diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index fcaaed9c7..419312401 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -22,10 +22,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '17' + java-version: '21' distribution: 'temurin' cache: maven - name: Build with Maven diff --git a/.gitignore b/.gitignore index b56bae84d..8a6e2fb1e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .idea policy-machine-core.iml /target -.DS_Store \ No newline at end of file +.DS_Store +**/gen/ \ No newline at end of file diff --git a/CODEMETA.yaml b/CODEMETA.yaml new file mode 100644 index 000000000..0577a88cf --- /dev/null +++ b/CODEMETA.yaml @@ -0,0 +1,36 @@ +# Topics for the NIST Open Source Portal +# +# Set the topic tags for your open source repository from the nested +# list below. Un-comment the relevant lines: +# +# remove the `#` character *and* the space immediately after it +# +# so that the YAML syntax remains valid. You may delete everything +# that does not apply, and add new topics from the NIST Taxonomy +# +# +# For example, a valid version of this file would be (note the `:` +# and `---`, they are important!) as follows: +# +# --- +# categories: +# - scientific-software +# +# themes: +# - Information Technology +# - Software research +# - Software performance +# +# Since scientific-software is most common it is left as the default +# category. Feel free to comment it with a hash (#) if it does not +# apply. There is no default theme; select as many as are relevant. +# Make sure to remove unwanted categories as the final topics are +# produced from this file. + +--- +categories: + - scientific-software + +themes: + - Information Technology + - Identity and access management diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..8d1e5035f --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,9 @@ +# This file lists the contributors responsible for the +# repository content. They will also be automatically +# asked to review any pull request made in this repository. + +# Each line is a file pattern followed by one or more owners. +# The sequence matters: later patterns take precedence. + +# FILES OWNERS +* @usnistgov/opensource-team diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000..b19169ae7 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,35 @@ +# NIST Software Licensing Statement + +NIST-developed software is provided by NIST as a public service. +You may use, copy, and distribute copies of the software in any +medium, provided that you keep intact this entire notice. You may +improve, modify, and create derivative works of the software or +any portion of the software, and you may copy and distribute such +modifications or works. Modified works should carry a notice +stating that you changed the software and should note the date +and nature of any such change. Please explicitly acknowledge the +National Institute of Standards and Technology as the source of +the software. + +NIST-developed software is expressly provided "AS IS." NIST MAKES +NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY +OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED +WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, +NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR +WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED +OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES +NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE +SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE +CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE +SOFTWARE. + +You are solely responsible for determining the appropriateness of +using and distributing the software and you assume all risks +associated with its use, including but not limited to the risks +and costs of program errors, compliance with applicable laws, +damage to or loss of data, programs or equipment, and the +unavailability or interruption of operation. This software is not +intended to be used in any situation where a failure could cause +risk of injury or damage to property. The software developed by +NIST employees is not subject to copyright protection within the +United States. diff --git a/README.md b/README.md index 778a9a0a6..0f0f348a7 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ # Policy Machine Core -The core components of the NIST Policy Machine, a reference implementation of the Next Generation Access Control (NGAC) standard. For complete documentation and detailed examples visit the [Wiki](https://github.com/PM-Master/policy-machine-core/wiki). +The core components of the NIST Policy Machine, a reference implementation of the Next Generation Access Control (NGAC) standard. +For complete documentation and detailed examples visit the Wiki. -## Table of Contents -1. [Installation](#install-using-maven) -2. [Basic Usage](#basic-usage) -3. [Policy Author Language (PAL)](/pml/README.md) +## Installation + +### Install using Maven +Policy Machine Core uses [JitPack](https://jitpack.io/) to compile and build the artifact to import with maven. -## Install using Maven -Policy Machine Core uses [JitPack](https://jitpack.io/) to compile and build the artifact to import into projects. First, add jitpack as a repository ```xml @@ -22,93 +21,131 @@ First, add jitpack as a repository -- ``` + Then, add the maven dependency ```xml com.github.PM-Master policy-machine-core - LATEST + 3.0.0 ``` +## Package Description + +- `pap` - Policy Administration Point. Provides the Policy Machine implementation of the NGAC PAP interfaces for modifying and querying policy. +- `pdp` - Policy Decision Point. Implementation of an administrative PDP that controls access to admin operations on the PAP. +- `epp` - Event Processing Point. The epp attaches to a PDP to listen to administrative events while exposing an interface for a PEP to send events. +- `impl` - Policy Machine supported implementations of the PAP interfaces. ## Basic Usage +The following examples use the provided in memory PAP. -Policy Machine Language docs can be found [here](/pml) +### PAP Usage -### 1. Policy Machine Language (PML) definition +#### Create a policy with the `PolicyModification` interface ```java -String pal = """ -set resource access rights ["read", "write"] - -create policy class "pc1" -create user attribute "ua1" in ["pc1"] -create user attribute "oa1" in ["pc1"] -associate "ua1" and "oa1" with ["read", "write"] - -create policy class "pc2" -assign "ua2" to ["pc2"] -create user attribute "oa2" in ["pc2"] -associate "ua2" and "oa2" with ["read", "write"] - -create user "u1" in ["ua1", "ua2"] -create user "u2" in ["ua1", "ua2"] +// create a new memory PAP +PAP pap = new MemoryPAP(); -create object "o1" in ["oa1", "oa2"] +// set the resource operations that the policy will support +pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + +// create a simple configuration with one of each node type, granting u1 read access to o1. +pap.modify().graph().createPolicyClass("pc1"); +pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); +pap.modify().graph().createUser("u1", List.of("ua1")); +pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); +pap.modify().graph().createObject("o1", List.of("oa1")); + +// create a prohibition +pap.modify().prohibitions().createProhibition( + "deny u1 write on oa1", + ProhibitionSubject.userAttribute("u1"), + new AccessRightSet("write"), + false, + List.of("oa1") +); + +// create an obligation that associates ua1 with any OA +String obligationPML = """ +create obligation "sample_obligation" { + create rule "rule1" + when any user + performs "create_object_attribute" + on { + descendants: "oa1" + } + do(ctx) { + associate "ua1" and ctx.operands.name with ["read", "write"] + } +} +"""; -create prohibition "u2-prohibition" -deny user "u2" -access rights ["write"] -on intersection of ["oa1", "oa2"] +// when creating an obligation a user is required +// this is the user the obligation response will be executed on behalf of +pap.executePML(new UserContext("u1"), obligationPML); +``` -create obligation "o1-obligation" { - create rule "o1-assignment-rule" +#### Create a policy with `PML` +```java +String pml = """ +set resource operations ["read", "write"] + +create pc "pc1" +create oa "oa1" in ["pc1"] +create ua "ua1" in ["pc1"] +create u "u1" in ["ua1"] +create o "o1" in ["oa1"] + +create prohibition "deny u1 write on oa1" +deny user "u1" +access rights ["write"] +on union of ["oa1"] + +create obligation "sample_obligation" { + create rule "rule1" when any user - performs ["assign"] - on "o1" - do(evtCtx) { - let parent = evtCtx["parent"] - associate "ua1" and parent with ["read", "write"] - associate "ua2" and parent with ["read", "write"] + performs "create_object_attribute" + on { + descendants: "oa1" + } + do(ctx) { + associate "ua1" and ctx.operands.name with ["read", "write"] } } -""" +"""; ``` -#### 2. Load PAL into a Memory Policy Administration Point (PAP) as the super user -No access checks are done yet, the user is needed to know who the author of any obligations are. +A user is required to execute PML. This user will be the defined author of any obligations created. ```java -UserContext superUser = new UserContext(SUPER_USER); -PAP pap = new MemoryPAP(); -pap.deserialize().fromPML(superUser, input); -``` +// execute the pml and apply to existing policy +pap.executePML(new UserContext("u1")), pml); -#### 3. Wrap in a PDP object to add administrative permission checks -```java -PDP pdp = new MemoryPDP(pap); +// or + +// reset the current policy befire applying the PML +pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()) ``` -#### 4. Run a PDP Transaction as the super user -This transaction will create 'pc3' and 'oa3', then assign 'o1' to 'oa3'. This will trigger the obligation to associate -'ua1' and 'ua2' with 'oa3'. +### PDP Usage +#### Initialization ```java -pdp.runTx(superUser, (policy) -> { - policy.graph().createPolicyClass("pc3") - policy.graph().createObjectAttribute("oa3", "pc2"); - policy.graph().assign("o1", "oa3"); -}); +PDP pdp = new PDP(pap); ``` - -#### 5. Run a PDP transaction as u1 that will fail -u1 does not have permission to create an object attribute in 'oa1'. This transaction will fail and 'newOA' will not be created. +#### Run a transaction as a user ```java -UserContext u1 = new UserContext("u1"); -pdp.runTx(u1, (policy) -> { - policy.graph().createObjectAttribute("newOA", "oa1"); +pdp.runTx(new UserContext("u1"), (policy) -> { + policy.modify().graph().createPolicyClass("pc3") + policy.modify().graph().createObjectAttribute("oa3", "pc2"); + policy.modify().graph().assign("o1", "oa3"); }); ``` -#### 6. Create an EPP to respond to policy events -An EPP will listen to policy events from the provided PDP and process obligations accordingly. +### EPP Usage +An EPP will listen to policy events from the provided PDP and process obligations in the PAP accordingly. The EPP and PDP uses an event listener pattern. The EPP listens to events from the PDP, attaching itself within the EPP constructor. ```java EPP epp = new EPP(pdp, pap); + +// will trigger above obligation response and associate ua1 with oa2 +pdp.modify().graph().createObjectAttribute("oa2", List.of("oa1")); ``` diff --git a/fair-software.md b/fair-software.md new file mode 100644 index 000000000..274c4c6dd --- /dev/null +++ b/fair-software.md @@ -0,0 +1,297 @@ +# FAIR Software & Data + +The following material is paraphrased from the NIST-internal +[Data Sponsorship][sponsors] repository by @tkphd. + +## Table of Contents + +- [FAIR principles](#fair-principles) + - [Findable](#findable) + - [Accessible](#accessible) + - [Interoperable](#interoperable) + - [Reusable](#reusable) +- [Make It FAIR in Ten Easy Steps](#make-it-fair-in-ten-easy-steps) +- [What's "good enough"?](#whats-good-enough) + - [Data management](#data-management) + - [Software](#software) + - [Collaboration](#collaboration) + - [Project organization](#project-organization) + - [Keeping track of changes](#keeping-track-of-changes) + - [Manuscripts](#manuscripts) +- [Links](#links) + +## FAIR principles + +What does FAIR even mean? The following sections reproduce the +summary from [Go FAIR][gofair], based on the original +[FAIR paper][fair]. + +Think you know FAIR? Please [use this tool][fair-aware] to check your +awareness! + +### Findable + +The first step in (re)using data is to find them. Metadata and data +should be easy to find for both humans and computers. +Machine-readable metadata are essential for automatic discovery of +datasets and services, so this is an essential component of the +FAIRification process. + +1. (Meta)data are assigned a globally unique and persistent + identifier +2. Data are described with rich metadata (defined by R1 below) +3. Metadata clearly and explicitly include the identifier of the data + they describe +4. (Meta)data are registered or indexed in a searchable resource + +### Accessible + +Once the user finds the required data, she/he/they need to know how +can they be accessed, possibly including authentication and +authorisation. + +1. (Meta)data are retrievable by their identifier using a + standardised communications protocol + 1. The protocol is open, free, and universally implementable + 2. The protocol allows for an authentication and authorisation + procedure, where necessary +2. Metadata are accessible, even when the data are no longer + available + +### Interoperable + +The data usually need to be integrated with other data. In addition, +the data need to interoperate with applications or workflows for +analysis, storage, and processing. + +1. (Meta)data use a formal, accessible, shared, and broadly + applicable language for knowledge representation. +2. (Meta)data use vocabularies that follow FAIR principles +3. (Meta)data include qualified references to other (meta)data + +### Reusable + +The ultimate goal of FAIR is to optimise the reuse of data. To +achieve this, metadata and data should be well-described so that they +can be replicated and/or combined in different settings. + +1. (Meta)data are richly described with a plurality of accurate and + relevant attributes + 1. (Meta)data are released with a clear and accessible data usage + license + 2. (Meta)data are associated with detailed provenance + 3. (Meta)data meet domain-relevant community standards + +## Make It FAIR in Ten Easy Steps + +[Library Carpentry][lc] has a summary of [10 "easy" steps to make your +software FAIR][lc-fair-poster] (PDF). An annotated list follows. +Note that while the list is software-centric, it applies equally to data. + +1. *Create a description of your software.* + Write this in `README.md` with supporting tables, charts, images, + etc. Include its dependencies, installation instructions, and + citations of any work it builds upon. +2. *Register your software in a software registry.* + [MIDAS][midas] is the go-to where Data Sponsorship is concerned, + but is not the only option. +3. *Use a unique and persistent identifier for your software.* + Any registry compliant with [NIST O 5702][o5702] will provide you + with a persistent handle. +4. *Make sure that people can download your software.* + If the data is fire- or pay-walled, provide an alternative site. + Wherever your data lives, check back from time to time to make + sure the links are still valid. +5. *Explain the functionality of your software.* + Write this into a "Usage" section of `README.md`, or similar, + with example of how to configure, launch, and interact with the + software, with examples of output to be expected. +6. *Use standard (community-agreed) formats for inputs and outputs.* + While open standards are preferred, if a proprietary format is the + *lingua franca* of the field, focus on that. Create open versions + if possible. +7. *Document your software.* + This goes beyond `README.md` and in-line comments. Place + documentation, or its build scripts, in a folder named `doc` with + its own `README.md` describing how to build the docs and what to + expect. +8. *Give your software a license.* + If all members of the development team are Federal employees, use + the standard NIST Disclaimer of Copyright and Warranty for your + [LICENSE.md][disc-copy]. Otherwise, decide on an appropriate + license. +9. *State how to cite your software.* + This can be done in `README.md`, or as a separate + [`CITATION.md`][citation] using a BiBTeX-styled code block. +10. *Follow best practices for software development.* + Broadly speaking, this starts with version control using + [git][git] or similar, [linting][lint] your code, and following + some type of branching workflow when multiple developers are + involved. The regularly-scheduled Software Carpentry workshops at + NIST teach the basics of some of these concepts. + +## What's good enough? + +[*Good enough practices in scientific computing*][gepsc] is an +excellent paper outlining what you need to do to produce good science +in a FAIR frame of mind. + +*tl;dr* follows. + +### Data management + +1. Save the raw data. +2. Ensure that raw data are backed up in more than one location. +3. Create the data you wish to see in the world. +4. Create analysis-friendly data. +5. Record all the steps used to process data. +6. Anticipate the need to use multiple tables, and use a unique + identifier for every record. +7. Submit data to a reputable DOI-issuing repository so that others + can access and cite it. + +### Software + +1. Place a brief explanatory comment at the start of every program. +2. Decompose programs into functions. +3. Be ruthless about eliminating duplication. +4. Always search for well-maintained software libraries that do what + you need. +5. Test libraries before relying on them. +6. Give functions and variables meaningful names. +7. Make dependencies and requirements explicit. +8. Do not comment and uncomment sections of code to control a + program's behavior. +9. Provide a simple example or test data set. +10. Submit code to a reputable DOI-issuing repository. + +### Collaboration + +1. Create an overview of your project. +2. Create a shared "to-do" list for the project. +3. Decide on communication strategies. +4. Make the license explicit. +5. Make the project citable. + +### Project organization + +1. Put each project in its own directory, which is named after the + project. +2. Put text documents associated with the project in the `doc` + directory. +3. Put raw data and metadata in a `data` directory and files generated + during cleanup and analysis in a results directory. +4. Put project source code in the `src` directory. +5. Put external scripts or compiled programs in the `bin` directory. +6. Name all files to reflect their content or function. + +### Keeping track of changes + +1. Back up (almost) everything created by a human being as soon as it + is created. +2. Keep changes small. +3. Share changes frequently. +4. Create, maintain, and use a checklist for saving and sharing + changes to the project. +5. Store each project in a folder that is mirrored off the + researcher's working machine. +6. Add a file called `CHANGELOG.md` to the project's docs subfolder. +7. Copy the entire project whenever a significant change has been + made. +8. Use a version control system. + +### Manuscripts + +1. Write manuscripts using online tools with rich formatting, change + tracking, and reference management. +2. Write the manuscript in a plain text format that permits version + control. + +## Links + +- [F-UJI][fuji] (*tool*): analyze a repository and get a report of + its FAIR compliance, with an overall score and a checklist +- [FAIRaware][fair-aware] quiz/checklist of understanding +- [FAIR for Research Software (FAIR4RS)][fair4rs], a proposed + modification of the FAIR principles specifically for software. +- [10 easy things to make your software FAIR!][lc-fair-poster] (PDF) + from [Library Carpentry][lc-fair] +- [4 Simple Recommendations for Open-Source Software][4oss] + walk-through lesson, Carpentries-style + +Some more general FAIR resources: + +- Research Data Alliance: [Top 10 FAIR data and software things](https://www.rd-alliance.org/group/libraries-research-data-ig/outcomes/top-10-fair-data-software-things) +- Library Carpentries: [Top 10 FAIR Research Software Things](https://librarycarpentry.org/Top-10-FAIR//2018/12/01/research-software/) +- [NLeSC FAIR Software](https://fair-software.eu/) +- [NLeSC howfairis](https://github.com/fair-software/howfairis) +- [Data and Software Sharing Guidance for Authors Submitting to AGU journals](https://data.agu.org/resources/agu-data-software-sharing-guidance) +- [FAIRSharing and FAIRShake](https://presqt.readthedocs.io/en/latest/) + from the Preservation Quality Tool (PresQT) +- [Registry of Research Data Repositories](https://re3data.org/) + also has software locations +- [*Automating the Monitoring of Research Software FAIR Metrics*](https://doi.org/10.7490/f1000research.1117992.1) +- [Proposal for software indicators in the Open Science Monitor](https://www.ouvrirlascience.fr/about-the-proposal-for-software-indicators-in-open-science-monitor-3/) +- *National Plan for Open Science* (France, 2021-2024). + [Theme Three: Opening Up and Promoting Source Code Produced by Research](https://www.ouvrirlascience.fr/second-national-plan-for-open-science/) +- [The Turing Way](https://the-turing-way.netlify.app/welcome) +- [*Software Citation Guide*](https://doi.org/10.12688/f1000research.26932.2) +- [Managing Research Software Projects](https://swcarpentry.github.io/managing-research-software-projects/) +- [Guides](https://www.software.ac.uk/resources/guides) + for several groups (researchers, managers, developers, ...) from + the Software Sustainability Institute +- [Chorus Software Citation Policies Index](https://chorusaccess.org) +- [Software Discovery Through Registries](https://softdev4research.github.io/4OSS-lesson/05-use-registry/index.html) +- [Awesome FAIR Data][afd]: a list of FAIR data resources. +- [Awesome Research Software Registries](https://github.com/NLeSC/awesome-research-software-registries/blob/main/README.md) +- [CodeMeta Standard](https://codemeta.github.io/) + - [CodeMeta Generator][cmg] (*tool*): generate a complete set of + [CodeMeta][codemeta]-compliant metadata for your research software + and/or data with this handy form. Exports to JSON. + *Note:* `codemeta.json` is *not* the same as `codemeta.yaml`: the + former is a nascent general schema, while the latter is only used + to help index and link NIST websites. +- [SOftware Metadata Extraction Framework (SOMEF)](https://github.com/KnowledgeCaptureAndDiscovery/somef/) +- [*Good Enough Practices in Scientific Computing*](https://doi.org/10.1371/journal.pcbi.1005510) +- [Citation File Format][citation] docs from GitHub +- [Software REUSE Specification](https://reuse.software/spec/) +- [FAIR Computational Workflows][fcw] (*paper*): Data doesn't just + happen. Record the workflow that created it to be super FAIR. + +Institutional guidance: + +- DLR: [Software Engineering Initiative](https://rse.dlr.de/01_guidelines.html) +- MIT: [Software Citation and Publishing](https://libguides.mit.edu/software) +- MIT workshop: [Managing your research code](https://www.dropbox.com/s/gukkthqzcuea1kr/MgingCode_Slides_MIT.pdf?dl=0) +- TU Delft [*Guidelines on Research Software: Licensing, Registration and Commercialisation*](https://doi.org/10.5281/zenodo.4629635) +- TU Delft: [Choosing a Repository Manager](https://doi.org/10.5281/zenodo.4710206) +- Helmholtz: [Guidelines for Sustainable Research Software](https://gfzpublic.gfz-potsdam.de/pubman/faces/ViewItemOverviewPage.jsp?itemId=item_4906899) + - [Checklist for Helmholtz Guidelines](https://gfzpublic.gfz-potsdam.de/pubman/faces/ViewItemOverviewPage.jsp?itemId=item_5007561) +- NIH: [Best Practices for Sharing Research Software](https://datascience.nih.gov/tools-and-analytics/best-practices-for-sharing-research-software-faq) + + + +[4oss]: https://softdev4research.github.io/4OSS-lesson/ +[afd]: https://github.com/Materials-Data-Science-and-Informatics/awesome-fair-data +[citation]: https://github.com/citation-file-format/citation-file-format +[cmg]: https://codemeta.github.io/codemeta-generator/ +[codemeta]: https://codemeta.github.io/ +[disc-copy]: https://www.nist.gov/open/copyright-fair-use-and-licensing-statements-srd-data-software-and-technical-series-publications +[fair]: https://doi.org/10.1038/sdata.2016.18 +[fair4rs]: https://doi.org/10.1016/j.patter.2021.100222 +[fair-aware]: https://fairaware.dans.knaw.nl +[fcw]: https://doi.org/10.1162/dint_a_00033 +[fuji]: https://www.f-uji.net/index.php?action=home +[gepsc]: https://doi.org/10.1371/journal.pcbi.1005510 +[git]: https://git-scm.com +[git-open]: https://github.com/usnistgov/opensource-repo +[gofair]: https://www.go-fair.org/fair-principles/ +[lc-fair]: https://librarycarpentry.org/Top-10-FAIR//2018/12/01/research-software/ +[lc-fair-poster]: https://librarycarpentry.org/Top-10-FAIR/files/poster_10things_FAIRsoftware.pdf +[lint]: https://en.wikipedia.org/wiki/Lint_(software) +[midas]: https://midas.nist.gov/ +[o5701]: https://inet.nist.gov/adlp/directives/managing-public-access-results-federally-funded-research-0 +[o5702]: https://inet.nist.gov/adlp/directives/preservation-maintenance-published-research-data +[sp811]: https://dx.doi.org/10.6028/NIST.SP.811e2008 +[sponsors]: https://gitlab.nist.gov/gitlab/tkphd/data-sponsorship +[taxon]: https://doi.org/10.18434/T4/1432795 diff --git a/jitpack.yml b/jitpack.yml index 00c69abe7..c7d4790e1 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,4 +1,4 @@ before_install: - sdk update - - sdk install java 17.0.1-open - - sdk use java 17.0.1-open \ No newline at end of file + - sdk install java 21.0.3-tem + - sdk use java 21.0.3-tem \ No newline at end of file diff --git a/pml/README.md b/pml/README.md deleted file mode 100644 index 64398828d..000000000 --- a/pml/README.md +++ /dev/null @@ -1,268 +0,0 @@ -# Policy Machine Language (PML) - -The Policy Machine Language (PML) defines a set of statements that can be used to create NGAC graphs, prohibitions, and obligations. -It also supports logic and control statements such as [if](#if) statements and [for](#for) loops. - -## ANTLR4 -PML is defined using [ANTLR4](https://www.antlr.org/). The PML grammar is defined [here](/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.g4). - -To build the ANTLR4 Java files from PML.g4, run: -`mvn clean generate-sources` - - -## Examples - -### Variable declaration -Variable types can be one of: - -- string - - ```pml - "hello world" - 'hello world' - ``` - -- boolean - - ```pml - true - false - ``` - -- number (int) - - ```pml - 123 - ``` - -- array - element type can be any supported type - - ```pml - ["1", "2", "3"] - ``` - -- map - **key** type must be string, **value** type can be any supported type - - ``` - { - "key1": "hello", - "key2": "world" - } - - { - "key1": ["1", "2", "3"], - "key2": ["3", "4", "5"] - } - ``` - -- any - type will be determined at runtime, an error may occur if the value is used improperly for it's assigned type - (i.e. accessing a map key on a string) - -#### Examples - -```pml -# variable declaration -let a = "hello world" -let b = 123 -let c = true -let d = { - "key1": "hello", - "key2": "world" -} - -# constant declaration -const e = "hello world" -``` - -### If -PML supports logical operators `&&` and `||` as well as comparison operators `==` and `!=`. - -```pml -let x = "a"; -let y = "b"; -let z = "a"; - -if x == y { - # do something -} else if x == z || y == z { - # do something -} else { - # do something -} -``` - -### For - -#### Foreach - -```pml -let arr = ["1", "2", "3"] -foreach x in arr { - # do something with x -} - -let m = {"k1": "v1", "k2": "v2"} -foreach key, value in m { - # do something - # key = map key - # value = map value -} -``` - -#### For range -Iterate from one bound to another. Use `(` or `)` to indicate an exclusive bound and `[` or `]` for an inclusive bound. - -```pml -for i in range [0, 100) { - # do something with i -} -``` - -### Functions - -#### Definition -```pml -function testFunc(string a, map[string]string b, []string c) string { - -} -``` - -#### Invocation -```pml -testFunc("...", {...}, [...]) -``` - -### Set Resource Access Rights -```pml -set resource access rights ["read", "write"] -``` - -### Create Policy Class -```pml -create policy class 'pc1' -``` - -### Create User|Object Attribute -```pml -create user attribute 'ua1' in ['pc1', 'pc2'] -create object attribute 'oa1' in ['pc1'] -``` - -### Create User|Object -```pml -create user 'u1' in ['ua1', 'ua2'] -create object 'o1' in ['oa1'] -``` - -### Set Node Properties -```pml -set properties of 'oa1' to {"key": "value", "key2": "value2"} -``` - -### Assign -```pml -assign 'u1' to ['ua1', 'ua2'] -``` - -### Deassign -```pml -deassign "u1" from ["ua1", "ua2"] -``` - -### Associate -```pml -associate "ua1" and "oa1" with ["read", "write"] -``` - -### Dissociate -```pml -dissociate "ua1" and "oa1" -``` - -### Create Prohibition - -```pml -# user prohibition -create prohibition 'prohibition1' -deny user 'u1' -access rights ["read"] -on intersection of ["oa1", !"oa2"] # ! denotes complement of attribute - -# user attribute prohibition -create prohibition 'prohibition1' -deny user attribute 'ua1' -access rights ["read"] -on union of ["oa1", "oa2"] - -# process prohibition -create prohibition 'prohibition1' -deny process '123' -access rights ["read"] -on union of ["oa1", "oa2"] -``` - -### Create Obligation -An obligation response context `ctx` holds information pertaining to the event that triggered the response. The ctx variable -is of type `map[string]any`. - -```pml -create obligation 'obl1' { - create rule 'rule1' - when any user - performs ["assign", assign_to"] - on "oa1" - do(ctx) { - # response defined in PML - # ctx will have event information depending on the event that triggers this response - # ctx could be an "assign" event or "assign_to" event - } -} -``` - -### Delete Node|Prohibition|Obligation|Rule -```pml -delete node "oa1" - -delete prohibition "prohibition1" - -delete obligation "obligation1" - -delete rule "rule1" from obligation "obligation1" -``` - -### Example -```pml -set resource access rights ["read", "write"] - -create policy class "pc1" -create user attribute "ua1" in ["pc1"] -create user attribute "oa1" in ["pc1"] -associate "ua1" and "oa1" with ["read", "write"] - -create policy class "pc2" -create user attribute "ua2" in ["pc2"] -create object attribute "oa2" in ["pc2"] -associate "ua2" and "oa2" with ["read", "write"] - -create user "u1" in ["ua1", "ua2"] -create user "u2" in ["ua1", "ua2"] - -create object "o1" in ["oa1", "oa2"] - -create prohibition "u2-prohibition" -deny user "u2" -access rights ["write"] -on intersection of ["oa1", "oa2"] - -create obligation "o1-obligation" { - create rule "o1-assignment-rule" - when any user - performs ["assign"] - on "o1" - do(evtCtx) { - let parent = evtCtx["parent"] - associate "ua1" and parent with ["read", "write"] - associate "ua2" and parent with ["read", "write"] - } -} -``` diff --git a/pom.xml b/pom.xml index 41404abfc..25e0cc3b4 100644 --- a/pom.xml +++ b/pom.xml @@ -11,14 +11,26 @@ + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + 3.3.0 + org.apache.maven.plugins maven-compiler-plugin 3.10.1 true - 17 - 17 + 21 + 21 @@ -64,12 +76,12 @@ antlr4-maven-plugin ${antlr.version} - src/main/java/gov/nist/csd/pm/policy/pml/antlr - src/main/java/gov/nist/csd/pm/policy/pml/antlr + src/main/java/gov/nist/csd/pm/pap/pml/antlr + src/main/java/gov/nist/csd/pm/pap/pml/antlr true -package - gov.nist.csd.pm.policy.pml.antlr + gov.nist.csd.pm.pap.pml.antlr @@ -106,46 +118,24 @@ 5.9.0 test - - - - mysql - mysql-connector-java - 8.0.30 - - - org.testcontainers - mysql - 1.17.4 - test - - - org.testcontainers - junit-jupiter - 1.17.4 - test - - - - - com.fasterxml.jackson.core - jackson-databind - 2.14.0 - commons-io commons-io 2.11.0 - org.apache.commons commons-lang3 - 3.12.0 + 3.13.0 + + + it.unimi.dsi + fastutil + 8.5.13 - 4.8 + 4.13.1 diff --git a/sql/pm_core.sql b/sql/pm_core.sql index 99754909b..15643a871 100644 --- a/sql/pm_core.sql +++ b/sql/pm_core.sql @@ -61,14 +61,14 @@ CREATE TABLE IF NOT EXISTS `prohibition_type` ( CREATE TABLE IF NOT EXISTS `prohibition` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `label` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, `node_id` int(11), `process_id` varchar(50), `subject_type` int(11) NOT NULL, `is_intersection` int(1) NOT NULL, `access_rights` json NOT NULL, PRIMARY KEY (`id`), - UNIQUE KEY `prohibition_label` (`label`), + UNIQUE KEY `prohibition_label` (`name`), CONSTRAINT `fk_prohibition_node_id` FOREIGN KEY (`node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_prohibition_type_id` FOREIGN KEY (`subject_type`) REFERENCES `prohibition_type` (`id`) ); @@ -84,11 +84,11 @@ CREATE TABLE IF NOT EXISTS `prohibition_container` ( CREATE TABLE IF NOT EXISTS `obligation` ( `id` int(11) NOT NULL AUTO_INCREMENT, - `label` varchar(50) NOT NULL, + `name` varchar(50) NOT NULL, `author` json NOT NULL, `rules` BLOB NOT NULL, PRIMARY KEY(`id`), - UNIQUE KEY `obligation_label` (`label`) + UNIQUE KEY `obligation_label` (`name`) ); CREATE TABLE IF NOT EXISTS `pml_function` ( diff --git a/src/main/java/gov/nist/csd/pm/epp/EPP.java b/src/main/java/gov/nist/csd/pm/epp/EPP.java index 6b39b6f78..24194c568 100644 --- a/src/main/java/gov/nist/csd/pm/epp/EPP.java +++ b/src/main/java/gov/nist/csd/pm/epp/EPP.java @@ -1,23 +1,60 @@ package gov.nist.csd.pm.epp; -import gov.nist.csd.pm.policy.exceptions.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; import gov.nist.csd.pm.pap.PAP; import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.policy.events.PolicyEventListener; -import gov.nist.csd.pm.policy.events.PolicyEvent; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pdp.PDPExecutionContext; -public class EPP implements PolicyEventListener{ +import java.util.Collection; +import java.util.List; - private final EventListener eventListener; +public class EPP { + + private final EPPEventProcessor eventListener; public EPP(PDP pdp, PAP pap) throws PMException { - eventListener = new EventListener(new EventProcessor(pdp, pap)); + eventListener = new EPPEventProcessor(pdp, pap); + + pdp.addEventListener(eventListener); + } - pdp.addEventListener(eventListener, false); + public EPPEventProcessor getEventProcessor() { + return eventListener; } - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - eventListener.handlePolicyEvent(event); + public static class EPPEventProcessor implements EventProcessor { + + private PDP pdp; + private PAP pap; + + public EPPEventProcessor(PDP pdp, PAP pap) { + this.pdp = pdp; + this.pap = pap; + } + + @Override + public void processEvent(EventContext eventCtx) throws PMException { + Collection obligations = pap.query().obligations().getObligations(); + for(Obligation obligation : obligations) { + String author = obligation.getAuthor(); + List rules = obligation.getRules(); + for(Rule rule : rules) { + if(!rule.getEventPattern().matches(eventCtx, pap)) { + continue; + } + + Response response = rule.getResponse(); + UserContext userContext = new UserContext(author); + + // need to run pdp tx as author + pdp.runTx(userContext, txPDP -> response.execute(new PDPExecutionContext(userContext, txPDP), eventCtx)); + } + } + } } } diff --git a/src/main/java/gov/nist/csd/pm/epp/EventContext.java b/src/main/java/gov/nist/csd/pm/epp/EventContext.java deleted file mode 100644 index a9d51a90c..000000000 --- a/src/main/java/gov/nist/csd/pm/epp/EventContext.java +++ /dev/null @@ -1,72 +0,0 @@ -package gov.nist.csd.pm.epp; - -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; - -public class EventContext implements PolicyEvent { - - private final UserContext userCtx; - private final String eventName; - private final String target; - private final PolicyEvent event; - - public EventContext(UserContext userCtx, String target, PolicyEvent event) { - this.userCtx = userCtx; - this.eventName = event.getEventName(); - this.target = target; - this.event = event; - } - - public EventContext(UserContext userCtx, PolicyEvent event) { - this.userCtx = userCtx; - this.eventName = event.getEventName(); - this.target = ""; - this.event = event; - } - - public UserContext getUserCtx() { - return userCtx; - } - - public String getEventName() { - return eventName; - } - - public String getTarget() { - return target; - } - - public PolicyEvent getEvent() { - return event; - } - - public boolean matchesPattern(EventPattern pattern, PolicyReviewer policyReviewer) throws PMException { - if (pattern.getOperations().isEmpty() || pattern.getOperations().get(0).isEmpty()) { - return true; // an empty event pattern will match all events - } else if (pattern.getOperations() != null && - !pattern.getOperations().contains(eventName)) { - return false; - } - - EventSubject patternSubject = pattern.getSubject(); - Target patternTarget = pattern.getTarget(); - - return patternSubject.matches(userCtx, policyReviewer) && - patternTarget.matches(target, policyReviewer); - } - - @Override - public String toString() { - return "EventContext{" + - "userCtx=" + userCtx + - ", eventName='" + eventName + '\'' + - ", target=" + target + - ", event=" + event + - '}'; - } -} diff --git a/src/main/java/gov/nist/csd/pm/epp/EventEmitter.java b/src/main/java/gov/nist/csd/pm/epp/EventEmitter.java new file mode 100644 index 000000000..d1c1139bc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/epp/EventEmitter.java @@ -0,0 +1,30 @@ +package gov.nist.csd.pm.epp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; + +/** + * Interface for emitting events to be processed by an EPP. + */ +public interface EventEmitter { + + /** + * Add the given EventProcessor as a listener for policy events. + * @param processor The processor to add as a listener. + */ + void addEventListener(EventProcessor processor); + + /** + * Remove the given EventProcessor as a listener. + * @param processor The processor to remove. + */ + void removeEventListener(EventProcessor processor); + + /** + * Emit the given event context to any EventProcessors listening. + * @param event The EventContext to emit. + * @throws PMException If there is an exception emitting the event. + */ + void emitEvent(EventContext event) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/epp/EventListener.java b/src/main/java/gov/nist/csd/pm/epp/EventListener.java deleted file mode 100644 index 114b209e9..000000000 --- a/src/main/java/gov/nist/csd/pm/epp/EventListener.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.epp; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.events.PolicyEventListener; -import gov.nist.csd.pm.policy.events.PolicyEvent; -import gov.nist.csd.pm.policy.exceptions.PMRuntimeException; - -class EventListener implements PolicyEventListener { - - private final EventProcessor eventProcessor; - - public EventListener(EventProcessor eventProcessor) { - this.eventProcessor = eventProcessor; - } - - @Override - public void handlePolicyEvent(PolicyEvent event) { - if (!(event instanceof EventContext evtCtx)) { - // ignore events that are not EventContext - return; - } - - try { - this.eventProcessor.processEvent(evtCtx); - } catch (PMException e) { - throw new PMRuntimeException(e.getMessage()); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/epp/EventProcessor.java b/src/main/java/gov/nist/csd/pm/epp/EventProcessor.java index 75a67ba0c..bc24c499d 100644 --- a/src/main/java/gov/nist/csd/pm/epp/EventProcessor.java +++ b/src/main/java/gov/nist/csd/pm/epp/EventProcessor.java @@ -1,40 +1,18 @@ package gov.nist.csd.pm.epp; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; -import java.util.List; +/** + * Interface for processing EventContexts in the EPP. + */ +public interface EventProcessor { -class EventProcessor { + /** + * Process the given EventContext in the EPP. + * @param eventCtx The event context to process. + * @throws PMException If there is an error processing the EventContext. + */ + void processEvent(EventContext eventCtx) throws PMException; - private final PDP pdp; - private final PAP pap; - - public EventProcessor(PDP pdp, PAP pap) { - this.pdp = pdp; - this.pap = pap; - } - - public void processEvent(EventContext eventCtx) throws PMException { - List obligations = pap.obligations().getAll(); - for(Obligation obligation : obligations) { - UserContext author = obligation.getAuthor(); - List rules = obligation.getRules(); - for(Rule rule : rules) { - if(!eventCtx.matchesPattern(rule.getEventPattern(), pdp.reviewer())) { - continue; - } - - Response response = rule.getResponse(); - - // need to run pdp tx as author - pdp.runTx(author, txPDP -> response.execute(txPDP, eventCtx)); - } - } - } } diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryAccessQuerier.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryAccessQuerier.java new file mode 100644 index 000000000..06f2f19c0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryAccessQuerier.java @@ -0,0 +1,708 @@ +package gov.nist.csd.pm.impl.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.*; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.graph.relationship.Relationship; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.query.explain.EdgePath; +import gov.nist.csd.pm.pap.query.explain.Explain; +import gov.nist.csd.pm.pap.query.explain.Path; +import gov.nist.csd.pm.pap.query.explain.PolicyClassExplain; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.query.AccessQuerier; +import gov.nist.csd.pm.pap.query.GraphQuerier; +import gov.nist.csd.pm.pap.query.ProhibitionsQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.store.GraphStoreBFS; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.U; +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; +import static gov.nist.csd.pm.pap.query.AccessRightResolver.*; + +public class MemoryAccessQuerier extends AccessQuerier { + + private GraphQuerier graphQuerier; + private ProhibitionsQuerier prohibitionsQuerier; + + public MemoryAccessQuerier(PolicyStore memoryPolicyStore, GraphQuerier graphQuerier, ProhibitionsQuerier prohibitionsQuerier) { + super(memoryPolicyStore); + this.graphQuerier = graphQuerier; + this.prohibitionsQuerier = prohibitionsQuerier; + } + + @Override + public AccessRightSet computePrivileges(UserContext userCtx, String target) throws PMException { + AccessRightSet accessRights = new AccessRightSet(); + + // traverse the user side of the graph to get the associations + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + if (userDagResult.borderTargets().isEmpty()) { + return accessRights; + } + + // traverse the target side of the graph to get permissions per policy class + TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); + + // resolve the permissions + return resolvePrivileges(userDagResult, targetDagResult, target, store.operations().getResourceOperations()); + } + + @Override + public AccessRightSet computeDeniedPrivileges(UserContext userCtx, String target) throws PMException { + AccessRightSet accessRights = new AccessRightSet(); + + // traverse the user side of the graph to get the associations + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + if (userDagResult.borderTargets().isEmpty()) { + return accessRights; + } + + // traverse the target side of the graph to get permissions per policy class + TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); + + // resolve the permissions + return resolveDeniedAccessRights(userDagResult, targetDagResult, target); + } + + @Override + public Map computePolicyClassAccessRights(UserContext userCtx, String target) throws PMException { + // traverse the user side of the graph to get the associations + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + if (userDagResult.borderTargets().isEmpty()) { + return new HashMap<>(); + } + + // traverse the target side of the graph to get permissions per policy class + TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); + + return targetDagResult.pcSet(); + } + + @Override + public Map computeCapabilityList(UserContext userCtx) throws PMException { + Map results = new HashMap<>(); + + //get border nodes. Can be OA or UA. Return empty set if no attrs are reachable + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + if (userDagResult.borderTargets().isEmpty()) { + return results; + } + + for(String borderTarget : userDagResult.borderTargets().keySet()) { + // compute permissions on the border attr + getAndStorePrivileges(results, userDagResult, borderTarget); + + // compute decisions for the subgraph of the border attr + Set descendants = getDescendants(borderTarget); + for (String descendant : descendants) { + if (results.containsKey(descendant)) { + continue; + } + + getAndStorePrivileges(results, userDagResult, descendant); + } + } + + return results; + } + + @Override + public Map computeACL(String target) throws PMException { + Map acl = new HashMap<>(); + Collection search = graphQuerier.search(U, NO_PROPERTIES); + for (String user : search) { + AccessRightSet list = this.computePrivileges(new UserContext(user), target); + acl.put(user, list); + } + + return acl; + } + + @Override + public Map computeDestinationAttributes(String user) throws PMException { + return processUserDAG(user, UserContext.NO_PROCESS) + .borderTargets(); + } + + @Override + public Map computeAscendantPrivileges(UserContext userCtx, String root) throws PMException { + Map results = new HashMap<>(); + + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + if (userDagResult.borderTargets().isEmpty()) { + return results; + } + + Set descendants = getDescendants(root); + for (String descendant : descendants) { + if (results.containsKey(descendant)) { + continue; + } + + getAndStorePrivileges(results, userDagResult, descendant); + } + + return results; + } + + @Override + public Explain explain(UserContext userCtx, String target) throws PMException { + Node userNode = graphQuerier.getNode(userCtx.getUser()); + Node targetNode = graphQuerier.getNode(target); + + List userPaths = explainDfs(userNode.getName()); + List targetPaths = explainDfs(targetNode.getName()); + + Map resolvedPaths = resolvePaths(graphQuerier, userPaths, targetPaths, target); + + UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); + TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); + + AccessRightSet priv = resolvePrivileges(userDagResult, targetDagResult, target, store.operations().getResourceOperations()); + AccessRightSet deniedPriv = resolveDeniedAccessRights(userDagResult, targetDagResult, target); + List prohibitions = computeSatisfiedProhibitions(userDagResult, targetDagResult, target); + + return new Explain(priv, resolvedPaths, deniedPriv, prohibitions); + } + + @Override + public Set computePersonalObjectSystem(UserContext userCtx) throws PMException { + // Prepare the hashset to return. + HashSet hsOa = new HashSet<>(); + + // Call find_border_oa_priv(u). The result is a Hashtable + // htoa = {oa -> {op -> pcset}}: + Hashtable>> htOa = findBorderOaPrivRestrictedInternal(userCtx); + + // For each returned oa (key in htOa) + for (Enumeration oas = htOa.keys(); oas.hasMoreElements(); ) { + String oa = oas.nextElement(); + + // Compute oa's required PCs by calling find_pc_set(oa). + HashSet hsReqPcs = inMemFindPcSet(oa); + // Extract oa's label. + Hashtable> htOaLabel = htOa.get(oa); + + // Walk through the op -> pcset of the oa's label. + // For each operation/access right + for (Enumeration ops = htOaLabel.keys(); ops.hasMoreElements(); ) { + String sOp = (String)ops.nextElement(); + // Extract the pcset corresponding to this operation/access right. + Set hsActualPcs = htOaLabel.get(sOp); + // if the set of required PCs is a subset of the actual pcset, + // then user u has some privileges on the current oa node. + if (hsActualPcs.containsAll(hsReqPcs)) { + hsOa.add(oa); + break; + } + } + } + + return new HashSet<>(hsOa); + } + + @Override + public Collection computeAccessibleAscendants(UserContext userCtx, String root) throws PMException { + List ascendants = new ArrayList<>(graphQuerier.getAdjacentAscendants(root)); + ascendants.removeIf(ascendant -> { + try { + return computePrivileges(userCtx, ascendant).isEmpty(); + } catch (PMException e) { + e.printStackTrace(); + return true; + } + }); + + return ascendants; + } + + @Override + public Collection computeAccessibleDescendants(UserContext userCtx, String root) throws PMException { + List descs = new ArrayList<>(graphQuerier.getAdjacentDescendants(root)); + descs.removeIf(desc -> { + try { + return computePrivileges(userCtx, desc).isEmpty(); + } catch (PMException e) { + e.printStackTrace(); + return true; + } + }); + + return descs; + } + + private void getAndStorePrivileges(Map arsetMap, UserDagResult userDagResult, String target) throws PMException { + TargetDagResult targetCtx = processTargetDAG(target, userDagResult); + AccessRightSet privileges = resolvePrivileges(userDagResult, targetCtx, target, store.operations().getResourceOperations()); + arsetMap.put(target, privileges); + } + + /** + * Perform a depth first search on the object side of the graph. Start at the target node and recursively visit nodes + * until a policy class is reached. On each node visited, collect any operation the user has on the target. At the + * end of each dfs iteration the visitedNodes map will contain the operations the user is permitted on the target under + * each policy class. + */ + protected TargetDagResult processTargetDAG(String target, UserDagResult userCtx) throws PMException { + if (!graphQuerier.nodeExists(target)) { + throw new NodeDoesNotExistException(target); + } + + Collection policyClasses = graphQuerier.getPolicyClasses(); + Map borderTargets = userCtx.borderTargets(); + Map> visitedNodes = new HashMap<>(); + Set reachedTargets = new HashSet<>(); + + Visitor visitor = node -> { + // mark the node as reached, to be used for resolving prohibitions + if (userCtx.prohibitionTargets().contains(node)) { + reachedTargets.add(node); + } + + Map nodeCtx = visitedNodes.getOrDefault(node, new HashMap<>()); + if (nodeCtx.isEmpty()) { + visitedNodes.put(node, nodeCtx); + } + + if (policyClasses.contains(node)) { + nodeCtx.put(node, new AccessRightSet()); + } else { + if (borderTargets.containsKey(node)) { + Set uaOps = borderTargets.get(node); + for (String pc : nodeCtx.keySet()) { + AccessRightSet pcOps = nodeCtx.getOrDefault(pc, new AccessRightSet()); + pcOps.addAll(uaOps); + nodeCtx.put(pc, pcOps); + } + } + } + }; + + Propagator propagator = (desc, asc) -> { + Map descCtx = visitedNodes.get(desc); + Map nodeCtx = visitedNodes.getOrDefault(asc, new HashMap<>()); + for (String name : descCtx.keySet()) { + AccessRightSet ops = nodeCtx.getOrDefault(name, new AccessRightSet()); + ops.addAll(descCtx.get(name)); + nodeCtx.put(name, ops); + } + visitedNodes.put(asc, nodeCtx); + }; + + new DepthFirstGraphWalker(graphQuerier) + .withDirection(Direction.DESCENDANTS) + .withVisitor(visitor) + .withPropagator(propagator) + .walk(target); + + return new TargetDagResult(visitedNodes.get(target), reachedTargets); + } + + /** + * Find the target nodes that are reachable by the subject via an association. This is done by a breadth first search + * starting at the subject node and walking up the user side of the graph until all user attributes the subject is assigned + * to have been visited. For each user attribute visited, get the associations it is the source of and store the + * target of that association as well as the operations in a map. If a target node is reached multiple times, add any + * new operations to the already existing ones. + * + * @return a Map of target nodes that the subject can reach via associations and the operations the user has on each. + */ + protected UserDagResult processUserDAG(String subject, String process) throws PMException { + if (!graphQuerier.nodeExists(subject)) { + throw new NodeDoesNotExistException(subject); + } + + final Map borderTargets = new HashMap<>(); + final Set prohibitionTargets = new HashSet<>(); + // initialize with the prohibitions or the provided process + final Set reachedProhibitions = new HashSet<>(prohibitionsQuerier.getProhibitionsWithSubject(process)); + + // get the associations for the subject, it the subject is a user, nothing will be returned + // this is only when a UA is the subject + Collection subjectAssociations = graphQuerier.getAssociationsWithSource(subject); + collectAssociationsFromBorderTargets(subjectAssociations, borderTargets); + + Visitor visitor = node -> { + Collection subjectProhibitions = prohibitionsQuerier.getProhibitionsWithSubject(node); + reachedProhibitions.addAll(subjectProhibitions); + for (Prohibition prohibition : subjectProhibitions) { + Collection containers = prohibition.getContainers(); + for (ContainerCondition cont : containers) { + prohibitionTargets.add(cont.getName()); + } + } + + Collection nodeAssociations = graphQuerier.getAssociationsWithSource(node); + collectAssociationsFromBorderTargets(nodeAssociations, borderTargets); + }; + + // start the bfs + new GraphStoreBFS(store.graph()) + .withDirection(Direction.DESCENDANTS) + .withVisitor(visitor) + .walk(subject); + + return new UserDagResult(borderTargets, reachedProhibitions, prohibitionTargets); + } + + private void collectAssociationsFromBorderTargets(Collection assocs, Map borderTargets) { + for (Association association : assocs) { + AccessRightSet ops = association.getAccessRightSet(); + AccessRightSet exOps = borderTargets.getOrDefault(association.getTarget(), new AccessRightSet()); + //if the target is not in the map already, put it + //else add the found operations to the existing ones. + exOps.addAll(ops); + borderTargets.put(association.getTarget(), exOps); + } + } + + private Set getDescendants(String vNode) throws PMException { + Set descendants = new HashSet<>(); + + Collection ascendants = graphQuerier.getAdjacentAscendants(vNode); + if (ascendants.isEmpty()) { + return descendants; + } + + descendants.addAll(ascendants); + for (String ascendant : ascendants) { + descendants.add(ascendant); + descendants.addAll(getDescendants(ascendant)); + } + + return descendants; + } + + private Hashtable>> findBorderOaPrivRestrictedInternal(UserContext userCtx) throws PMException { + // Uses a hashtable htReachableOas of reachable oas (see find_border_oa_priv(u)) + // An oa is a key in this hashtable. The value is another hashtable that + // represents a label of the oa. A label is a set of pairs {(op -> pcset)}, with + // the op being the key and pcset being the value. + // {oa -> {op -> pcset}}. + Hashtable>> htReachableOas = new Hashtable<>(); + + // BFS from u (the base node). Prepare a queue. + Set visited = new HashSet<>(); + String crtNode; + + // Get u's directly assigned attributes and put them into the queue. + Collection hsAttrs = graphQuerier.getAdjacentDescendants(userCtx.getUser()); + List queue = new ArrayList<>(hsAttrs); + + // While the queue has elements, extract an element from the queue + // and visit it. + while (!queue.isEmpty()) { + // Extract an ua from queue. + crtNode = queue.remove(0); + if (!visited.contains(crtNode)) { + // If the ua has ua -> oa edges + if (inMemUattrHasOpsets(crtNode)) { + // Find the set of PCs reachable from ua. + HashSet hsUaPcs = inMemFindPcSet(crtNode); + + // From each discovered ua traverse the edges ua -> oa. + + // Find the opsets of this user attribute. Note that the set of containers for this + // node (user attribute) may contain not only opsets. + Collection assocs = graphQuerier.getAssociationsWithSource(crtNode); + + // Go through the containers and only for opsets do the following. + // For each opset ops of ua: + for (Association assoc : assocs) { + String target = assoc.getTarget(); + // If oa is in htReachableOas + if (htReachableOas.containsKey(target)) { + // Then oa has a label op1 -> hsPcs1, op2 -> hsPcs2,... + // Extract its label: + Hashtable> htOaLabel = htReachableOas.get(target); + + // Get the operations from the opset: + AccessRightSet arSet = assoc.getAccessRightSet(); + // For each operation in the opset + for (String sOp : arSet) { + // If the oa's label already contains the operation sOp + if (htOaLabel.containsKey(sOp)) { + // The label contains op -> some pcset. + // Do the union of the old pc with ua's pcset + Set hsPcs = htOaLabel.get(sOp); + hsPcs.addAll(hsUaPcs); + } else { + // The op is not in the oa's label. + // Create new op -> ua's pcs mappiing in the label. + Set hsNewPcs = new HashSet<>(hsUaPcs); + htOaLabel.put(sOp, hsNewPcs); + } + } + } else { + // oa is not in htReachableOas. + // Prepare a new label + Hashtable> htOaLabel = new Hashtable<>(); + + // Get the operations from the opset: + AccessRightSet arSet = assoc.getAccessRightSet(); + // For each operation in the opset + for (String sOp : arSet) { + // Add op -> pcs to the label. + Set hsNewPcs = new HashSet<>(hsUaPcs); + htOaLabel.put(sOp, hsNewPcs); + } + + // Add oa -> {op -> pcs} + htReachableOas.put(target, htOaLabel); + } + } + } + visited.add(crtNode); + + Collection hsDescs = graphQuerier.getAdjacentDescendants(crtNode); + queue.addAll(hsDescs); + } + } + + + // For each reachable oa in htReachableOas.keys + for (Enumeration keys = htReachableOas.keys(); keys.hasMoreElements() ;) { + String oa = keys.nextElement(); + // Compute {pc | oa ->+ pc} + Set hsOaPcs = inMemFindPcSet(oa); + // Extract oa's label. + Hashtable> htOaLabel = htReachableOas.get(oa); + // The label contains op1 -> pcs1, op2 -> pcs2,... + // For each operation in the label + for (Enumeration lbl = htOaLabel.keys(); lbl.hasMoreElements();) { + String sOp = lbl.nextElement(); + // Intersect the pcset corresponding to this operation, + // which comes from the uas, with the oa's pcset. + Set oaPcs = htOaLabel.get(sOp); + oaPcs.retainAll(hsOaPcs); + if (oaPcs.isEmpty()) htOaLabel.remove(sOp); + } + } + + return htReachableOas; + } + + private HashSet inMemFindPcSet(String node) throws PMException { + HashSet reachable = new HashSet<>(); + + // Init the queue, visited + ArrayList queue = new ArrayList<>(); + HashSet visited = new HashSet<>(); + + // The current element + String crtNode; + + // Insert the start node into the queue + queue.add(node); + + Collection policyClasses = graphQuerier.getPolicyClasses(); + + // While queue is not empty + while (!queue.isEmpty()) { + // Extract current element from queue + crtNode = queue.remove(0); + // If not visited + if (!visited.contains(crtNode)) { + // Mark it as visited + visited.add(crtNode); + // Extract its direct descendants. If a descendant is an attribute, + // insert it into the queue. If it is a pc, add it to reachable, + // if not already there + Collection hsContainers = graphQuerier.getAdjacentDescendants(crtNode); + for (String n : hsContainers) { + if (policyClasses.contains(n)) { + reachable.add(n); + } else { + queue.add(n); + } + } + } + } + return reachable; + } + + private boolean inMemUattrHasOpsets(String uaNode) throws PMException { + return !graphQuerier.getAssociationsWithSource(uaNode).isEmpty(); + } + + /** + * Given a set of paths starting at a user, and a set of paths starting at an object, return the paths from + * the user to the target node (through an association) that belong to each policy class. A path is added to a policy + * class' entry in the returned map if the user path ends in an association in which the target of the association + * exists in a target path. That same target path must also end in a policy class. If the path does not end in a policy + * class the target path is ignored. + * + * @param userPaths the set of paths starting with a user. + * @param targetPaths the set of paths starting with a target node. + * @param target the name of the target node. + * @return the set of paths from a user to a target node (through an association) for each policy class in the system. + * @throws PMException if there is an exception traversing the graph + */ + public static Map resolvePaths(GraphQuerier graphQuerier, List userPaths, List targetPaths, String target) throws PMException { + Map results = new HashMap<>(); + + for (EdgePath targetPath : targetPaths) { + Relationship pcEdge = targetPath.getEdges().get(targetPath.getEdges().size()-1); + + // if the last element in the target path is a pc, the target belongs to that pc, add the pc to the results + // skip to the next target path if it is not a policy class + if (!isPolicyClass(graphQuerier, pcEdge.getTarget())) { + continue; + } + + PolicyClassExplain policyClass = results.getOrDefault(pcEdge.getTarget(), new PolicyClassExplain()); + + // compute the paths for this target path + Set paths = computeExplainPaths(userPaths, targetPath, target); + + // add all paths + Set existingPaths = policyClass.getPaths(); + existingPaths.addAll(paths); + + // collect all ops + for (Path p : paths) { + policyClass.getArset().addAll(p.getAssociation().getAccessRightSet()); + } + + // update results + results.put(pcEdge.getTarget(), policyClass); + } + + return results; + } + + public static boolean isPolicyClass(GraphQuerier graphQuerier, String node) throws PMException { + return graphQuerier.getPolicyClasses().contains(node); + } + + public static Set computeExplainPaths(List userEdgePaths, EdgePath targetEdgePath, String target) { + Set computedPaths = new HashSet<>(); + + for(EdgePath userEdgePath : userEdgePaths) { + Relationship lastUserEdge = userEdgePath.getEdges().get(userEdgePath.getEdges().size()-1); + + // if the last edge does not have any ops, it is not an association, so ignore it + if (!lastUserEdge.isAssociation()) { + continue; + } + + for(int i = 0; i < targetEdgePath.getEdges().size(); i++) { + Relationship curEdge = targetEdgePath.getEdges().get(i); + // if the target of the last edge in a user resolvedPath does not match the target of the current edge in the target + // resolvedPath, continue to the next target edge + String lastUserEdgeTarget = lastUserEdge.getTarget(); + String curEdgeSource = curEdge.getSource(); + String curEdgeTarget = curEdge.getTarget(); + + // if the target of the last edge in a user path does not match the target of the current edge in the target path + // AND if the target of the last edge in a user path does not match the source of the current edge in the target path + // OR if the target of the last edge in a user path does not match the target of the explain + // continue to the next target edge + if((!lastUserEdgeTarget.equals(curEdgeTarget)) && + (!lastUserEdgeTarget.equals(curEdgeSource) || !lastUserEdgeTarget.equals(target))) { + continue; + } + + List userPathToAssociation = userEdgePath.toPath(); + List targetPathToPolicyClass = targetEdgePath.toPath(); + + + Path path = new Path(userPathToAssociation, targetPathToPolicyClass, + new Association(lastUserEdge.getSource(), lastUserEdgeTarget, lastUserEdge.getAccessRightSet())); + + computedPaths.add(path); + } + } + + return computedPaths; + } + + private List explainDfs(String start) throws PMException { + List paths = new ArrayList<>(); + Map> propPaths = new HashMap<>(); + + Visitor visitor = nodeName -> { + Node node = graphQuerier.getNode(nodeName); + List nodePaths = new ArrayList<>(); + + for(String desc : graphQuerier.getAdjacentDescendants(nodeName)) { + Relationship edge = new Relationship(node.getName(), desc); + List descPaths = propPaths.get(desc); + if(descPaths.isEmpty()) { + EdgePath path = new EdgePath(); + path.addEdge(edge); + nodePaths.add(0, path); + } else { + for(EdgePath p : descPaths) { + EdgePath descPath = new EdgePath(); + for(Relationship e : p.getEdges()) { + descPath.addEdge(new Relationship(e.getSource(), e.getTarget(), e.getAccessRightSet())); + } + + descPath.getEdges().addFirst(edge); + nodePaths.add(descPath); + } + } + } + + Collection assocs = graphQuerier.getAssociationsWithSource(node.getName()); + for(Association association : assocs) { + Node targetNode = graphQuerier.getNode(association.getTarget()); + EdgePath path = new EdgePath(); + path.addEdge(new Relationship(node.getName(), targetNode.getName(), association.getAccessRightSet())); + nodePaths.add(path); + } + + // if the node being visited is the start node, add all the found nodePaths + // we don't need the if for users, only when the target is an OA, so it might have something to do with + // leafs vs non leafs + if (node.getName().equals(start)) { + paths.clear(); + paths.addAll(nodePaths); + } else { + propPaths.put(node.getName(), nodePaths); + } + }; + + Propagator propagator = (desc, asc) -> { + Node descNode = graphQuerier.getNode(desc); + Node ascNode = graphQuerier.getNode(asc); + List ascPaths = propPaths.computeIfAbsent(ascNode.getName(), k -> new ArrayList<>()); + List descPaths = propPaths.get(descNode.getName()); + + for(EdgePath p : descPaths) { + EdgePath path = new EdgePath(); + for(Relationship edge : p.getEdges()) { + path.addEdge(new Relationship(edge.getSource(), edge.getTarget(), edge.getAccessRightSet())); + } + + EdgePath newPath = new EdgePath(); + newPath.getEdges().addAll(path.getEdges()); + Relationship edge = new Relationship(ascNode.getName(), descNode.getName(), null); + newPath.getEdges().add(0, edge); + ascPaths.add(newPath); + propPaths.put(ascNode.getName(), ascPaths); + } + + if (ascNode.getName().equals(start)) { + paths.clear(); + paths.addAll(propPaths.get(ascNode.getName())); + } + }; + + new DepthFirstGraphWalker(graphQuerier) + .withVisitor(visitor) + .withPropagator(propagator) + .withDirection(Direction.DESCENDANTS) + .walk(start); + + return paths; + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPAP.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPAP.java new file mode 100644 index 000000000..6ca3a7f40 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPAP.java @@ -0,0 +1,46 @@ +package gov.nist.csd.pm.impl.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.store.MemoryPolicyStore; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.PolicyQuerier; + +public class MemoryPAP extends PAP { + + private final MemoryPolicyQuerier querier; + + public MemoryPAP() throws PMException { + super(new MemoryPolicyStore()); + this.querier = new MemoryPolicyQuerier(policyStore()); + } + + public MemoryPAP(MemoryPolicyStore store) throws PMException { + super(store); + this.querier = new MemoryPolicyQuerier(policyStore()); + } + + public MemoryPAP(PAP pap) throws PMException { + super(pap); + this.querier = new MemoryPolicyQuerier(policyStore()); + } + + @Override + public PolicyQuerier query() { + return querier; + } + + @Override + public void beginTx() throws PMException { + policyStore.beginTx(); + } + + @Override + public void commit() throws PMException { + policyStore.commit(); + } + + @Override + public void rollback() throws PMException { + policyStore.rollback(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPolicyQuerier.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPolicyQuerier.java new file mode 100644 index 000000000..c0eee271d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/MemoryPolicyQuerier.java @@ -0,0 +1,19 @@ +package gov.nist.csd.pm.impl.memory.pap; + +import gov.nist.csd.pm.pap.query.*; +import gov.nist.csd.pm.pap.store.PolicyStore; + +public class MemoryPolicyQuerier extends PolicyQuerier { + + private final MemoryAccessQuerier accessQuerier; + + public MemoryPolicyQuerier(PolicyStore policyStore) { + super(policyStore); + this.accessQuerier = new MemoryAccessQuerier(policyStore, graph(), prohibitions()); + } + + @Override + public MemoryAccessQuerier access() { + return accessQuerier; + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryGraphStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryGraphStore.java new file mode 100644 index 000000000..7466fabbd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryGraphStore.java @@ -0,0 +1,372 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.Direction; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.store.GraphStore; +import gov.nist.csd.pm.pap.store.GraphStoreDFS; + +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; +import static gov.nist.csd.pm.pap.graph.node.Properties.WILDCARD; + +public class MemoryGraphStore extends MemoryStore implements GraphStore { + + public MemoryGraphStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + super(policy, tx, txCmdTracker); + } + + @Override + public void createNode(String name, NodeType type) throws PMException { + + if (type == PC) { + policy.pcs.add(name); + VertexPolicyClass vertexPolicyClass = new VertexPolicyClass(name); + policy.graph.put(name, vertexPolicyClass); + } else if (type == OA || type == UA) { + VertexAttribute vertexAttribute = new VertexAttribute(name, type); + policy.graph.put(name, vertexAttribute); + } else if (type == O || type == U) { + VertexLeaf vertexLeaf = new VertexLeaf(name, type); + policy.graph.put(name, vertexLeaf); + } + + txCmdTracker.trackOp(tx, new TxCmd.CreateNodeTxCmd(name)); + } + + @Override + public void deleteNode(String name) throws PMException { + Vertex vertex = policy.graph.get(name); + + if (vertex == null) { + return; + } + + Collection descs = vertex.getAdjacentDescendants(); + Collection incomingAssociations = vertex.getIncomingAssociations(); + Collection outgoingAssociations = vertex.getOutgoingAssociations(); + + for (String desc : descs) { + deleteAssignment(name, desc); + } + + for (Association association : incomingAssociations) { + Vertex v = policy.graph.get(association.getSource()); + if(v == null) { + continue; + } + + deleteAssociation(association.getSource(), association.getTarget()); + } + + for (Association association : outgoingAssociations) { + Vertex v = policy.graph.get(association.getTarget()); + if(v == null) { + continue; + } + + deleteAssociation(association.getSource(), association.getTarget()); + } + + policy.graph.remove(name); + + if (vertex.getType() == PC) { + policy.pcs.remove(name); + } + + txCmdTracker.trackOp(tx, new TxCmd.DeleteNodeTxCmd( + name, + new Node(vertex.name, vertex.type, vertex.getProperties()), + vertex.getAdjacentDescendants() + )); + } + + @Override + public void setNodeProperties(String name, Map newProperties) throws PMException { + Vertex vertex = policy.graph.get(name); + Map oldProperties = vertex.getProperties(); + + if (oldProperties.isEmpty() && newProperties.isEmpty()) { + return; + } + + if (vertex instanceof VertexWithProps vertexWithProps) { + if (newProperties.isEmpty()) { + policy.graph.put(name, vertexWithProps.getVertex()); + } else { + policy.graph.put(name, new VertexWithProps(vertexWithProps.getVertex(), newProperties)); + } + } else { + policy.graph.put(name, new VertexWithProps(vertex, newProperties)); + } + + txCmdTracker.trackOp(tx, new TxCmd.SetNodePropertiesTxCmd(name, oldProperties, newProperties)); + } + + @Override + public void createAssignment(String start, String end) throws PMException { + policy.graph.get(start).addAssignment(start, end); + policy.graph.get(end).addAssignment(start, end); + + txCmdTracker.trackOp(tx, new TxCmd.CreateAssignmentTxCmd(start, end)); + } + + @Override + public void deleteAssignment(String start, String end) throws PMException { + policy.graph.get(start).deleteAssignment(start, end); + policy.graph.get(end).deleteAssignment(start, end); + + txCmdTracker.trackOp(tx, new TxCmd.DeleteAssignmentTxCmd(start, end)); + } + + @Override + public void createAssociation(String ua, String target, AccessRightSet arset) throws PMException { + deleteAssociation(ua, target); + policy.graph.get(ua).addAssociation(ua, target, arset); + policy.graph.get(target).addAssociation(ua, target, arset); + + txCmdTracker.trackOp(tx, new TxCmd.CreateAssociationTxCmd(ua, target)); + } + + @Override + public void deleteAssociation(String ua, String target) throws PMException { + Vertex vertex = policy.graph.get(ua); + + AccessRightSet accessRightSet = new AccessRightSet(); + for (Association association : vertex.getOutgoingAssociations()) { + if (association.getTarget().equals(target)) { + accessRightSet = association.getAccessRightSet(); + } + } + + policy.graph.get(ua).deleteAssociation(ua, target); + policy.graph.get(target).deleteAssociation(ua, target); + + txCmdTracker.trackOp(tx, new TxCmd.DeleteAssociationTxCmd(ua, target, accessRightSet)); + } + + @Override + public Node getNode(String name) throws PMException { + Vertex vertex = policy.graph.get(name); + return new Node(vertex.getName(), vertex.getType(), vertex.getProperties()); + } + + @Override + public boolean nodeExists(String name) throws PMException { + return policy.graph.containsKey(name); + } + + @Override + public Collection search(NodeType type, Map properties) throws PMException { + List nodes = filterByType(type); + return filterByProperties(nodes, properties); + } + + @Override + public Collection getPolicyClasses() throws PMException { + return new ArrayList<>(policy.pcs); + } + + @Override + public Collection getAdjacentDescendants(String name) throws PMException { + return policy.graph.get(name).getAdjacentDescendants(); + } + + @Override + public Collection getAdjacentAscendants(String name) throws PMException { + return policy.graph.get(name).getAdjacentAscendants(); + } + + @Override + public Collection getAssociationsWithSource(String ua) throws PMException { + return policy.graph.get(ua).getOutgoingAssociations(); + } + + @Override + public Collection getAssociationsWithTarget(String target) throws PMException { + return policy.graph.get(target).getIncomingAssociations(); + } + + @Override + public Collection getAscendants(String node) throws PMException { + Set ascs = new HashSet<>(); + + new GraphStoreDFS(this) + .withDirection(Direction.ASCENDANTS) + .withVisitor(n -> { + ascs.add(n); + }) + .walk(node); + + ascs.remove(node); + + return ascs; + } + + @Override + public Collection getPolicyClassDescendants(String node) throws PMException { + Set pcs = new HashSet<>(); + + new GraphStoreDFS(this) + .withDirection(Direction.DESCENDANTS) + .withVisitor((n) -> { + Node visitedNode; + visitedNode = getNode(n); + if (visitedNode.getType().equals(PC)) { + pcs.add(n); + } + }) + .walk(node); + + pcs.remove(node); + + return pcs; + } + + @Override + public Collection getAttributeDescendants(String node) throws PMException { + Set attrs = new HashSet<>(); + + new GraphStoreDFS(this) + .withDirection(Direction.DESCENDANTS) + .withVisitor((n) -> { + Node visitedNode; + visitedNode = getNode(n); + if (visitedNode.getType().equals(UA) || + visitedNode.getType().equals(OA)) { + attrs.add(n); + } + }) + .walk(node); + + attrs.remove(node); + + return attrs; + } + + @Override + public Collection getDescendants(String node) throws PMException { + Set descs = new HashSet<>(); + + new GraphStoreDFS(this) + .withDirection(Direction.DESCENDANTS) + .withVisitor(descs::add) + .walk(node); + + descs.remove(node); + + return descs; + } + + @Override + public boolean isAscendant(String asc, String dsc) throws PMException { + AtomicBoolean found = new AtomicBoolean(false); + + new GraphStoreDFS(this) + .withDirection(Direction.ASCENDANTS) + .withVisitor((n) -> { + if (n.equals(asc)) { + found.set(true); + } + }) + .withAllPathShortCircuit(n -> n.equals(asc)) + .walk(dsc); + + return found.get(); + } + + @Override + public boolean isDescendant(String asc, String dsc) throws PMException { + AtomicBoolean found = new AtomicBoolean(false); + + new GraphStoreDFS(this) + .withDirection(Direction.DESCENDANTS) + .withVisitor((n) -> { + if (n.equals(dsc)) { + found.set(true); + } + }) + .withAllPathShortCircuit(n -> n.equals(dsc)) + .walk(asc); + + return found.get(); + } + + private List filterByProperties(List nodes, Map properties) throws PMException { + List results = new ArrayList<>(); + if (properties.isEmpty()) { + results.addAll(nodes); + } else { + for (String n : nodes) { + Map nodeProperties = getNode(n).getProperties(); + + if (!hasAllKeys(nodeProperties, properties) + || !valuesMatch(nodeProperties, properties)) { + continue; + } + + results.add(n); + } + } + + return results; + } + + private List filterByType(NodeType type) { + List nodes = new ArrayList<>(); + + // return all nodes if type is ANY + if (type == ANY) { + for (Map.Entry node : policy.graph.entrySet()) { + nodes.add(node.getKey()); + } + + return nodes; + } + + // return pcs from separate set if type is PC + if (type == PC) { + nodes.addAll(policy.pcs); + + return nodes; + } + + // get other node types that match + for (Map.Entry node : policy.graph.entrySet()) { + Vertex vertex = node.getValue(); + if (vertex.type == type) { + nodes.add(node.getKey()); + } + } + + return nodes; + } + + private boolean valuesMatch(Map nodeProperties, Map checkProperties) { + for (Map.Entry entry : checkProperties.entrySet()) { + String checkKey = entry.getKey(); + String checkValue = entry.getValue(); + if (!checkValue.equals(nodeProperties.get(checkKey)) + && !checkValue.equals(WILDCARD)) { + return false; + } + } + + return true; + } + + private boolean hasAllKeys(Map nodeProperties, Map checkProperties) { + for (String key : checkProperties.keySet()) { + if (!nodeProperties.containsKey(key)) { + return false; + } + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryObligationsStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryObligationsStore.java new file mode 100644 index 000000000..2ec976bb9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryObligationsStore.java @@ -0,0 +1,74 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.exception.ObligationDoesNotExistException; +import gov.nist.csd.pm.pap.store.ObligationsStore; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +class MemoryObligationsStore extends MemoryStore implements ObligationsStore { + + public MemoryObligationsStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + super(policy, tx, txCmdTracker); + } + + @Override + public void createObligation(String author, String name, List rules) throws PMException { + Obligation obligation = new Obligation(author, name, rules.stream().toList()); + + policy.obligations.add(obligation); + + txCmdTracker.trackOp(tx, new TxCmd.CreateObligationTxCmd(obligation)); + } + + @Override + public Collection getObligations() throws PMException { + return policy.obligations; + } + + @Override + public boolean obligationExists(String name) throws PMException { + for (Obligation o : policy.obligations) { + if (o.getName().equals(name)) { + return true; + } + } + + return false; + } + + @Override + public Obligation getObligation(String name) throws ObligationDoesNotExistException { + for (Obligation obligation : policy.obligations) { + if (obligation.getName().equals(name)) { + return obligation; + } + } + + throw new ObligationDoesNotExistException(name); + } + + @Override + public Collection getObligationsWithAuthor(String user) throws PMException { + List obls = new ArrayList<>(); + for (Obligation obligation : getObligations()) { + if (obligation.getAuthor().equals(user)) { + obls.add(obligation); + } + } + + return obls; + } + + @Override + public void deleteObligation(String name) throws PMException { + Obligation old = getObligation(name); + policy.obligations.removeIf(o -> o.getName().equals(name)); + txCmdTracker.trackOp(tx, new TxCmd.DeleteObligationTxCmd(old)); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryOperationsStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryOperationsStore.java new file mode 100644 index 000000000..7c08cd351 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryOperationsStore.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.store.OperationsStore; + +import java.util.ArrayList; +import java.util.Collection; + +public class MemoryOperationsStore extends MemoryStore implements OperationsStore { + + public MemoryOperationsStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + super(policy, tx, txCmdTracker); + } + + @Override + public void setResourceOperations(AccessRightSet accessRightSet) throws PMException { + AccessRightSet old = new AccessRightSet(policy.resourceOperations); + + policy.resourceOperations = accessRightSet; + + txCmdTracker.trackOp(tx, new TxCmd.SetResourceOperationsTxCmd( + old, + accessRightSet) + ); + } + + @Override + public void createAdminOperation(Operation operation) throws PMException { + policy.operations.put(operation.getName(), operation); + } + + @Override + public void deleteAdminOperation(String operation) throws PMException { + policy.operations.remove(operation); + } + + @Override + public AccessRightSet getResourceOperations() throws PMException { + return policy.resourceOperations; + } + + @Override + public Collection getAdminOperationNames() throws PMException { + return new ArrayList<>(policy.operations.keySet()); + } + + @Override + public Operation getAdminOperation(String operationName) throws PMException { + return policy.operations.get(operationName); + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicy.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicy.java new file mode 100644 index 000000000..ab9a46a6a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicy.java @@ -0,0 +1,36 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.routine.Routine; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +import java.util.*; + +public class MemoryPolicy { + + protected Map graph; + protected AccessRightSet resourceOperations; + protected Set pcs; + protected Map> prohibitions; + protected List obligations; + protected Map> operations; + protected Map> routines; + + public MemoryPolicy() { + reset(); + } + + public void reset() { + this.graph = new Object2ObjectOpenHashMap<>(); + this.pcs = new ObjectOpenHashSet<>(); + this.resourceOperations = new AccessRightSet(); + this.prohibitions = new HashMap<>(); + this.obligations = new ArrayList<>(); + this.operations = new HashMap<>(); + this.routines = new HashMap<>(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicyStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicyStore.java new file mode 100644 index 000000000..e4851a6f9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryPolicyStore.java @@ -0,0 +1,91 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.store.*; + +import java.util.List; + +public class MemoryPolicyStore implements PolicyStore { + + private TxCmdTracker txCmdTracker; + private MemoryTx tx; + private MemoryPolicy policy; + + private MemoryGraphStore graph; + private MemoryProhibitionsStore prohibitions; + private MemoryObligationsStore obligations; + private MemoryOperationsStore operations; + private MemoryRoutinesStore routines; + + public MemoryPolicyStore() { + this.policy = new MemoryPolicy(); + this.tx = new MemoryTx(); + this.txCmdTracker = new TxCmdTracker(); + + this.graph = new MemoryGraphStore(policy, tx, txCmdTracker); + this.prohibitions = new MemoryProhibitionsStore(policy, tx, txCmdTracker); + this.obligations = new MemoryObligationsStore(policy, tx, txCmdTracker); + this.operations = new MemoryOperationsStore(policy, tx, txCmdTracker); + this.routines = new MemoryRoutinesStore(policy, tx, txCmdTracker); + } + + @Override + public MemoryGraphStore graph() { + return graph; + } + + @Override + public MemoryProhibitionsStore prohibitions() { + return prohibitions; + } + + @Override + public MemoryObligationsStore obligations() { + return obligations; + } + + @Override + public MemoryOperationsStore operations() { + return operations; + } + + @Override + public MemoryRoutinesStore routines() { + return routines; + } + + @Override + public void reset() { + policy.reset(); + } + + @Override + public void beginTx() throws PMException { + tx.beginTx(); + } + + @Override + public void commit() { + tx.commit(); + + if (tx.getCounter() == 0) { + txCmdTracker.clearOps(); + } + } + + @Override + public void rollback() throws PMException { + tx.rollback(); + + List events = txCmdTracker.getOperations(); + for (TxCmd txCmd : events) { + try { + txCmd.rollback(this); + } catch (PMException e) { + throw new PMException("error during tx rollback", e); + } + } + + txCmdTracker.clearOps(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryProhibitionsStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryProhibitionsStore.java new file mode 100644 index 000000000..92fc70f2f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryProhibitionsStore.java @@ -0,0 +1,96 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.exception.ProhibitionDoesNotExistException; +import gov.nist.csd.pm.pap.store.ProhibitionsStore; + +import java.util.*; + +public class MemoryProhibitionsStore extends MemoryStore implements ProhibitionsStore { + + public MemoryProhibitionsStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + super(policy, tx, txCmdTracker); + } + + @Override + public void createProhibition(String name, + ProhibitionSubject subject, + AccessRightSet accessRightSet, + boolean intersection, + Collection containerConditions) { + List existingPros = new ArrayList<>(policy.prohibitions.getOrDefault( + subject.getName(), + new ArrayList<>() + )); + + Prohibition p = new Prohibition( + name, + subject, + accessRightSet, + intersection, + containerConditions.stream().toList() + ); + + existingPros.add(p); + + policy.prohibitions.put(subject.getName(), existingPros); + + txCmdTracker.trackOp(tx, new TxCmd.CreateProhibitionTxCmd(p)); + } + + @Override + public void deleteProhibition(String name) throws PMException { + Prohibition old = getProhibition(name); + + for (String subject : policy.prohibitions.keySet()) { + Collection ps = policy.prohibitions.getOrDefault(subject, new ArrayList<>()); + ps.removeIf(p -> p.getName().equals(name)); + + if (ps.isEmpty()) { + policy.prohibitions.remove(subject); + } else { + policy.prohibitions.put(subject, ps); + } + } + + if(old != null) { + txCmdTracker.trackOp(tx, new TxCmd.DeleteProhibitionTxCmd(old)); + } + } + + @Override + public Map> getProhibitions() throws PMException { + return policy.prohibitions; + } + + @Override + public Prohibition getProhibition(String name) throws PMException { + for (String subject : policy.prohibitions.keySet()) { + Collection subjectPros = policy.prohibitions.getOrDefault(subject, new ArrayList<>()); + for (Prohibition p : subjectPros) { + if (p.getName().equals(name)) { + return p; + } + } + } + + throw new ProhibitionDoesNotExistException(name); + } + + @Override + public boolean prohibitionExists(String name) throws PMException { + for (Map.Entry> e : policy.prohibitions.entrySet()) { + for (Prohibition p : e.getValue()) { + if (p.getName().equals(name)) { + return true; + } + } + } + + return false; + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryRoutinesStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryRoutinesStore.java new file mode 100644 index 000000000..ed95918bb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryRoutinesStore.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pap.store.RoutinesStore; + +import java.util.ArrayList; +import java.util.Collection; + +public class MemoryRoutinesStore extends MemoryStore implements RoutinesStore { + public MemoryRoutinesStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + super(policy, tx, txCmdTracker); + } + + @Override + public void createAdminRoutine(Routine routine) throws PMException { + policy.routines.put(routine.getName(), routine); + + txCmdTracker.trackOp(tx, new TxCmd.CreateAdminRoutine(routine)); + } + + @Override + public void deleteAdminRoutine(String name) throws PMException { + Routine routine = policy.routines.get(name); + + policy.routines.remove(name); + + txCmdTracker.trackOp(tx, new TxCmd.DeleteAdminRoutine(routine)); + } + + @Override + public Collection getAdminRoutineNames() throws PMException { + return new ArrayList<>(policy.routines.keySet()); + } + + @Override + public Routine getAdminRoutine(String routineName) throws PMException { + return policy.routines.get(routineName); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryStore.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryStore.java new file mode 100644 index 000000000..464d32b1e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryStore.java @@ -0,0 +1,32 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.tx.Transactional; + +public class MemoryStore implements Transactional { + + protected MemoryPolicy policy; + protected MemoryTx tx; + protected TxCmdTracker txCmdTracker; + + public MemoryStore(MemoryPolicy policy, MemoryTx tx, TxCmdTracker txCmdTracker) { + this.policy = policy; + this.tx = tx; + this.txCmdTracker = txCmdTracker; + } + + @Override + public final void beginTx() throws PMException { + tx.beginTx(); + } + + @Override + public final void commit() throws PMException { + tx.commit(); + } + + @Override + public final void rollback() throws PMException { + tx.rollback(); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryTx.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryTx.java new file mode 100644 index 000000000..13624f330 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/MemoryTx.java @@ -0,0 +1,75 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.tx.Transactional; + +import java.util.Objects; + +public class MemoryTx implements Transactional { + private boolean active; + private int counter; + + public MemoryTx() { + active = false; + counter = 0; + } + + public MemoryTx(boolean active, int counter) { + this.active = active; + this.counter = counter; + } + + public boolean isActive() { + return active; + } + + public void setActive(boolean active) { + this.active = active; + } + + public int getCounter() { + return counter; + } + + public void setCounter(int counter) { + this.counter = counter; + } + + @Override + public void beginTx() { + active = true; + counter++; + } + + @Override + public void commit() { + counter--; + active = counter != 0; + } + + @Override + public void rollback() { + counter = 0; + active = false; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MemoryTx memoryTx = (MemoryTx) o; + return active == memoryTx.active && counter == memoryTx.counter; + } + + @Override + public int hashCode() { + return Objects.hash(active, counter); + } + + @Override + public String toString() { + return "MemoryTx{" + + "active=" + active + + ", counter=" + counter + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmd.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmd.java new file mode 100644 index 000000000..a5e405ffe --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmd.java @@ -0,0 +1,254 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.Collection; +import java.util.Map; + +public abstract class TxCmd implements TxRollbackSupport { + + static class SetResourceOperationsTxCmd extends TxCmd { + + private AccessRightSet oldAccessRights; + private AccessRightSet newAccessRights; + + public SetResourceOperationsTxCmd(AccessRightSet oldAccessRights, AccessRightSet newAccessRights) { + this.oldAccessRights = oldAccessRights; + this.newAccessRights = newAccessRights; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.operations().setResourceOperations(oldAccessRights); + } + } + + static class CreatePolicyClassTxCmd extends TxCmd { + + private String name; + private Map properties; + + public CreatePolicyClassTxCmd(String name, Map properties) { + this.name = name; + this.properties = properties; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().deleteNode(name); + } + } + + static class CreateNodeTxCmd extends TxCmd { + + private final String name; + + public CreateNodeTxCmd(String name) { + this.name = name; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().deleteNode(name); + } + } + + static class SetNodePropertiesTxCmd extends TxCmd { + private final String name; + private final Map oldProperties; + private final Map newProperties; + + public SetNodePropertiesTxCmd(String name, Map oldProperties, Map newProperties) { + this.name = name; + this.oldProperties = oldProperties; + this.newProperties = newProperties; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().setNodeProperties(name, oldProperties); + } + } + + static class DeleteNodeTxCmd extends TxCmd { + private final String name; + private final Node nodeToDelete; + private final Collection descendants; + + public DeleteNodeTxCmd(String name, Node nodeToDelete, Collection descendants) { + this.name = name; + this.nodeToDelete = nodeToDelete; + this.descendants = descendants; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + NodeType type = nodeToDelete.getType(); + Map properties = nodeToDelete.getProperties(); + + memoryPolicyStore.graph().createNode(name, nodeToDelete.getType()); + + for (String descendant : descendants) { + memoryPolicyStore.graph().createAssignment(name, descendant); + } + } + } + + static final class CreateAssignmentTxCmd extends TxCmd { + private final String ascendant; + private final String descendant; + + public CreateAssignmentTxCmd(String ascendant, String descendant) { + this.ascendant = ascendant; + this.descendant = descendant; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().deleteAssignment(ascendant, descendant); + } + } + + static class DeleteAssignmentTxCmd extends TxCmd { + private final String ascendant; + private final String descendant; + + public DeleteAssignmentTxCmd(String ascendant, String descendant) { + this.ascendant = ascendant; + this.descendant = descendant; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().createAssignment(ascendant, descendant); + } + } + + static class CreateAssociationTxCmd extends TxCmd { + + private final String source; + private final String target; + + public CreateAssociationTxCmd(String source, String target) { + this.source = source; + this.target = target; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().deleteAssociation(source, target); + } + } + + static class DeleteAssociationTxCmd extends TxCmd { + private String ua; + private String target; + private AccessRightSet accessRightSet; + + public DeleteAssociationTxCmd(String ua, String target, AccessRightSet accessRightSet) { + this.ua = ua; + this.target = target; + this.accessRightSet = accessRightSet; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.graph().createAssociation(ua, target, accessRightSet); + } + } + + static class CreateProhibitionTxCmd extends TxCmd { + private final Prohibition prohibition; + + public CreateProhibitionTxCmd(Prohibition prohibition) { + this.prohibition = prohibition; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.prohibitions().deleteProhibition(prohibition.getName()); + } + } + + static class DeleteProhibitionTxCmd extends TxCmd { + private final Prohibition prohibitionToDelete; + + public DeleteProhibitionTxCmd(Prohibition prohibitionToDelete) { + this.prohibitionToDelete = prohibitionToDelete; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.prohibitions().createProhibition( + prohibitionToDelete.getName(), + prohibitionToDelete.getSubject(), + prohibitionToDelete.getAccessRightSet(), + prohibitionToDelete.isIntersection(), + prohibitionToDelete.getContainers() + ); + } + } + + static class CreateObligationTxCmd extends TxCmd { + private final Obligation obligation; + + public CreateObligationTxCmd(Obligation obligation) { + this.obligation = obligation; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.obligations().deleteObligation(obligation.getName()); + } + } + + static class DeleteObligationTxCmd extends TxCmd { + private final Obligation obligationToDelete; + public DeleteObligationTxCmd(Obligation obligationToDelete) { + this.obligationToDelete = obligationToDelete; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.obligations().createObligation( + obligationToDelete.getAuthor(), + obligationToDelete.getName(), + obligationToDelete.getRules() + ); + } + } + + static class CreateAdminRoutine extends TxCmd { + + private Routine routine; + + public CreateAdminRoutine(Routine routine) { + this.routine = routine; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.routines().deleteAdminRoutine(routine.getName()); + } + } + + static class DeleteAdminRoutine extends TxCmd { + + private Routine routine; + + public DeleteAdminRoutine(Routine routine) { + this.routine = routine; + } + + @Override + public void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException { + memoryPolicyStore.routines().createAdminRoutine(routine); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmdTracker.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmdTracker.java new file mode 100644 index 000000000..c2d20bdfb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxCmdTracker.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class TxCmdTracker { + + private final List operations; + + public TxCmdTracker() { + operations = new ArrayList<>(); + } + + public List getOperations() { + List copy = new ArrayList<>(operations); + + Collections.reverse(copy); + + return copy; + } + + public void trackOp(MemoryTx tx, TxCmd op) { + if (!tx.isActive()) { + return; + } + + this.operations.add(op); + } + + public void clearOps() { + this.operations.clear(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxRollbackSupport.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxRollbackSupport.java new file mode 100644 index 000000000..7d2debcf9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/TxRollbackSupport.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface TxRollbackSupport { + void rollback(MemoryPolicyStore memoryPolicyStore) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/Vertex.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/Vertex.java new file mode 100644 index 000000000..694939be3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/Vertex.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; + +import java.util.Collection; +import java.util.Map; + +public abstract class Vertex { + + protected String name; + protected NodeType type; + + public Vertex(String name, NodeType type) { + this.name = name; + this.type = type; + } + + protected String getName() { + return name; + } + + protected NodeType getType() { + return type; + } + + protected abstract Map getProperties(); + + protected abstract Collection getAdjacentDescendants(); + protected abstract Collection getAdjacentAscendants(); + protected abstract Collection getOutgoingAssociations(); + protected abstract Collection getIncomingAssociations(); + + protected abstract void addAssignment(String ascendant, String descendant); + protected abstract void deleteAssignment(String ascendant, String descendant); + protected abstract void addAssociation(String ua, String target, AccessRightSet accessRightSet); + protected abstract void deleteAssociation(String ua, String target); + +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexAttribute.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexAttribute.java new file mode 100644 index 000000000..175f18995 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexAttribute.java @@ -0,0 +1,87 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +import java.util.HashMap; +import java.util.Map; + +class VertexAttribute extends Vertex { + + private ObjectOpenHashSet descendants; + private ObjectOpenHashSet ascendants; + private ObjectOpenHashSet outgoingAssociations; + private ObjectOpenHashSet incomingAssociations; + + public VertexAttribute(String name, NodeType type) { + super(name, type); + this.descendants = new ObjectOpenHashSet<>(); + this.ascendants = new ObjectOpenHashSet<>(); + this.outgoingAssociations = new ObjectOpenHashSet<>(); + this.incomingAssociations = new ObjectOpenHashSet<>(); + } + + @Override + protected Map getProperties() { + return new HashMap<>(); + } + + @Override + public ObjectOpenHashSet getAdjacentDescendants() { + return new ObjectOpenHashSet<>(descendants); + } + + @Override + public ObjectOpenHashSet getAdjacentAscendants() { + return new ObjectOpenHashSet<>(ascendants); + } + + @Override + public ObjectOpenHashSet getOutgoingAssociations() { + return new ObjectOpenHashSet<>(outgoingAssociations); + } + + @Override + public ObjectOpenHashSet getIncomingAssociations() { + return new ObjectOpenHashSet<>(incomingAssociations); + } + + @Override + protected void addAssignment(String ascendant, String descendant) { + if (ascendant.equals(name)) { + descendants.add(descendant); + } else { + ascendants.add(ascendant); + } + } + + @Override + protected void deleteAssignment(String ascendant, String descendant) { + if (ascendant.equals(name)) { + descendants.remove(descendant); + } else { + ascendants.remove(ascendant); + } + } + + @Override + public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { + if (ua.equals(name)) { + outgoingAssociations.add(new Association(ua, target, accessRightSet)); + } else { + incomingAssociations.add(new Association(ua, target, accessRightSet)); + } + } + + @Override + public void deleteAssociation(String ua, String target) { + if (ua.equals(name)) { + outgoingAssociations.removeIf(a -> a.getSource().equals(ua) && a.getTarget().equals(target)); + } else { + incomingAssociations.removeIf(a -> a.getSource().equals(ua) && a.getTarget().equals(target)); + } + } +} + diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexLeaf.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexLeaf.java new file mode 100644 index 000000000..724944e9b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexLeaf.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +import java.util.HashMap; +import java.util.Map; + +class VertexLeaf extends Vertex { + + private ObjectOpenHashSet descendants; + + public VertexLeaf(String name, NodeType type) { + super(name, type); + this.descendants = new ObjectOpenHashSet<>(); + } + + @Override + protected Map getProperties() { + return new HashMap<>(); + } + + @Override + protected ObjectOpenHashSet getAdjacentDescendants() { + return new ObjectOpenHashSet<>(descendants); + } + + @Override + protected ObjectOpenHashSet getAdjacentAscendants() { + return new ObjectOpenHashSet<>(); + } + + @Override + protected ObjectOpenHashSet getOutgoingAssociations() { + return new ObjectOpenHashSet<>(); + } + + @Override + protected ObjectOpenHashSet getIncomingAssociations() { + return new ObjectOpenHashSet<>(); + } + + @Override + public void addAssignment(String ascendant, String descendant) { + descendants.add(descendant); + } + + @Override + public void deleteAssignment(String ascendant, String descendant) { + descendants.remove(descendant); + } + + @Override + public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { + + } + + @Override + public void deleteAssociation(String ua, String target) { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexPolicyClass.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexPolicyClass.java new file mode 100644 index 000000000..8d93eac37 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexPolicyClass.java @@ -0,0 +1,68 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +import java.util.HashMap; +import java.util.Map; + +class VertexPolicyClass extends Vertex { + private ObjectOpenHashSet ascendants; + + public VertexPolicyClass(String name) { + super(name, NodeType.PC); + this.ascendants = new ObjectOpenHashSet<>(); + } + + public VertexPolicyClass(String name, ObjectOpenHashSet ascendants) { + super(name, NodeType.PC); + this.ascendants = ascendants; + } + + @Override + protected Map getProperties() { + return new HashMap<>(); + } + + @Override + protected ObjectOpenHashSet getAdjacentDescendants() { + return new ObjectOpenHashSet<>(); + } + + @Override + protected ObjectOpenHashSet getAdjacentAscendants() { + return new ObjectOpenHashSet<>(ascendants); + } + + @Override + protected ObjectOpenHashSet getOutgoingAssociations() { + return new ObjectOpenHashSet<>(); + } + + @Override + protected ObjectOpenHashSet getIncomingAssociations() { + return new ObjectOpenHashSet<>(); + } + + @Override + public void addAssignment(String ascendant, String descendant) { + ascendants.add(ascendant); + } + + @Override + public void deleteAssignment(String ascendant, String descendant) { + ascendants.remove(ascendant); + } + + @Override + public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { + + } + + @Override + public void deleteAssociation(String ua, String target) { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexWithProps.java b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexWithProps.java new file mode 100644 index 000000000..ddbc2f45c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/impl/memory/pap/store/VertexWithProps.java @@ -0,0 +1,68 @@ +package gov.nist.csd.pm.impl.memory.pap.store; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; + +import java.util.Collection; +import java.util.Map; + +public class VertexWithProps extends Vertex{ + + private Vertex vertex; + private Map properties; + + public VertexWithProps(Vertex vertex, Map properties) { + super(vertex.name, vertex.type); + this.vertex = vertex; + this.properties = properties; + } + + public Vertex getVertex() { + return vertex; + } + + @Override + protected Map getProperties() { + return properties; + } + + @Override + protected Collection getAdjacentDescendants() { + return vertex.getAdjacentDescendants(); + } + + @Override + protected Collection getAdjacentAscendants() { + return vertex.getAdjacentAscendants(); + } + + @Override + protected Collection getOutgoingAssociations() { + return vertex.getOutgoingAssociations(); + } + + @Override + protected Collection getIncomingAssociations() { + return vertex.getIncomingAssociations(); + } + + @Override + protected void addAssignment(String ascendant, String descendant) { + vertex.addAssignment(ascendant, descendant); + } + + @Override + protected void deleteAssignment(String ascendant, String descendant) { + vertex.deleteAssignment(ascendant, descendant); + } + + @Override + protected void addAssociation(String ua, String target, AccessRightSet accessRightSet) { + vertex.addAssociation(ua, target, accessRightSet); + } + + @Override + protected void deleteAssociation(String ua, String target) { + vertex.deleteAssociation(ua, target); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/PAP.java b/src/main/java/gov/nist/csd/pm/pap/PAP.java index c7f9e18f4..83ac860f3 100644 --- a/src/main/java/gov/nist/csd/pm/pap/PAP.java +++ b/src/main/java/gov/nist/csd/pm/pap/PAP.java @@ -1,126 +1,168 @@ package gov.nist.csd.pm.pap; -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.PMLExecutable; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.tx.Transactional; - -import java.util.HashSet; -import java.util.Set; - -public class PAP implements PolicySync, PolicyEventListener, PolicyEventEmitter, Transactional, PMLExecutable, Policy { - - protected PolicyStore policyStore; - - protected Set listeners; - - private final PAPGraph papGraph; - private final PAPProhibitions papProhibitions; - private final PAPObligations papObligations; - private final PAPUserDefinedPML papUserDefinedPML; +import gov.nist.csd.pm.pap.admin.AdminPolicy; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.executable.AdminExecutor; +import gov.nist.csd.pm.pap.modification.PolicyModifier; +import gov.nist.csd.pm.pap.pml.PMLCompiler; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.PolicyQuerier; +import gov.nist.csd.pm.pap.serialization.PolicyDeserializer; +import gov.nist.csd.pm.pap.serialization.PolicySerializer; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class PAP implements PolicyPoint, AdminExecutor { + + protected final PolicyStore policyStore; + private final PolicyModifier modifier; + + private Map pmlOperations; + private Map pmlRoutines; + private Map pmlConstants; public PAP(PolicyStore policyStore) throws PMException { this.policyStore = policyStore; - this.listeners = new HashSet<>(); - - this.papGraph = new PAPGraph(policyStore, this); - this.papProhibitions = new PAPProhibitions(policyStore, this); - this.papObligations = new PAPObligations(policyStore, this); - this.papUserDefinedPML = new PAPUserDefinedPML(policyStore, this); + this.modifier = new PolicyModifier(policyStore); + AdminPolicy.verify(modifier); - SuperPolicy.verifySuperPolicy(this.policyStore); + this.pmlOperations = new HashMap<>(); + this.pmlRoutines = new HashMap<>(); + this.pmlConstants = new HashMap<>(); } - @Override - public Graph graph() { - return papGraph; + public PAP(PAP pap) throws PMException { + this(pap.policyStore); } - @Override - public Prohibitions prohibitions() { - return papProhibitions; - } + public abstract PolicyQuerier query(); - @Override - public Obligations obligations() { - return papObligations; + public PolicyModifier modify() { + return modifier; } - @Override - public UserDefinedPML userDefinedPML() { - return papUserDefinedPML; + protected PolicyStore policyStore() { + return policyStore; } @Override - public PolicySerializer serialize() throws PMException { - return policyStore.serialize(); + public void reset() throws PMException { + policyStore.reset(); + + AdminPolicy.verify(modifier); } @Override - public PolicyDeserializer deserialize() throws PMException { - return new PAPDeserializer(policyStore); + public Object executeAdminExecutable(AdminExecutable adminExecutable, Map operands) throws PMException { + return adminExecutable.execute(this, operands); + } + + /** + * Serialize the current policy state with the given PolicySerializer. + * + * @param serializer The PolicySerializer used to generate the output String. + * @return The string representation of the policy. + * @throws PMException If there is an error during the serialization process. + */ + public String serialize(PolicySerializer serializer) throws PMException { + return serializer.serialize(query()); + } + + /** + * Deserialize the given input string into the current policy state. The user defined in the UserContext needs to exist + * in the graph created if any obligations are created. If the user does not exist before an obligation is created + * an exception will be thrown. This method also resets the policy before deserialization. However, the {@link AdminPolicy} + * nodes are assumed to be created and can be referenced in the input string without explicit creation. If any of the + * admin policy nodes are created in the input string an exception will be thrown. + * + * @param author The UserContext describing the author of the deserialized policy elements. + * @param input The string representation of the policy to deserialize. + * @param policyDeserializer The PolicyDeserializer to apply the input string to the policy. + * @throws PMException If there is an error deserializing the given inputs string. + */ + public void deserialize(UserContext author, String input, PolicyDeserializer policyDeserializer) throws PMException { + beginTx(); + + try { + policyDeserializer.deserialize(this, author, input); + } catch (PMException e) { + rollback(); + throw e; + } + + commit(); } - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - listeners.add(listener); + public void setPMLOperations(Map pmlOperations) throws PMException { + this.pmlOperations = pmlOperations; + } - if (sync) { - listener.handlePolicyEvent(policyStore.policySync()); + public void setPMLOperations(PMLOperation... operations) throws PMException { + for (PMLOperation operation : operations) { + this.pmlOperations.put(operation.getName(), operation); } } - @Override - public void removeEventListener(PolicyEventListener listener) { - listeners.remove(listener); + public void setPMLRoutines(Map pmlRoutines) throws PMException { + this.pmlRoutines = pmlRoutines; } - @Override - public void emitEvent(PolicyEvent event) throws PMException { - for (PolicyEventListener listener : listeners) { - listener.handlePolicyEvent(event); + public void setPMLRoutines(PMLRoutine... routines) throws PMException { + for (PMLRoutine routine : routines) { + this.pmlRoutines.put(routine.getName(), routine); } } - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - for (PolicyEventListener listener : listeners) { - listener.handlePolicyEvent(event); - } + public Map getPMLOperations() throws PMException { + return pmlOperations; } - @Override - public PolicySynchronizationEvent policySync() throws PMException { - return this.policyStore.policySync(); + public Map getPMLRoutines() throws PMException { + return pmlRoutines; } - @Override - public void beginTx() throws PMException { - policyStore.beginTx(); + public void setPMLConstants(Map pmlConstants) throws PMException { + this.pmlConstants = pmlConstants; + } - emitEvent(new BeginTxEvent()); + public Map getPMLConstants() throws PMException { + return pmlConstants; } - @Override - public void commit() throws PMException { - policyStore.commit(); + public void executePML(UserContext author, String input) throws PMException { + PMLCompiler pmlCompiler = new PMLCompiler(this); + + List compiledPML = pmlCompiler.compilePML(input); - emitEvent(new CommitTxEvent()); + // execute other statements + ExecutionContext ctx = new ExecutionContext(author, this); + + ctx.executeStatements(compiledPML, Map.of()); } - @Override - public void rollback() throws PMException { - policyStore.rollback(); + public void runTx(TxRunner txRunner) throws PMException { + beginTx(); - emitEvent(new RollbackTxEvent(this)); + try { + txRunner.runTx(this); + + commit(); + } catch (PMException e) { + rollback(); + throw e; + } } - @Override - public void executePML(UserContext userContext, String input, FunctionDefinitionStatement... functionDefinitionStatements) throws PMException { - PMLExecutor.compileAndExecutePML(this, userContext, input, functionDefinitionStatements); + public interface TxRunner { + void runTx(PAP pap) throws PMException; } } diff --git a/src/main/java/gov/nist/csd/pm/pap/PAPDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/PAPDeserializer.java deleted file mode 100644 index c08764336..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PAPDeserializer.java +++ /dev/null @@ -1,44 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.PolicyDeserializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -class PAPDeserializer implements PolicyDeserializer { - - private PolicyStore policyStore; - - public PAPDeserializer(PolicyStore policyStore) { - this.policyStore = policyStore; - } - - @Override - public void fromJSON(String json) throws PMException { - // start a new tx to deserialize policy - policyStore.beginTx(); - - policyStore.reset(); - - // deserialize using deserializer - policyStore.deserialize().fromJSON(json); - - policyStore.commit(); - } - - @Override - public void fromPML(UserContext author, String pml, FunctionDefinitionStatement... customFunctions) throws PMException { - // start a new tx to deserialize policy - policyStore.beginTx(); - - policyStore.reset(); - - // deserialize using deserializer - policyStore.deserialize().fromPML(author, pml, customFunctions); - - // need to apply super policy to any policy classes created or attributes assigned to policy classes - SuperPolicy.verifySuperPolicy(this.policyStore); - - policyStore.commit(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/PAPGraph.java b/src/main/java/gov/nist/csd/pm/pap/PAPGraph.java deleted file mode 100644 index 0a4c6d32e..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PAPGraph.java +++ /dev/null @@ -1,491 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.*; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Assignment; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.*; - -import static gov.nist.csd.pm.pap.SuperPolicy.pcRepObjectAttribute; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.wildcardAccessRights; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -class PAPGraph implements Graph, PolicyEventEmitter { - - protected PolicyStore policyStore; - - protected PolicyEventListener listener; - - public PAPGraph(PolicyStore policyStore, PolicyEventListener listener) throws PMException { - this.policyStore = policyStore; - this.listener = listener; - - SuperPolicy.verifySuperPolicy(this.policyStore); - } - - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) throws PMException { - for (String ar : accessRightSet) { - if (isAdminAccessRight(ar) || isWildcardAccessRight(ar)) { - throw new AdminAccessRightExistsException(ar); - } - } - - policyStore.graph().setResourceAccessRights(accessRightSet); - - // notify listeners of policy modification - emitEvent(new SetResourceAccessRightsEvent(accessRightSet)); - } - - @Override - public AccessRightSet getResourceAccessRights() throws PMException { - return policyStore.graph().getResourceAccessRights(); - } - - @Override - public String createPolicyClass(String name, Map properties) throws PMException { - if (nodeExists(name)) { - if (SuperPolicy.isSuperPolicyNode(name)) { - return name; - } - - throw new NodeNameExistsException(name); - } - - List events = SuperPolicy.createPolicyClass(policyStore, name, properties); - for (PolicyEvent event : events) { - emitEvent(event); - } - - return name; - } - - @Override - public String createPolicyClass(String name) throws PMException { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) throws PMException { - return createNode(name, UA, properties, parent, parents); - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) throws PMException { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) throws PMException { - return createNode(name, OA, properties, parent, parents); - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) throws PMException { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) throws PMException { - return createNode(name, O, properties, parent, parents); - } - - @Override - public String createObject(String name, String parent, String... parents) throws PMException { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) throws PMException { - return createNode(name, U, properties, parent, parents); - } - - @Override - public String createUser(String name, String parent, String... parents) throws PMException { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - private String createNode(String name, NodeType type, Map properties, String parent, String ... parents) throws PMException { - if (nodeExists(name)) { - if (SuperPolicy.isSuperPolicyNode(name)) { - return name; - } - - throw new NodeNameExistsException(name); - } - - // collect any parents that are of type PC - // this will also check if the nodes exist by calling getNode - List pcParents = new ArrayList<>(); - List parentsList = new ArrayList<>(Arrays.asList(parents)); - parentsList.add(parent); - - for (String p : parentsList) { - Node parentNode = getNode(p); - if (parentNode.getType() != PC) { - continue; - } - - pcParents.add(p); - } - - switch (type) { - case OA -> { - policyStore.graph().createObjectAttribute(name, properties, parent, parents); - emitEvent(new CreateObjectAttributeEvent(name, properties, parent, parents)); - } - case UA -> { - policyStore.graph().createUserAttribute(name, properties, parent, parents); - emitEvent(new CreateUserAttributeEvent(name, properties, parent, parents)); - } - case O -> { - policyStore.graph().createObject(name, properties, parent, parents); - emitEvent(new CreateObjectEvent(name, properties, parent, parents)); - } - case U -> { - policyStore.graph().createUser(name, properties, parent, parents); - emitEvent(new CreateUserEvent(name, properties, parent, parents)); - } - default -> { /* PC and ANY should not ever be passed to this private method */ } - } - - // for any pc parents, create any necessary super policy configurations - for (String pc : pcParents) { - List events = SuperPolicy.assignedToPolicyClass(policyStore, name, pc); - for (PolicyEvent e : events) { - emitEvent(e); - } - } - - return name; - } - - @Override - public void setNodeProperties(String name, Map properties) throws PMException { - if (!nodeExists(name)) { - throw new NodeDoesNotExistException(name); - } - - policyStore.graph().setNodeProperties(name, properties); - - emitEvent(new SetNodePropertiesEvent(name, properties)); - } - - @Override - public boolean nodeExists(String name) throws PMException { - return policyStore.graph().nodeExists(name); - } - - @Override - public Node getNode(String name) throws PMException { - if (!nodeExists(name)) { - throw new NodeDoesNotExistException(name); - } - - return policyStore.graph().getNode(name); - } - - @Override - public List search(NodeType type, Map properties) throws PMException { - return policyStore.graph().search(type, properties); - } - - @Override - public List getPolicyClasses() throws PMException { - return policyStore.graph().getPolicyClasses(); - } - - @Override - public void deleteNode(String name) throws PMException { - if (!nodeExists(name)) { - return; - } - - List children = getChildren(name); - if (!children.isEmpty()) { - throw new NodeHasChildrenException(name); - } - - checkIfNodeInProhibition(name); - checkIfNodeInObligation(name); - - NodeType type = getNode(name).getType(); - - // delete the rep node if node is a PC - policyStore.beginTx(); - - if (type == PC) { - String rep = pcRepObjectAttribute(name); - policyStore.graph().deleteNode(rep); - emitEvent(new DeleteNodeEvent(rep)); - } - - policyStore.graph().deleteNode(name); - emitEvent(new DeleteNodeEvent(name)); - - policyStore.commit(); - } - - private void checkIfNodeInProhibition(String name) throws PMException { - Map> prohibitions = policyStore.prohibitions().getAll(); - for (List subjPros : prohibitions.values()) { - for (Prohibition p : subjPros) { - if (nodeInProhibition(name, p)) { - throw new NodeReferencedInProhibitionException(name, p.getLabel()); - } - } - } - } - - private boolean nodeInProhibition(String name, Prohibition prohibition) { - if (prohibition.getSubject().getName().equals(name)) { - return true; - } - - for (ContainerCondition containerCondition : prohibition.getContainers()) { - if (containerCondition.name().equals(name)) { - return true; - } - } - - return false; - } - - private void checkIfNodeInObligation(String name) throws PMException { - List obligations = policyStore.obligations().getAll(); - for (Obligation obligation : obligations) { - // if the node is the author of the obligation or referenced in any rules throw an exception - if (obligation.getAuthor().getUser().equals(name) - || nodeInObligation(name, obligation)) { - throw new NodeReferencedInObligationException(name, obligation.getLabel()); - } - } - } - - private boolean nodeInObligation(String name, Obligation obligation) { - for (Rule rule : obligation.getRules()) { - if (nodeInEvent(name, rule.getEventPattern())) { - return true; - } - } - - return false; - } - - private boolean nodeInEvent(String name, EventPattern event) { - // check subject - EventSubject subject = event.getSubject(); - - boolean isAnyUserWithAttribute = (subject.getType() == EventSubject.Type.ANY_USER_WITH_ATTRIBUTE && subject.anyUserWithAttribute().equals(name)); - boolean isUserWithAttribute = (subject.getType() == EventSubject.Type.USERS && subject.users().contains(name)); - if (isAnyUserWithAttribute || isUserWithAttribute) { - return true; - } - - // check the target - Target target = event.getTarget(); - return (target.getType() == Target.Type.ANY_CONTAINED_IN && target.anyContainedIn().equals(name)) - || (target.getType() == Target.Type.ANY_OF_SET && target.anyOfSet().contains(name)) - || (target.getType() == Target.Type.POLICY_ELEMENT && target.policyElement().equals(name)); - } - - @Override - public void assign(String child, String parent) throws PMException { - Node childNode = getNode(child); - Node parentNode = getNode(parent); - - // ignore if assignment already exists - if (getParents(child).contains(parent)) { - return; - } - - // check node types make a valid assignment relation - Assignment.checkAssignment(childNode.getType(), parentNode.getType()); - - policyStore.graph().assign(child, parent); - emitEvent(new AssignEvent(child, parent)); - - // if the parent is a policy class, need to associate the super ua with the child - if (parentNode.getType() == PC) { - List events = SuperPolicy.assignedToPolicyClass(policyStore, child, parent); - for (PolicyEvent e : events) { - emitEvent(e); - } - } - } - - - @Override - public void deassign(String child, String parent) throws PMException { - if ((!nodeExists(child) || !nodeExists(parent)) - || (!getParents(child).contains(parent))) { - return; - } - - List parents = policyStore.graph().getParents(child); - if (parents.size() == 1) { - throw new DisconnectedNodeException(child, parent); - } - - policyStore.graph().deassign(child, parent); - - emitEvent(new DeassignEvent(child, parent)); - } - - @Override - public void assignAll(List children, String target) throws PMException { - policyStore.beginTx(); - - Node targetNode = getNode(target); - - for(String child : children) { - Node childNode = getNode(child); - Assignment.checkAssignment(childNode.getType(), targetNode.getType()); - } - - policyStore.graph().assignAll(children, target); - - policyStore.commit(); - - emitEvent(new AssignAllEvent(children, target)); - } - - @Override - public void deassignAll(List children, String target) throws PMException { - policyStore.beginTx(); - - Node targetNode = getNode(target); - - for(String child : children) { - Node childNode = getNode(child); - - List parents = policyStore.graph().getParents(child); - if (parents.contains(target) && parents.size() == 1) { - throw new DisconnectedNodeException(child, target); - } - } - - policyStore.graph().deassignAll(children, target); - - policyStore.commit(); - - emitEvent(new AssignAllEvent(children, target)); - } - - @Override - public void deassignAllFromAndDelete(String target) throws PMException { - deassignAll(getChildren(target), target); - deleteNode(target); - } - - @Override - public List getChildren(String node) throws PMException { - if (!nodeExists(node)) { - throw new NodeDoesNotExistException(node); - } - - return policyStore.graph().getChildren(node); - } - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { - Node uaNode = getNode(ua); - Node targetNode = getNode(target); - - // check the access rights are valid - checkAccessRightsValid(policyStore.graph(), accessRights); - - // check the types of each node make a valid association - Association.checkAssociation(uaNode.getType(), targetNode.getType()); - - // associate and emit event - policyStore.graph().associate(ua, target, accessRights); - emitEvent(new AssociateEvent(ua, target, accessRights)); - } - - static void checkAccessRightsValid(Graph graph, AccessRightSet accessRightSet) throws PMException { - AccessRightSet resourceAccessRights = graph.getResourceAccessRights(); - - for (String ar : accessRightSet) { - if (!resourceAccessRights.contains(ar) - && !allAdminAccessRights().contains(ar) - && !wildcardAccessRights().contains(ar)) { - throw new UnknownAccessRightException(ar); - } - } - } - - @Override - public void dissociate(String ua, String target) throws PMException { - - boolean nodesNotExist = (!nodeExists(ua) || !nodeExists(target)); - if (nodesNotExist) { - return; - } - - boolean pathNotExist = (!getAssociationsWithSource(ua).contains(new Association(ua, target))); - if (pathNotExist) { - return; - } - - policyStore.graph().dissociate(ua, target); - - emitEvent(new DissociateEvent(ua, target)); - } - - @Override - public List getParents(String node) throws PMException { - if (!nodeExists(node)) { - throw new NodeDoesNotExistException(node); - } - - return policyStore.graph().getParents(node); - } - - @Override - public List getAssociationsWithSource(String ua) throws PMException { - if (!nodeExists(ua)) { - throw new NodeDoesNotExistException(ua); - } - - return policyStore.graph().getAssociationsWithSource(ua); - } - - @Override - public List getAssociationsWithTarget(String target) throws PMException { - if (!nodeExists(target)) { - throw new NodeDoesNotExistException(target); - } - - return policyStore.graph().getAssociationsWithTarget(target); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/PAPObligations.java b/src/main/java/gov/nist/csd/pm/pap/PAPObligations.java deleted file mode 100644 index 2689fd0c4..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PAPObligations.java +++ /dev/null @@ -1,153 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.Obligations; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.NodeDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.ObligationDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.ObligationExistsException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; - -import java.util.List; - -class PAPObligations implements Obligations, PolicyEventEmitter { - protected PolicyStore policyStore; - - protected PolicyEventListener listener; - - public PAPObligations(PolicyStore policyStore, PolicyEventListener listener) throws PMException { - this.policyStore = policyStore; - this.listener = listener; - } - - @Override - public void create(UserContext author, String label, Rule... rules) throws PMException { - if (exists(label)) { - throw new ObligationExistsException(label); - } - - checkAuthorExists(author); - checkEventPatternAttributesExist(rules); - - policyStore.obligations().create(author, label, rules); - - emitEvent(new CreateObligationEvent(author, label, List.of(rules))); - } - - private void checkAuthorExists(UserContext author) throws PMException { - if (!policyStore.graph().nodeExists(author.getUser())) { - throw new NodeDoesNotExistException(author.getUser()); - } - } - - private void checkEventPatternAttributesExist(Rule ... rules) throws PMException { - for (Rule rule : rules) { - EventPattern event = rule.getEventPattern(); - - // check subject - EventSubject subject = event.getSubject(); - switch (subject.getType()) { - case USERS -> { - for (String user : subject.users()) { - if (!policyStore.graph().nodeExists(user)) { - throw new NodeDoesNotExistException(user); - } - } - } - case ANY_USER_WITH_ATTRIBUTE -> { - if (!policyStore.graph().nodeExists(subject.anyUserWithAttribute())) { - throw new NodeDoesNotExistException(subject.anyUserWithAttribute()); - } - } - } - - // check target - Target target = event.getTarget(); - switch (target.getType()) { - case ANY_OF_SET -> { - for (String pe : target.anyOfSet()) { - if (!policyStore.graph().nodeExists(pe)) { - throw new NodeDoesNotExistException(pe); - } - } - } - case POLICY_ELEMENT -> { - if (!policyStore.graph().nodeExists(target.policyElement())) { - throw new NodeDoesNotExistException(target.policyElement()); - } - } - case ANY_CONTAINED_IN -> { - if (!policyStore.graph().nodeExists(target.anyContainedIn())) { - throw new NodeDoesNotExistException(target.anyContainedIn()); - } - } - } - } - } - - @Override - public boolean exists(String label) throws PMException { - return policyStore.obligations().exists(label); - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws PMException { - if (!exists(label)) { - throw new ObligationDoesNotExistException(label); - } - - checkAuthorExists(author); - checkEventPatternAttributesExist(rules); - - policyStore.obligations().update(author, label, rules); - - emitEvent(new UpdateObligationEvent(author, label, List.of(rules))); - } - - @Override - public void delete(String label) throws PMException { - if (!exists(label)) { - return; - } - - Obligation obligation = policyStore.obligations().get(label); - - policyStore.obligations().delete(label); - - emitEvent(new DeleteObligationEvent(obligation)); - } - - @Override - public List getAll() throws PMException { - return policyStore.obligations().getAll(); - } - - @Override - public Obligation get(String label) throws PMException { - if (!exists(label)) { - throw new ObligationDoesNotExistException(label); - } - - return policyStore.obligations().get(label); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/PAPProhibitions.java b/src/main/java/gov/nist/csd/pm/pap/PAPProhibitions.java deleted file mode 100644 index cac671c7f..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PAPProhibitions.java +++ /dev/null @@ -1,138 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.Prohibitions; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.*; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.PAPGraph.checkAccessRightsValid; - -class PAPProhibitions implements Prohibitions, PolicyEventEmitter { - protected PolicyStore policyStore; - - protected PolicyEventListener listener; - - public PAPProhibitions(PolicyStore policyStore, PolicyEventListener listener) throws PMException { - this.policyStore = policyStore; - this.listener = listener; - } - - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - if (exists(label)) { - throw new ProhibitionExistsException(label); - } - - checkProhibitionParameters(subject, accessRightSet, containerConditions); - - policyStore.prohibitions().create(label, subject, accessRightSet, intersection, containerConditions); - - emitEvent(new CreateProhibitionEvent( - label, subject, accessRightSet, intersection, List.of(containerConditions) - )); - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - checkProhibitionParameters(subject, accessRightSet, containerConditions); - - policyStore.prohibitions().update(label, subject, accessRightSet, intersection, containerConditions); - - emitEvent(new UpdateProhibitionEvent( - label, subject, accessRightSet, intersection, List.of(containerConditions)) - ); - } - - private void checkProhibitionParameters(ProhibitionSubject subject, AccessRightSet accessRightSet, ContainerCondition ... containerConditions) throws PMException { - checkAccessRightsValid(policyStore.graph(), accessRightSet); - checkProhibitionSubjectExists(subject); - checkProhibitionContainersExist(containerConditions); - } - - private void checkProhibitionSubjectExists(ProhibitionSubject subject) throws PMException { - if (subject.getType() != ProhibitionSubject.Type.PROCESS) { - if (!policyStore.graph().nodeExists(subject.getName())) { - throw new ProhibitionSubjectDoesNotExistException(subject.getName()); - } - } - } - - private void checkProhibitionContainersExist(ContainerCondition ... containerConditions) throws PMException { - for (ContainerCondition container : containerConditions) { - if (!policyStore.graph().nodeExists(container.name())) { - throw new ProhibitionContainerDoesNotExistException(container.name()); - } - } - } - - @Override - public void delete(String label) throws PMException { - if (!exists(label)) { - return; - } - - Prohibition prohibition = policyStore.prohibitions().get(label); - - policyStore.prohibitions().delete(label); - - emitEvent(new DeleteProhibitionEvent(prohibition)); - } - - @Override - public Map> getAll() throws PMException { - return policyStore.prohibitions().getAll(); - } - - @Override - public boolean exists(String label) throws PMException { - return policyStore.prohibitions().exists(label); - } - - @Override - public List getWithSubject(String subject) throws PMException { - return policyStore.prohibitions().getWithSubject(subject); - } - - @Override - public Prohibition get(String label) throws PMException { - Prohibition prohibition = getProhibitionOrNull(label); - if (prohibition == null) { - throw new ProhibitionDoesNotExistException(label); - } - - return prohibition; - } - - private Prohibition getProhibitionOrNull(String label) throws PMException { - for (List prohibitions : policyStore.prohibitions().getAll().values()) { - for (Prohibition p : prohibitions) { - if (p.getLabel().equals(label)) { - return p; - } - } - } - - return null; - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/PAPUserDefinedPML.java b/src/main/java/gov/nist/csd/pm/pap/PAPUserDefinedPML.java deleted file mode 100644 index b874af80e..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PAPUserDefinedPML.java +++ /dev/null @@ -1,93 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.UserDefinedPML; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.ConstantAlreadyDefinedException; -import gov.nist.csd.pm.policy.exceptions.FunctionAlreadyDefinedException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.Map; - -class PAPUserDefinedPML implements UserDefinedPML, PolicyEventEmitter { - protected PolicyStore policyStore; - - protected PolicyEventListener listener; - - public PAPUserDefinedPML(PolicyStore policyStore, PolicyEventListener listener) throws PMException { - this.policyStore = policyStore; - this.listener = listener; - } - - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws PMException { - if (policyStore.userDefinedPML().getFunctions().containsKey(functionDefinitionStatement.getFunctionName())) { - throw new FunctionAlreadyDefinedException(functionDefinitionStatement.getFunctionName()); - } - - policyStore.userDefinedPML().createFunction(functionDefinitionStatement); - - emitEvent(new AddFunctionEvent(functionDefinitionStatement)); - } - - @Override - public void deleteFunction(String functionName) throws PMException { - policyStore.userDefinedPML().deleteFunction(functionName); - - emitEvent(new RemoveFunctionEvent(functionName)); - } - - @Override - public Map getFunctions() throws PMException { - return policyStore.userDefinedPML().getFunctions(); - } - - @Override - public FunctionDefinitionStatement getFunction(String name) throws PMException { - return policyStore.userDefinedPML().getFunction(name); - } - - @Override - public void createConstant(String constantName, Value constantValue) throws PMException { - if (policyStore.userDefinedPML().getConstants().containsKey(constantName)) { - throw new ConstantAlreadyDefinedException(constantName); - } - - policyStore.userDefinedPML().createConstant(constantName, constantValue); - - emitEvent(new AddConstantEvent(constantName, constantValue)); - } - - @Override - public void deleteConstant(String constName) throws PMException { - policyStore.userDefinedPML().deleteConstant(constName); - - emitEvent(new RemoveConstantEvent(constName)); - } - - @Override - public Map getConstants() throws PMException { - return policyStore.userDefinedPML().getConstants(); - } - - @Override - public Value getConstant(String name) throws PMException { - return policyStore.userDefinedPML().getConstant(name); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/PolicyPoint.java b/src/main/java/gov/nist/csd/pm/pap/PolicyPoint.java new file mode 100644 index 000000000..75882a091 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/PolicyPoint.java @@ -0,0 +1,58 @@ +package gov.nist.csd.pm.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.tx.Transactional; +import gov.nist.csd.pm.pap.admin.AdminPolicy; +import gov.nist.csd.pm.pap.modification.PolicyModification; +import gov.nist.csd.pm.pap.query.PolicyQuery; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.serialization.PolicyDeserializer; +import gov.nist.csd.pm.pap.serialization.PolicySerializer; + +/** + * An interface for the administrative functions of NGAC policy points (i.e. PAP , PDP). + */ +public interface PolicyPoint extends Transactional { + + /** + * Return the modification component of the Policy Point. + * @return The modification component of the Policy Point. + */ + PolicyModification modify(); + + /** + * Return the query component of the Policy Point. + * @return The query component of the Policy Point. + */ + PolicyQuery query(); + + /** + * Reset the policy while keeping the PM admin policy nodes. + * @throws PMException If there is an error resetting. + */ + void reset() throws PMException; + + /** + * Serialize the current policy state with the given PolicySerializer. + * + * @param serializer The PolicySerializer used to generate the output String. + * @return The string representation of the policy. + * @throws PMException If there is an error during the serialization process. + */ + String serialize(PolicySerializer serializer) throws PMException; + + /** + * Deserialize the given input string into the current policy state. The user defined in the UserContext needs to exist + * in the graph created if any obligations are created. If the user does not exist before an obligation is created + * an exception will be thrown. This method also resets the policy before deserialization. However, the {@link AdminPolicy} + * nodes are assumed to be created and can be referenced in the input string without explicit creation. If any of the + * admin policy nodes are created in the input string an exception will be thrown. + * + * @param author The UserContext describing the author of the deserialized policy elements. + * @param input The string representation of the policy to deserialize. + * @param policyDeserializer The PolicyDeserializer to apply the input string to the policy. + * @throws PMException If there is an error deserializing the given inputs string. + */ + void deserialize(UserContext author, String input, PolicyDeserializer policyDeserializer) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/PolicyStore.java b/src/main/java/gov/nist/csd/pm/pap/PolicyStore.java deleted file mode 100644 index d426b4865..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/PolicyStore.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.events.PolicySync; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.tx.Transactional; - -public abstract class PolicyStore implements PolicySync, Transactional, Policy { - - protected abstract void reset() throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/pap/SuperPolicy.java b/src/main/java/gov/nist/csd/pm/pap/SuperPolicy.java deleted file mode 100644 index f1ea97c69..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/SuperPolicy.java +++ /dev/null @@ -1,155 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.allAccessRights; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static gov.nist.csd.pm.policy.tx.TxRunner.runTx; - -public class SuperPolicy { - - private SuperPolicy() { } - - public static final String SUPER_PREFIX = "super"; - - public static final String SUPER_USER = "super"; - public static final String SUPER_PC = "super_policy"; - public static final String SUPER_UA = "super_ua"; - public static final String SUPER_UA1 = "super_ua1"; - public static final String SUPER_PC_REP = pcRepObjectAttribute(SUPER_PC); - public static final String SUPER_OA = "super_oa"; - - public static String pcRepObjectAttribute(String policyClass) { - return policyClass + "_pc_rep"; - } - - public static boolean isSuperPolicyNode(String node) { - return node.equals(SUPER_USER) || - node.equals(SUPER_PC) || - node.equals(SUPER_UA) || - node.equals(SUPER_UA1) || - node.equals(SUPER_OA) || - node.equals(SUPER_PC_REP); - } - - protected static void verifySuperPolicy(PolicyStore store) throws PMException { - // start a transaction on the policy store the graph uses - // then use Graph methods to take advantage of the policy emitter - // internally, the Graph methods will be using a policy store in Tx mode - runTx(store, () -> { - if (!store.graph().nodeExists(SUPER_PC)) { - store.graph().createPolicyClass(SUPER_PC); - } - - if (!store.graph().nodeExists(SUPER_UA)) { - store.graph().createUserAttribute(SUPER_UA, SUPER_PC); - } else if (!store.graph().getParents(SUPER_UA).contains(SUPER_PC)) { - store.graph().assign(SUPER_UA, SUPER_PC); - } - - if (!store.graph().nodeExists(SUPER_UA1)) { - store.graph().createUserAttribute(SUPER_UA1, SUPER_PC); - } else if (!store.graph().getParents(SUPER_UA1).contains(SUPER_PC)) { - store.graph().assign(SUPER_UA1, SUPER_PC); - } - - if (!store.graph().nodeExists(SUPER_OA)) { - store.graph().createObjectAttribute(SUPER_OA, SUPER_PC); - } else if (!store.graph().getParents(SUPER_OA).contains(SUPER_PC)) { - store.graph().assign(SUPER_OA, SUPER_PC); - } - - if (!store.graph().nodeExists(SUPER_USER)) { - store.graph().createUser(SUPER_USER, SUPER_UA, SUPER_UA1); - } - - List parents = store.graph().getParents(SUPER_USER); - if (!parents.contains(SUPER_UA)) { - store.graph().assign(SUPER_USER, SUPER_UA); - } else if (!parents.contains(SUPER_UA1)) { - store.graph().assign(SUPER_USER, SUPER_UA1); - } - - if (!store.graph().nodeExists(SUPER_PC_REP)) { - store.graph().createObjectAttribute(SUPER_PC_REP, SUPER_OA); - } else if (!store.graph().getParents(SUPER_PC_REP).contains(SUPER_OA)) { - store.graph().assign(SUPER_PC_REP, SUPER_OA); - } - - // associate the super_ua1 and super_ua to provide * rights to the super user on itself - // if the association already exists this will do nothing - store.graph().associate(SUPER_UA1, SUPER_UA, allAccessRights()); - - // associate super ua and super oa - store.graph().associate(SUPER_UA, SUPER_OA, allAccessRights()); - - // associate the super ua with each policy not super_pc - for (String pc : store.graph().getPolicyClasses()) { - if (pc.equals(SUPER_PC)) { - continue; - } - - String repOAName = pcRepObjectAttribute(pc); - - if (!store.graph().nodeExists(repOAName)) { - store.graph().createObjectAttribute(repOAName, SUPER_OA); - } - - List children = store.graph().getChildren(pc); - for (String child : children) { - store.graph().associate(SUPER_UA, child, allAccessRights()); - } - } - }); - } - - protected static List assignedToPolicyClass(PolicyStore store, String child, String pc) throws PMException { - List events = new ArrayList<>(); - - runTx(store, () -> { - if (child.startsWith(SUPER_PREFIX)) { - return; - } - - if (!store.graph().nodeExists(SUPER_UA)) { - store.graph().createUserAttribute(SUPER_UA, SUPER_PC); - events.add(new AssignEvent(SUPER_UA, SUPER_PC)); - } - - store.graph().associate(SUPER_UA, child, allAccessRights()); - events.add(new AssociateEvent(SUPER_UA, child, allAccessRights())); - }); - - return events; - } - - protected static List createPolicyClass(PolicyStore store, String name, Map properties) throws PMException { - List events = new ArrayList<>(); - - runTx(store, () -> { - // create pc node - store.graph().createPolicyClass(name, properties); - events.add(new CreatePolicyClassEvent(name, properties)); - - // create pc rep node in super policy - if (!store.graph().nodeExists(SUPER_OA)) { - store.graph().createObjectAttribute(SUPER_OA, SUPER_PC); - } - - String pcRep = pcRepObjectAttribute(name); - if (store.graph().nodeExists(pcRep)) { - return; - } - - store.graph().createObjectAttribute(pcRep, NO_PROPERTIES, SUPER_OA); - events.add(new CreateObjectAttributeEvent(pcRep, NO_PROPERTIES, SUPER_OA)); - }); - - return events; - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicy.java b/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicy.java new file mode 100644 index 000000000..1d66b7176 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicy.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.admin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.exception.*; + +import java.util.*; + +import static gov.nist.csd.pm.pap.admin.AdminPolicyNode.*; + +public class AdminPolicy { + + public static final Set ALL_NODE_NAMES = new HashSet<>(List.of( + ADMIN_POLICY.nodeName(), + ADMIN_POLICY_OBJECT.nodeName() + )); + + public static final Set AL_NODE_CONSTANT_NAMES = new HashSet<>(List.of( + ADMIN_POLICY.constantName(), + ADMIN_POLICY_OBJECT.constantName() + )); + + public static boolean isAdminPolicyNodeConstantName(String name) { + return AL_NODE_CONSTANT_NAMES.contains(name); + } + + public static boolean isAdminPolicyNodeName(String name) { + return ALL_NODE_NAMES.contains(name); + } + + /** + * Create {@link AdminPolicyNode#ADMIN_POLICY} + * Create the {@link AdminPolicyNode#ADMIN_POLICY} policy class.

+ * Create the {@link AdminPolicyNode#ADMIN_POLICY_OBJECT} in the ADMIN_POLICY.

+ * + * @param verifier The verifier used to verify the admin policy nodes exist. + * @throws PMException If there is an error verifying any element of the admin policy. + */ + public static void verify(Verifier verifier) throws PMException { + try { + verifier.verifyAdminPolicy(); + } catch (PMException e) { + throw new AdminPolicyVerificationException(e); + } + } + + public interface Verifier { + void verifyAdminPolicy() throws PMException; + } + + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicyNode.java b/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicyNode.java new file mode 100644 index 000000000..bde123cd1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/admin/AdminPolicyNode.java @@ -0,0 +1,36 @@ +package gov.nist.csd.pm.pap.admin; + +public enum AdminPolicyNode { + + // Admin policy class + ADMIN_POLICY("PM_ADMIN"), + // Admin policy object attribute + ADMIN_POLICY_OBJECT("PM_ADMIN:object"); + + private final String value; + + AdminPolicyNode(String value) { + this.value = value; + } + + public static AdminPolicyNode fromNodeName(String ascendant) { + switch (ascendant) { + case "PM_ADMIN" -> { + return ADMIN_POLICY; + } + case "PM_ADMIN:object" -> { + return ADMIN_POLICY_OBJECT; + } + } + + throw new IllegalArgumentException("unknown admin policy node " + ascendant); + } + + public String constantName() { + return name(); + } + + public String nodeName() { + return value; + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/AdminAccessRightExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/AdminAccessRightExistsException.java similarity index 82% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/AdminAccessRightExistsException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/AdminAccessRightExistsException.java index 730a6465f..86ed2d65b 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/AdminAccessRightExistsException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/AdminAccessRightExistsException.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; -public class AdminAccessRightExistsException extends PMException{ +public class AdminAccessRightExistsException extends PMException { public AdminAccessRightExistsException(String ar) { super(String.format("%s is already defined as an admin access right", ar)); } diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/AdminPolicyVerificationException.java b/src/main/java/gov/nist/csd/pm/pap/exception/AdminPolicyVerificationException.java new file mode 100644 index 000000000..cbd0fe586 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/AdminPolicyVerificationException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class AdminPolicyVerificationException extends PMException { + public AdminPolicyVerificationException(PMException e) { + super("error verifying admin policy node", e); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/AssignmentCausesLoopException.java b/src/main/java/gov/nist/csd/pm/pap/exception/AssignmentCausesLoopException.java new file mode 100644 index 000000000..673fd0ffc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/AssignmentCausesLoopException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.exception; + +public class AssignmentCausesLoopException extends PMException { + + public AssignmentCausesLoopException(String ascendant, String descendant) { + super("a relation between " + ascendant + " and " + descendant + " would cause a loop in the graph"); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/BootstrapExistingPolicyException.java b/src/main/java/gov/nist/csd/pm/pap/exception/BootstrapExistingPolicyException.java new file mode 100644 index 000000000..7e789b3dd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/BootstrapExistingPolicyException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class BootstrapExistingPolicyException extends PMException { + public BootstrapExistingPolicyException() { + super("cannot bootstrap when a policy already exists"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/CannotDeleteAdminPolicyConfigException.java b/src/main/java/gov/nist/csd/pm/pap/exception/CannotDeleteAdminPolicyConfigException.java new file mode 100644 index 000000000..84caa5b34 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/CannotDeleteAdminPolicyConfigException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class CannotDeleteAdminPolicyConfigException extends PMException { + public CannotDeleteAdminPolicyConfigException() { + super("cannot delete ADMIN_POLICY, ADMIN_POLICY_OBJECT, or the assignment between the two"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/DisconnectedNodeException.java b/src/main/java/gov/nist/csd/pm/pap/exception/DisconnectedNodeException.java new file mode 100644 index 000000000..18c6208a5 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/DisconnectedNodeException.java @@ -0,0 +1,12 @@ +package gov.nist.csd.pm.pap.exception; + +import gov.nist.csd.pm.pap.graph.node.NodeType; + +public class DisconnectedNodeException extends PMException { + public DisconnectedNodeException(String ascendant, String descendant) { + super("deassigning " + ascendant + " from " + descendant + " would make " + ascendant + " a disconnected node"); + } + public DisconnectedNodeException(String node, NodeType type) { + super(node + " is of type " + type + " which is required to be assigned to at least one node initially"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/InvalidProhibitionSubjectException.java b/src/main/java/gov/nist/csd/pm/pap/exception/InvalidProhibitionSubjectException.java similarity index 80% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/InvalidProhibitionSubjectException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/InvalidProhibitionSubjectException.java index baf183f8c..bf9b18050 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/InvalidProhibitionSubjectException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/InvalidProhibitionSubjectException.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; -public class InvalidProhibitionSubjectException extends PMException{ +public class InvalidProhibitionSubjectException extends PMException { public InvalidProhibitionSubjectException(String type) { super("invalid prohibition subject type \"" + type + "\""); } diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/NodeDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodeDoesNotExistException.java new file mode 100644 index 000000000..863504ecb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodeDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class NodeDoesNotExistException extends PMException { + public NodeDoesNotExistException(String name) { + super("a node with the name \"" + name + "\" does not exist"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/NodeHasAscendantsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodeHasAscendantsException.java new file mode 100644 index 000000000..9b601c42c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodeHasAscendantsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class NodeHasAscendantsException extends PMException { + public NodeHasAscendantsException(String node) { + super("cannot delete " + node + ", it has nodes assigned to it"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeNameExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodeNameExistsException.java similarity index 81% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/NodeNameExistsException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/NodeNameExistsException.java index 087227619..10fa208b6 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeNameExistsException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodeNameExistsException.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; public class NodeNameExistsException extends PMException { public NodeNameExistsException(String nodeName) { diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInObligationException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInObligationException.java new file mode 100644 index 000000000..92b6d34bb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInObligationException.java @@ -0,0 +1,8 @@ +package gov.nist.csd.pm.pap.exception; + +public class NodeReferencedInObligationException extends PMException { + + public NodeReferencedInObligationException(String nodeToDelete, String obligationName) { + super("cannot delete \"" + nodeToDelete + "\" because it is referenced in obligation \"" + obligationName + "\""); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInProhibitionException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInProhibitionException.java new file mode 100644 index 000000000..621364e72 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodeReferencedInProhibitionException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class NodeReferencedInProhibitionException extends PMException { + public NodeReferencedInProhibitionException(String nodeToDelete, String prohibitionName) { + super("cannot delete \"" + nodeToDelete + "\" because it is referenced in prohibition \"" + prohibitionName + "\""); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodesAlreadyAssignedException.java b/src/main/java/gov/nist/csd/pm/pap/exception/NodesAlreadyAssignedException.java similarity index 86% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/NodesAlreadyAssignedException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/NodesAlreadyAssignedException.java index 9959bfff9..350e8d9c3 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodesAlreadyAssignedException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/NodesAlreadyAssignedException.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; public class NodesAlreadyAssignedException extends PMException { public NodesAlreadyAssignedException(String ua, String target) { diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/ObligationDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationDoesNotExistException.java new file mode 100644 index 000000000..d8332c29b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class ObligationDoesNotExistException extends PMException { + public ObligationDoesNotExistException(String name) { + super("obligation with name " + name + " does not exist"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/ObligationNameExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationNameExistsException.java new file mode 100644 index 000000000..c58ed6bfb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationNameExistsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class ObligationNameExistsException extends PMException { + public ObligationNameExistsException(String name) { + super("obligation with name " + name + " already exists"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/ObligationRuleNameExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationRuleNameExistsException.java new file mode 100644 index 000000000..3cea958d4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ObligationRuleNameExistsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class ObligationRuleNameExistsException extends PMException { + public ObligationRuleNameExistsException(String obligationName, String ruleName) { + super("A rule with the name " + ruleName + " already exists in the obligation " + obligationName); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/OperandsDoNotMatchException.java b/src/main/java/gov/nist/csd/pm/pap/exception/OperandsDoNotMatchException.java new file mode 100644 index 000000000..9d1e5f744 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/OperandsDoNotMatchException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.exception; + +import java.util.Collection; + +public class OperandsDoNotMatchException extends PMException { + public OperandsDoNotMatchException(String opName, Collection expected, Collection actual) { + super("operation " + opName + " expected operands " + expected + ", got " + actual); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/OperationDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/OperationDoesNotExistException.java new file mode 100644 index 000000000..01e470b3b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/OperationDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class OperationDoesNotExistException extends PMException { + public OperationDoesNotExistException(String op) { + super("operation " + op + " does not exist"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/OperationExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/OperationExistsException.java new file mode 100644 index 000000000..b5d7e49bd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/OperationExistsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class OperationExistsException extends PMException { + public OperationExistsException(String op) { + super("operation " + op + " already exists"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMBackendException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMBackendException.java new file mode 100644 index 000000000..d7b2e9472 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMBackendException.java @@ -0,0 +1,18 @@ +package gov.nist.csd.pm.pap.exception; + +/** + * Wrapper for backend related exceptions independent of backend implementation. + */ +public class PMBackendException extends PMException { + public PMBackendException(Exception e) { + super(e); + } + + public PMBackendException(String message, Exception e) { + super(message, e); + } + + public PMBackendException(String s) { + super(s); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMException.java new file mode 100644 index 000000000..33d2018c9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMException.java @@ -0,0 +1,21 @@ +package gov.nist.csd.pm.pap.exception; + +/** + * Root exception to cover any possible error in the Policy Machine interfaces. This is to support multiple implementations + * of the same interfaces that may have different and unplanned exceptions. These exceptions can be wrapped in a PMException. + */ +public class PMException extends Exception { + + public PMException(String msg) { + super(msg); + } + + public PMException(Exception e) { + super(e); + } + + public PMException(String message, Exception e) { + super(message, e); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantAlreadyDefinedException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantAlreadyDefinedException.java new file mode 100644 index 000000000..114083155 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantAlreadyDefinedException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class PMLConstantAlreadyDefinedException extends PMException { + public PMLConstantAlreadyDefinedException(String name) { + super("constant \"" + name + "\" is already defined"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantNotDefinedException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantNotDefinedException.java new file mode 100644 index 000000000..1d982558b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMLConstantNotDefinedException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class PMLConstantNotDefinedException extends PMException { + public PMLConstantNotDefinedException(String c) { + super("PML constant " + c + " not defined"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionAlreadyDefinedException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionAlreadyDefinedException.java new file mode 100644 index 000000000..7517099ca --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionAlreadyDefinedException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class PMLFunctionAlreadyDefinedException extends PMException { + public PMLFunctionAlreadyDefinedException(String functionName) { + super("a function with the name \"" + functionName + "\" is already defined"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionNotDefinedException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionNotDefinedException.java new file mode 100644 index 000000000..7dcf5265d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMLFunctionNotDefinedException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.exception; + +public class PMLFunctionNotDefinedException extends PMException { + + + public PMLFunctionNotDefinedException(String functionName) { + super("PML function " + functionName + " not defined"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PMRuntimeException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PMRuntimeException.java new file mode 100644 index 000000000..2e0763499 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PMRuntimeException.java @@ -0,0 +1,17 @@ +package gov.nist.csd.pm.pap.exception; + +public class PMRuntimeException extends RuntimeException { + + public PMRuntimeException(String message) { + super(message); + } + + public PMRuntimeException(Exception e) { + super(e); + } + + public PMRuntimeException(String message, Exception e) { + super(message, e); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/PolicyEntityDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/PolicyEntityDoesNotExistException.java new file mode 100644 index 000000000..7a67563cd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/PolicyEntityDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class PolicyEntityDoesNotExistException extends PMException { + public PolicyEntityDoesNotExistException(String msg) { + super(msg); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionContainerDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionContainerDoesNotExistException.java similarity index 79% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionContainerDoesNotExistException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionContainerDoesNotExistException.java index 5e79364b7..25d39cb44 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionContainerDoesNotExistException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionContainerDoesNotExistException.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; -public class ProhibitionContainerDoesNotExistException extends PMException{ +public class ProhibitionContainerDoesNotExistException extends PMException { public ProhibitionContainerDoesNotExistException(String name) { super("prohibition container \"" + name + "\" does not exist"); } diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionDoesNotExistException.java new file mode 100644 index 000000000..c41b5449b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class ProhibitionDoesNotExistException extends PMException { + public ProhibitionDoesNotExistException(String name) { + super("prohibition with the name " + name + " does not exist"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionExistsException.java new file mode 100644 index 000000000..013be44d6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionExistsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class ProhibitionExistsException extends PMException { + public ProhibitionExistsException(String name) { + super("a prohibition with the name " + name + " already exists"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionSubjectDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionSubjectDoesNotExistException.java similarity index 79% rename from src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionSubjectDoesNotExistException.java rename to src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionSubjectDoesNotExistException.java index 60c7931a9..c2ad89ad1 100644 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionSubjectDoesNotExistException.java +++ b/src/main/java/gov/nist/csd/pm/pap/exception/ProhibitionSubjectDoesNotExistException.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.exceptions; +package gov.nist.csd.pm.pap.exception; -public class ProhibitionSubjectDoesNotExistException extends PMException{ +public class ProhibitionSubjectDoesNotExistException extends PMException { public ProhibitionSubjectDoesNotExistException(String name) { super("prohibition subject \"" + name + "\" does not exist"); } diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/RepObjectNotSetException.java b/src/main/java/gov/nist/csd/pm/pap/exception/RepObjectNotSetException.java new file mode 100644 index 000000000..b04953655 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/RepObjectNotSetException.java @@ -0,0 +1,8 @@ +package gov.nist.csd.pm.pap.exception; + +public class RepObjectNotSetException extends PMException { + + public RepObjectNotSetException(String node) { + super("the rep object has not been set for " + node); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/RoutineDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/pap/exception/RoutineDoesNotExistException.java new file mode 100644 index 000000000..fbc61982a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/RoutineDoesNotExistException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class RoutineDoesNotExistException extends PMException { + public RoutineDoesNotExistException(String routine) { + super("a routine with the name " + routine + " does not exist"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/RoutineExistsException.java b/src/main/java/gov/nist/csd/pm/pap/exception/RoutineExistsException.java new file mode 100644 index 000000000..e4364693a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/RoutineExistsException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class RoutineExistsException extends PMException { + public RoutineExistsException(String routine) { + super("a routine with name " + routine + " already exists"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/UnknownAccessRightException.java b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownAccessRightException.java new file mode 100644 index 000000000..e94ddc555 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownAccessRightException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class UnknownAccessRightException extends PMException { + public UnknownAccessRightException(String ar) { + super("unknown access right \"" + ar + "\""); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/UnknownOperandException.java b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownOperandException.java new file mode 100644 index 000000000..dd5f30f9a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownOperandException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class UnknownOperandException extends PMException { + public UnknownOperandException(String operand) { + super("unknown operand " + operand); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/UnknownPatternException.java b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownPatternException.java new file mode 100644 index 000000000..182f88d5c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownPatternException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class UnknownPatternException extends PMException { + public UnknownPatternException() { + super("unknown pattern"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/exception/UnknownTypeException.java b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownTypeException.java new file mode 100644 index 000000000..a7869dc22 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/exception/UnknownTypeException.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.exception; + +public class UnknownTypeException extends PMException { + public UnknownTypeException(String type) { + super("unknown node type " + type); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutable.java b/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutable.java new file mode 100644 index 000000000..ee3916b36 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutable.java @@ -0,0 +1,28 @@ +package gov.nist.csd.pm.pap.executable; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.List; +import java.util.Map; + +public abstract class AdminExecutable { + + protected final String name; + protected final List operandNames; + + public AdminExecutable(String name, List operandNames) { + this.name = name; + this.operandNames = operandNames; + } + + public abstract T execute(PAP pap, Map operands) throws PMException; + + public String getName() { + return name; + } + + public List getOperandNames() { + return operandNames; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutor.java b/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutor.java new file mode 100644 index 000000000..a5019586d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/executable/AdminExecutor.java @@ -0,0 +1,11 @@ +package gov.nist.csd.pm.pap.executable; + +import gov.nist.csd.pm.pap.exception.PMException; + +import java.util.Map; + +public interface AdminExecutor { + + Object executeAdminExecutable(AdminExecutable adminExecutable, Map operands) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/AllPathsShortCircuit.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/AllPathsShortCircuit.java similarity index 90% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/dag/AllPathsShortCircuit.java rename to src/main/java/gov/nist/csd/pm/pap/graph/dag/AllPathsShortCircuit.java index 4153eef8f..f1d5e776e 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/AllPathsShortCircuit.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/AllPathsShortCircuit.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.model.graph.dag; +package gov.nist.csd.pm.pap.graph.dag; public class AllPathsShortCircuit implements ShortCircuit{ diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/BreadthFirstGraphWalker.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/BreadthFirstGraphWalker.java new file mode 100644 index 000000000..76d0ba94e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/BreadthFirstGraphWalker.java @@ -0,0 +1,122 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.GraphQuery; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public class BreadthFirstGraphWalker implements GraphWalker { + + private GraphQuery graphQuery; + private Direction direction; + private Visitor visitor; + private Propagator propagator; + private ShortCircuit allPathsShortCircuit; + private ShortCircuit singlePathShortCircuit; + + public BreadthFirstGraphWalker(GraphQuery graphQuery) { + this.graphQuery = graphQuery; + this.visitor = new NoopVisitor(); + this.propagator = new NoopPropagator(); + this.direction = Direction.DESCENDANTS; + this.allPathsShortCircuit = new NoopShortCircuit(); + this.singlePathShortCircuit = new NoopShortCircuit(); + } + + public BreadthFirstGraphWalker withVisitor(Visitor visitor) { + this.visitor = visitor == null ? new NoopVisitor(): visitor; + return this; + } + + public BreadthFirstGraphWalker withPropagator(Propagator propagator) { + this.propagator = propagator == null ? new NoopPropagator(): propagator; + return this; + } + + public BreadthFirstGraphWalker withDirection(Direction direction) { + this.direction = direction; + return this; + } + + public BreadthFirstGraphWalker withAllPathShortCircuit(ShortCircuit shortCircuit) { + this.allPathsShortCircuit = shortCircuit; + return this; + } + + public BreadthFirstGraphWalker withSinglePathShortCircuit(ShortCircuit shortCircuit) { + this.singlePathShortCircuit = shortCircuit; + return this; + } + + public GraphQuery getGraphQuery() { + return graphQuery; + } + + public Direction getDirection() { + return direction; + } + + public Visitor getVisitor() { + return visitor; + } + + public Propagator getPropagator() { + return propagator; + } + + public ShortCircuit getAllPathsShortCircuit() { + return allPathsShortCircuit; + } + + public ShortCircuit getSinglePathShortCircuit() { + return singlePathShortCircuit; + } + + @Override + public void walk(String start) throws PMException { + visitor.visit(start); + if (allPathsShortCircuit.evaluate(start) + || singlePathShortCircuit.evaluate(start)){ + return; + } + + walkInternal(start); + } + + private boolean walkInternal(String start) throws PMException { + Collection nextLevel = getNextLevel(start); + Set skip = new HashSet<>(); + for (String n : nextLevel) { + visitor.visit(n); + if (allPathsShortCircuit.evaluate(n)){ + return true; + } else if (singlePathShortCircuit.evaluate(n)){ + skip.add(n); + continue; + } + + propagator.propagate(n, start); + } + + // remove skipped nodes + nextLevel.removeIf(skip::contains); + + for (String n : nextLevel) { + if (walkInternal(n)) { + return true; + } + } + + return false; + } + + protected Collection getNextLevel(String node) throws PMException { + if (direction == Direction.DESCENDANTS) { + return graphQuery.getAdjacentDescendants(node); + } else { + return graphQuery.getAdjacentAscendants(node); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/DepthFirstGraphWalker.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/DepthFirstGraphWalker.java new file mode 100644 index 000000000..900f76766 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/DepthFirstGraphWalker.java @@ -0,0 +1,119 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.GraphQuery; + +import java.util.Collection; + +public class DepthFirstGraphWalker implements GraphWalker { + + private final GraphQuery graphQuery; + private Direction direction; + private Visitor visitor; + private Propagator propagator; + private ShortCircuit allPathsShortCircuit; + private ShortCircuit singlePathShortCircuit; + + public DepthFirstGraphWalker(GraphQuery graphQuery) { + this.graphQuery = graphQuery; + this.visitor = new NoopVisitor(); + this.propagator = new NoopPropagator(); + this.direction = Direction.DESCENDANTS; + this.allPathsShortCircuit = new NoopShortCircuit(); + this.singlePathShortCircuit = new NoopShortCircuit(); + } + + public DepthFirstGraphWalker withVisitor(Visitor visitor) { + this.visitor = visitor == null ? new NoopVisitor(): visitor; + return this; + } + + public DepthFirstGraphWalker withPropagator(Propagator propagator) { + this.propagator = propagator == null ? new NoopPropagator(): propagator; + return this; + } + + public DepthFirstGraphWalker withDirection(Direction direction) { + this.direction = direction; + return this; + } + + public DepthFirstGraphWalker withAllPathShortCircuit(ShortCircuit shortCircuit) { + this.allPathsShortCircuit = shortCircuit; + return this; + } + + public DepthFirstGraphWalker withSinglePathShortCircuit(ShortCircuit shortCircuit) { + this.singlePathShortCircuit = shortCircuit; + return this; + } + + public GraphQuery getGraphQuery() { + return graphQuery; + } + + public Direction getDirection() { + return direction; + } + + public Visitor getVisitor() { + return visitor; + } + + public Propagator getPropagator() { + return propagator; + } + + public ShortCircuit getAllPathsShortCircuit() { + return allPathsShortCircuit; + } + + public ShortCircuit getSinglePathShortCircuit() { + return singlePathShortCircuit; + } + + @Override + public void walk(String start) throws PMException { + walkInternal(start); + } + + private int walkInternal(String start) throws PMException { + if (allPathsShortCircuit.evaluate(start)) { + visitor.visit(start); + return RETURN; + } else if (singlePathShortCircuit.evaluate(start)){ + visitor.visit(start); + return CONTINUE; + } + + Collection nodes = getNextLevel(start); + int ret = WALK; + for(String n : nodes) { + int i = walkInternal(n); + + // propagate to the next level + propagator.propagate(n, start); + + if (i == RETURN) { + ret = i; + break; + } + } + + visitor.visit(start); + + return ret; + } + + protected static final int WALK = 0; + protected static final int CONTINUE = 1; + protected static final int RETURN = 2; + + protected Collection getNextLevel(String node) throws PMException { + if (direction == Direction.DESCENDANTS) { + return graphQuery.getAdjacentDescendants(node); + } else { + return graphQuery.getAdjacentAscendants(node); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/Direction.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Direction.java new file mode 100644 index 000000000..4fed4937e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Direction.java @@ -0,0 +1,6 @@ +package gov.nist.csd.pm.pap.graph.dag; + +public enum Direction { + ASCENDANTS, + DESCENDANTS +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/GraphWalker.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/GraphWalker.java new file mode 100644 index 000000000..a548784a3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/GraphWalker.java @@ -0,0 +1,12 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface GraphWalker { + + /** + * Traverse a graph starting at the start node. + */ + void walk(String start) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopPropagator.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopPropagator.java new file mode 100644 index 000000000..be7887ccc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopPropagator.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.graph.dag; + +public class NoopPropagator implements Propagator { + + @Override + public void propagate(String node, String target) { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopShortCircuit.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopShortCircuit.java new file mode 100644 index 000000000..402b3f6a9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopShortCircuit.java @@ -0,0 +1,8 @@ +package gov.nist.csd.pm.pap.graph.dag; + +public class NoopShortCircuit implements ShortCircuit{ + @Override + public boolean evaluate(String node) { + return false; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopVisitor.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopVisitor.java new file mode 100644 index 000000000..3b3812bd0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/NoopVisitor.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.graph.dag; + +public class NoopVisitor implements Visitor{ + + @Override + public void visit(String node) { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/Propagator.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Propagator.java new file mode 100644 index 000000000..7ea692714 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Propagator.java @@ -0,0 +1,15 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface Propagator { + + /** + * Propagate information from the src node to the dst node. + * + * @param src The node that holds the information already. + * @param dst The node to propagate the information to. + */ + void propagate(String src, String dst) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/ShortCircuit.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/ShortCircuit.java new file mode 100644 index 000000000..8276789a9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/ShortCircuit.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.graph.dag; + +public interface ShortCircuit { + + boolean evaluate(String node); + +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/SinglePathShortCircuit.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/SinglePathShortCircuit.java similarity index 87% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/dag/SinglePathShortCircuit.java rename to src/main/java/gov/nist/csd/pm/pap/graph/dag/SinglePathShortCircuit.java index cf6abfe87..182993a14 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/SinglePathShortCircuit.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/SinglePathShortCircuit.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.model.graph.dag; +package gov.nist.csd.pm.pap.graph.dag; public class SinglePathShortCircuit implements ShortCircuit { diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/TargetDagResult.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/TargetDagResult.java new file mode 100644 index 000000000..6f84fba87 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/TargetDagResult.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +import java.util.Map; +import java.util.Set; + +public record TargetDagResult(Map pcSet, Set reachedTargets) { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/UserDagResult.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/UserDagResult.java new file mode 100644 index 000000000..3fadb4df6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/UserDagResult.java @@ -0,0 +1,17 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.Prohibition; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public record UserDagResult(Map borderTargets, + Set prohibitions, + Set prohibitionTargets) { + public UserDagResult() { + this(new HashMap<>(), new HashSet<>(), new HashSet<>()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/dag/Visitor.java b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Visitor.java new file mode 100644 index 000000000..e1b2f203d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/dag/Visitor.java @@ -0,0 +1,8 @@ +package gov.nist.csd.pm.pap.graph.dag; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface Visitor { + + void visit(String node) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Node.java b/src/main/java/gov/nist/csd/pm/pap/graph/node/Node.java similarity index 97% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Node.java rename to src/main/java/gov/nist/csd/pm/pap/graph/node/Node.java index c2983a060..65b81fc83 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Node.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/node/Node.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.model.graph.nodes; +package gov.nist.csd.pm.pap.graph.node; import java.io.Serializable; import java.util.HashMap; diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/NodeType.java b/src/main/java/gov/nist/csd/pm/pap/graph/node/NodeType.java similarity index 92% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/NodeType.java rename to src/main/java/gov/nist/csd/pm/pap/graph/node/NodeType.java index 4fe6b6e84..e42dbe1a8 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/NodeType.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/node/NodeType.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.model.graph.nodes; +package gov.nist.csd.pm.pap.graph.node; -import gov.nist.csd.pm.policy.exceptions.UnknownTypeException; +import gov.nist.csd.pm.pap.exception.UnknownTypeException; import java.io.Serializable; diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Properties.java b/src/main/java/gov/nist/csd/pm/pap/graph/node/Properties.java similarity index 96% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Properties.java rename to src/main/java/gov/nist/csd/pm/pap/graph/node/Properties.java index 4d384e1e1..12bf28d20 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/nodes/Properties.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/node/Properties.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.model.graph.nodes; +package gov.nist.csd.pm.pap.graph.node; import java.util.Collections; import java.util.HashMap; diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/relationship/AccessRightSet.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/AccessRightSet.java new file mode 100644 index 000000000..167d27121 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/AccessRightSet.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.graph.relationship; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; + +import java.util.Arrays; +import java.util.Collection; + +public class AccessRightSet extends ObjectOpenHashSet { + + public AccessRightSet(){ + } + + public AccessRightSet(String ... ops) { + this.addAll(Arrays.asList(ops)); + } + + public AccessRightSet(Collection ops) { + this.addAll(ops); + } + + public AccessRightSet(AccessRightSet a, AccessRightSet b) { + this.addAll(a); + this.addAll(b); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Assignment.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Assignment.java new file mode 100644 index 000000000..f9d36b6bf --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Assignment.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.graph.relationship; + +import gov.nist.csd.pm.pap.graph.node.NodeType; + +import java.io.Serializable; +import java.util.EnumMap; +import java.util.Map; + +/** + * This object represents an Assignment in a NGAC graph + */ +public class Assignment extends Relationship implements Serializable { + + public Assignment(String source, String target) { + super(source, target); + } + + private static final Map validAssignments = new EnumMap<>(NodeType.class); + static { + validAssignments.put(NodeType.PC, new NodeType[]{}); + validAssignments.put(NodeType.OA, new NodeType[]{NodeType.PC, NodeType.OA}); + validAssignments.put(NodeType.O, new NodeType[]{NodeType.OA}); + validAssignments.put(NodeType.UA, new NodeType[]{NodeType.UA, NodeType.PC}); + validAssignments.put(NodeType.U, new NodeType[]{NodeType.UA}); + } + + /** + * Check if the assignment provided, is valid under NGAC. + * + * @param ascType The type of the ascendant node. + * @param dscType The type of the descendant node. + * @throws InvalidAssignmentException if the ascendant type is not allowed to be assigned to the descendant type. + */ + public static void checkAssignment(NodeType ascType, NodeType dscType) throws InvalidAssignmentException { + NodeType[] check = validAssignments.get(ascType); + for (NodeType nt : check) { + if (nt.equals(dscType)) { + return; + } + } + + throw new InvalidAssignmentException(String.format("cannot assign a node of type %s to a node of type %s", + ascType, + dscType + )); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Association.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Association.java similarity index 84% rename from src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Association.java rename to src/main/java/gov/nist/csd/pm/pap/graph/relationship/Association.java index 1760bc0e3..b6938a857 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Association.java +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Association.java @@ -1,13 +1,12 @@ -package gov.nist.csd.pm.policy.model.graph.relationships; +package gov.nist.csd.pm.pap.graph.relationship; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; +import gov.nist.csd.pm.pap.graph.node.NodeType; import java.io.Serializable; import java.util.EnumMap; import java.util.Map; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; /** * This object represents an Association in a NGAC graph. An association is a relationship between two nodes, @@ -23,10 +22,6 @@ public Association(String source, String target, AccessRightSet ars) { super(source, target, ars); } - public Association(String ua, String target) { - super(ua, target, new AccessRightSet()); - } - private static final Map validAssociations = new EnumMap<>(NodeType.class); static { validAssociations.put(PC, new NodeType[]{}); diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssignmentException.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssignmentException.java new file mode 100644 index 000000000..5db3e9508 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssignmentException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.graph.relationship; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class InvalidAssignmentException extends PMException { + public InvalidAssignmentException(String msg) { + super(msg); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssociationException.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssociationException.java new file mode 100644 index 000000000..8b3013090 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/InvalidAssociationException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.graph.relationship; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class InvalidAssociationException extends PMException { + public InvalidAssociationException(String msg) { + super(msg); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Relationship.java b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Relationship.java new file mode 100644 index 000000000..02e58f53a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/graph/relationship/Relationship.java @@ -0,0 +1,84 @@ +package gov.nist.csd.pm.pap.graph.relationship; + +import java.io.Serializable; +import java.util.Objects; + +/** + * This class will serve as a descendant class for Assignments and Associations. Both types of relations have a source node + * and a target node. + */ +public class Relationship implements Serializable { + private String source; + private String target; + private AccessRightSet accessRightSet; + + public Relationship() { + + } + + public Relationship(String source, String target) { + this.source = source; + this.target = target; + this.accessRightSet = null; + } + + public Relationship(String source, String target, AccessRightSet accessRightSet) { + this.source = source; + this.target = target; + this.accessRightSet = accessRightSet; + } + + public Relationship(AccessRightSet accessRightSet) { + this.accessRightSet = accessRightSet; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public boolean isAssociation() { + return this.accessRightSet != null; + } + + public AccessRightSet getAccessRightSet() { + return accessRightSet; + } + + public void setAccessRightSet(AccessRightSet accessRightSet) { + this.accessRightSet = accessRightSet; + } + + public String toString() { + return source + "->" + target + (isAssociation() ? accessRightSet : ""); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Relationship)) { + return false; + } + Relationship that = (Relationship) o; + return Objects.equals(source, that.source) && Objects.equals( + target, that.target) && Objects.equals(accessRightSet, that.accessRightSet); + } + + @Override + public int hashCode() { + return Objects.hash(source, target, accessRightSet); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryGraph.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryGraph.java deleted file mode 100644 index 89ef51df2..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryGraph.java +++ /dev/null @@ -1,513 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.io.Serializable; -import java.util.*; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.WILDCARD; - -class MemoryGraph implements Graph { - - private final Map graph; - private final AccessRightSet resourceAccessRights; - private final List pcs; - private final List oas; - private final List uas; - private final List os; - private final List us; - - protected MemoryTx tx; - - public MemoryGraph() { - this.graph = new HashMap<>(); - this.pcs = new ArrayList<>(); - this.oas = new ArrayList<>(); - this.uas = new ArrayList<>(); - this.os = new ArrayList<>(); - this.us = new ArrayList<>(); - this.resourceAccessRights = new AccessRightSet(); - tx = new MemoryTx(false, 0, null); - } - - public MemoryGraph(MemoryGraph graph) { - this.graph = new HashMap<>(); - for (String n : graph.graph.keySet()) { - this.graph.put(n, graph.graph.get(n).copy()); - } - - this.pcs = new ArrayList<>(graph.pcs); - this.oas = new ArrayList<>(graph.oas); - this.uas = new ArrayList<>(graph.uas); - this.os = new ArrayList<>(graph.os); - this.us = new ArrayList<>(graph.us); - this.resourceAccessRights = new AccessRightSet(graph.getResourceAccessRights()); - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryGraph(Graph graph) throws PMException { - this.graph = new HashMap<>(); - this.pcs = new ArrayList<>(); - this.oas = new ArrayList<>(); - this.uas = new ArrayList<>(); - this.os = new ArrayList<>(); - this.us = new ArrayList<>(); - this.resourceAccessRights = new AccessRightSet(graph.getResourceAccessRights()); - this.tx = new MemoryTx(false, 0, null); - - List nodes = graph.search(ANY, NO_PROPERTIES); - - // add nodes to graph - List uas = new ArrayList<>(); - for (String n : nodes) { - Node node = graph.getNode(n); - addNode(n, node.getType(), node.getProperties()); - - if (node.getType() == UA) { - uas.add(n); - } - } - - // add assignments to graph - for (String n : nodes) { - List parents = graph.getParents(n); - for (String p : parents) { - assignInternal(n, p); - } - } - - // add associations to graph - for (String ua : uas) { - List assocs = graph.getAssociationsWithSource(ua); - for (Association a : assocs) { - associate(ua, a.getTarget(), a.getAccessRightSet()); - } - } - } - - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) throws PMException { - if (tx.active()) { - tx.policyStore().graph().setResourceAccessRights(accessRightSet); - } - - this.resourceAccessRights.clear(); - this.resourceAccessRights.addAll(accessRightSet); - } - - @Override - public AccessRightSet getResourceAccessRights() { - return new AccessRightSet(resourceAccessRights); - } - - @Override - public String createPolicyClass(String name, Map properties) throws PMException { - if (tx.active()) { - tx.policyStore().graph().createPolicyClass(name, properties); - } - - this.graph.put(name, getVertex(name, PC, properties)); - this.pcs.add(name); - - return name; - } - - @Override - public String createPolicyClass(String name) throws PMException { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) throws PMException { - if (tx.active()) { - tx.policyStore().graph().createUserAttribute(name, properties, parent, parents); - } - - return addNode(name, UA, properties, parent, parents); - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) throws PMException { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) throws PMException { - if (tx.active()) { - tx.policyStore().graph().createObjectAttribute(name, properties, parent, parents); - } - - return addNode(name, OA, properties, parent, parents); - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) throws PMException { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) throws PMException { - if (tx.active()) { - tx.policyStore().graph().createObject(name, properties, parent, parents); - } - - return addNode(name, O, properties, parent, parents); - } - - @Override - public String createObject(String name, String parent, String... parents) throws PMException { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) throws PMException { - if (tx.active()) { - tx.policyStore().graph().createUser(name, properties, parent, parents); - } - - return addNode(name, U, properties, parent, parents); - } - - @Override - public String createUser(String name, String parent, String... parents) throws PMException { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - @Override - public void setNodeProperties(String name, Map properties) throws PMException { - if (tx.active()) { - tx.policyStore().graph().setNodeProperties(name, properties); - } - - this.graph.get(name).setProperties(properties); - } - - @Override - public boolean nodeExists(String name) { - return this.graph.containsKey(name); - } - - - @Override - public Node getNode(String name) { - return new Node(this.graph.get(name).getNode()); - } - - @Override - public List search(NodeType type, Map properties) { - List nodes = filterByType(type); - return filterByProperties(nodes, properties); - } - - @Override - public List getPolicyClasses() { - return new ArrayList<>(pcs); - } - - @Override - public void deleteNode(String name) throws PMException { - if (!graph.containsKey(name)) { - return; - } - - if (tx.active()) { - tx.policyStore().graph().deleteNode(name); - } - - Vertex vertex = graph.get(name); - - List children = vertex.getChildren(); - List parents = vertex.getParents(); - List incomingAssociations = vertex.getIncomingAssociations(); - List outgoingAssociations = vertex.getOutgoingAssociations(); - - for (String child : children) { - graph.get(child).removeAssignment(child, name); - } - - for (String parent : parents) { - graph.get(parent).removeAssignment(name, parent); - } - - for (Association association : incomingAssociations) { - graph.get(association.getSource()).removeAssociation(association.getSource(), association.getTarget()); - } - - for (Association association : outgoingAssociations) { - graph.get(association.getTarget()).removeAssociation(association.getSource(), association.getTarget()); - } - - graph.remove(name); - - if (vertex.getNode().getType() == PC) { - pcs.remove(name); - } else if (vertex.getNode().getType() == OA) { - oas.remove(name); - } else if (vertex.getNode().getType() == UA) { - uas.remove(name); - } else if (vertex.getNode().getType() == O) { - os.remove(name); - } else if (vertex.getNode().getType() == U) { - us.remove(name); - } - } - - @Override - public void assign(String child, String parent) throws PMException { - if (tx.active()) { - tx.policyStore().graph().assign(child, parent); - } - - assignInternal(child, parent); - } - - @Override - public void deassign(String child, String parent) throws PMException { - if (tx.active()) { - tx.policyStore().graph().deassign(child, parent); - } - - deassignInternal(child, parent); - } - - @Override - public void assignAll(List children, String target) throws PMException { - if (tx.active()) { - tx.policyStore().graph().assignAll(children, target); - } - - for (String c : children) { - assignInternal(c, target); - } - } - - @Override - public void deassignAll(List children, String target) throws PMException { - if (tx.active()) { - tx.policyStore().graph().deassignAll(children, target); - } - - for (String c : children) { - deassignInternal(c, target); - } - } - - @Override - public void deassignAllFromAndDelete(String target) throws PMException { - if (tx.active()) { - tx.policyStore().graph().deassignAllFromAndDelete(target); - } - - for (String c : getChildren(target)) { - deassignInternal(c, target); - } - - deleteNode(target); - } - - @Override - public List getParents(String node) { - return new ArrayList<>(graph.get(node).getParents()); - } - - - @Override - public List getChildren(String node) { - return new ArrayList<>(graph.get(node).getChildren()); - } - - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { - if (tx.active()) { - tx.policyStore().graph().associate(ua, target, accessRights); - } - - if (containsEdge(ua, target)) { - // remove the existing association edge in order to update it - dissociateInternal(ua, target); - } - - associateInternal(ua, target, accessRights); - } - - @Override - public void dissociate(String ua, String target) throws PMException { - if (tx.active()) { - tx.policyStore().graph().dissociate(ua, target); - } - - dissociateInternal(ua, target); - } - - @Override - public List getAssociationsWithSource(String ua) { - return new ArrayList<>(graph.get(ua).getOutgoingAssociations()); - } - - @Override - public List getAssociationsWithTarget(String target) { - return new ArrayList<>(graph.get(target).getIncomingAssociations()); - } - - public String addNode(String name, NodeType type, Map properties) { - this.graph.put(name, getVertex(name, type, properties)); - if (type == NodeType.PC) { - this.pcs.add(name); - } else if (type == OA){ - this.oas.add(name); - } else if (type == UA){ - this.uas.add(name); - } else if (type == O){ - this.os.add(name); - } else if (type == U){ - this.us.add(name); - } - - return name; - } - - private String addNode(String name, NodeType type, Map properties, String initialParent, String ... parents) throws PMException { - addNode(name, type, properties); - - assign(name, initialParent); - for (String parent : parents) { - assign(name, parent); - } - - return name; - } - - private Vertex getVertex(String name, NodeType type, Map properties) { - switch (type){ - case PC -> { - return new PolicyClass(name, properties); - } - case OA -> { - return new ObjectAttribute(name, properties); - } - case UA -> { - return new UserAttribute(name, properties); - } - case O -> { - return new Object(name, properties); - } - default -> { - return new User(name, properties); - } - } - } - - private List filterByProperties(List nodes, Map properties) { - List results = new ArrayList<>(); - if (properties.isEmpty()) { - results.addAll(nodes); - } else { - for (String n : nodes) { - Map nodeProperties = graph.get(n).getNode().getProperties(); - - if (!hasAllKeys(nodeProperties, properties) - || !valuesMatch(nodeProperties, properties)) { - continue; - } - - results.add(n); - } - } - - return results; - } - - private List filterByType(NodeType type) { - List nodes = new ArrayList<>(); - if (type != ANY) { - if (type == PC) { - nodes.addAll(pcs); - } else if (type == OA) { - nodes.addAll(oas); - } else if (type == UA) { - nodes.addAll(uas); - } else if (type == O) { - nodes.addAll(os); - } else { - nodes.addAll(us); - } - } else { - nodes.addAll(pcs); - nodes.addAll(uas); - nodes.addAll(oas); - nodes.addAll(us); - nodes.addAll(os); - } - - return nodes; - } - - private boolean valuesMatch(Map nodeProperties, Map checkProperties) { - for (Map.Entry entry : checkProperties.entrySet()) { - String checkKey = entry.getKey(); - String checkValue = entry.getValue(); - if (!checkValue.equals(nodeProperties.get(checkKey)) - && !checkValue.equals(WILDCARD)) { - return false; - } - } - - return true; - } - - private boolean hasAllKeys(Map nodeProperties, Map checkProperties) { - for (String key : checkProperties.keySet()) { - if (!nodeProperties.containsKey(key)) { - return false; - } - } - - return true; - } - - public void assignInternal(String child, String parent) { - if (graph.get(child).getParents().contains(parent)) { - return; - } - - graph.get(child).addAssignment(child, parent); - graph.get(parent).addAssignment(child, parent); - } - - public void deassignInternal(String child, String parent) { - graph.get(child).removeAssignment(child, parent); - graph.get(parent).removeAssignment(child, parent); - } - - public void associateInternal(String ua, String target, AccessRightSet accessRights) { - graph.get(ua).addAssociation(ua, target, accessRights); - graph.get(target).addAssociation(ua, target, accessRights); - } - - public void dissociateInternal(String ua, String target) { - graph.get(ua).removeAssociation(ua, target); - graph.get(target).removeAssociation(ua, target); - } - - public boolean containsEdge(String source, String target) { - return graph.get(source).getParents().contains(target) - || graph.get(source).getOutgoingAssociations().contains(new Association(source, target)); - } - - public List getNodes() { - Collection values = graph.values(); - List nodes = new ArrayList<>(); - for (Vertex v : values) { - nodes.add(v.getNode()); - } - return nodes; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryObligations.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryObligations.java deleted file mode 100644 index 82a768c47..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryObligations.java +++ /dev/null @@ -1,99 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import com.google.gson.Gson; -import gov.nist.csd.pm.policy.Obligations; -import gov.nist.csd.pm.policy.exceptions.ObligationDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -class MemoryObligations implements Obligations, Serializable { - - protected MemoryTx tx; - private List obligations; - - public MemoryObligations() { - this.obligations = new ArrayList<>(); - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryObligations(List obligations) { - this.obligations = obligations; - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryObligations(Obligations obligations) throws PMException { - this.obligations = obligations.getAll(); - this.tx = new MemoryTx(false, 0, null); - } - - @Override - public void create(UserContext author, String label, Rule... rules) throws PMException { - if (tx.active()) { - tx.policyStore().obligations().create(author, label, rules); - } - - obligations.add(new Obligation(author, label, Arrays.asList(rules))); - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws PMException { - if (tx.active()) { - tx.policyStore().obligations().update(author, label, rules); - } - - for (Obligation o : obligations) { - if (o.getLabel().equals(label)) { - o.setAuthor(author); - o.setLabel(label); - o.setRules(List.of(rules)); - } - } - } - - @Override - public void delete(String label) throws PMException { - if (tx.active()) { - tx.policyStore().obligations().delete(label); - } - - this.obligations.removeIf(o -> o.getLabel().equals(label)); - } - - @Override - public List getAll() { - return new ArrayList<>(obligations); - } - - @Override - public boolean exists(String label) throws PMException { - for (Obligation o : obligations) { - if (o.getLabel().equals(label)) { - return true; - } - } - - return false; - } - - @Override - public Obligation get(String label) throws PMException { - for (Obligation obligation : obligations) { - if (obligation.getLabel().equals(label)) { - return obligation.clone(); - } - } - - throw new ObligationDoesNotExistException(label); - } - - public void fromJson(String json) { - this.obligations = new Gson().fromJson(json, List.class); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializer.java deleted file mode 100644 index 16f483da1..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializer.java +++ /dev/null @@ -1,117 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import gov.nist.csd.pm.policy.PolicyDeserializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.json.JSONGraph; -import gov.nist.csd.pm.policy.json.JSONPolicy; -import gov.nist.csd.pm.policy.json.JSONUserDefinedPML; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.PMLSerializer; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.apache.commons.lang3.SerializationUtils; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -public class MemoryPolicyDeserializer implements PolicyDeserializer { - - private static ObjectMapper mapper = new ObjectMapper(); - - private MemoryPolicyStore memoryPolicyStore; - - public MemoryPolicyDeserializer(MemoryPolicyStore memoryPolicyStore) { - this.memoryPolicyStore = memoryPolicyStore; - } - - @Override - public void fromJSON(String json) throws PMException { - JSONPolicy jsonPolicy = JSONPolicy.fromJson(json); - - graphFromJson(jsonPolicy.getGraph()); - prohibitionsFromJson(jsonPolicy.getProhibitions()); - obligationsFromJson(jsonPolicy.getObligations()); - userDefinedPMLFromJson(jsonPolicy.getUserDefinedPML()); - } - - @Override - public void fromPML(UserContext author, String pml, FunctionDefinitionStatement... customFunctions) throws PMException { - PMLSerializer pmlSerializer = new PMLSerializer(memoryPolicyStore); - pmlSerializer.fromPML(author, pml, customFunctions); - } - - private void userDefinedPMLFromJson(String userDefinedPML) throws PMException { - JSONUserDefinedPML jsonPML = - new Gson().fromJson(userDefinedPML, JSONUserDefinedPML.class); - - for (Map.Entry e : jsonPML.getFunctions().entrySet()) { - memoryPolicyStore.userDefinedPML().createFunction(SerializationUtils.deserialize(e.getValue())); - } - - for (Map.Entry e : jsonPML.getConstants().entrySet()) { - memoryPolicyStore.userDefinedPML().createConstant(e.getKey(), SerializationUtils.deserialize(e.getValue())); - } - } - - private void obligationsFromJson(String obligations) throws PMException { - Type type = new TypeToken>() {}.getType(); - List list = new Gson().fromJson(obligations, type); - - for (byte[] b : list) { - Obligation obligation = SerializationUtils.deserialize(b); - - List rules = obligation.getRules(); - memoryPolicyStore.obligations().create( - obligation.getAuthor(), - obligation.getLabel(), - rules.toArray(new Rule[]{}) - ); - } - } - - private void prohibitionsFromJson(String prohibitions) throws PMException { - Type type = new TypeToken>() {}.getType(); - List list = new Gson().fromJson(prohibitions, type); - - for (byte[] b : list) { - Prohibition prohibition = SerializationUtils.deserialize(b); - - memoryPolicyStore.prohibitions().create( - prohibition.getLabel(), - prohibition.getSubject(), - prohibition.getAccessRightSet(), - prohibition.isIntersection(), - prohibition.getContainers().toArray(new ContainerCondition[0]) - ); - } - } - - private void graphFromJson(String json) throws PMException { - JSONGraph jsonGraph = new Gson().fromJson(json, JSONGraph.class); - - ((MemoryGraph)memoryPolicyStore.graph()).setResourceAccessRights(jsonGraph.getResourceAccessRights()); - - for (Node node : jsonGraph.getNodes()) { - ((MemoryGraph)memoryPolicyStore.graph()).addNode(node.getName(), node.getType(), node.getProperties()); - } - - for (String[] assignment : jsonGraph.getAssignments()) { - ((MemoryGraph)memoryPolicyStore.graph()).assignInternal(assignment[0], assignment[1]); - } - - for (Map.Entry> e : jsonGraph.getAssociations().entrySet()) { - for (Map.Entry e2 : e.getValue().entrySet()) { - ((MemoryGraph)memoryPolicyStore.graph()).associateInternal(e.getKey(), e2.getKey(), e2.getValue()); - } - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicySerializer.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicySerializer.java deleted file mode 100644 index a3fd1551b..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicySerializer.java +++ /dev/null @@ -1,130 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import com.google.gson.Gson; -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.PolicySerializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.json.JSONGraph; -import gov.nist.csd.pm.policy.json.JSONPolicy; -import gov.nist.csd.pm.policy.json.JSONUserDefinedPML; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.PMLSerializer; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.apache.commons.lang3.SerializationUtils; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.ANY; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.UA; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -public class MemoryPolicySerializer implements PolicySerializer { - - private MemoryPolicyStore memoryPolicyStore; - - public MemoryPolicySerializer(MemoryPolicyStore memoryPolicyStore) { - this.memoryPolicyStore = memoryPolicyStore; - } - - @Override - public String toJSON() throws PMException { - return new Gson().toJson(toJSONPolicy()); - } - - @Override - public String toPML() throws PMException { - return new PMLSerializer(memoryPolicyStore).toPML(false); - } - - public JSONPolicy toJSONPolicy() throws PMException { - String jsonGraph = graphToJson(); - String jsonProhibitions = prohibitionsToJson(); - String jsonObligations = obligationsToJson(); - String jsonUserDefinedPML = userDefinedPMLToJson(); - - return new JSONPolicy(jsonGraph, jsonProhibitions, jsonObligations, jsonUserDefinedPML); - } - - private String userDefinedPMLToJson() throws PMException { - Map functionBytes = new HashMap<>(); - Map functions = memoryPolicyStore.userDefinedPML().getFunctions(); - for (Map.Entry f : functions.entrySet()) { - functionBytes.put(f.getKey(), SerializationUtils.serialize(f.getValue())); - } - - Map constantBytes = new HashMap<>(); - Map constants = memoryPolicyStore.userDefinedPML().getConstants(); - for (Map.Entry c : constants.entrySet()) { - constantBytes.put(c.getKey(), SerializationUtils.serialize(c.getValue())); - } - - return new Gson().toJson(new JSONUserDefinedPML( - functionBytes, - constantBytes - )); - } - - private String obligationsToJson() throws PMException { - List obligations = memoryPolicyStore.obligations().getAll(); - List bytes = new ArrayList<>(); - for (Obligation o : obligations) { - bytes.add(SerializationUtils.serialize(o)); - } - - return new Gson().toJson(bytes); - } - - private String prohibitionsToJson() throws PMException { - Map> prohibitions = memoryPolicyStore.prohibitions().getAll(); - List bytes = new ArrayList<>(); - for (List proList : prohibitions.values()) { - for (Prohibition p : proList) { - bytes.add(SerializationUtils.serialize(p)); - } - } - - return new Gson().toJson(bytes); - } - - private String graphToJson() throws PMException { - Graph graph = memoryPolicyStore.graph(); - AccessRightSet accessRightSet = graph.getResourceAccessRights(); - List nodes = new ArrayList<>(); - List assignments = new ArrayList<>(); - Map> associations = new HashMap<>(); - - List search = graph.search(ANY, NO_PROPERTIES); - for (String s : search) { - Node node = graph.getNode(s); - nodes.add(node); - - List children = graph.getChildren(s); - for (String c : children) { - assignments.add(new String[]{c, s}); - } - - if (node.getType() == UA) { - List assocs = graph.getAssociationsWithSource(s); - - Map assocsMap = associations.getOrDefault(s, new HashMap<>()); - for (Association a : assocs) { - assocsMap.put(a.getTarget(), a.getAccessRightSet()); - } - - associations.put(s, assocsMap); - } - } - - JSONGraph jsonGraph = new JSONGraph(accessRightSet, nodes, assignments, associations); - return new Gson().toJson(jsonGraph); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStore.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStore.java deleted file mode 100644 index 72dca6621..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStore.java +++ /dev/null @@ -1,135 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.pap.PolicyStore; -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.events.PolicySynchronizationEvent; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.io.Serializable; - -public class MemoryPolicyStore extends PolicyStore { - - private MemoryGraph graph; - private MemoryProhibitions prohibitions; - private MemoryObligations obligations; - private MemoryUserDefinedPML userDefinedPML; - - private boolean inTx; - private int txCounter; - private TxPolicyStore txPolicyStore; - - public MemoryPolicyStore() { - this.graph = new MemoryGraph(); - this.prohibitions = new MemoryProhibitions(); - this.obligations = new MemoryObligations(); - this.userDefinedPML = new MemoryUserDefinedPML(); - } - - public MemoryPolicyStore(Graph graph, Prohibitions prohibitions, Obligations obligations, UserDefinedPML userDefinedPML) throws PMException { - this.graph = new MemoryGraph(graph); - this.prohibitions = new MemoryProhibitions(prohibitions); - this.obligations = new MemoryObligations(obligations); - this.userDefinedPML = new MemoryUserDefinedPML(userDefinedPML); - } - - MemoryPolicyStore(MemoryGraph graph, MemoryProhibitions prohibitions, MemoryObligations obligations, MemoryUserDefinedPML userDefinedPML) throws PMException { - this.graph = graph; - this.prohibitions = prohibitions; - this.obligations = obligations; - this.userDefinedPML = userDefinedPML; - } - - @Override - public Graph graph() { - return graph; - } - - @Override - public Prohibitions prohibitions() { - return prohibitions; - } - - @Override - public Obligations obligations() { - return obligations; - } - - @Override - public UserDefinedPML userDefinedPML() { - return userDefinedPML; - } - - @Override - public PolicySerializer serialize() { - return new MemoryPolicySerializer(this); - } - - @Override - public PolicyDeserializer deserialize() { - return new MemoryPolicyDeserializer(this); - } - - @Override - public PolicySynchronizationEvent policySync() { - return new PolicySynchronizationEvent( - this - ); - } - - @Override - public void beginTx() throws PMException { - if (!inTx) { - txPolicyStore = new TxPolicyStore(this); - } - - inTx = true; - txCounter++; - - MemoryTx tx = new MemoryTx(true, txCounter, txPolicyStore); - graph.tx = tx; - prohibitions.tx = tx; - obligations.tx = tx; - userDefinedPML.tx = tx; - } - - @Override - public void commit() throws PMException { - txCounter--; - if(txCounter == 0) { - inTx = false; - txPolicyStore.clearEvents(); - - MemoryTx tx = new MemoryTx(false, txCounter, txPolicyStore); - graph.tx = tx; - prohibitions.tx = tx; - obligations.tx = tx; - userDefinedPML.tx = tx; - } - } - - @Override - public void rollback() throws PMException { - inTx = false; - txCounter = 0; - - MemoryTx tx = new MemoryTx(false, txCounter, txPolicyStore); - graph.tx = tx; - prohibitions.tx = tx; - obligations.tx = tx; - userDefinedPML.tx = tx; - - TxPolicyEventListener txPolicyEventListener = txPolicyStore.getTxPolicyEventListener(); - txPolicyEventListener.revert(this); - } - - @Override - protected void reset() throws PMException { - graph = new MemoryGraph(); - prohibitions = new MemoryProhibitions(); - obligations = new MemoryObligations(); - userDefinedPML = new MemoryUserDefinedPML(); - - // a call to rollback will reset tx fields - rollback(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreEventHandler.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreEventHandler.java deleted file mode 100644 index 462a25494..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreEventHandler.java +++ /dev/null @@ -1,20 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class MemoryPolicyStoreEventHandler extends BasePolicyEventHandler { - - public MemoryPolicyStoreEventHandler(MemoryPolicyStore store) { - super(store); - } - - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - if (event instanceof PolicySynchronizationEvent policySynchronizationEvent) { - policy = policySynchronizationEvent.getPolicyStore(); - } else { - super.handlePolicyEvent(event); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryProhibitions.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryProhibitions.java deleted file mode 100644 index b2f7ae257..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryProhibitions.java +++ /dev/null @@ -1,126 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import com.google.gson.Gson; -import gov.nist.csd.pm.policy.Prohibitions; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.ProhibitionDoesNotExistException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.io.Serializable; -import java.util.*; - -class MemoryProhibitions implements Prohibitions, Serializable { - - protected MemoryTx tx; - private Map> prohibitions; - - public MemoryProhibitions() { - this.prohibitions = new HashMap<>(); - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryProhibitions(Map> prohibitions) { - this.prohibitions = prohibitions; - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryProhibitions(Prohibitions prohibitions) throws PMException { - this.prohibitions = prohibitions.getAll(); - this.tx = new MemoryTx(false, 0, null); - } - - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - if (tx.active()) { - tx.policyStore().prohibitions().create(label, subject, accessRightSet, intersection, containerConditions); - } - - List existingPros = prohibitions.getOrDefault(subject.getName(), new ArrayList<>()); - existingPros.add(new Prohibition(label, subject, accessRightSet, intersection, Arrays.asList(containerConditions))); - prohibitions.put(subject.getName(), existingPros); - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - if (tx.active()) { - tx.policyStore().prohibitions().update(label, subject, accessRightSet, intersection, containerConditions); - } - - delete(label); - create(label, subject, accessRightSet, intersection, containerConditions); - } - - @Override - public void delete(String label) throws PMException { - if (tx.active()) { - tx.policyStore().prohibitions().delete(label); - } - - for(String subject : prohibitions.keySet()) { - List ps = prohibitions.get(subject); - Iterator iterator = ps.iterator(); - while (iterator.hasNext()) { - Prohibition p = iterator.next(); - if(p.getLabel().equals(label)) { - iterator.remove(); - prohibitions.put(subject, ps); - } - } - } - } - - @Override - public Map> getAll() { - Map> retProhibitions = new HashMap<>(); - for (String subject : prohibitions.keySet()) { - retProhibitions.put(subject, prohibitions.get(subject)); - } - - return retProhibitions; - } - - @Override - public boolean exists(String label) throws PMException { - for (Map.Entry> e : prohibitions.entrySet()) { - for (Prohibition p : e.getValue()) { - if (p.getLabel().equals(label)) { - return true; - } - } - } - - return false; - } - - @Override - public List getWithSubject(String subject) { - List subjectPros = prohibitions.get(subject); - if (subjectPros == null) { - return new ArrayList<>(); - } - - return new ArrayList<>(subjectPros); - } - - @Override - public Prohibition get(String label) throws PMException { - for (String subject : prohibitions.keySet()) { - List subjectPros = prohibitions.get(subject); - for (Prohibition p : subjectPros) { - if (p.getLabel().equals(label)) { - return p; - } - } - } - - throw new ProhibitionDoesNotExistException(label); - } - - public void fromJson(String json) { - this.prohibitions = new Gson().fromJson(json, Map.class); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryTx.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryTx.java deleted file mode 100644 index 8f4244aed..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryTx.java +++ /dev/null @@ -1,4 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -public record MemoryTx(boolean active, int counter, TxPolicyStore policyStore) { -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryUserDefinedPML.java b/src/main/java/gov/nist/csd/pm/pap/memory/MemoryUserDefinedPML.java deleted file mode 100644 index 7e04275f1..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/MemoryUserDefinedPML.java +++ /dev/null @@ -1,92 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.UserDefinedPML; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -class MemoryUserDefinedPML implements UserDefinedPML, Serializable { - - protected MemoryTx tx; - private Map functions; - private Map constants; - - public MemoryUserDefinedPML() { - this.functions = new HashMap<>(); - this.constants = new HashMap<>(); - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryUserDefinedPML(Map functions, Map constants) { - this.functions = functions; - this.constants = constants; - this.tx = new MemoryTx(false, 0, null); - } - - public MemoryUserDefinedPML(UserDefinedPML userDefinedPML) throws PMException { - this.functions = userDefinedPML.getFunctions(); - this.constants = userDefinedPML.getConstants(); - this.tx = new MemoryTx(false, 0, null); - } - - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws PMException { - if (tx.active()) { - tx.policyStore().userDefinedPML().createFunction(functionDefinitionStatement); - } - - functions.put(functionDefinitionStatement.getFunctionName(), functionDefinitionStatement); - } - - @Override - public void deleteFunction(String functionName) throws PMException { - if (tx.active()) { - tx.policyStore().userDefinedPML().deleteFunction(functionName); - } - - functions.remove(functionName); - } - - @Override - public Map getFunctions() { - return new HashMap<>(functions); - } - - @Override - public FunctionDefinitionStatement getFunction(String name) throws PMException { - return getFunctions().get(name); - } - - @Override - public void createConstant(String constantName, Value constantValue) throws PMException { - if (tx.active()) { - tx.policyStore().userDefinedPML().createConstant(constantName, constantValue); - } - - constants.put(constantName, constantValue); - } - - @Override - public void deleteConstant(String constName) throws PMException { - if (tx.active()) { - tx.policyStore().userDefinedPML().deleteConstant(constName); - } - - constants.remove(constName); - } - - @Override - public Map getConstants() { - return new HashMap<>(constants); - } - - @Override - public Value getConstant(String name) { - return getConstants().get(name); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/Object.java b/src/main/java/gov/nist/csd/pm/pap/memory/Object.java deleted file mode 100644 index 5787dbfee..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/Object.java +++ /dev/null @@ -1,82 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -class Object implements Vertex { - - private final Node node; - private final List parents; - - public Object(String name, Map properties) { - this.node = new Node(name, NodeType.O, properties); - this.parents = new ArrayList<>(); - } - - private Object(Node node, List parents) { - this.node = new Node(node); - this.parents = new ArrayList<>(parents); - } - - @Override - public Vertex copy() { - return new Object(node, parents); - } - - @Override - public void setProperties(Map properties) { - node.setProperties(properties); - } - - @Override - public Node getNode() { - return node; - } - - @Override - public List getParents() { - return parents; - } - - @Override - public List getChildren() { - return Collections.emptyList(); - } - - @Override - public List getOutgoingAssociations() { - return Collections.emptyList(); - } - - @Override - public List getIncomingAssociations() { - return Collections.emptyList(); - } - - @Override - public void addAssignment(String child, String parent) { - parents.add(parent); - } - - @Override - public void removeAssignment(String child, String parent) { - parents.remove(parent); - } - - @Override - public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { - - } - - @Override - public void removeAssociation(String ua, String target) { - - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/ObjectAttribute.java b/src/main/java/gov/nist/csd/pm/pap/memory/ObjectAttribute.java deleted file mode 100644 index c407efe1d..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/ObjectAttribute.java +++ /dev/null @@ -1,96 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -class ObjectAttribute implements Vertex { - - private final Node node; - private final List parents; - private final List children; - private final List associations; - - public ObjectAttribute(String name, Map properties) { - this.node = new Node(name, NodeType.OA, properties); - this.parents = new ArrayList<>(); - this.children = new ArrayList<>(); - this.associations = new ArrayList<>(); - } - - private ObjectAttribute(Node node, List parents, List children, List associations) { - this.node = new Node(node); - this.parents = new ArrayList<>(parents); - this.children = new ArrayList<>(children); - this.associations = new ArrayList<>(associations); - } - - @Override - public Vertex copy() { - return new ObjectAttribute(node, parents, children, associations); - } - - @Override - public void setProperties(Map properties) { - node.setProperties(properties); - } - - @Override - public Node getNode() { - return node; - } - - @Override - public List getParents() { - return parents; - } - - @Override - public List getChildren() { - return children; - } - - @Override - public List getOutgoingAssociations() { - return Collections.emptyList(); - } - - @Override - public List getIncomingAssociations() { - return associations; - } - - @Override - public void addAssignment(String child, String parent) { - if (child.equals(node.getName())) { - parents.add(parent); - } else { - children.add(child); - } - } - - @Override - public void removeAssignment(String child, String parent) { - if (child.equals(node.getName())) { - parents.remove(parent); - } else { - children.remove(child); - } - } - - @Override - public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { - associations.add(new Association(ua, target, accessRightSet)); - } - - @Override - public void removeAssociation(String ua, String target) { - associations.remove(new Association(ua, target)); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/PolicyClass.java b/src/main/java/gov/nist/csd/pm/pap/memory/PolicyClass.java deleted file mode 100644 index 7950b27c6..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/PolicyClass.java +++ /dev/null @@ -1,82 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -class PolicyClass implements Vertex { - - private final Node node; - private final List children; - - public PolicyClass(String name, Map properties) { - this.node = new Node(name, NodeType.PC, properties); - this.children = new ArrayList<>(); - } - - private PolicyClass(Node node, List children) { - this.node = new Node(node); - this.children = new ArrayList<>(children); - } - - @Override - public Vertex copy() { - return new PolicyClass(node, children); - } - - @Override - public void setProperties(Map properties) { - node.setProperties(properties); - } - - @Override - public Node getNode() { - return node; - } - - @Override - public List getParents() { - return Collections.emptyList(); - } - - @Override - public List getChildren() { - return children; - } - - @Override - public List getOutgoingAssociations() { - return Collections.emptyList(); - } - - @Override - public List getIncomingAssociations() { - return Collections.emptyList(); - } - - @Override - public void addAssignment(String child, String parent) { - children.add(child); - } - - @Override - public void removeAssignment(String child, String parent) { - children.remove(child); - } - - @Override - public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { - - } - - @Override - public void removeAssociation(String ua, String target) { - - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/TxCmd.java b/src/main/java/gov/nist/csd/pm/pap/memory/TxCmd.java deleted file mode 100644 index 9e0792067..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/TxCmd.java +++ /dev/null @@ -1,387 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.*; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.PC; - -interface TxCmd { - - void revert(MemoryPolicyStore store) throws PMException; - - class CreatePolicyClassTxCmd implements TxCmd { - - private String name; - private Map properties; - - public CreatePolicyClassTxCmd(String name, Map properties) { - this.name = name; - this.properties = properties; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deleteNode(name); - } - } - - class CreateObjectAttributeTxCmd implements TxCmd { - private final String name; - private final Map properties; - private final String parent; - private final String[] parents; - - public CreateObjectAttributeTxCmd(String name, Map properties, String parent, String... parents) { - this.name = name; - this.properties = properties; - this.parent = parent; - this.parents = parents; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deleteNode(name); - } - } - - class CreateUserAttributeTxCmd implements TxCmd { - private final String name; - private final Map properties; - private final String parent; - private final String[] parents; - - public CreateUserAttributeTxCmd(String name, Map properties, String parent, String... parents) { - this.name = name; - this.properties = properties; - this.parent = parent; - this.parents = parents; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deleteNode(name); - } - } - - class CreateObjectTxCmd implements TxCmd { - private final String name; - private final Map properties; - private final String parent; - private final String[] parents; - - public CreateObjectTxCmd(String name, Map properties, String parent, String... parents) { - this.name = name; - this.properties = properties; - this.parent = parent; - this.parents = parents; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deleteNode(name); - } - } - - class CreateUserTxCmd implements TxCmd { - private final String name; - private final Map properties; - private final String parent; - private final String[] parents; - - public CreateUserTxCmd(String name, Map properties, String parent, String... parents) { - this.name = name; - this.properties = properties; - this.parent = parent; - this.parents = parents; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deleteNode(name); - } - } - - class SetNodePropertiesTxCmd implements TxCmd { - private final String name; - private final Map oldProperties; - private final Map newProperties; - - public SetNodePropertiesTxCmd(String name, Map oldProperties, Map newProperties) { - this.name = name; - this.oldProperties = oldProperties; - this.newProperties = newProperties; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().setNodeProperties(name, oldProperties); - } - } - - class DeleteNodeTxCmd implements TxCmd { - private final String name; - private final Node nodeToDelete; - private final List parents; - - public DeleteNodeTxCmd(String name, Node nodeToDelete, List parents) { - this.name = name; - this.nodeToDelete = nodeToDelete; - this.parents = parents; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - NodeType type = nodeToDelete.getType(); - Map properties = nodeToDelete.getProperties(); - String initialParent = ""; - String[] parentsArr = new String[parents.size()]; - if (type != PC) { - initialParent = parents.get(0); - parents.remove(0); - parentsArr = parents.toArray(new String[]{}); - } - - switch (type) { - case PC -> store.graph().createPolicyClass(name, properties); - case OA -> store.graph().createObjectAttribute(name, properties, initialParent, parentsArr); - case UA -> store.graph().createUserAttribute(name, properties, initialParent, parentsArr); - case O -> store.graph().createObject(name, properties, initialParent, parentsArr); - case U -> store.graph().createUser(name, properties, initialParent, parentsArr); - } - } - } - - final class AssignTxCmd implements TxCmd { - private final String child; - private final String parent; - - public AssignTxCmd(String child, String parent) { - this.child = child; - this.parent = parent; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().deassign(child, parent); - } - } - - class DeassignTxCmd implements TxCmd { - private final String child; - private final String parent; - - public DeassignTxCmd(String child, String parent) { - this.child = child; - this.parent = parent; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().assign(child, parent); - } - } - - class AssociateTxCmd implements TxCmd { - private final Association association; - - public AssociateTxCmd(Association association) { - this.association = association; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().dissociate(association.getSource(), association.getTarget()); - } - } - - class DissociateTxCmd implements TxCmd { - private final Association association; - - public DissociateTxCmd(Association association) { - this.association = association; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.graph().associate(association.getSource(), association.getTarget(), association.getAccessRightSet()); - } - } - - class CreateProhibitionTxCmd implements TxCmd { - private final Prohibition prohibition; - - public CreateProhibitionTxCmd(Prohibition prohibition) { - this.prohibition = prohibition; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.prohibitions().delete(prohibition.getLabel()); - } - } - - class UpdateProhibitionTxCmd implements TxCmd { - private final Prohibition newProhibition; - private final Prohibition oldProhibition; - - public UpdateProhibitionTxCmd(Prohibition newProhibition, Prohibition oldProhibition) { - this.newProhibition = newProhibition; - this.oldProhibition = oldProhibition; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.prohibitions().update( - oldProhibition.getLabel(), - oldProhibition.getSubject(), - oldProhibition.getAccessRightSet(), - oldProhibition.isIntersection(), - oldProhibition.getContainers().toArray(new ContainerCondition[]{}) - ); - } - } - - class DeleteProhibitionTxCmd implements TxCmd { - private final Prohibition prohibitionToDelete; - - public DeleteProhibitionTxCmd(Prohibition prohibitionToDelete) { - this.prohibitionToDelete = prohibitionToDelete; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.prohibitions().create( - prohibitionToDelete.getLabel(), - prohibitionToDelete.getSubject(), - prohibitionToDelete.getAccessRightSet(), - prohibitionToDelete.isIntersection(), - prohibitionToDelete.getContainers().toArray(new ContainerCondition[]{}) - ); - } - } - - class CreateObligationTxCmd implements TxCmd { - private final Obligation obligation; - - public CreateObligationTxCmd(Obligation obligation) { - this.obligation = obligation; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.obligations().delete(obligation.getLabel()); - } - } - - class UpdateObligationTxCmd implements TxCmd { - private final Obligation newObligation; - private final Obligation oldObligation; - - public UpdateObligationTxCmd(Obligation newObligation, Obligation oldObligation) { - this.newObligation = newObligation; - this.oldObligation = oldObligation; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.obligations().update( - oldObligation.getAuthor(), - oldObligation.getLabel(), - oldObligation.getRules().toArray(new Rule[]{}) - ); - } - } - - class DeleteObligationTxCmd implements TxCmd { - private final Obligation obligationToDelete; - public DeleteObligationTxCmd(Obligation obligationToDelete) { - this.obligationToDelete = obligationToDelete; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.obligations().create( - obligationToDelete.getAuthor(), - obligationToDelete.getLabel(), - obligationToDelete.getRules().toArray(new Rule[]{}) - ); - } - } - - class AddFunctionTxCmd implements TxCmd { - private final FunctionDefinitionStatement functionDefinitionStatement; - - public AddFunctionTxCmd(FunctionDefinitionStatement functionDefinitionStatement) { - this.functionDefinitionStatement = functionDefinitionStatement; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.userDefinedPML().deleteFunction(functionDefinitionStatement.getFunctionName()); - } - } - - class RemoveFunctionTxCmd implements TxCmd { - private final FunctionDefinitionStatement functionDefinitionStatement; - - public RemoveFunctionTxCmd(FunctionDefinitionStatement functionDefinitionStatement) { - this.functionDefinitionStatement = functionDefinitionStatement; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.userDefinedPML().createFunction(functionDefinitionStatement); - } - - } - - class AddConstantTxCmd implements TxCmd { - private final String constantName; - private final Value value; - - public AddConstantTxCmd(String constantName, Value value) { - this.constantName = constantName; - this.value = value; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.userDefinedPML().deleteConstant(constantName); - } - } - - class RemoveConstantTxCmd implements TxCmd { - private final String constantName; - private final Value oldValue; - - public RemoveConstantTxCmd(String constantName, Value oldValue) { - this.constantName = constantName; - this.oldValue = oldValue; - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - store.userDefinedPML().createConstant(constantName, oldValue); - } - } - - class NoopTxCmd implements TxCmd { - public NoopTxCmd() { - } - - @Override - public void revert(MemoryPolicyStore store) { - - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/TxEvents.java b/src/main/java/gov/nist/csd/pm/pap/memory/TxEvents.java deleted file mode 100644 index c8844986a..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/TxEvents.java +++ /dev/null @@ -1,142 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.List; -import java.util.Map; - -public class TxEvents { - - private TxEvents() {} - - public static class MemoryDeleteNodeEvent extends DeleteNodeEvent { - - private Node node; - private List parents; - - public MemoryDeleteNodeEvent(String name, Node node, List parents) { - super(name); - this.node = node; - this.parents = parents; - } - - public Node getNode() { - return node; - } - - public List getParents() { - return parents; - } - } - - public static class MemoryDeleteObligationEvent extends DeleteObligationEvent { - - private Obligation obligationToDelete; - - public MemoryDeleteObligationEvent(Obligation obligationToDelete) { - super(obligationToDelete); - this.obligationToDelete = obligationToDelete; - } - - public Obligation getObligationToDelete() { - return obligationToDelete; - } - } - - public static class MemoryDeleteProhibitionEvent extends DeleteProhibitionEvent { - - public MemoryDeleteProhibitionEvent(Prohibition prohibition) { - super(prohibition); - } - } - - public static class MemoryDissociateEvent extends DissociateEvent { - - private AccessRightSet accessRightSet; - - public MemoryDissociateEvent(String ua, String target, AccessRightSet accessRightSet) { - super(ua, target); - this.accessRightSet = accessRightSet; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - } - - public static class MemoryRemoveConstantEvent extends RemoveConstantEvent { - - private Value value; - - public MemoryRemoveConstantEvent(String constantName, Value value) { - super(constantName); - this.value = value; - } - - public Value getValue() { - return value; - } - } - - public static class MemoryRemoveFunctionEvent extends RemoveFunctionEvent { - - private FunctionDefinitionStatement functionDefinitionStatement; - - public MemoryRemoveFunctionEvent(FunctionDefinitionStatement functionDefinitionStatement) { - super(functionDefinitionStatement.getFunctionName()); - this.functionDefinitionStatement = functionDefinitionStatement; - } - - public FunctionDefinitionStatement getFunctionDefinitionStatement() { - return functionDefinitionStatement; - } - } - - public static class MemorySetNodePropertiesEvent extends SetNodePropertiesEvent { - - private Map oldProps; - - public MemorySetNodePropertiesEvent(String name, Map oldProps, Map newProps) { - super(name, newProps); - this.oldProps = oldProps; - } - - public Map getOldProps() { - return oldProps; - } - } - - public static class MemoryUpdateObligationEvent extends UpdateObligationEvent { - - private Obligation oldObl; - - public MemoryUpdateObligationEvent(Obligation newObl, Obligation oldObl) { - super(newObl.getAuthor(), newObl.getLabel(), newObl.getRules()); - this.oldObl = oldObl; - } - - public Obligation getOldObl() { - return oldObl; - } - } - - public static class MemoryUpdateProhibitionEvent extends UpdateProhibitionEvent { - - private Prohibition oldPro; - - public MemoryUpdateProhibitionEvent(Prohibition newPro, Prohibition oldPro) { - super(newPro.getLabel(), newPro.getSubject(), newPro.getAccessRightSet(), newPro.isIntersection(), newPro.getContainers()); - this.oldPro = oldPro; - } - - public Prohibition getOldPro() { - return oldPro; - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyEventListener.java b/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyEventListener.java deleted file mode 100644 index f5e0a223a..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyEventListener.java +++ /dev/null @@ -1,89 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.ArrayList; -import java.util.List; - -class TxPolicyEventListener implements PolicyEventListener, TxCmd { - - private final List events; - - public TxPolicyEventListener() { - events = new ArrayList<>(); - } - - public List getEvents() { - return events; - } - - @Override - public void handlePolicyEvent(PolicyEvent event) { - this.events.add(event); - } - - @Override - public void revert(MemoryPolicyStore store) throws PMException { - for (int i = events.size()-1; i >= 0; i--) { - TxCmd cmd = eventToCmd(events.get(i)); - cmd.revert(store); - } - } - - private TxCmd eventToCmd(PolicyEvent event) { - if (event instanceof AddConstantEvent e) { - return new AddConstantTxCmd(e.getName(), e.getValue()); - } else if (event instanceof AddFunctionEvent e) { - return new AddFunctionTxCmd(e.getFunctionDefinitionStatement()); - } else if (event instanceof AssignEvent e) { - return new AssignTxCmd(e.getChild(), e.getParent()); - } else if (event instanceof AssignToEvent e) { - return new AssignTxCmd(e.getChild(), e.getParent()); - } else if (event instanceof AssociateEvent e) { - return new AssociateTxCmd(new Association(e.getUa(), e.getTarget(), e.getAccessRightSet())); - } else if (event instanceof CreateObjectAttributeEvent e) { - return new CreateObjectAttributeTxCmd(e.getName(), e.getProperties(), e.getInitialParent(), e.getAdditionalParents()); - } else if (event instanceof CreateObjectEvent e) { - return new CreateObjectTxCmd(e.getName(), e.getProperties(), e.getInitialParent(), e.getAdditionalParents()); - } else if (event instanceof CreateObligationEvent e) { - return new CreateObligationTxCmd(new Obligation(e.getAuthor(), e.getLabel(), e.getRules())); - } else if (event instanceof CreatePolicyClassEvent e) { - return new CreatePolicyClassTxCmd(e.getName(), e.getProperties()); - } else if (event instanceof CreateProhibitionEvent e) { - return new CreateProhibitionTxCmd(new Prohibition(e.getLabel(), e.getSubject(), e.getAccessRightSet(), e.isIntersection(), e.getContainers())); - } else if (event instanceof CreateUserAttributeEvent e) { - return new CreateUserAttributeTxCmd(e.getName(), e.getProperties(), e.getInitialParent(), e.getAdditionalParents()); - } else if (event instanceof CreateUserEvent e) { - return new CreateUserTxCmd(e.getName(), e.getProperties(), e.getInitialParent(), e.getAdditionalParents()); - } else if (event instanceof DeassignEvent e) { - return new DeassignTxCmd(e.getChild(), e.getParent()); - } else if (event instanceof TxEvents.MemoryDeleteNodeEvent e) { - return new DeleteNodeTxCmd(e.getName(), e.getNode(), e.getParents()); - } else if (event instanceof TxEvents.MemoryDeleteObligationEvent e) { - return new DeleteObligationTxCmd(e.getObligationToDelete()); - } else if (event instanceof TxEvents.MemoryDeleteProhibitionEvent e) { - return new DeleteProhibitionTxCmd(e.getProhibition()); - } else if (event instanceof TxEvents.MemoryDissociateEvent e) { - return new DissociateTxCmd(new Association(e.getUa(), e.getTarget(), e.getAccessRightSet())); - } else if (event instanceof TxEvents.MemoryRemoveConstantEvent e) { - return new RemoveConstantTxCmd(e.getName(), e.getValue()); - } else if (event instanceof TxEvents.MemoryRemoveFunctionEvent e) { - return new RemoveFunctionTxCmd(e.getFunctionDefinitionStatement()); - } else if (event instanceof TxEvents.MemorySetNodePropertiesEvent e) { - return new SetNodePropertiesTxCmd(e.getName(), e.getOldProps(), e.getProperties()); - } else if (event instanceof TxEvents.MemoryUpdateObligationEvent e) { - return new UpdateObligationTxCmd(new Obligation(e.getAuthor(), e.getLabel(), e.getRules()), e.getOldObl()); - } else if (event instanceof TxEvents.MemoryUpdateProhibitionEvent e) { - return new UpdateProhibitionTxCmd( - new Prohibition(e.getName(), e.getSubject(), e.getAccessRightSet(), e.isIntersection(), e.getContainers()), - e.getOldPro() - ); - } - - return new NoopTxCmd(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyStore.java b/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyStore.java deleted file mode 100644 index 233614887..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/TxPolicyStore.java +++ /dev/null @@ -1,381 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -class TxPolicyStore implements Policy, PolicyEventEmitter { - - private final MemoryPolicyStore memoryPolicyStore; - - /** - * An event listener to track the events that occur during the transaction. - * These events will be committed to the target policy store on commit. - */ - protected TxPolicyEventListener txPolicyEventListener; - - private TxGraph txGraph; - private TxProhibitions txProhibitions; - private TxObligations txObligations; - private TxUserDefinedPML txUserDefinedPML; - - public TxPolicyStore(MemoryPolicyStore txStore) { - this.memoryPolicyStore = txStore; - this.txPolicyEventListener = new TxPolicyEventListener(); - this.txGraph = new TxGraph(); - this.txProhibitions = new TxProhibitions(); - this.txObligations = new TxObligations(); - this.txUserDefinedPML = new TxUserDefinedPML(); - } - - public TxPolicyEventListener getTxPolicyEventListener() { - return txPolicyEventListener; - } - - public void clearEvents() { - txPolicyEventListener = new TxPolicyEventListener(); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) { - txPolicyEventListener.handlePolicyEvent(event); - } - - @Override - public Graph graph() { - return txGraph; - } - - @Override - public Prohibitions prohibitions() { - return txProhibitions; - } - - @Override - public Obligations obligations() { - return txObligations; - } - - @Override - public UserDefinedPML userDefinedPML() { - return txUserDefinedPML; - } - - @Override - public PolicySerializer serialize() throws PMException { - return memoryPolicyStore.serialize(); - } - - @Override - public PolicyDeserializer deserialize() throws PMException { - return memoryPolicyStore.deserialize(); - } - - class TxGraph implements Graph { - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) { - emitEvent(new SetResourceAccessRightsEvent(accessRightSet)); - } - - @Override - public AccessRightSet getResourceAccessRights() { - return null; - } - - @Override - public String createPolicyClass(String name, Map properties) { - emitEvent(new CreatePolicyClassEvent(name, properties)); - return name; - } - - @Override - public String createPolicyClass(String name) { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) { - emitEvent(new CreateUserAttributeEvent(name, properties, parent, parents)); - return name; - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) { - emitEvent(new CreateObjectAttributeEvent(name, properties, parent, parents)); - return name; - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) { - emitEvent(new CreateObjectEvent(name, properties, parent, parents)); - return name; - } - - @Override - public String createObject(String name, String parent, String... parents) { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) { - emitEvent(new CreateUserEvent(name, properties, parent, parents)); - return name; - } - - @Override - public String createUser(String name, String parent, String... parents) { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - @Override - public void setNodeProperties(String name, Map properties) throws PMException { - emitEvent(new TxEvents.MemorySetNodePropertiesEvent(name, memoryPolicyStore.graph().getNode(name).getProperties(), properties)); - } - - @Override - public boolean nodeExists(String name) { - return false; - } - - @Override - public Node getNode(String name) { - return null; - } - - @Override - public List search(NodeType type, Map properties) { - return null; - } - - @Override - public List getPolicyClasses() { - return null; - } - - @Override - public void deleteNode(String name) throws PMException { - emitEvent(new TxEvents.MemoryDeleteNodeEvent( - name, - memoryPolicyStore.graph().getNode(name), - memoryPolicyStore.graph().getParents(name) - )); - } - - @Override - public void assign(String child, String parent) { - emitEvent(new AssignEvent(child, parent)); - } - - @Override - public void deassign(String child, String parent) { - emitEvent(new DeassignEvent(child, parent)); - } - - @Override - public void assignAll(List children, String target) { - emitEvent(new AssignAllEvent(children, target)); - } - - @Override - public void deassignAll(List children, String target) { - emitEvent(new DeassignAllEvent(children, target)); - } - - @Override - public void deassignAllFromAndDelete(String target) { - emitEvent(new DeassignAllFromAndDeleteEvent(target)); - } - - @Override - public List getParents(String node) { - return null; - } - - @Override - public List getChildren(String node) { - return null; - } - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) { - emitEvent(new AssociateEvent(ua, target, accessRights)); - } - - @Override - public void dissociate(String ua, String target) throws PMException { - AccessRightSet accessRightSet = new AccessRightSet(); - for (Association association : memoryPolicyStore.graph().getAssociationsWithSource(ua)) { - if (association.getTarget().equals(target)) { - accessRightSet = association.getAccessRightSet(); - } - } - - emitEvent(new TxEvents.MemoryDissociateEvent(ua, target, accessRightSet)); - } - - @Override - public List getAssociationsWithSource(String ua) { - return null; - } - - @Override - public List getAssociationsWithTarget(String target) { - return null; - } - } - - class TxProhibitions implements Prohibitions { - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) { - emitEvent(new CreateProhibitionEvent(label, subject, accessRightSet, intersection, List.of(containerConditions))); - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - emitEvent(new TxEvents.MemoryUpdateProhibitionEvent( - new Prohibition(label, subject, accessRightSet, intersection, List.of(containerConditions)), - memoryPolicyStore.prohibitions().get(label) - )); - } - - @Override - public void delete(String label) throws PMException { - emitEvent(new TxEvents.MemoryDeleteProhibitionEvent(memoryPolicyStore.prohibitions().get(label))); - } - - @Override - public Map> getAll() { - return null; - } - - @Override - public boolean exists(String label) { - return false; - } - - @Override - public List getWithSubject(String subject) { - return null; - } - - @Override - public Prohibition get(String label) { - return null; - } - } - - class TxObligations implements Obligations { - @Override - public void create(UserContext author, String label, Rule... rules) { - emitEvent(new CreateObligationEvent(author, label, List.of(rules))); - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws PMException { - emitEvent(new TxEvents.MemoryUpdateObligationEvent( - new Obligation(author, label, List.of(rules)), - memoryPolicyStore.obligations().get(label) - )); - } - - @Override - public void delete(String label) throws PMException { - emitEvent(new TxEvents.MemoryDeleteObligationEvent(memoryPolicyStore.obligations().get(label))); - } - - @Override - public List getAll() { - return null; - } - - @Override - public boolean exists(String label) { - return false; - } - - @Override - public Obligation get(String label) { - return null; - } - - } - - class TxUserDefinedPML implements UserDefinedPML { - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) { - emitEvent(new AddFunctionEvent(functionDefinitionStatement)); - } - - @Override - public void deleteFunction(String functionName) throws PMException { - emitEvent(new TxEvents.MemoryRemoveFunctionEvent(memoryPolicyStore.userDefinedPML().getFunctions().get(functionName))); - } - - @Override - public Map getFunctions() { - return null; - } - - @Override - public FunctionDefinitionStatement getFunction(String name) { - return null; - } - - @Override - public void createConstant(String constantName, Value constantValue) { - emitEvent(new AddConstantEvent(constantName, constantValue)); - } - - @Override - public void deleteConstant(String constName) throws PMException { - emitEvent(new TxEvents.MemoryRemoveConstantEvent(constName, memoryPolicyStore.userDefinedPML().getConstants().get(constName))); - } - - @Override - public Map getConstants() { - return null; - } - - @Override - public Value getConstant(String name) { - return null; - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/User.java b/src/main/java/gov/nist/csd/pm/pap/memory/User.java deleted file mode 100644 index 03caae376..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/User.java +++ /dev/null @@ -1,82 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -class User implements Vertex { - - private final Node node; - private final List parents; - - public User(String name, Map properties) { - this.node = new Node(name, NodeType.U, properties); - this.parents = new ArrayList<>(); - } - - private User(Node node, List parents) { - this.node = new Node(node); - this.parents = new ArrayList<>(parents); - } - - @Override - public Vertex copy() { - return new User(node, parents); - } - - @Override - public void setProperties(Map properties) { - node.setProperties(properties); - } - - @Override - public Node getNode() { - return node; - } - - @Override - public List getParents() { - return parents; - } - - @Override - public List getChildren() { - return Collections.emptyList(); - } - - @Override - public List getOutgoingAssociations() { - return Collections.emptyList(); - } - - @Override - public List getIncomingAssociations() { - return Collections.emptyList(); - } - - @Override - public void addAssignment(String child, String parent) { - parents.add(parent); - } - - @Override - public void removeAssignment(String child, String parent) { - parents.remove(parent); - } - - @Override - public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { - - } - - @Override - public void removeAssociation(String ua, String target) { - - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/UserAttribute.java b/src/main/java/gov/nist/csd/pm/pap/memory/UserAttribute.java deleted file mode 100644 index 6fabd39ae..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/UserAttribute.java +++ /dev/null @@ -1,106 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -class UserAttribute implements Vertex { - - private final Node node; - private final List parents; - private final List children; - private final List outgoingAssociations; - private final List incomingAssociations; - - public UserAttribute(String name, Map properties) { - this.node = new Node(name, NodeType.UA, properties); - this.parents = new ArrayList<>(); - this.children = new ArrayList<>(); - this.outgoingAssociations = new ArrayList<>(); - this.incomingAssociations = new ArrayList<>(); - } - - private UserAttribute(Node node, List parents, List children, List outgoing, List incoming) { - this.node = new Node(node); - this.parents = new ArrayList<>(parents); - this.children = new ArrayList<>(children); - this.outgoingAssociations = new ArrayList<>(outgoing); - this.incomingAssociations = new ArrayList<>(incoming); - } - - @Override - public Vertex copy() { - return new UserAttribute(node, parents, children, outgoingAssociations, incomingAssociations); - } - - @Override - public void setProperties(Map properties) { - node.setProperties(properties); - } - - @Override - public Node getNode() { - return node; - } - - @Override - public List getParents() { - return parents; - } - - @Override - public List getChildren() { - return children; - } - - @Override - public List getOutgoingAssociations() { - return outgoingAssociations; - } - - @Override - public List getIncomingAssociations() { - return incomingAssociations; - } - - @Override - public void addAssignment(String child, String parent) { - if (child.equals(node.getName())) { - parents.add(parent); - } else { - children.add(child); - } - } - - @Override - public void removeAssignment(String child, String parent) { - if (child.equals(node.getName())) { - parents.remove(parent); - } else { - children.remove(child); - } - } - - @Override - public void addAssociation(String ua, String target, AccessRightSet accessRightSet) { - if (ua.equals(node.getName())) { - outgoingAssociations.add(new Association(ua, target, accessRightSet)); - } else { - incomingAssociations.add(new Association(ua, target, accessRightSet)); - } - } - - @Override - public void removeAssociation(String ua, String target) { - if (ua.equals(node.getName())) { - outgoingAssociations.remove(new Association(ua, target)); - } else { - incomingAssociations.remove(new Association(ua, target)); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/Vertex.java b/src/main/java/gov/nist/csd/pm/pap/memory/Vertex.java deleted file mode 100644 index 11dbe10b9..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/Vertex.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.List; -import java.util.Map; - -interface Vertex { - - Vertex copy(); - void setProperties(Map properties); - Node getNode(); - List getParents(); - List getChildren(); - List getOutgoingAssociations(); - List getIncomingAssociations(); - - void addAssignment(String child, String parent); - void removeAssignment(String child, String parent); - void addAssociation(String ua, String target, AccessRightSet accessRightSet); - void removeAssociation(String ua, String target); - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalker.java b/src/main/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalker.java deleted file mode 100644 index f8a795726..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalker.java +++ /dev/null @@ -1,103 +0,0 @@ -package gov.nist.csd.pm.pap.memory.dag; - -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.dag.NoopShortCircuit; -import gov.nist.csd.pm.policy.model.graph.dag.ShortCircuit; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.NoopPropagator; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.Propagator; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.NoopVisitor; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.Visitor; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import gov.nist.csd.pm.policy.model.graph.dag.walker.GraphWalker; - -import java.util.*; - -public class BreadthFirstGraphWalker implements GraphWalker { - - private final Graph graph; - private Direction direction; - private Visitor visitor; - private Propagator propagator; - private ShortCircuit allPathsShortCircuit; - private ShortCircuit singlePathShortCircuit; - - public BreadthFirstGraphWalker(Graph graph) { - this.graph = graph; - this.visitor = new NoopVisitor(); - this.propagator = new NoopPropagator(); - this.direction = Direction.PARENTS; - this.allPathsShortCircuit = new NoopShortCircuit(); - this.singlePathShortCircuit = new NoopShortCircuit(); - } - - public BreadthFirstGraphWalker withVisitor(Visitor visitor) { - this.visitor = visitor == null ? new NoopVisitor(): visitor; - return this; - } - - public BreadthFirstGraphWalker withPropagator(Propagator propagator) { - this.propagator = propagator == null ? new NoopPropagator(): propagator; - return this; - } - - public BreadthFirstGraphWalker withDirection(Direction direction) { - this.direction = direction; - return this; - } - - public BreadthFirstGraphWalker withAllPathShortCircuit(ShortCircuit shortCircuit) { - this.allPathsShortCircuit = shortCircuit; - return this; - } - - public BreadthFirstGraphWalker withSinglePathShortCircuit(ShortCircuit shortCircuit) { - this.singlePathShortCircuit = shortCircuit; - return this; - } - - @Override - public void walk(String start) throws PMException { - visitor.visit(start); - if (allPathsShortCircuit.evaluate(start) - || singlePathShortCircuit.evaluate(start)){ - return; - } - - walkInternal(start); - } - - private boolean walkInternal(String start) throws PMException { - List nextLevel = getNextLevel(start); - for (String n : nextLevel) { - visitor.visit(n); - if (allPathsShortCircuit.evaluate(n)){ - return true; - } else if (singlePathShortCircuit.evaluate(n)){ - return false; - } - - propagator.propagate(n, start); - } - - for (String n : nextLevel) { - if (walkInternal(n)) { - return true; - } - } - - return false; - } - - private static final int WALK = 0; - private static final int CONTINUE = 1; - private static final int RETURN = 2; - - private List getNextLevel(String node) throws PMException { - if (direction == Direction.PARENTS) { - return graph.getParents(node); - } else { - return graph.getChildren(node); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalker.java b/src/main/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalker.java deleted file mode 100644 index 0b243485a..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalker.java +++ /dev/null @@ -1,105 +0,0 @@ -package gov.nist.csd.pm.pap.memory.dag; - -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.dag.NoopShortCircuit; -import gov.nist.csd.pm.policy.model.graph.dag.ShortCircuit; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.NoopPropagator; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.Propagator; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.NoopVisitor; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.Visitor; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import gov.nist.csd.pm.policy.model.graph.dag.walker.GraphWalker; - -import java.util.List; - -public class DepthFirstGraphWalker implements GraphWalker { - - private final Graph graph; - private Direction direction; - private Visitor visitor; - private Propagator propagator; - private ShortCircuit allPathsShortCircuit; - private ShortCircuit singlePathShortCircuit; - - public DepthFirstGraphWalker(Graph graph) { - this.graph = graph; - this.visitor = new NoopVisitor(); - this.propagator = new NoopPropagator(); - this.direction = Direction.PARENTS; - this.allPathsShortCircuit = new NoopShortCircuit(); - this.singlePathShortCircuit = new NoopShortCircuit(); - } - - public DepthFirstGraphWalker withVisitor(Visitor visitor) { - this.visitor = visitor == null ? new NoopVisitor(): visitor; - return this; - } - - public DepthFirstGraphWalker withPropagator(Propagator propagator) { - this.propagator = propagator == null ? new NoopPropagator(): propagator; - return this; - } - - public DepthFirstGraphWalker withDirection(Direction direction) { - this.direction = direction; - return this; - } - - public DepthFirstGraphWalker withAllPathShortCircuit(ShortCircuit shortCircuit) { - this.allPathsShortCircuit = shortCircuit; - return this; - } - - public DepthFirstGraphWalker withSinglePathShortCircuit(ShortCircuit shortCircuit) { - this.singlePathShortCircuit = shortCircuit; - return this; - } - - @Override - public void walk(String start) throws PMException { - // start traversal - walkInternal(start); - } - - private int walkInternal(String start) throws PMException { - if (allPathsShortCircuit.evaluate(start)) { - visitor.visit(start); - return RETURN; - } else if (singlePathShortCircuit.evaluate(start)){ - visitor.visit(start); - return CONTINUE; - } - - List nodes = getNextLevel(start); - int ret = WALK; - for(String n : nodes) { - int i = walkInternal(n); - - // propagate to the next level - propagator.propagate(n, start); - - if (i == RETURN) { - ret = i; - break; - } - } - - visitor.visit(start); - - return ret; - } - - private static final int WALK = 0; - private static final int CONTINUE = 1; - private static final int RETURN = 2; - - - private List getNextLevel(String node) throws PMException { - if (direction == Direction.PARENTS) { - return graph.getParents(node); - } else { - return graph.getChildren(node); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/GraphModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/GraphModification.java new file mode 100644 index 000000000..3b577f2d2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/GraphModification.java @@ -0,0 +1,130 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.*; + +import java.util.Collection; +import java.util.Map; + +/** + * NGAC graph methods. + */ +public interface GraphModification { + + /** + * Create a policy class in the graph. + * + * @param name The name of the policy class. + * @return The name of the policy class. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + String createPolicyClass(String name) throws PMException; + + /** + * Create a new user attribute and assign it to the provided assignments. User attributes must have at + * least one assignment initially. + * + * @param name the name of the user attribute + * @param assignments A list of assignments to assign the new node to. + * + * @return the name of the user attribute. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + String createUserAttribute(String name, Collection assignments) throws PMException; + + /** + * Create a new object attribute and assign it to the provided assignments. Object attributes must have at + * least one assignment initially. + * + * @param name The name of the object attribute + * @param assignments A list of 0 or more assignments to assign the new node to. + * + * @return The name of the object attribute. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + String createObjectAttribute(String name, Collection assignments) throws PMException; + + /** + * Create a new object and assign it to the provided assignments. Objects must have a least one assignment initially. + * + * @param name The name of the object attribute + * @param assignments A list of 0 or more assignments to assign the new node to. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + String createObject(String name, Collection assignments) throws PMException; + + /** + * Create a new user and assign it to the provided assignments. Users must have a least one assignment initially. + * + * @param name The name of the object attribute + * @param assignments A list of 0 or more assignments to assign the new node to. + * + * @return The name of the object attribute. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + String createUser(String name, Collection assignments) throws PMException; + + /** + * Update the properties of the node with the given name. The given properties overwrite any existing properties. + * + * @param name The name of the node to update. + * @param properties The properties to give the node. + * @throws PMBackendException If there is an error executing the command in the PIP. + */ + void setNodeProperties(String name, Map properties) throws PMException; + + /** + * Delete the node with the given name from the graph. If the node is a policy class this will also delete the + * representative object attribute. An exception will be thrown if the node has any nodes assigned to it or if + * the node is defined in a prohibition or an obligation event pattern. If the node does not exist, no exception + * will be thrown as this is the desired state. + * + * @param name The name of the node to delete. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void deleteNode(String name) throws PMException; + + /** + * Assign the ascendant node to the descendant node. + * + * @param ascendant The name of the ascendant node. + * @param descendants The names of the descendant nodes. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void assign(String ascendant, Collection descendants) throws PMException; + + /** + * Delete the assignment between the ascendant and descendant nodes. + * + * @param ascendant The name of the ascendant node. + * @param descendants The names of the descendant nodes. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void deassign(String ascendant, Collection descendants) throws PMException; + + /** + * Create an association between the user attribute and the target node with the provided access rights. + * If an association already exists between these two nodes, overwrite the existing access rights with the ones + * provided. Associations can only begin at a user attribute but can point to either an object or user attribute. If + * either node does not exist or a provided access right is unknown to the policy an exception will be thrown. + * + * @param ua The name of the user attribute. + * @param target The name of the target attribute. + * @param accessRights The set of access rights to add to the association. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void associate(String ua, String target, AccessRightSet accessRights) throws PMException; + + /** + * Delete the association between the user attribute and target node. If either of the nodes does not exist an + * exception will be thrown. If the association does not exist no exception will be thrown as this is the desired + * state. + * + * @param ua The name of the user attribute. + * @param target The name of the target attribute. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void dissociate(String ua, String target) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/GraphModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/GraphModifier.java new file mode 100644 index 000000000..feb2e49f4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/GraphModifier.java @@ -0,0 +1,487 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.Direction; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Assignment; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.exception.*; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.store.GraphStoreDFS; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.wildcardAccessRights; + +public class GraphModifier extends Modifier implements GraphModification { + + public GraphModifier(PolicyStore store) { + super(store); + } + + public GraphModifier(Modifier modifier) { + super(modifier); + } + + @Override + public String createPolicyClass(String name) throws PMException { + if (!checkCreatePolicyClassInput(name)) { + return name; + } + + // create pc node + store.graph().createNode(name, PC); + + return name; + } + + @Override + public String createUserAttribute(String name, Collection assignments) + throws PMException { + return createNonPolicyClassNode(name, UA, assignments); + } + + @Override + public String createObjectAttribute(String name, Collection assignments) + throws PMException { + return createNonPolicyClassNode(name, OA, assignments); + } + + @Override + public String createObject(String name, Collection assignments) throws PMException { + return createNonPolicyClassNode(name, O, assignments); + } + + @Override + public String createUser(String name, Collection assignments) throws PMException { + return createNonPolicyClassNode(name, U, assignments); + } + + @Override + public void setNodeProperties(String name, Map properties) throws PMException { + checkSetNodePropertiesInput(name); + + store.graph().setNodeProperties(name, properties); + } + + @Override + public void deleteNode(String name) throws PMException { + if(!checkDeleteNodeInput(name)) { + return; + } + + store.graph().deleteNode(name); + } + + @Override + public void assign(String ascendant, Collection descendants) throws PMException { + if(!checkAssignInput(ascendant, descendants)) { + return; + } + + for (String descendant : descendants) { + store.graph().createAssignment(ascendant, descendant); + } + } + + @Override + public void deassign(String ascendant, Collection descendants) throws PMException { + if(!checkDeassignInput(ascendant, descendants)) { + return; + } + + for (String descendant : descendants) { + store.graph().deleteAssignment(ascendant, descendant); + } + } + + @Override + public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { + checkAssociateInput(ua, target, accessRights); + + store.graph().createAssociation(ua, target, accessRights); + } + + @Override + public void dissociate(String ua, String target) throws PMException { + if(!checkDissociateInput(ua, target)) { + return; + } + + store.graph().deleteAssociation(ua, target); + } + + /** + * Check if a proposed assignment causes a loop. + * + * @param ascendant The ascendant of the assignment. + * @param descendant The descendant of the assignment. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkAssignmentDoesNotCreateLoop(String ascendant, String descendant) throws PMException { + AtomicBoolean loop = new AtomicBoolean(false); + + new GraphStoreDFS(store.graph()) + .withVisitor((node -> { + if (!node.equals(ascendant)) { + return; + } + + loop.set(true); + })) + .withDirection(Direction.DESCENDANTS) + .withAllPathShortCircuit(node -> node.equals(ascendant)) + .walk(descendant); + + if (loop.get()) { + throw new AssignmentCausesLoopException(ascendant, descendant); + } + } + + /** + * Check that the given policy class name is not taken by another node. + * + * @param name The name to check. + * @return True if execution should proceed, false otherwise + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkCreatePolicyClassInput(String name) throws PMException { + if (name.equals(AdminPolicyNode.ADMIN_POLICY.nodeName())) { + return false; + } else if (store.graph().nodeExists(name)) { + throw new NodeNameExistsException(name); + } + + return true; + } + + /** + * Check the node name does not already exist and ensure the given descendant nodes exist and form a valid assignment. + * + * @param name The name of the new node. + * @param type The type of the new node. + * @param descendants Nodes to assign the new node to. + * @throws PMException If any PM related exceptions occur in the implementing class. + * assignment. + */ + protected boolean checkCreateNodeInput(String name, NodeType type, Collection descendants) throws PMException { + if (name.equals(AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName())) { + return false; + } else if (store.graph().nodeExists(name)) { + throw new NodeNameExistsException(name); + } + + // when creating a node the only loop that can occur is to itself + if (descendants.contains(name)) { + throw new AssignmentCausesLoopException(name, name); + } + + // need to be assigned to at least one node to avoid a disconnected graph + if (descendants.isEmpty()) { + throw new DisconnectedNodeException(name, type); + } + + // check assign inputs + for (String assignment : descendants) { + if (name.equals(assignment)) { + throw new AssignmentCausesLoopException(name, assignment); + } + + if (!store.graph().nodeExists(assignment)) { + throw new NodeDoesNotExistException(assignment); + } + + Node assignNode = store.graph().getNode(assignment); + Assignment.checkAssignment(type, assignNode.getType()); + } + + return true; + } + + /** + * Check if the given nodes exists. + * + * @param name The name of the node to check. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkSetNodePropertiesInput(String name) throws PMException { + if (!store.graph().nodeExists(name)) { + throw new NodeDoesNotExistException(name); + } + } + + /** + * Check if the given node can be deleted. If the node is referenced in a prohibition or event pattern then it + * cannot + * be deleted. If the node does not exist an error does not occur but return false to indicate to the caller that + * execution should not proceed. + * + * @param name The name of the node being deleted. + * pattern. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkDeleteNodeInput(String name) throws PMException { + if (!store.graph().nodeExists(name)) { + return false; + } + + Collection ascendants; + try { + ascendants = store.graph().getAdjacentAscendants(name); + } catch (NodeDoesNotExistException e) { + // quietly return if the nodes already does not exist as this is the desired state + return false; + } + + if (!ascendants.isEmpty()) { + throw new NodeHasAscendantsException(name); + } + + checkIfNodeInProhibition(name); + checkIfNodeInObligation(name); + + return true; + } + + /** + * Helper method to check if a given node is referenced in any prohibitions. The default implementation loads all + * prohibitions into memory and then searches through each one. + * + * @param name The node to check for. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkIfNodeInProhibition(String name) throws PMException { + Map> allProhibitions = store.prohibitions().getProhibitions(); + for (Collection subjPros : allProhibitions.values()) { + for (Prohibition p : subjPros) { + if (nodeInProhibition(name, p)) { + throw new NodeReferencedInProhibitionException(name, p.getName()); + } + } + } + } + + /** + * Helper method to check if a given node is referenced in any obligations. The default implementation loads all + * obligations into memory and then searches through each one. + * + * @param name The node to check for. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkIfNodeInObligation(String name) throws PMException { + Collection obligations = store.obligations().getObligations(); + for (Obligation obligation : obligations) { + // if the node is the author of the obligation or referenced in any rules throw an exception + if (obligation.getAuthor().equals(name)) { + throw new NodeReferencedInObligationException(name, obligation.getName()); + } + + // check if node referenced in pattern + for (Rule rule : obligation.getRules()) { + EventPattern eventPattern = rule.getEventPattern(); + + // check subject and operation patterns + boolean referenced = checkPatternForNode(name, eventPattern.getSubjectPattern()); + + // check operand patterns + for (List pattern : eventPattern.getOperandPatterns().values()) { + for (OperandPatternExpression operandPatternExpression : pattern) { + if (checkPatternForNode(name, operandPatternExpression)) { + referenced = true; + } + } + } + + if (referenced) { + throw new NodeReferencedInObligationException(name, obligation.getName()); + } + } + } + } + + private boolean checkPatternForNode(String entity, Pattern pattern) { + return pattern.getReferencedNodes().nodes().contains(entity); + } + + /** + * Check if both nodes exist and make a valid assignment. If the assignment already exists an error does not + * occur but + * return false to indicate to the caller that execution should not proceed. + * + * @param ascendant The ascendant node. + * @param descendants The descendant nodes. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkAssignInput(String ascendant, Collection descendants) throws PMException { + for (String descendant : descendants) { + // getting both nodes will check if they exist + if (!store.graph().nodeExists(ascendant)) { + throw new NodeDoesNotExistException(ascendant); + } else if (!store.graph().nodeExists(descendant)) { + throw new NodeDoesNotExistException(descendant); + } + + // ignore if assignment already exists + if (store.graph().getAdjacentDescendants(ascendant).contains(descendant)) { + return false; + } + + Node ascNode = store.graph().getNode(ascendant); + Node descNode = store.graph().getNode(descendant); + + // check node types make a valid assignment relation + Assignment.checkAssignment(ascNode.getType(), descNode.getType()); + + // check the assignment won't create a loop + checkAssignmentDoesNotCreateLoop(ascendant, descendant); + } + + return true; + } + + /** + * Check if the ascendants and descendants exist. If the assignment does not exist an error does not occur but return + * false to indicate to the caller that execution should not proceed. If trying to delete the admin policy config, + * an error will occur. + * + * @param ascendant The ascendant node. + * @param descendants The descendant nodes. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkDeassignInput(String ascendant, Collection descendants) throws PMException { + for (String descendant : descendants) { + if (!store.graph().nodeExists(ascendant)) { + throw new NodeDoesNotExistException(ascendant); + } else if (!store.graph().nodeExists(descendant)) { + throw new NodeDoesNotExistException(descendant); + } else if (ascendant.equals(AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName()) && + descendant.equals(AdminPolicyNode.ADMIN_POLICY.nodeName())) { + throw new CannotDeleteAdminPolicyConfigException(); + } + + Collection descs = store.graph().getAdjacentDescendants(ascendant); + if (!descs.contains(descendant)) { + return false; + } + + if (descs.size() == 1) { + throw new DisconnectedNodeException(ascendant, descendant); + } + } + + return true; + } + + /** + * Check if the user attribute and target nodes exist and make up a valid association and that the given access + * rights are allowed. + * + * @param ua The user attribute. + * @param target The target node. + * @param accessRights The access rights. + * @throws PMException If any PM related exceptions occur in the implementing class. + * association. + */ + protected void checkAssociateInput(String ua, String target, AccessRightSet accessRights) throws PMException { + if (!store.graph().nodeExists(ua)) { + throw new NodeDoesNotExistException(ua); + } else if (!store.graph().nodeExists(target)) { + throw new NodeDoesNotExistException(target); + } + + Node uaNode = store.graph().getNode(ua); + Node targetNode = store.graph().getNode(target); + + // check the access rights are valid + checkAccessRightsValid(store.operations().getResourceOperations(), accessRights); + + // check the types of each node make a valid association + Association.checkAssociation(uaNode.getType(), targetNode.getType()); + } + + /** + * Check if both nodes exist. If the association does not exist an error does not occur but return false to indicate + * to the caller that execution should not proceed. + * + * @param ua The user attribute. + * @param target The target node. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkDissociateInput(String ua, String target) throws PMException { + if (!store.graph().nodeExists(ua)) { + throw new NodeDoesNotExistException(ua); + } else if (!store.graph().nodeExists(target)) { + throw new NodeDoesNotExistException(target); + } + + Collection associations = store.graph().getAssociationsWithSource(ua); + for (Association a : associations) { + if (a.getSource().equals(ua) && a.getTarget().equals(target)) { + return true; + } + } + + return false; + } + + static void checkAccessRightsValid(AccessRightSet resourceAccessRights, AccessRightSet accessRightSet) throws PMException { + for (String ar : accessRightSet) { + if (!resourceAccessRights.contains(ar) + && !allAdminAccessRights().contains(ar) + && !wildcardAccessRights().contains(ar)) { + throw new UnknownAccessRightException(ar); + } + } + } + + private static boolean nodeInProhibition(String name, Prohibition prohibition) { + if (prohibition.getSubject().getName().equals(name)) { + return true; + } + + for (ContainerCondition containerCondition : prohibition.getContainers()) { + if (containerCondition.getName().equals(name)) { + return true; + } + } + + return false; + } + + private String createNonPolicyClassNode(String name, NodeType type, Collection assignments) + throws PMException { + return runTx(() -> { + if (!checkCreateNodeInput(name, type, assignments)) { + return name; + } + + store.graph().createNode(name, type); + + for (String assignmentNode : assignments) { + store.graph().createAssignment(name, assignmentNode); + } + + return name; + }); + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/Modifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/Modifier.java new file mode 100644 index 000000000..ec709d1d3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/Modifier.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.tx.Transactional; +import gov.nist.csd.pm.pap.store.PolicyStore; + +public abstract class Modifier implements Transactional { + + protected PolicyStore store; + + public Modifier(PolicyStore store) { + this.store = store; + } + + public Modifier(Modifier modifier) { + this(modifier.store); + } + + protected T runTx(Runner txRunner) throws PMException { + try { + beginTx(); + T result = txRunner.run(); + commit(); + return result; + } catch (PMException e) { + rollback(); + throw e; + } + } + + protected void runTx(VoidRunner txRunner) throws PMException { + try { + beginTx(); + txRunner.run(); + commit(); + } catch (PMException e) { + rollback(); + throw e; + } + } + + @Override + public final void beginTx() throws PMException { + store.beginTx(); + } + + @Override + public final void commit() throws PMException { + store.commit(); + } + + @Override + public final void rollback() throws PMException { + store.rollback(); + } + + public interface Runner { + T run() throws PMException; + } + + public interface VoidRunner { + void run() throws PMException; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModification.java new file mode 100644 index 000000000..abd19205b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModification.java @@ -0,0 +1,35 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Rule; + +import java.util.List; + +/** + * NGAC obligation methods. + */ +public interface ObligationsModification { + + /** + * Create a new obligation with the given author, name, and rules. The author of the obligation is the user that the + * responses will be executed as in the EPP. This means the author will need the privileges to carry out each action + * in the response at the time it's executed. If they do not have sufficient privileges no action in the response + * will be executed.

+ * + * @param author The user/process that is creating the obligation. + * @param name The name of the obligation. + * @param rules The rules of the obligation. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void createObligation(String author, String name, List rules) throws PMException; + + /** + * Delete the obligation with the given name. If the obligation does not exist, no exception is thrown as this is + * the desired state.

+ * + * @param name The name of the obligation to delete. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void deleteObligation(String name) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModifier.java new file mode 100644 index 000000000..24c5b5424 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/ObligationsModifier.java @@ -0,0 +1,94 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.exception.*; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.*; + +public class ObligationsModifier extends Modifier implements ObligationsModification { + + public ObligationsModifier(PolicyStore store) { + super(store); + } + + public ObligationsModifier(Modifier modifier) { + super(modifier); + } + + @Override + public void createObligation(String author, String name, List rules) throws PMException { + checkCreateInput(author, name, rules); + + store.obligations().createObligation(author, name, new ArrayList<>(rules)); + } + + @Override + public void deleteObligation(String name) throws PMException { + if(!checkDeleteInput(name)) { + return; + } + + store.obligations().deleteObligation(name); + } + + /** + * Check the obligation being created. + * + * @param author The author of the obligation. + * @param name The name of the obligation. + * @param rules The rules of the obligation. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkCreateInput(String author, String name, Collection rules) throws PMException { + if (store.obligations().obligationExists(name)) { + throw new ObligationNameExistsException(name); + } + + checkAuthorExists(author); + checkEventPatternAttributesExist(rules); + } + + /** + * Check if the obligation exists. If it doesn't, return false to indicate to the caller that execution should not + * proceed. + * + * @param name The name of the obligation. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkDeleteInput(String name) throws PMException { + if (!store.obligations().obligationExists(name)) { + return false; + } + + return true; + } + + private void checkAuthorExists(String author) throws PMException { + if (!store.graph().nodeExists(author)) { + throw new NodeDoesNotExistException(author); + } + } + + private void checkEventPatternAttributesExist(Collection rules) throws PMException { + for (Rule rule : rules) { + EventPattern event = rule.getEventPattern(); + + // check subject pattern + Pattern pattern = event.getSubjectPattern(); + pattern.checkReferencedNodesExist(store.graph()); + + // check operand patterns + for (Map.Entry> operandPattern : event.getOperandPatterns().entrySet()) { + for (OperandPatternExpression operandPatternExpression : operandPattern.getValue()) { + operandPatternExpression.checkReferencedNodesExist(store.graph()); + } + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModification.java new file mode 100644 index 000000000..0d5ecace9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModification.java @@ -0,0 +1,33 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.op.Operation; + +/** + * Methods to manage NGAC resource and administrative operations. + */ +public interface OperationsModification { + + /** + * Set the resource access rights for the policy. + * @param resourceOperations The operations to set as the resource operations. + * @throws PMException If there is an error in the PM. + */ + void setResourceOperations(AccessRightSet resourceOperations) throws PMException; + + /** + * Create an administrative operation. + * @param operation The operation to create. + * @throws PMException If there is an error in the PM. + */ + void createAdminOperation(Operation operation) throws PMException; + + /** + * Delete the admin operation with the given name. + * @param operation The operation name. + * @throws PMException If there is an error in the PM. + */ + void deleteAdminOperation(String operation) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModifier.java new file mode 100644 index 000000000..97c5d92ba --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/OperationsModifier.java @@ -0,0 +1,66 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.AdminAccessRightExistsException; +import gov.nist.csd.pm.pap.exception.OperationExistsException; +import gov.nist.csd.pm.pap.op.AdminOperations; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.isAdminAccessRight; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.isWildcardAccessRight; + +public class OperationsModifier extends Modifier implements OperationsModification{ + + public OperationsModifier(PolicyStore store) throws PMException { + super(store); + AdminOperations.init(store.operations()); + } + + public OperationsModifier(Modifier modifier) throws PMException { + super(modifier); + AdminOperations.init(store.operations()); + } + + @Override + public void setResourceOperations(AccessRightSet resourceOperations) throws PMException { + checkSetResourceAccessRightsInput(resourceOperations); + + store.operations().setResourceOperations(resourceOperations); + } + + @Override + public void createAdminOperation(Operation operation) throws PMException { + if (store.operations().getAdminOperationNames().contains(operation.getName())) { + throw new OperationExistsException(operation.getName()); + } + + store.operations().createAdminOperation(operation); + } + + @Override + public void deleteAdminOperation(String operation) throws PMException { + // return without error if the operation does not exist or is a built in admin op such as assign + if (!store.operations().getAdminOperationNames().contains(operation) || + AdminOperations.ADMIN_OP_NAMES.contains(operation)) { + return; + } + + store.operations().deleteAdminOperation(operation); + } + + /** + * Check that the provided resource operations are not existing admin access rights. + * + * @param accessRightSet The access right set to check. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkSetResourceAccessRightsInput(AccessRightSet accessRightSet) throws PMException { + for (String ar : accessRightSet) { + if (isAdminAccessRight(ar) || isWildcardAccessRight(ar)) { + throw new AdminAccessRightExistsException(ar); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModification.java new file mode 100644 index 000000000..1b8d12bbf --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModification.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.modification; + +/** + * General interface for managing a NGAC policy. + */ +public interface PolicyModification { + + /** + * Get the graph component of the policy. + * @return The GraphModification implementation. + */ + GraphModification graph(); + + /** + * Get the prohibitions component of the policy. + * @return The ProhibitionsModification implementation. + */ + ProhibitionsModification prohibitions(); + + /** + * Get the obligations component of the policy. + * @return The ObligationsModification implementation. + */ + ObligationsModification obligations(); + + /** + * Get the operations component of the policy. + * @return The ObligationsModification implementation. + */ + OperationsModification operations(); + + /** + * Get the routines component of the policy. + * @return The RoutinesModification implementation. + */ + RoutinesModification routines(); + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModifier.java new file mode 100644 index 000000000..6e23fe041 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/PolicyModifier.java @@ -0,0 +1,77 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.admin.AdminPolicy; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.OA; +import static gov.nist.csd.pm.pap.graph.node.NodeType.PC; + +/** + * PolicyStore is an abstract class that outlines the expected behavior of a backend implementation. + */ +public class PolicyModifier extends Modifier implements PolicyModification, AdminPolicy.Verifier { + + private GraphModifier graphModifier; + private ProhibitionsModifier prohibitionsModifier; + private ObligationsModifier obligationsModifier; + private OperationsModifier operationsModifier; + private RoutinesModifier routinesModifier; + + public PolicyModifier(PolicyStore store) throws PMException { + super(store); + this.graphModifier = new GraphModifier(store); + this.prohibitionsModifier = new ProhibitionsModifier(store); + this.obligationsModifier = new ObligationsModifier(store); + this.operationsModifier = new OperationsModifier(store); + this.routinesModifier = new RoutinesModifier(store); + } + + public PolicyModifier(PolicyModifier modifier) throws PMException { + this(modifier.store); + } + + @Override + public GraphModifier graph() { + return graphModifier; + } + + @Override + public ProhibitionsModifier prohibitions() { + return prohibitionsModifier; + } + + @Override + public ObligationsModifier obligations() { + return obligationsModifier; + } + + @Override + public OperationsModifier operations() { + return operationsModifier; + } + + @Override + public RoutinesModifier routines() { + return routinesModifier; + } + + @Override + public void verifyAdminPolicy() throws PMException { + String pc = AdminPolicyNode.ADMIN_POLICY.nodeName(); + + if (!store.graph().nodeExists(pc)) { + store.graph().createNode(pc, PC); + } + + String oa = AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(); + if (!store.graph().nodeExists(oa)) { + store.graph().createNode(oa, OA); + } + + if (!store.graph().getAdjacentDescendants(oa).contains(pc)) { + store.graph().createAssignment(oa, pc); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModification.java new file mode 100644 index 000000000..72d0f62aa --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModification.java @@ -0,0 +1,36 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; + +import java.util.Collection; + +/** + * NGAC prohibition methods. + */ +public interface ProhibitionsModification { + + /** + * Create a new prohibition. + * + * @param name the identifier of this prohibition. + * @param subject ths subject of the prohibition (user, user attribute, or process). + * @param accessRightSet the access rights to be denied + * @param intersection a boolean flag that determines if the intersection of the containers should be denied or not. + * @param containerConditions the containers to deny the subject access to. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void createProhibition(String name, ProhibitionSubject subject, AccessRightSet accessRightSet, + boolean intersection, Collection containerConditions) throws PMException; + + /** + * Delete the prohibition with the given name. No exception will be thrown if the prohibition does not exist. + * + * @param name The name of the prohibition to delete. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + void deleteProhibition(String name) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifier.java new file mode 100644 index 000000000..7c3ef5e31 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifier.java @@ -0,0 +1,101 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.exception.ProhibitionContainerDoesNotExistException; +import gov.nist.csd.pm.pap.exception.ProhibitionExistsException; +import gov.nist.csd.pm.pap.exception.ProhibitionSubjectDoesNotExistException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.ArrayList; +import java.util.Collection; + +import static gov.nist.csd.pm.pap.modification.GraphModifier.checkAccessRightsValid; + +public class ProhibitionsModifier extends Modifier implements ProhibitionsModification { + + public ProhibitionsModifier(PolicyStore store) { + super(store); + } + + public ProhibitionsModifier(Modifier modifier) { + super(modifier); + } + + @Override + public void createProhibition(String name, + ProhibitionSubject subject, + AccessRightSet accessRightSet, + boolean intersection, + Collection containerConditions) throws PMException { + checkCreateInput(name, subject, accessRightSet, new ArrayList<>(containerConditions)); + + store.prohibitions().createProhibition(name, subject, accessRightSet, intersection, new ArrayList<>(containerConditions)); + } + + @Override + public void deleteProhibition(String name) throws PMException { + if(!checkDeleteInput(name)) { + return; + } + + store.prohibitions().deleteProhibition(name); + } + + /** + * Check the prohibition being created. + * + * @param name The name of the prohibition. + * @param subject The subject of the prohibition. + * @param accessRightSet The denied access rights. + * @param containerConditions The prohibition container conditions. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected void checkCreateInput(String name, ProhibitionSubject subject, AccessRightSet accessRightSet, + Collection containerConditions) throws PMException { + if (store.prohibitions().prohibitionExists(name)) { + throw new ProhibitionExistsException(name); + } + + // check the prohibition parameters are valid + checkAccessRightsValid(store.operations().getResourceOperations(), accessRightSet); + checkProhibitionSubjectExists(subject); + checkProhibitionContainersExist(containerConditions); + } + + /** + * Check if the prohibition exists. If it doesn't, return false to indicate to the caller that execution should not + * proceed. + * + * @param name The name of the prohibition. + * @return True if the execution should proceed, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + protected boolean checkDeleteInput(String name) throws PMException { + if (!store.prohibitions().prohibitionExists(name)) { + return false; + } + + return true; + } + + protected void checkProhibitionSubjectExists(ProhibitionSubject subject) + throws PMException { + if (subject.getType() != ProhibitionSubject.Type.PROCESS) { + if (!store.graph().nodeExists(subject.getName())) { + throw new ProhibitionSubjectDoesNotExistException(subject.getName()); + } + } + } + + protected void checkProhibitionContainersExist(Collection containerConditions) + throws PMException { + for (ContainerCondition container : containerConditions) { + if (!store.graph().nodeExists(container.getName())) { + throw new ProhibitionContainerDoesNotExistException(container.getName()); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModification.java b/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModification.java new file mode 100644 index 000000000..279c50e2d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModification.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.routine.Routine; + +/** + * Interface for managing NGAC administrative routines. + */ +public interface RoutinesModification { + + /** + * Create a new administrative routine. + * @param routine The routine to create. + * @throws PMException If there is an error in the PM. + */ + void createAdminRoutine(Routine routine) throws PMException; + + /** + * Delete the admin routine with the given name. + * @param name The name of the admin routine to delete. + * @throws PMException If there is an error in the PM. + */ + void deleteAdminRoutine(String name) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModifier.java b/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModifier.java new file mode 100644 index 000000000..ac8310a39 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/modification/RoutinesModifier.java @@ -0,0 +1,35 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.exception.RoutineExistsException; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pap.store.PolicyStore; + +public class RoutinesModifier extends Modifier implements RoutinesModification{ + + public RoutinesModifier(PolicyStore store) { + super(store); + } + + public RoutinesModifier(Modifier modifier) { + super(modifier); + } + + @Override + public void createAdminRoutine(Routine routine) throws PMException { + if (store.routines().getAdminRoutineNames().contains(routine.getName())) { + throw new RoutineExistsException(routine.getName()); + } + + store.routines().createAdminRoutine(routine); + } + + @Override + public void deleteAdminRoutine(String name) throws PMException { + if (!store.routines().getAdminRoutineNames().contains(name)) { + return; + } + + store.routines().deleteAdminRoutine(name); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlConnection.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlConnection.java deleted file mode 100644 index b14d4e961..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlConnection.java +++ /dev/null @@ -1,64 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.policy.tx.Transactional; - -import java.sql.Connection; -import java.sql.SQLException; - -class MysqlConnection implements Transactional { - private Connection connection; - private int txCounter; - - public MysqlConnection(Connection connection) { - this.connection = connection; - } - - public Connection getConnection() { - return connection; - } - - @Override - public void beginTx() throws MysqlPolicyException { - try { - connection.setAutoCommit(false); - - txCounter++; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void commit() throws MysqlPolicyException { - if (txCounter != 1) { - txCounter--; - return; - } - - try { - connection.setAutoCommit(true); - txCounter--; - } catch (SQLException e) { - try { - connection.rollback(); - } catch (SQLException rollbackEx) { - throw new MysqlPolicyException(rollbackEx.getMessage()); - } - - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void rollback() throws MysqlPolicyException { - try { - if (!connection.getAutoCommit()) { - connection.rollback(); - connection.setAutoCommit(true); - } - txCounter = 0; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlGraph.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlGraph.java deleted file mode 100644 index 3064ae034..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlGraph.java +++ /dev/null @@ -1,534 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.exceptions.NodeDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.nodes.Properties; -import gov.nist.csd.pm.policy.model.graph.relationships.Assignment; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.graph.relationships.Relationship; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.U; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -public class MysqlGraph implements Graph { - - private MysqlConnection connection; - - public MysqlGraph(MysqlConnection connection) { - this.connection = connection; - } - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) throws MysqlPolicyException { - try { - String sql = """ - insert into resource_access_rights (id, access_rights) values (1, ?) ON DUPLICATE KEY UPDATE access_rights = (?); - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - String arJson = MysqlPolicyStore.arsetToJson(accessRightSet); - ps.setString(1, arJson); - ps.setString(2, arJson); - ps.execute(); - } - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public AccessRightSet getResourceAccessRights() throws MysqlPolicyException { - AccessRightSet arset = new AccessRightSet(); - String sql = """ - select access_rights from resource_access_rights; - """; - - try(Statement stmt = connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - arset = MysqlPolicyStore.arsetReader.readValue(rs.getString(1)); - } - - return arset; - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public String createPolicyClass(String name, Map properties) throws MysqlPolicyException { - return createPolicyClassNode(name, properties); - } - - @Override - public String createPolicyClass(String name) throws MysqlPolicyException { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) throws MysqlPolicyException { - return createNode(name, UA, properties, parent, parents); - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) throws MysqlPolicyException { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) throws MysqlPolicyException { - return createNode(name, OA, properties, parent, parents); - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) throws MysqlPolicyException { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) throws MysqlPolicyException { - return createNode(name, O, properties, parent, parents); - } - - @Override - public String createObject(String name, String parent, String... parents) throws MysqlPolicyException { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) throws MysqlPolicyException { - return createNode(name, U, properties, parent, parents); - } - - @Override - public String createUser(String name, String parent, String... parents) throws MysqlPolicyException { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - @Override - public void setNodeProperties(String name, Map properties) throws MysqlPolicyException { - String sql = """ - UPDATE node SET properties=? WHERE NAME=? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, MysqlPolicyStore.toJSON(properties)); - ps.setString(2, name); - ps.execute(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public boolean nodeExists(String name) throws MysqlPolicyException { - String sql = """ - SELECT count(*) FROM node WHERE name = ? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, name); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - return false; - } - - int anInt = rs.getInt(1); - boolean exists = anInt == 1; - - rs.close(); - - return exists; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Node getNode(String name) throws PMException { - String sql = """ - SELECT name, node_type_id, properties FROM node WHERE name = ? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, name); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new NodeDoesNotExistException(name); - } - - Node node = getNodeFromResultSet(rs); - - rs.close(); - - return node; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - protected static Node getNodeFromResultSet(ResultSet rs) throws MysqlPolicyException { - try { - String name = rs.getString(1); - NodeType type = MysqlPolicyStore.getNodeTypeFromId(rs.getInt(2)); - Map props = MysqlPolicyStore.hashmapReader.readValue(rs.getString(3)); - return new Node(name, type, props); - } catch (JsonProcessingException | SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public List search(NodeType type, Map properties) throws MysqlPolicyException { - String sql = "select name from node"; - StringBuilder where = new StringBuilder(); - if (type != ANY) { - where = new StringBuilder("node_type_id = " + MysqlPolicyStore.getNodeTypeId(type)); - } - - if (properties != null && !properties.isEmpty()) { - for (String key : properties.keySet()) { - if (where.length() > 0) { - where.append(" AND "); - } - - String value = properties.get(key); - - where.append("properties -> '$.") - .append(key) - .append("' like '\"") - .append(value.equals(Properties.WILDCARD) ? "%%" : value) - .append("\"'"); - } - } - - if (!where.isEmpty()) { - sql = sql + " where " + where; - } - - List results = new ArrayList<>(); - try (Statement stmt = connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - results.add(rs.getString(1)); - } - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return results; - } - - @Override - public List getPolicyClasses() throws MysqlPolicyException { - List policyClasses = new ArrayList<>(); - String sql = """ - SELECT name FROM node WHERE node_type_id = ? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setInt(1, MysqlPolicyStore.getNodeTypeId(PC)); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - policyClasses.add(rs.getString(1)); - } - - rs.close(); - - return policyClasses; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void deleteNode(String name) throws MysqlPolicyException { - String sql = """ - DELETE FROM node WHERE NAME=? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, name); - ps.execute(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void assign(String child, String parent) throws MysqlPolicyException { - String sql = """ - INSERT INTO assignment (start_node_id, end_node_id) VALUES ( - (SELECT id FROM node WHERE name=?), (SELECT id FROM node WHERE name=?) - ) ON DUPLICATE KEY UPDATE start_node_id=start_node_id - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, child); - ps.setString(2, parent); - ps.execute(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void deassign(String child, String parent) throws MysqlPolicyException { - String sql = """ - DELETE FROM assignment - WHERE start_node_id = (SELECT id FROM node WHERE name=?) - AND end_node_id = (SELECT id FROM node WHERE name=?) - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, child); - ps.setString(2, parent); - ps.execute(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void assignAll(List children, String target) throws MysqlPolicyException { - try { - connection.beginTx(); - - for (String c : children) { - assign(c, target); - } - - connection.commit(); - } catch (MysqlPolicyException e) { - connection.rollback(); - throw e; - } - } - - @Override - public void deassignAll(List children, String target) throws MysqlPolicyException { - try { - connection.beginTx(); - - for (String c : children) { - deassign(c, target); - } - - connection.commit(); - } catch (MysqlPolicyException e) { - connection.rollback(); - } - } - - @Override - public void deassignAllFromAndDelete(String target) throws MysqlPolicyException { - try { - connection.beginTx(); - - deassignAll(getChildren(target), target); - deleteNode(target); - - connection.commit(); - } catch (MysqlPolicyException e) { - connection.rollback(); - } - } - - @Override - public List getChildren(String node) throws MysqlPolicyException { - List children = new ArrayList<>(); - - String sql = """ - select children.name from node - join assignment on node.id=assignment.end_node_id - join node as children on children.id=assignment.start_node_id - where node.name = ?; - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, node); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - children.add(rs.getString(1)); - } - - rs.close(); - - return children; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) throws MysqlPolicyException { - String sql = """ - INSERT INTO association (start_node_id, end_node_id, operation_set) VALUES ( - (SELECT id FROM node WHERE name=?), (SELECT id FROM node WHERE name=?), ? - ) ON DUPLICATE KEY UPDATE operation_set=? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, ua); - ps.setString(2, target); - - String json = MysqlPolicyStore.arsetToJson(accessRights); - ps.setString(3, json); - ps.setString(4, json); - ps.execute(); - }catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void dissociate(String ua, String target) throws MysqlPolicyException { - String sql = """ - DELETE FROM association - WHERE start_node_id = (SELECT id FROM node WHERE name=?) - AND end_node_id = (SELECT id FROM node WHERE name=?) - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, ua); - ps.setString(2, target); - ps.execute(); - }catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public List getParents(String node) throws MysqlPolicyException { - List parents = new ArrayList<>(); - - String sql = """ - select parents.name from node - join assignment on node.id=assignment.start_node_id - join node as parents on parents.id=assignment.end_node_id - where node.name = ?; - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, node); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - parents.add(rs.getString(1)); - } - - rs.close(); - - return parents; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public List getAssociationsWithSource(String ua) throws MysqlPolicyException { - List associations = new ArrayList<>(); - - String sql = """ - select targets.name, association.operation_set from node - join association on node.id=association.start_node_id - join node as targets on targets.id=association.end_node_id - where node.name = ?; - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, ua); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - String target = rs.getString(1); - AccessRightSet arset = MysqlPolicyStore.arsetReader.readValue(rs.getString(2)); - associations.add(new Association(ua, target, arset)); - } - - rs.close(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return associations; - } - - @Override - public List getAssociationsWithTarget(String target) throws MysqlPolicyException { - List associations = new ArrayList<>(); - - String sql = """ - select sources.name, association.operation_set from node - join association on node.id=association.end_node_id - join node as sources on sources.id=association.start_node_id - where node.name = ?; - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, target); - ResultSet rs = ps.executeQuery(); - while (rs.next()) { - String source = rs.getString(1); - AccessRightSet opSet = MysqlPolicyStore.arsetReader.readValue(rs.getString(2)); - associations.add(new Association(source, target, opSet)); - } - - rs.close(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return associations; - } - - private String createPolicyClassNode(String name, Map properties) throws MysqlPolicyException { - String sql = """ - INSERT INTO node (node_type_id, name, properties) VALUES (?,?,?) - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setInt(1, MysqlPolicyStore.getNodeTypeId(PC)); - ps.setString(2, name); - ps.setString(3, MysqlPolicyStore.toJSON(properties)); - ps.execute(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return name; - } - - private String createNode(String name, NodeType type, Map properties, - String initialParent, String ... parents) throws MysqlPolicyException { - connection.beginTx(); - - String sql = """ - INSERT INTO node (node_type_id, name, properties) VALUES (?,?,?) - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - int nodeTypeIdIndex = 1; - int nameIndex = 2; - int propertiesIndex = 3; - ps.setInt(nodeTypeIdIndex, MysqlPolicyStore.getNodeTypeId(type)); - ps.setString(nameIndex, name); - ps.setString(propertiesIndex, MysqlPolicyStore.toJSON(properties)); - ps.execute(); - - assign(name, initialParent); - - for (String parent : parents) { - assign(name, parent); - } - - connection.commit(); - } catch (SQLException | JsonProcessingException | MysqlPolicyException e) { - connection.rollback(); - throw new MysqlPolicyException(e.getMessage()); - } - - return name; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlObligations.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlObligations.java deleted file mode 100644 index 383871148..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlObligations.java +++ /dev/null @@ -1,139 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import gov.nist.csd.pm.policy.Obligations; -import gov.nist.csd.pm.policy.exceptions.ObligationDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import org.apache.commons.lang3.SerializationUtils; - -import java.io.IOException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -public class MysqlObligations implements Obligations { - - private MysqlConnection connection; - - public MysqlObligations(MysqlConnection mysqlConnection) { - this.connection = mysqlConnection; - } - - @Override - public void create(UserContext author, String label, Rule... rules) throws MysqlPolicyException { - String sql = """ - insert into obligation (label, author, rules) values (?, ?, ?) - """; - - try (PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, label); - ps.setString(2, MysqlPolicyStore.objectMapper.writeValueAsString(author)); - ps.setBytes(3, serializeRules(rules)); - - ps.executeUpdate(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws MysqlPolicyException { - connection.beginTx(); - - try { - delete(label); - create(author, label, rules); - connection.commit(); - } catch (MysqlPolicyException e) { - connection.rollback(); - throw e; - } - } - - @Override - public void delete(String label) throws MysqlPolicyException { - String sql = """ - delete from obligation where label = ? - """; - - try (PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, label); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public List getAll() throws MysqlPolicyException { - List obligations = new ArrayList<>(); - - String sql = """ - select label, author, rules from obligation; - """; - - try(Statement stmt = connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - String label = rs.getString(1); - UserContext author = MysqlPolicyStore.userCtxReader.readValue(rs.getString(2)); - Rule[] rules = deserializeRules(rs.getBlob(3).getBinaryStream().readAllBytes()); - - obligations.add(new Obligation(author, label, List.of(rules))); - } - - return obligations; - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public boolean exists(String label) throws PMException { - try { - get(label); - return true; - } catch (ObligationDoesNotExistException e) { - return false; - } - } - - @Override - public Obligation get(String label) throws PMException { - String sql = """ - select author, rules from obligation where label = ? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, label); - ResultSet rs = ps.executeQuery(); - if (!rs.next()) { - throw new ObligationDoesNotExistException(label); - } - - UserContext author = MysqlPolicyStore.userCtxReader.readValue(rs.getString(1)); - Rule[] rules = deserializeRules(rs.getBlob(2).getBinaryStream().readAllBytes()); - - return new Obligation(author, label, List.of(rules)); - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - private static byte[] serializeRules(Rule[] rules) { - return SerializationUtils.serialize(rules); - } - - private static Rule[] deserializeRules(byte[] b) { - return SerializationUtils.deserialize(b); - } - - - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializer.java deleted file mode 100644 index 18fe5cbb7..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializer.java +++ /dev/null @@ -1,173 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; -import gov.nist.csd.pm.policy.PolicyDeserializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.json.JSONGraph; -import gov.nist.csd.pm.policy.json.JSONPolicy; -import gov.nist.csd.pm.policy.json.JSONUserDefinedPML; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.apache.commons.lang3.SerializationUtils; - -import java.lang.reflect.Type; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.List; -import java.util.Map; - -public class MysqlPolicyDeserializer implements PolicyDeserializer { - - private MysqlPolicyStore policyStore; - - private static ObjectMapper mapper = new ObjectMapper(); - - public MysqlPolicyDeserializer(MysqlPolicyStore policyStore) { - this.policyStore = policyStore; - } - - @Override - public void fromJSON(String json) throws PMException { - JSONPolicy jsonPolicy = new Gson().fromJson(json, JSONPolicy.class); - - policyStore.beginTx(); - - insertGraph(new Gson().fromJson(jsonPolicy.getGraph(), JSONGraph.class)); - insertProhibitions(jsonPolicy.getProhibitions()); - insertObligations(jsonPolicy.getObligations()); - insertUserDefinedPML(jsonPolicy.getUserDefinedPML()); - - policyStore.commit(); - } - - @Override - public void fromPML(UserContext author, String pml, FunctionDefinitionStatement... customFunctions) throws PMException { - policyStore.beginTx(); - - PMLExecutor.compileAndExecutePML(policyStore, author, pml, customFunctions); - - policyStore.commit(); - } - - private void insertUserDefinedPML(String userDefinedPML) throws PMException { - JSONUserDefinedPML jsonPML = - new Gson().fromJson(userDefinedPML, JSONUserDefinedPML.class); - - for (Map.Entry e : jsonPML.getFunctions().entrySet()) { - policyStore.userDefinedPML().createFunction(SerializationUtils.deserialize(e.getValue())); - } - - for (Map.Entry e : jsonPML.getConstants().entrySet()) { - policyStore.userDefinedPML().createConstant(e.getKey(), SerializationUtils.deserialize(e.getValue())); - } - } - - private void insertObligations(String obligations) throws PMException { - Type type = new TypeToken>() {}.getType(); - List list = new Gson().fromJson(obligations, type); - - for (byte[] b : list) { - Obligation obligation = SerializationUtils.deserialize(b); - - List rules = obligation.getRules(); - policyStore.obligations().create( - obligation.getAuthor(), - obligation.getLabel(), - rules.toArray(new Rule[]{}) - ); - } - } - - private void insertProhibitions(String prohibitions) throws PMException { - Type type = new TypeToken>() {}.getType(); - List list = new Gson().fromJson(prohibitions, type); - - for (byte[] b : list) { - Prohibition prohibition = SerializationUtils.deserialize(b); - - policyStore.prohibitions().create( - prohibition.getLabel(), - prohibition.getSubject(), - prohibition.getAccessRightSet(), - prohibition.isIntersection(), - prohibition.getContainers().toArray(new ContainerCondition[0]) - ); - } - } - - private void insertGraph(JSONGraph jsonGraph) throws PMException { - policyStore.graph().setResourceAccessRights(jsonGraph.getResourceAccessRights()); - - String sql = """ - INSERT INTO node (node_type_id, name, properties) VALUES (?,?,?) - """; - try(PreparedStatement ps = policyStore.connection.getConnection().prepareStatement(sql)) { - for (Node node : jsonGraph.getNodes()) { - ps.setInt(1, MysqlPolicyStore.getNodeTypeId(node.getType())); - ps.setString(2, node.getName()); - ps.setString(3, MysqlPolicyStore.toJSON(node.getProperties())); - ps.addBatch(); - } - - ps.executeBatch(); - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - sql = """ - INSERT INTO assignment (start_node_id, end_node_id) VALUES ( - (SELECT id FROM node WHERE name=?), (SELECT id FROM node WHERE name=?) - ) ON DUPLICATE KEY UPDATE start_node_id=start_node_id - """; - try(PreparedStatement ps = policyStore.connection.getConnection().prepareStatement(sql)) { - for (String[] s : jsonGraph.getAssignments()) { - ps.setString(1, s[0]); - ps.setString(2, s[1]); - ps.addBatch(); - } - - ps.executeBatch(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - sql = """ - INSERT INTO association (start_node_id, end_node_id, operation_set) VALUES ( - (SELECT id FROM node WHERE name=?), (SELECT id FROM node WHERE name=?), ? - ) ON DUPLICATE KEY UPDATE operation_set=? - """; - - try(PreparedStatement ps = policyStore.connection.getConnection().prepareStatement(sql)) { - Map> associations = jsonGraph.getAssociations(); - for (Map.Entry> e1 : associations.entrySet()) { - String ua = e1.getKey(); - - for (Map.Entry e2 : e1.getValue().entrySet()) { - String target = e2.getKey(); - AccessRightSet arset = e2.getValue(); - String json = MysqlPolicyStore.arsetToJson(arset); - - ps.setString(1, ua); - ps.setString(2, target); - ps.setString(3, json); - ps.setString(4, json); - ps.addBatch(); - } - } - - ps.executeBatch(); - }catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyException.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyException.java deleted file mode 100644 index 9b4df44d0..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyException.java +++ /dev/null @@ -1,10 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class MysqlPolicyException extends PMException { - - public MysqlPolicyException(String message) { - super(message); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicySerializer.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicySerializer.java deleted file mode 100644 index ee299fb4d..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicySerializer.java +++ /dev/null @@ -1,170 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.google.gson.Gson; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.PolicySerializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.json.JSONGraph; -import gov.nist.csd.pm.policy.json.JSONPolicy; -import gov.nist.csd.pm.policy.json.JSONUserDefinedPML; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.PMLSerializer; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.apache.commons.lang3.SerializationUtils; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.mysql.MysqlGraph.getNodeFromResultSet; - -public class MysqlPolicySerializer implements PolicySerializer { - - private MysqlPolicyStore policyStore; - - public MysqlPolicySerializer(MysqlPolicyStore policyStore) { - this.policyStore = policyStore; - } - - @Override - public String toJSON() throws PMException { - String jsonGraph = graphToJson(); - String jsonProhibitions = prohibitionsToJson(); - String jsonObligations = obligationsToJson(); - String jsonUserDefinedPML = userDefinedPMLToJson(); - - return new Gson().toJson(new JSONPolicy(jsonGraph, jsonProhibitions, jsonObligations, jsonUserDefinedPML)); - } - - @Override - public String toPML() throws PMException { - MemoryPolicyStore memoryPolicyStore = new MemoryPolicyStore( - policyStore.graph(), - policyStore.prohibitions(), - policyStore.obligations(), - policyStore.userDefinedPML() - ); - - return new PMLSerializer(memoryPolicyStore).toPML(false); - } - - private String userDefinedPMLToJson() throws PMException { - Map functionBytes = new HashMap<>(); - Map functions = policyStore.userDefinedPML().getFunctions(); - for (Map.Entry f : functions.entrySet()) { - functionBytes.put(f.getKey(), SerializationUtils.serialize(f.getValue())); - } - - Map constantBytes = new HashMap<>(); - Map constants = policyStore.userDefinedPML().getConstants(); - for (Map.Entry c : constants.entrySet()) { - constantBytes.put(c.getKey(), SerializationUtils.serialize(c.getValue())); - } - - return new Gson().toJson(new JSONUserDefinedPML( - functionBytes, - constantBytes - )); - } - - private String obligationsToJson() throws PMException { - List obligations = policyStore.obligations().getAll(); - List bytes = new ArrayList<>(); - for (Obligation o : obligations) { - bytes.add(SerializationUtils.serialize(o)); - } - - return new Gson().toJson(bytes); - } - - private String prohibitionsToJson() throws PMException { - Map> prohibitions = policyStore.prohibitions().getAll(); - List bytes = new ArrayList<>(); - for (List proList : prohibitions.values()) { - for (Prohibition p : proList) { - bytes.add(SerializationUtils.serialize(p)); - } - } - - return new Gson().toJson(bytes); - } - - private String graphToJson() throws PMException { - AccessRightSet accessRightSet = policyStore.graph().getResourceAccessRights(); - JSONGraph jsonGraph = new JSONGraph(accessRightSet, getNodes(), getAssignments(), getAssociations()); - return new Gson().toJson(jsonGraph); - } - - private List getNodes() throws MysqlPolicyException { - String sql = """ - select name, node_type_id, properties from node - """; - List results = new ArrayList<>(); - try (Statement stmt = policyStore.connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - Node node = getNodeFromResultSet(rs); - results.add(node); - } - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return results; - } - - private List getAssignments() throws MysqlPolicyException { - List assignments = new ArrayList<>(); - String sql = """ - SELECT child.name, parent.name FROM assignment - join node as child on assignment.start_node_id=child.id - join node as parent on assignment.end_node_id=parent.id; - """; - try(PreparedStatement ps = policyStore.connection.getConnection().prepareStatement(sql); - ResultSet rs = ps.executeQuery()) { - while (rs.next()) { - assignments.add(new String[]{rs.getString(1), rs.getString(2)}); - } - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return assignments; - } - - private Map> getAssociations() throws PMException { - Map> associations = new HashMap<>(); - - String sql = """ - SELECT ua.name, target.name, operation_set FROM association - join node as ua on association.start_node_id=ua.id - join node as target on association.end_node_id=target.id; - """; - try (Statement stmt = policyStore.connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - while (rs.next()) { - String ua = rs.getString(1); - String target = rs.getString(2); - AccessRightSet arset = MysqlPolicyStore.arsetReader.readValue(rs.getString(3)); - - Map uaAssocs = associations.getOrDefault(ua, new HashMap<>()); - uaAssocs.put(target, arset); - associations.put(ua, uaAssocs); - } - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return associations; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyStore.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyStore.java deleted file mode 100644 index 63d5caece..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyStore.java +++ /dev/null @@ -1,143 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectReader; -import gov.nist.csd.pm.pap.PolicyStore; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.events.PolicySynchronizationEvent; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; - -public class MysqlPolicyStore extends PolicyStore { - - public static final String MYSQL_DRIVER = "com.mysql.cj.jdbc.Driver"; - public static final String MYSQL_SCHEMA = "pm_core"; - - static final ObjectMapper objectMapper = new ObjectMapper(); - static final ObjectReader hashmapReader = new ObjectMapper().readerFor(HashMap.class); - static final ObjectReader arsetReader = new ObjectMapper().readerFor(AccessRightSet.class); - static final ObjectReader userCtxReader = new ObjectMapper().readerFor(UserContext.class); - - protected final MysqlConnection connection; - - private final MysqlGraph graph; - private final MysqlProhibitions prohibitions; - private final MysqlObligations obligations; - private final MysqlUserDefinedPML userDefinedPML; - - public MysqlPolicyStore(Connection connection) { - this.connection = new MysqlConnection(connection); - - this.graph = new MysqlGraph(this.connection); - this.prohibitions = new MysqlProhibitions(this.connection); - this.obligations = new MysqlObligations(this.connection); - this.userDefinedPML = new MysqlUserDefinedPML(this.connection); - } - - @Override - public void beginTx() throws MysqlPolicyException { - connection.beginTx(); - } - - @Override - public void commit() throws MysqlPolicyException { - connection.commit(); - } - - @Override - public void rollback() throws MysqlPolicyException { - connection.rollback(); - } - - @Override - public PolicySynchronizationEvent policySync() throws PMException { - return new PolicySynchronizationEvent( - new MemoryPolicyStore(graph, prohibitions, obligations, userDefinedPML) - ); - } - - @Override - protected void reset() throws MysqlPolicyException { - List sequence = PolicyResetSequence.getSequence(); - try (Statement stmt = connection.getConnection().createStatement()) { - for (String s : sequence) { - stmt.executeUpdate(s); - } - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Graph graph() { - return graph; - } - - @Override - public Prohibitions prohibitions() { - return prohibitions; - } - - @Override - public Obligations obligations() { - return obligations; - } - - @Override - public UserDefinedPML userDefinedPML() { - return userDefinedPML; - } - - @Override - public PolicySerializer serialize() throws PMException { - return new MysqlPolicySerializer(this); - } - - @Override - public PolicyDeserializer deserialize() throws PMException { - return new MysqlPolicyDeserializer(this); - } - - static int getNodeTypeId(NodeType nodeType) { - // values are mapped to values in node_type table - return switch (nodeType) { - case PC -> 5; - case OA -> 1; - case UA -> 2; - case O -> 4; - default -> 3; // U - }; - } - - static NodeType getNodeTypeFromId(int id) { - // values are mapped to values in node_type table - return switch (id) { - case 1 -> OA; - case 2 -> UA; - case 3 -> U; - case 4 -> O; - default -> PC; - }; - } - - public static String toJSON(Map map) throws JsonProcessingException { - return objectMapper.writeValueAsString(map); - } - - public static String arsetToJson(AccessRightSet set) throws JsonProcessingException { - return objectMapper.writeValueAsString(set); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlProhibitions.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlProhibitions.java deleted file mode 100644 index cd4beb03b..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlProhibitions.java +++ /dev/null @@ -1,280 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import com.fasterxml.jackson.core.JsonProcessingException; -import gov.nist.csd.pm.policy.Prohibitions; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.ProhibitionDoesNotExistException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject.Type.*; -import static gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject.Type.USER; - -public class MysqlProhibitions implements Prohibitions { - - private MysqlConnection connection; - - public MysqlProhibitions(MysqlConnection mysqlConnection) { - this.connection = mysqlConnection; - } - - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws MysqlPolicyException { - connection.beginTx(); - - String sql; - if (subject.getType() == ProhibitionSubject.Type.PROCESS) { - sql = - """ - insert into prohibition (label, process_id, subject_type, access_rights, is_intersection) values (?,?,?,?,?) - """; - } else { - sql = - """ - insert into prohibition (label, node_id, subject_type, access_rights, is_intersection) values (?,(select id from node where name = ?),?,?,?) - """; - } - - int prohibitionID; - try (PreparedStatement ps = connection.getConnection().prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS)) { - ps.setString(1, label); - ps.setString(2, subject.getName()); - ps.setInt(3, getProhibitionSubjectTypeId(subject.getType())); - ps.setString(4, MysqlPolicyStore.arsetToJson(accessRightSet)); - ps.setBoolean(5, intersection); - - ps.executeUpdate(); - - ResultSet generatedKeys = ps.getGeneratedKeys(); - if (generatedKeys.next()) { - prohibitionID = generatedKeys.getInt(1); - } else { - throw new MysqlPolicyException("could not retrieve generated prohibition id after insert"); - } - } catch (SQLException | JsonProcessingException e) { - connection.rollback(); - throw new MysqlPolicyException(e.getMessage()); - } - - sql = """ - insert into prohibition_container (prohibition_id, container_id, is_complement) values (?, (select id from node where name = ?), ?) - """; - try (PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - for (ContainerCondition containerCondition : containerConditions) { - ps.setInt(1, prohibitionID); - ps.setString(2, containerCondition.name()); - ps.setInt(3, containerCondition.complement() ? 1 : 0); - - ps.addBatch(); - } - - ps.executeBatch(); - } catch (SQLException e) { - connection.rollback(); - throw new MysqlPolicyException(e.getMessage()); - } - - connection.commit(); - } - - private int getProhibitionSubjectTypeId(ProhibitionSubject.Type type) { - switch (type) { - case USER -> { - return 1; - } - case USER_ATTRIBUTE -> { - return 2; - } - case PROCESS -> { - return 3; - } - } - - return 0; - } - - private ProhibitionSubject.Type getProhibitionSubjectTypeFromId(int id) { - switch (id) { - case 1 -> { - return USER; - } - case 2 -> { - return USER_ATTRIBUTE; - } - case 3 -> { - return PROCESS; - } - } - - return USER; - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws MysqlPolicyException { - connection.beginTx(); - - try { - delete(label); - create(label, subject, accessRightSet, intersection, containerConditions); - connection.commit(); - } catch (MysqlPolicyException e) { - connection.rollback(); - throw e; - } - } - - @Override - public void delete(String label) throws MysqlPolicyException { - String sql = """ - delete from prohibition where label = ? - """; - - try (PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, label); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Map> getAll() throws MysqlPolicyException { - String sql = """ - select id, label, (select name from node where node.id=prohibition.node_id) as node, process_id, subject_type, access_rights, is_intersection from prohibition - """; - - try(Statement stmt = connection.getConnection().createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { - - List prohibitions = getProhibitionsFromResultSet(rs); - - rs.close(); - - Map> prohibitionsMap = new HashMap<>(); - for (Prohibition p : prohibitions) { - List subjPros = prohibitionsMap.getOrDefault(p.getSubject().getName(), new ArrayList<>()); - subjPros.add(p); - prohibitionsMap.put(p.getSubject().getName(), subjPros); - } - - return prohibitionsMap; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public boolean exists(String label) throws PMException { - try { - get(label); - return true; - } catch (ProhibitionDoesNotExistException e) { - return false; - } - } - - private List getContainerConditions(int id) throws SQLException { - List containers = new ArrayList<>(); - String containerSql = """ - select (select name from node where node.id = prohibition_container.container_id) as container, is_complement - from prohibition_container - where prohibition_id=? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(containerSql)) { - ps.setInt(1, id); - ResultSet containerRs = ps.executeQuery(); - while (containerRs.next()) { - String container = containerRs.getString(1); - boolean isComplement = containerRs.getBoolean(2); - containers.add(new ContainerCondition(container, isComplement)); - } - - containerRs.close(); - } - - return containers; - } - - @Override - public List getWithSubject(String subject) throws MysqlPolicyException { - String sql = """ - select id, label, (select name from node where node.id=prohibition.node_id) as node, process_id, subject_type, access_rights, is_intersection - from prohibition - where node_id = (select id from node where name = ?) || process_id = ? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, subject); - ps.setString(2, subject); - ResultSet rs = ps.executeQuery(); - - List prohibitions = getProhibitionsFromResultSet(rs); - - rs.close(); - - return prohibitions; - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Prohibition get(String label) throws PMException { - String sql = """ - select id, label, (select name from node where node.id=prohibition.node_id) as node, process_id, subject_type, access_rights, is_intersection from prohibition where label = ? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, label); - ResultSet rs = ps.executeQuery(); - - List prohibitions = getProhibitionsFromResultSet(rs); - if (prohibitions.isEmpty()) { - throw new ProhibitionDoesNotExistException(label); - } - - rs.close(); - - return prohibitions.get(0); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - private List getProhibitionsFromResultSet(ResultSet rs) throws MysqlPolicyException { - List prohibitions = new ArrayList<>(); - - try { - while (rs.next()) { - int id = rs.getInt(1); - String label = rs.getString(2); - String node = rs.getString(3); - String process = rs.getString(4); - ProhibitionSubject.Type type = getProhibitionSubjectTypeFromId(rs.getInt(5)); - AccessRightSet arset = MysqlPolicyStore.arsetReader.readValue(rs.getString(6)); - boolean isIntersection = rs.getBoolean(7); - - List containers = getContainerConditions(id); - - prohibitions.add(new Prohibition(label, new ProhibitionSubject(type == PROCESS ? process : node, type), arset, isIntersection, containers)); - } - - return prohibitions; - } catch (SQLException | JsonProcessingException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlUserDefinedPML.java b/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlUserDefinedPML.java deleted file mode 100644 index c79ff7669..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/MysqlUserDefinedPML.java +++ /dev/null @@ -1,167 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.policy.UserDefinedPML; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.apache.commons.lang3.SerializationUtils; - -import java.io.IOException; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; - -public class MysqlUserDefinedPML implements UserDefinedPML { - - private MysqlConnection connection; - - public MysqlUserDefinedPML(MysqlConnection connection) { - this.connection = connection; - } - - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws MysqlPolicyException { - String sql = """ - insert into pml_function (name, bytes) values (?,?) - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, functionDefinitionStatement.getFunctionName()); - ps.setBytes(2, SerializationUtils.serialize(functionDefinitionStatement)); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void deleteFunction(String functionName) throws MysqlPolicyException { - String sql = """ - delete from pml_function where name=? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, functionName); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Map getFunctions() throws PMException { - String sql = """ - select bytes from pml_function - """; - - Map functionDefinitionStatements = new HashMap<>(); - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql); - ResultSet resultSet = ps.executeQuery()) { - while (resultSet.next()) { - FunctionDefinitionStatement funcDef = SerializationUtils.deserialize(resultSet.getBlob(1).getBinaryStream().readAllBytes()); - functionDefinitionStatements.put(funcDef.getFunctionName(), funcDef); - } - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return functionDefinitionStatements; - } - - @Override - public FunctionDefinitionStatement getFunction(String name) throws PMException { - String sql = """ - select bytes from pml_function where name = ? - """; - - Map functionDefinitionStatements = new HashMap<>(); - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, name); - - FunctionDefinitionStatement funcDef = null; - ResultSet resultSet = ps.executeQuery(); - if (resultSet.next()) { - funcDef = SerializationUtils.deserialize(resultSet.getBlob(1).getBinaryStream().readAllBytes()); - functionDefinitionStatements.put(funcDef.getFunctionName(), funcDef); - } - - resultSet.close(); - - return funcDef; - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void createConstant(String constantName, Value constantValue) throws MysqlPolicyException { - String sql = """ - insert into pml_constant (name, value) values (?,?) - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, constantName); - ps.setBytes(2, SerializationUtils.serialize(constantValue)); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public void deleteConstant(String constName) throws MysqlPolicyException { - String sql = """ - delete from pml_constant where name=? - """; - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, constName); - ps.executeUpdate(); - } catch (SQLException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - - @Override - public Map getConstants() throws PMException { - String sql = """ - select name, value from pml_constant - """; - - Map constants = new HashMap<>(); - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql); - ResultSet resultSet = ps.executeQuery()) { - while (resultSet.next()) { - String key = resultSet.getString(1); - Value value = SerializationUtils.deserialize(resultSet.getBlob(2).getBinaryStream().readAllBytes()); - constants.put(key, value); - } - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - - return constants; - } - - @Override - public Value getConstant(String name) throws PMException { - String sql = """ - select value from pml_constant where name=? - """; - - try(PreparedStatement ps = connection.getConnection().prepareStatement(sql)) { - ps.setString(1, name); - - ResultSet resultSet = ps.executeQuery(); - Value value = null; - if (resultSet.next()) { - value = SerializationUtils.deserialize(resultSet.getBlob(1).getBinaryStream().readAllBytes()); - } - - resultSet.close(); - - return value; - } catch (SQLException | IOException e) { - throw new MysqlPolicyException(e.getMessage()); - } - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pap/mysql/PolicyResetSequence.java b/src/main/java/gov/nist/csd/pm/pap/mysql/PolicyResetSequence.java deleted file mode 100644 index 93e7d4e4a..000000000 --- a/src/main/java/gov/nist/csd/pm/pap/mysql/PolicyResetSequence.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Arrays; -import java.util.List; - -public class PolicyResetSequence { - - public static List getSequence() { - return Arrays.asList( - "SET SQL_SAFE_UPDATES = 0", - "SET FOREIGN_KEY_CHECKS=0", - "delete from node", - "delete from assignment", - "delete from association", - "delete from prohibition", - "delete from prohibition_container", - "delete from obligation", - "delete from resource_access_rights", - "delete from pml_function", - "delete from pml_constant", - "SET SQL_SAFE_UPDATES = 1", - "SET FOREIGN_KEY_CHECKS=1" - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/EventContext.java b/src/main/java/gov/nist/csd/pm/pap/obligation/EventContext.java new file mode 100644 index 000000000..a3f7816b6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/EventContext.java @@ -0,0 +1,79 @@ +package gov.nist.csd.pm.pap.obligation; + +import gov.nist.csd.pm.pap.op.Operation; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class EventContext { + + private final String user; + private final String process; + private final String opName; + private final Map operands; + private final List nodeOperands; + + public EventContext(String user, String process, String opName, Map operands, List nodeOperands) { + this.user = user; + this.process = process; + this.opName = opName; + this.operands = operands; + this.nodeOperands = nodeOperands; + } + + public EventContext(String user, String opName, Map operands, List nodeOperands) { + this(user, "", opName, operands, nodeOperands); + } + + public EventContext(String user, String process, Operation op, Map operands) { + this(user, process, op.getName(), operands, op.getNodeOperands()); + } + + public EventContext(String user, String opName, Map operands) { + this(user, "", opName, operands, List.of()); + } + + public String user() { + return user; + } + + public String process() { + return process; + } + + public String opName() { + return opName; + } + + public Map operands() { + return operands; + } + + public List nodeOperands() { + return nodeOperands; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EventContext that)) return false; + return Objects.equals(user, that.user) && Objects.equals(process, that.process) && Objects.equals(opName, that.opName) && Objects.equals(operands, that.operands) && Objects.equals(nodeOperands, that.nodeOperands); + } + + @Override + public int hashCode() { + return Objects.hash(user, process, opName, operands, nodeOperands); + } + + @Override + public String toString() { + return "EventContext{" + + "user='" + user + '\'' + + ", process='" + process + '\'' + + ", opName='" + opName + '\'' + + ", operands=" + operands + + ", nodeOperands=" + nodeOperands + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/EventPattern.java b/src/main/java/gov/nist/csd/pm/pap/obligation/EventPattern.java new file mode 100644 index 000000000..b48e781ba --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/EventPattern.java @@ -0,0 +1,140 @@ +package gov.nist.csd.pm.pap.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; + +import java.io.Serializable; +import java.util.*; + +public class EventPattern implements Serializable { + + protected SubjectPattern subjectPattern; + protected OperationPattern operationPattern; + protected Map> operandPatterns; + + public EventPattern(SubjectPattern subjectPattern, + OperationPattern operationPattern, + Map> operandPatterns) { + this.subjectPattern = subjectPattern; + this.operationPattern = operationPattern; + this.operandPatterns = operandPatterns; + } + + public EventPattern(SubjectPattern subjectPattern, OperationPattern operationPattern) { + this.subjectPattern = subjectPattern; + this.operationPattern = operationPattern; + this.operandPatterns = new HashMap<>(); + } + + public SubjectPattern getSubjectPattern() { + return subjectPattern; + } + + public void setSubjectPattern(SubjectPattern subjectPattern) { + this.subjectPattern = subjectPattern; + } + + public OperationPattern getOperationPattern() { + return operationPattern; + } + + public void setOperationPattern(OperationPattern operationPattern) { + this.operationPattern = operationPattern; + } + + public Map> getOperandPatterns() { + return operandPatterns; + } + + public void setOperandPatterns(Map> operandPatterns) { + this.operandPatterns = operandPatterns; + } + + public boolean matches(EventContext eventCtx, PAP pap) throws PMException { + boolean userMatches = userMatches(eventCtx.user(), pap) || processMatches(eventCtx.process(), pap); + boolean opMatches = operationMatches(eventCtx.opName(), pap); + if (operationPattern.isAny()) { + return userMatches; + } + + boolean operandsMatch = operandsMatch(eventCtx.operands(), eventCtx.nodeOperands(), pap); + + return userMatches && opMatches && operandsMatch; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EventPattern that)) return false; + return Objects.equals(subjectPattern, that.subjectPattern) && Objects.equals(operationPattern, that.operationPattern) && Objects.equals(operandPatterns, that.operandPatterns); + } + + @Override + public int hashCode() { + return Objects.hash(subjectPattern, operationPattern, operandPatterns); + } + + @Override + public String toString() { + return "EventPattern[" + + "subjectPattern=" + subjectPattern + ", " + + "operationPattern=" + operationPattern + ", " + + "operandPatterns=" + operandPatterns + ']'; + } + + private boolean userMatches(String user, PAP pap) throws PMException { + return subjectPattern.matches(user, pap); + } + + private boolean processMatches(String process, PAP pap) throws PMException { + return subjectPattern.matches(process, pap); + } + + private boolean operationMatches(String opName, PAP pap) throws PMException { + return operationPattern.matches(opName, pap); + } + + private boolean operandsMatch(Map operands, List nodeOperands, PAP pap) throws PMException { + // if more patterns than operands - false + // if no patterns - true (match everything) + if (operandPatterns.size() > operands.size()) { + return false; + } else if (operandPatterns.isEmpty()) { + return true; + } + + for (String nodeOperand : nodeOperands) { + if (!operandPatterns.containsKey(nodeOperand)) { + continue; + } else if (!operands.containsKey(nodeOperand)) { + return false; + } + + Object operandValue = operands.get(nodeOperand); + List expressions = operandPatterns.get(nodeOperand); + + // needs to match each expression in pattern list + for (OperandPatternExpression operandPatternExpression : expressions) { + switch (operandValue) { + case null -> {} + case String operandValueStr -> { + if (!operandPatternExpression.matches(operandValueStr, pap)) { + return false; + } + } + case Collection operandValueCollection -> { + if (!operandPatternExpression.matches((Collection) operandValueCollection, pap)) { + return false; + } + } + default -> throw new UnexpectedOperandTypeException(operandValue.getClass()); + } + } + } + + return true; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/Obligation.java b/src/main/java/gov/nist/csd/pm/pap/obligation/Obligation.java new file mode 100644 index 000000000..66e63a1e9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/Obligation.java @@ -0,0 +1,96 @@ +package gov.nist.csd.pm.pap.obligation; + +import gov.nist.csd.pm.pap.pml.statement.operation.CreateObligationStatement; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Obligation implements Serializable { + + private String author; + private String name; + private List rules; + + public Obligation() { + } + + public Obligation(String author, String name) { + this.author = author; + this.name = name; + this.rules = new ArrayList<>(); + } + + public Obligation(String author, String name, List rules) { + this.author = author; + this.name = name; + this.rules = rules; + } + + public Obligation addRule(String name, EventPattern eventPattern, Response response) { + rules.add(new Rule(name, eventPattern, response)); + return this; + } + + public void deleteRule(String name) { + rules.removeIf(rule -> rule.getName().equals(name)); + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String userCtx) { + this.author = userCtx; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getRules() { + return rules; + } + + public Rule getRule(String ruleName) { + for (Rule rule : rules) { + if (rule.getName().equals(ruleName)) { + return rule; + } + } + + return null; + } + + public void setRules(List rules) { + this.rules = rules; + } + + public Obligation addRule(Rule rule) { + this.rules.add(rule); + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Obligation that = (Obligation) o; + return Objects.equals(author, that.author) && Objects.equals(name, that.name) && Objects.equals(rules, that.rules); + } + + @Override + public int hashCode() { + return Objects.hash(author, name, rules); + } + + @Override + public String toString() { + return CreateObligationStatement.fromObligation(this).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/Response.java b/src/main/java/gov/nist/csd/pm/pap/obligation/Response.java new file mode 100644 index 000000000..13cc2ab64 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/Response.java @@ -0,0 +1,54 @@ +package gov.nist.csd.pm.pap.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.VoidValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class Response implements Serializable { + + private final List stmts; + private final String eventCtxVariable; + + public Response(String eventCtxVariable, List stmts) { + this.eventCtxVariable = eventCtxVariable; + this.stmts = List.copyOf(stmts); + } + + public Response(Response response) { + this.eventCtxVariable = response.eventCtxVariable; + this.stmts = response.stmts; + } + + public String getEventCtxVariable() { + return eventCtxVariable; + } + + public List getStatements() { + return stmts; + } + + public Value execute(ExecutionContext executionCtx, EventContext eventCtx) throws PMException { + executionCtx.executeStatements(stmts, Map.of(eventCtxVariable, eventCtx)); + + return new VoidValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Response response)) return false; + return Objects.equals(stmts, response.stmts) && Objects.equals(eventCtxVariable, response.eventCtxVariable); + } + + @Override + public int hashCode() { + return Objects.hash(stmts, eventCtxVariable); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/Rule.java b/src/main/java/gov/nist/csd/pm/pap/obligation/Rule.java new file mode 100644 index 000000000..77b838fb1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/Rule.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.obligation; + +import java.io.Serializable; +import java.util.Objects; + +public class Rule implements Serializable { + + private String name; + private EventPattern eventPattern; + private Response response; + + public Rule() { + } + + public Rule(String name, EventPattern eventPattern, Response response) { + this.name = name; + this.eventPattern = eventPattern; + this.response = response; + } + + public String getName() { + return name; + } + + public EventPattern getEventPattern() { + return eventPattern; + } + + public Response getResponse() { + return response; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Rule rule = (Rule) o; + return Objects.equals(name, rule.name) && Objects.equals(eventPattern, rule.eventPattern) && Objects.equals(response, rule.response); + } + + @Override + public int hashCode() { + return Objects.hash(name, eventPattern, response); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/obligation/UnexpectedOperandTypeException.java b/src/main/java/gov/nist/csd/pm/pap/obligation/UnexpectedOperandTypeException.java new file mode 100644 index 000000000..720e2dd19 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/obligation/UnexpectedOperandTypeException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class UnexpectedOperandTypeException extends PMException { + public UnexpectedOperandTypeException(Class c) { + super("unexpected operand type " + c.getName() + ", expected String or Collection"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/AdminAccessRights.java b/src/main/java/gov/nist/csd/pm/pap/op/AdminAccessRights.java new file mode 100644 index 000000000..b26776ae1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/AdminAccessRights.java @@ -0,0 +1,178 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +public class AdminAccessRights { + + public static final String CREATE_POLICY_CLASS = "create_policy_class"; + public static final String CREATE_OBJECT = "create_object"; + public static final String CREATE_OBJECT_ATTRIBUTE = "create_object_attribute"; + public static final String CREATE_USER_ATTRIBUTE = "create_user_attribute"; + public static final String CREATE_USER = "create_user"; + + public static final String SET_NODE_PROPERTIES = "set_node_properties"; + + public static final String DELETE_POLICY_CLASS = "delete_policy_class"; + public static final String DELETE_OBJECT = "delete_object"; + public static final String DELETE_OBJECT_ATTRIBUTE = "delete_object_attribute"; + public static final String DELETE_USER_ATTRIBUTE = "delete_user_attribute"; + public static final String DELETE_USER = "delete_user"; + + public static final String DELETE_POLICY_CLASS_FROM = "delete_policy_class_from"; + public static final String DELETE_OBJECT_FROM = "delete_object_from"; + public static final String DELETE_OBJECT_ATTRIBUTE_FROM = "delete_object_attribute_from"; + public static final String DELETE_USER_ATTRIBUTE_FROM = "delete_user_attribute_from"; + public static final String DELETE_USER_FROM = "delete_user_from"; + + public static final String ASSIGN = "assign"; + public static final String ASSIGN_TO = "assign_to"; + public static final String DEASSIGN = "deassign"; + public static final String DEASSIGN_FROM = "deassign_from"; + + public static final String ASSOCIATE = "associate"; + public static final String ASSOCIATE_TO = "associate_to"; + + public static final String DISSOCIATE = "dissociate"; + public static final String DISSOCIATE_FROM = "dissociate_from"; + + public static final String GET_ASSOCIATIONS = "get_associations"; + public static final String GET_PROHIBITIONS = "get_prohibitions"; + public static final String GET_ACCESS_RIGHTS = "get_access_rights"; + + // prohibitions + public static final String CREATE_PROHIBITION = "create_prohibition"; + public static final String CREATE_PROCESS_PROHIBITION = "create_process_prohibition"; + public static final String DELETE_PROCESS_PROHIBITION = "delete_process_prohibition"; + public static final String GET_PROCESS_PROHIBITIONS = "get_process_prohibitions"; + public static final String DELETE_PROHIBITION = "delete_prohibition"; + + // obligations + public static final String CREATE_OBLIGATION = "create_obligation"; + public static final String DELETE_OBLIGATION = "delete_obligation"; + public static final String GET_OBLIGATION = "get_obligation"; + public static final String DELETE_RULE = "delete_rule"; + public static final String SET_RESOURCE_OPERATIONS = "set_resource_operations"; + public static final String GET_RESOURCE_OPERATIONS = "get_resource_operations"; + + // operations + public static final String CREATE_ADMIN_OPERATION = "create_admin_operation"; + public static final String DELETE_ADMIN_OPERATION = "delete_admin_operation"; + + // routines + public static final String CREATE_ADMIN_ROUTINE = "create_admin_routine"; + public static final String DELETE_ADMIN_ROUTINE = "delete_admin_routine"; + + + // policy review + public static final String REVIEW_POLICY = "review_policy"; + + // policy + public static final String RESET = "reset"; + public static final String SERIALIZE_POLICY = "serialize_policy"; + public static final String DESERIALIZE_POLICY = "deserialize_policy"; + + // pml + public static final String SET_PML_OPS = "set_pml_operations"; + public static final String SET_PML_ROUTINES = "set_pml_routines"; + public static final String SET_PML_CONSTANTS = "set_pml_constants"; + + public static final String ALL_ACCESS_RIGHTS = "*"; + public static final String ALL_ADMIN_ACCESS_RIGHTS = "*a"; + public static final String ALL_RESOURCE_ACCESS_RIGHTS = "*r"; + + private static final AccessRightSet ALL_ADMIN_ACCESS_RIGHTS_SET = new AccessRightSet( + CREATE_POLICY_CLASS, + CREATE_OBJECT, + CREATE_OBJECT_ATTRIBUTE , + CREATE_USER_ATTRIBUTE, + CREATE_USER, + + SET_NODE_PROPERTIES, + + DELETE_POLICY_CLASS, + DELETE_OBJECT, + DELETE_OBJECT_ATTRIBUTE, + DELETE_USER_ATTRIBUTE, + DELETE_USER, + + DELETE_POLICY_CLASS_FROM, + DELETE_OBJECT_FROM, + DELETE_OBJECT_ATTRIBUTE_FROM, + DELETE_USER_ATTRIBUTE_FROM, + DELETE_USER_FROM, + + ASSIGN, + ASSIGN_TO, + DEASSIGN, + DEASSIGN_FROM, + ASSOCIATE, + ASSOCIATE_TO, + DISSOCIATE, + DISSOCIATE_FROM, + + // prohibitions + CREATE_PROHIBITION, + CREATE_PROCESS_PROHIBITION, + DELETE_PROCESS_PROHIBITION, + GET_PROCESS_PROHIBITIONS, + DELETE_PROHIBITION, + + // obligations + CREATE_OBLIGATION, + DELETE_OBLIGATION, + GET_OBLIGATION, + DELETE_RULE, + SET_RESOURCE_OPERATIONS, + GET_RESOURCE_OPERATIONS, + + // operations + CREATE_ADMIN_OPERATION, + DELETE_ADMIN_OPERATION, + + // routines + CREATE_ADMIN_ROUTINE, + DELETE_ADMIN_ROUTINE, + + // policy + RESET, + SERIALIZE_POLICY, + DESERIALIZE_POLICY, + + // pml + SET_PML_OPS, + SET_PML_ROUTINES, + + // review + REVIEW_POLICY + ); + + private static final AccessRightSet WILDCARD_ACCESS_RIGHTS_SET = new AccessRightSet( + ALL_ACCESS_RIGHTS, + ALL_ADMIN_ACCESS_RIGHTS, + ALL_RESOURCE_ACCESS_RIGHTS + ); + + private static final AccessRightSet ALL_ACCESS_RIGHTS_SET = new AccessRightSet(ALL_ACCESS_RIGHTS); + + private AdminAccessRights() {} + + public static AccessRightSet allAdminAccessRights() { + return new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS_SET); + } + + public static AccessRightSet allAccessRights() { + return new AccessRightSet(ALL_ACCESS_RIGHTS_SET); + } + + public static AccessRightSet wildcardAccessRights() { + return new AccessRightSet(WILDCARD_ACCESS_RIGHTS_SET); + } + + public static boolean isAdminAccessRight(String ar) { + return ALL_ADMIN_ACCESS_RIGHTS_SET.contains(ar); + } + + public static boolean isWildcardAccessRight(String ar) { + return WILDCARD_ACCESS_RIGHTS_SET.contains(ar); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/AdminOperations.java b/src/main/java/gov/nist/csd/pm/pap/op/AdminOperations.java new file mode 100644 index 000000000..fc5452275 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/AdminOperations.java @@ -0,0 +1,67 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.op.graph.*; +import gov.nist.csd.pm.pap.op.obligation.CreateObligationOp; +import gov.nist.csd.pm.pap.op.obligation.DeleteObligationOp; +import gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.DeleteAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp; +import gov.nist.csd.pm.pap.op.prohibition.CreateProhibitionOp; +import gov.nist.csd.pm.pap.op.prohibition.DeleteProhibitionOp; +import gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp; +import gov.nist.csd.pm.pap.op.routine.DeleteAdminRoutineOp; +import gov.nist.csd.pm.pap.store.OperationsStore; + +import java.util.*; + +public class AdminOperations { + + public static List> ADMIN_OPERATIONS = List.of( + new AssignOp(), + new AssociateOp(), + new CreateObjectAttributeOp(), + new CreateObjectOp(), + new CreatePolicyClassOp(), + new CreateUserAttributeOp(), + new CreateUserOp(), + new DeassignOp(), + new DeleteObjectAttributeOp(), + new DeleteObjectOp(), + new DeletePolicyClassOp(), + new DeleteUserAttributeOp(), + new DeleteUserOp(), + new DissociateOp(), + new SetNodePropertiesOp(), + + new CreateObligationOp(), + new DeleteObligationOp(), + + new CreateAdminOperationOp(), + new DeleteAdminOperationOp(), + new SetResourceOperationsOp(), + + new CreateProhibitionOp(), + new DeleteProhibitionOp(), + + new CreateAdminRoutineOp(), + new DeleteAdminRoutineOp() + ); + + public static Set ADMIN_OP_NAMES = new HashSet<>(adminOperationNames()); + + public static void init(OperationsStore operationsStore) throws PMException { + for (Operation op : ADMIN_OPERATIONS) { + operationsStore.createAdminOperation(op); + } + } + + private static Set adminOperationNames() { + Set names = new HashSet<>(); + for (Operation op : ADMIN_OPERATIONS) { + names.add(op.getName()); + } + + return names; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/Operation.java b/src/main/java/gov/nist/csd/pm/pap/op/Operation.java new file mode 100644 index 000000000..34ed2b0dc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/Operation.java @@ -0,0 +1,112 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.OperandsDoNotMatchException; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.io.Serializable; +import java.util.*; + +public abstract class Operation extends AdminExecutable implements Serializable { + + public static final String NAME_OPERAND = "name"; + + protected List nodeOperands; + + public Operation(String name, List allOperands, List nodeOperands) { + super(name, allOperands); + + validateOperandNames(allOperands, nodeOperands); + + this.nodeOperands = nodeOperands; + } + + public Operation(String name, List allOperands) { + super(name, allOperands); + + validateOperandNames(allOperands, new ArrayList<>()); + + this.nodeOperands = new ArrayList<>(); + } + + public Operation(String name) { + super(name, new ArrayList<>()); + + this.nodeOperands = new ArrayList<>(); + } + + private void validateOperandNames(List allOperands, List nodeOperands) { + if (!allOperands.containsAll(nodeOperands)) { + throw new IllegalArgumentException("all nodeOperands must be defined in allOperands"); + } + } + + public List getNodeOperands() { + return nodeOperands; + } + + public abstract void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException; + + public PreparedOperation withOperands(Map actualOperands) throws OperandsDoNotMatchException { + validateOperands(actualOperands); + + return new PreparedOperation<>(this, actualOperands); + } + + public void validateOperands(Map actualOperands) throws OperandsDoNotMatchException { + Set actualOperandNames = actualOperands.keySet(); + + if (actualOperandNames.size() != operandNames.size()) { + throw new OperandsDoNotMatchException(name, operandNames, actualOperandNames); + } + + for (String actualOperandName : actualOperandNames) { + if (!operandNames.contains(actualOperandName)) { + throw new OperandsDoNotMatchException(name, operandNames, actualOperandNames); + } + } + + for (String nodeOperandName : nodeOperands) { + Object operandValue = actualOperands.get(nodeOperandName); + if (operandValue instanceof String) { + continue; + } + + if (operandValue instanceof Collection collection) { + if (collection.isEmpty()) { + continue; + } + + Object next = collection.iterator().next(); + if (next instanceof String) { + continue; + } + } + + throw new IllegalArgumentException("node operand can only be a string or collection of strings"); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Operation operation = (Operation) o; + return Objects.equals(name, operation.name) && Objects.equals(operandNames, operation.operandNames); + } + + @Override + public int hashCode() { + return Objects.hash(name, operandNames); + } + + @Override + public String toString() { + return "Operation{" + + "name='" + name + '\'' + + ", operandNames=" + operandNames + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/PreparedOperation.java b/src/main/java/gov/nist/csd/pm/pap/op/PreparedOperation.java new file mode 100644 index 000000000..efd19ad4b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/PreparedOperation.java @@ -0,0 +1,67 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.Map; +import java.util.Objects; + +public class PreparedOperation { + + private Operation op; + private Map operands; + + public PreparedOperation(Operation op, Map operands) { + this.op = op; + this.operands = operands; + } + + public Operation getOp() { + return op; + } + + public void setOp(Operation op) { + this.op = op; + } + + public Map getOperands() { + return operands; + } + + public void setOperands(Map operands) { + this.operands = operands; + } + + public T execute(PAP pap) throws PMException { + return op.execute(pap, operands); + } + + public EventContext execute(PAP pap, UserContext userCtx) throws PMException { + // check user can execute op with given operands + op.canExecute(pap, userCtx, operands); + + // execute the op with the given operands + op.execute(pap, operands); + + return new EventContext(userCtx.getUser(), userCtx.getProcess(), op, operands); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PreparedOperation that = (PreparedOperation) o; + return Objects.equals(op, that.op) && Objects.equals(operands, that.operands); + } + + @Override + public int hashCode() { + return Objects.hash(op, operands); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/PrivilegeChecker.java b/src/main/java/gov/nist/csd/pm/pap/op/PrivilegeChecker.java new file mode 100644 index 000000000..d2d3b73d4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/PrivilegeChecker.java @@ -0,0 +1,67 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.graph.node.Node; + +import java.util.Arrays; +import java.util.Collection; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.PC; + +public class PrivilegeChecker { + + public static void check(PAP pap, UserContext userCtx, String target, Collection toCheck) throws PMException { + // if checking the permissions on a PC, check the permissions on the target node for the PC + Node targetNode = pap.query().graph().getNode(target); + + if (targetNode.getType().equals(PC)) { + target = AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(); + } + + AccessRightSet accessRights = pap.query().access().computePrivileges(userCtx, target); + if (!accessRights.containsAll(toCheck)) { + throw new UnauthorizedException(userCtx, target, toCheck.toArray(String[]::new)); + } + } + + public static void check(PAP pap, UserContext userCtx, String target, String... toCheck) throws PMException { + // if checking the permissions on a PC, check the permissions on the target node for the PC + Node targetNode = pap.query().graph().getNode(target); + + if (targetNode.getType().equals(PC)) { + target = AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(); + } + + AccessRightSet accessRights = pap.query().access().computePrivileges(userCtx, target); + if (!accessRights.containsAll(Arrays.asList(toCheck))) { + throw new UnauthorizedException(userCtx, target, toCheck); + } + } + + public static void check(PAP pap, UserContext userCtx, Collection targets, String... toCheck) throws PMException { + for (String target : targets) { + check(pap, userCtx, target, toCheck); + } + } + + public static void checkPattern(PAP pap, UserContext userCtx, Pattern pattern, String toCheck) throws PMException { + ReferencedNodes referencedNodes = pattern.getReferencedNodes(); + if (referencedNodes.isAny()) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), toCheck); + + return; + } + + for (String entity : referencedNodes.nodes()) { + PrivilegeChecker.check(pap, userCtx, entity, toCheck); + } + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/AssignOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/AssignOp.java new file mode 100644 index 000000000..0c70b2bee --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/AssignOp.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.ASSIGN; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.ASSIGN_TO; + +public class AssignOp extends GraphOp { + + public AssignOp() { + super( + "assign", + List.of(ASCENDANT_OPERAND, DESCENDANTS_OPERAND), + List.of(ASCENDANT_OPERAND, DESCENDANTS_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + String asc = (String) operands.get(ASCENDANT_OPERAND); + List descs = (List) operands.get(DESCENDANTS_OPERAND); + + pap.modify().graph().assign(asc, descs); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(ASCENDANT_OPERAND), ASSIGN); + PrivilegeChecker.check(pap, userCtx, (List) operands.get(DESCENDANTS_OPERAND), ASSIGN_TO); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/AssociateOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/AssociateOp.java new file mode 100644 index 000000000..02e7dab90 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/AssociateOp.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class AssociateOp extends GraphOp { + + public AssociateOp() { + super("associate", + List.of(UA_OPERAND, TARGET_OPERAND, ARSET_OPERAND), + List.of(UA_OPERAND, TARGET_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().associate( + (String) operands.get(UA_OPERAND), + (String) operands.get(TARGET_OPERAND), + (AccessRightSet) operands.get(ARSET_OPERAND) + ); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(UA_OPERAND), ASSOCIATE); + PrivilegeChecker.check(pap, userCtx, (String) operands.get(TARGET_OPERAND), ASSOCIATE_TO); + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateNodeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateNodeOp.java new file mode 100644 index 000000000..e6569cabc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateNodeOp.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.*; + +public abstract class CreateNodeOp extends GraphOp { + + private String ar; + + public CreateNodeOp(String name, String ar) { + super( + name, + List.of(NAME_OPERAND, DESCENDANTS_OPERAND), + List.of(DESCENDANTS_OPERAND) + ); + + this.ar = ar; + } + + public CreateNodeOp(String name, List nodeOperands, List otherOperands, String ar) { + super( + name, + nodeOperands, + otherOperands + ); + + this.ar = ar; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + Collection coll = (Collection) operands.get(DESCENDANTS_OPERAND); + for (Object o : coll) { + if (o instanceof String strColOp) { + PrivilegeChecker.check(pap, userCtx, strColOp, ar); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectAttributeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectAttributeOp.java new file mode 100644 index 000000000..b579f128f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectAttributeOp.java @@ -0,0 +1,26 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBJECT_ATTRIBUTE; + +public class CreateObjectAttributeOp extends CreateNodeOp{ + + public CreateObjectAttributeOp() { + super("create_object_attribute", CREATE_OBJECT_ATTRIBUTE); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createObjectAttribute( + (String) operands.get(NAME_OPERAND), + (Collection) operands.get(DESCENDANTS_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectOp.java new file mode 100644 index 000000000..e03a1ef28 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateObjectOp.java @@ -0,0 +1,26 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBJECT; + +public class CreateObjectOp extends CreateNodeOp{ + public CreateObjectOp() { + super("create_object", CREATE_OBJECT); + + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createObject( + (String) operands.get(NAME_OPERAND), + (Collection) operands.get(DESCENDANTS_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreatePolicyClassOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreatePolicyClassOp.java new file mode 100644 index 000000000..f43ced559 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreatePolicyClassOp.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.*; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_POLICY_CLASS; + +public class CreatePolicyClassOp extends CreateNodeOp{ + + public CreatePolicyClassOp() { + super( + "create_policy_class", + List.of(NAME_OPERAND), + List.of(), + CREATE_POLICY_CLASS + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), CREATE_POLICY_CLASS); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass( + (String) operands.get(NAME_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserAttributeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserAttributeOp.java new file mode 100644 index 000000000..c388e10f9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserAttributeOp.java @@ -0,0 +1,27 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_USER_ATTRIBUTE; + +public class CreateUserAttributeOp extends CreateNodeOp{ + public CreateUserAttributeOp() { + super("create_user_attribute", CREATE_USER_ATTRIBUTE); + + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createUserAttribute( + (String) operands.get(NAME_OPERAND), + (Collection) operands.get(DESCENDANTS_OPERAND) + ); + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserOp.java new file mode 100644 index 000000000..0bd5089bf --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/CreateUserOp.java @@ -0,0 +1,26 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_USER; + +public class CreateUserOp extends CreateNodeOp{ + public CreateUserOp() { + super("create_user", CREATE_USER); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createUser( + (String) operands.get(NAME_OPERAND), + (Collection) operands.get(DESCENDANTS_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeassignOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeassignOp.java new file mode 100644 index 000000000..9c288a048 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeassignOp.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class DeassignOp extends GraphOp { + + public DeassignOp() { + super( + "deassign", + List.of(ASCENDANT_OPERAND, DESCENDANTS_OPERAND), + List.of(ASCENDANT_OPERAND, DESCENDANTS_OPERAND) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(ASCENDANT_OPERAND), DEASSIGN); + PrivilegeChecker.check(pap, userCtx, (List) operands.get(DESCENDANTS_OPERAND), DEASSIGN_FROM); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + String asc = (String) operands.get(ASCENDANT_OPERAND); + List descs = (List) operands.get(DESCENDANTS_OPERAND); + + pap.modify().graph().deassign(asc, descs); + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteNodeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteNodeOp.java new file mode 100644 index 000000000..12e549a31 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteNodeOp.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public abstract class DeleteNodeOp extends GraphOp { + + private String reqCap; + private String descsReqCap; + + public DeleteNodeOp(String name, String reqCap, String descsReqCap) { + super( + name, + List.of(NAME_OPERAND, TYPE_OPERAND, DESCENDANTS_OPERAND), + List.of(NAME_OPERAND, DESCENDANTS_OPERAND) + ); + + this.reqCap = reqCap; + this.descsReqCap = descsReqCap; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(NAME_OPERAND), reqCap); + + Collection descs = (Collection) operands.get(DESCENDANTS_OPERAND); + for (String desc : descs) { + PrivilegeChecker.check(pap, userCtx, desc, descsReqCap); + } + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().deleteNode((String) operands.get(NAME_OPERAND)); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectAttributeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectAttributeOp.java new file mode 100644 index 000000000..4a56fd8da --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectAttributeOp.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.op.graph; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class DeleteObjectAttributeOp extends DeleteNodeOp{ + public DeleteObjectAttributeOp() { + super("delete_object_attribute", DELETE_OBJECT_ATTRIBUTE, DELETE_OBJECT_ATTRIBUTE_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectOp.java new file mode 100644 index 000000000..5ea92887e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteObjectOp.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.op.graph; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class DeleteObjectOp extends DeleteNodeOp { + public DeleteObjectOp() { + super("delete_object", DELETE_OBJECT, DELETE_OBJECT_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeletePolicyClassOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeletePolicyClassOp.java new file mode 100644 index 000000000..fa6c4b4b9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeletePolicyClassOp.java @@ -0,0 +1,11 @@ +package gov.nist.csd.pm.pap.op.graph; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_POLICY_CLASS; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_POLICY_CLASS_FROM; + +public class DeletePolicyClassOp extends DeleteNodeOp { + + public DeletePolicyClassOp() { + super("delete_policy_class", DELETE_POLICY_CLASS, DELETE_POLICY_CLASS_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserAttributeOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserAttributeOp.java new file mode 100644 index 000000000..daf1e5788 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserAttributeOp.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.op.graph; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_USER_ATTRIBUTE; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_USER_ATTRIBUTE_FROM; + +public class DeleteUserAttributeOp extends DeleteNodeOp{ + public DeleteUserAttributeOp() { + super("delete_user_attribute", DELETE_USER_ATTRIBUTE, DELETE_USER_ATTRIBUTE_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserOp.java new file mode 100644 index 000000000..fd244d4ea --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DeleteUserOp.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.op.graph; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_USER; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_USER_FROM; + +public class DeleteUserOp extends DeleteNodeOp{ + public DeleteUserOp() { + super("delete_user", DELETE_USER, DELETE_USER_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/DissociateOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/DissociateOp.java new file mode 100644 index 000000000..bfd334d30 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/DissociateOp.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class DissociateOp extends GraphOp { + + public DissociateOp() { + super("dissociate", + List.of(UA_OPERAND, TARGET_OPERAND), + List.of(UA_OPERAND, TARGET_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().dissociate( + (String) operands.get(UA_OPERAND), + (String) operands.get(TARGET_OPERAND) + ); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(UA_OPERAND), DISSOCIATE); + PrivilegeChecker.check(pap, userCtx, (String) operands.get(TARGET_OPERAND), DISSOCIATE_FROM); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/GraphOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/GraphOp.java new file mode 100644 index 000000000..49357209c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/GraphOp.java @@ -0,0 +1,29 @@ +package gov.nist.csd.pm.pap.op.graph; + +import gov.nist.csd.pm.pap.op.*; + +import java.util.List; + +public abstract class GraphOp extends Operation { + + public static final String TYPE_OPERAND = "type"; + public static final String DESCENDANTS_OPERAND = "descendants"; + public static final String PROPERTIES_OPERAND = "properties"; + public static final String ASCENDANT_OPERAND = "ascendant"; + public static final String UA_OPERAND = "ua"; + public static final String TARGET_OPERAND = "target"; + public static final String ARSET_OPERAND = "arset"; + + + public GraphOp(String name, List allOperands, List nodeOperands) { + super(name, allOperands, nodeOperands); + } + + public GraphOp(String name, List allOperands) { + super(name, allOperands); + } + + public GraphOp(String name) { + super(name); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/graph/SetNodePropertiesOp.java b/src/main/java/gov/nist/csd/pm/pap/op/graph/SetNodePropertiesOp.java new file mode 100644 index 000000000..e40b32ecb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/graph/SetNodePropertiesOp.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.op.graph; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.SET_NODE_PROPERTIES; + +public class SetNodePropertiesOp extends GraphOp { + + public SetNodePropertiesOp() { + super( + "set_node_properties", + List.of(NAME_OPERAND, PROPERTIES_OPERAND), + List.of(NAME_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().setNodeProperties( + (String) operands.get(NAME_OPERAND), + (Map) operands.get(PROPERTIES_OPERAND) + ); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get(NAME_OPERAND), SET_NODE_PROPERTIES); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/obligation/CreateObligationOp.java b/src/main/java/gov/nist/csd/pm/pap/op/obligation/CreateObligationOp.java new file mode 100644 index 000000000..67d0f8057 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/obligation/CreateObligationOp.java @@ -0,0 +1,28 @@ +package gov.nist.csd.pm.pap.op.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.obligation.Rule; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBLIGATION; + +public class CreateObligationOp extends ObligationOp { + + public CreateObligationOp() { + super("create_obligation", CREATE_OBLIGATION); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().obligations().createObligation( + (String) operands.get(AUTHOR_OPERAND), + (String) operands.get(NAME_OPERAND), + (List) operands.get(RULES_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/obligation/DeleteObligationOp.java b/src/main/java/gov/nist/csd/pm/pap/op/obligation/DeleteObligationOp.java new file mode 100644 index 000000000..5326659dc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/obligation/DeleteObligationOp.java @@ -0,0 +1,22 @@ +package gov.nist.csd.pm.pap.op.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_OBLIGATION; + +public class DeleteObligationOp extends ObligationOp { + + public DeleteObligationOp() { + super("delete_obligation", DELETE_OBLIGATION); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().obligations().deleteObligation((String) operands.get(NAME_OPERAND)); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/obligation/ObligationOp.java b/src/main/java/gov/nist/csd/pm/pap/op/obligation/ObligationOp.java new file mode 100644 index 000000000..750512f5b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/obligation/ObligationOp.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.op.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public abstract class ObligationOp extends Operation { + + public static final String AUTHOR_OPERAND = "author"; + public static final String RULES_OPERAND = "rules"; + + private String reqCap; + + public ObligationOp(String opName, String reqCap) { + super( + opName, + List.of(AUTHOR_OPERAND, NAME_OPERAND, RULES_OPERAND) + ); + + this.reqCap = reqCap; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + List rules = (List) operands.get(RULES_OPERAND); + for (Rule rule : rules) { + EventPattern eventPattern = rule.getEventPattern(); + + // check subject pattern + Pattern pattern = eventPattern.getSubjectPattern(); + checkPatternPrivileges(pap, userCtx, pattern, reqCap); + + // check operand patterns + for (Map.Entry> operandPattern : eventPattern.getOperandPatterns().entrySet()) { + for (OperandPatternExpression operandPatternExpression : operandPattern.getValue()) { + checkPatternPrivileges(pap, userCtx, operandPatternExpression, reqCap); + } + } + } + } + + static void checkPatternPrivileges(PAP pap, UserContext userCtx, Pattern pattern, String toCheck) throws PMException { + ReferencedNodes referencedNodes = pattern.getReferencedNodes(); + if (referencedNodes.isAny()) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), toCheck); + + return; + } + + for (String entity : referencedNodes.nodes()) { + PrivilegeChecker.check(pap, userCtx, entity, toCheck); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/operation/CreateAdminOperationOp.java b/src/main/java/gov/nist/csd/pm/pap/op/operation/CreateAdminOperationOp.java new file mode 100644 index 000000000..77df3a097 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/operation/CreateAdminOperationOp.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.op.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.*; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_ADMIN_OPERATION; + +public class CreateAdminOperationOp extends Operation { + + public static final String OPERATION_OPERAND = "operation"; + + public CreateAdminOperationOp() { + super( + "create_admin_operation", + List.of(OPERATION_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + Operation operation = (Operation) operands.get(OPERATION_OPERAND); + + pap.modify().operations().createAdminOperation(operation); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), CREATE_ADMIN_OPERATION); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/operation/DeleteAdminOperationOp.java b/src/main/java/gov/nist/csd/pm/pap/op/operation/DeleteAdminOperationOp.java new file mode 100644 index 000000000..924bc5ac0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/operation/DeleteAdminOperationOp.java @@ -0,0 +1,36 @@ +package gov.nist.csd.pm.pap.op.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_ADMIN_OPERATION; + +public class DeleteAdminOperationOp extends Operation { + + public DeleteAdminOperationOp() { + super( + "delete_admin_operation", + List.of(NAME_OPERAND) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), DELETE_ADMIN_OPERATION); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + String name = (String) operands.get(NAME_OPERAND); + pap.modify().operations().deleteAdminOperation(name); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/operation/SetResourceOperationsOp.java b/src/main/java/gov/nist/csd/pm/pap/op/operation/SetResourceOperationsOp.java new file mode 100644 index 000000000..d3fc28967 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/operation/SetResourceOperationsOp.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.op.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.SET_RESOURCE_OPERATIONS; + +public class SetResourceOperationsOp extends Operation { + + public static final String OPERATIONS_OPERAND = "operations"; + + public SetResourceOperationsOp() { + super( + "set_resource_operations", + List.of(OPERATIONS_OPERAND) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_RESOURCE_OPERATIONS); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().operations().setResourceOperations((AccessRightSet) operands.get(OPERATIONS_OPERAND)); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/prohibition/CreateProhibitionOp.java b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/CreateProhibitionOp.java new file mode 100644 index 000000000..1ac53516a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/CreateProhibitionOp.java @@ -0,0 +1,31 @@ +package gov.nist.csd.pm.pap.op.prohibition; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAP; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class CreateProhibitionOp extends ProhibitionOp { + + public CreateProhibitionOp() { + super("create_prohibition", CREATE_PROCESS_PROHIBITION, CREATE_PROHIBITION); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().prohibitions().createProhibition( + (String) operands.get(NAME_OPERAND), + (ProhibitionSubject) operands.get(SUBJECT_OPERAND), + (AccessRightSet) operands.get(ARSET_OPERAND), + (Boolean) operands.get(INTERSECTION_OPERAND), + (Collection) operands.get(CONTAINERS_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/prohibition/DeleteProhibitionOp.java b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/DeleteProhibitionOp.java new file mode 100644 index 000000000..f81493134 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/DeleteProhibitionOp.java @@ -0,0 +1,24 @@ +package gov.nist.csd.pm.pap.op.prohibition; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class DeleteProhibitionOp extends ProhibitionOp { + + public DeleteProhibitionOp() { + super("delete_prohibition", DELETE_PROCESS_PROHIBITION, DELETE_PROHIBITION); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().prohibitions().deleteProhibition( + (String) operands.get(NAME_OPERAND) + ); + + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/prohibition/ProhibitionOp.java b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/ProhibitionOp.java new file mode 100644 index 000000000..7103867ac --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/prohibition/ProhibitionOp.java @@ -0,0 +1,56 @@ +package gov.nist.csd.pm.pap.op.prohibition; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.*; + +public abstract class ProhibitionOp extends Operation { + + public static final String SUBJECT_OPERAND = "subject"; + public static final String ARSET_OPERAND = "arset"; + public static final String INTERSECTION_OPERAND = "intersection"; + public static final String CONTAINERS_OPERAND = "containers"; + + private String processReqCap; + private String reqCap; + + public ProhibitionOp(String opName, String processReqCap, String reqCap) { + super( + opName, + List.of(NAME_OPERAND, SUBJECT_OPERAND, ARSET_OPERAND, INTERSECTION_OPERAND, CONTAINERS_OPERAND) + ); + + this.processReqCap = processReqCap; + this.reqCap = reqCap; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + ProhibitionSubject subject = (ProhibitionSubject) operands.get(SUBJECT_OPERAND); + + if (subject.getType() == ProhibitionSubject.Type.PROCESS) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), processReqCap); + } else { + PrivilegeChecker.check(pap, userCtx, subject.getName(), reqCap); + } + + // check that the user can create a prohibition for each container in the condition + Collection containers = (Collection) operands.get(CONTAINERS_OPERAND); + for (ContainerCondition contCond : containers) { + PrivilegeChecker.check(pap, userCtx, contCond.getName(), reqCap); + + // there is another access right needed if the condition is a complement since it applies to a greater + // number of nodes + if (contCond.isComplement()) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), reqCap); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/routine/CreateAdminRoutineOp.java b/src/main/java/gov/nist/csd/pm/pap/op/routine/CreateAdminRoutineOp.java new file mode 100644 index 000000000..ed8ec28fd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/routine/CreateAdminRoutineOp.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.pap.op.routine; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_ADMIN_ROUTINE; + +public class CreateAdminRoutineOp extends Operation { + + public static final String ROUTINE_OPERAND = "routine"; + + public CreateAdminRoutineOp() { + super( + "create_admin_routine", + List.of(ROUTINE_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + Routine routine = (Routine) operands.get(ROUTINE_OPERAND); + + pap.modify().routines().createAdminRoutine(routine); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), CREATE_ADMIN_ROUTINE); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/op/routine/DeleteAdminRoutineOp.java b/src/main/java/gov/nist/csd/pm/pap/op/routine/DeleteAdminRoutineOp.java new file mode 100644 index 000000000..85eadc945 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/op/routine/DeleteAdminRoutineOp.java @@ -0,0 +1,37 @@ +package gov.nist.csd.pm.pap.op.routine; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.DELETE_ADMIN_ROUTINE; + +public class DeleteAdminRoutineOp extends Operation { + + public DeleteAdminRoutineOp() { + super( + "create_admin_routine", + List.of(NAME_OPERAND) + ); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + String name = (String) operands.get(NAME_OPERAND); + + pap.modify().routines().deleteAdminRoutine(name); + + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), DELETE_ADMIN_ROUTINE); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/CompiledPML.java b/src/main/java/gov/nist/csd/pm/pap/pml/CompiledPML.java new file mode 100644 index 000000000..496e1336a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/CompiledPML.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public record CompiledPML(Map executables, List stmts) { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/PMLCompiler.java b/src/main/java/gov/nist/csd/pm/pap/pml/PMLCompiler.java new file mode 100644 index 000000000..8f8524d9e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/PMLCompiler.java @@ -0,0 +1,125 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.antlr.PMLLexer; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.compiler.error.ErrorLog; +import gov.nist.csd.pm.pap.pml.compiler.visitor.PMLVisitor; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationWrapper; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineWrapper; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLStmtsRoutine; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.routine.Routine; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +import java.util.*; + +public class PMLCompiler { + + protected Map executableSignatures; + protected Map constantVariables; + + public PMLCompiler() { + executableSignatures = new HashMap<>(); + constantVariables = new HashMap<>(); + } + + public PMLCompiler(PAP pap) throws PMException { + executableSignatures = new HashMap<>(); + constantVariables = new HashMap<>(); + + Map operations = pap.getPMLOperations(); + for (PMLOperation operation : operations.values()) { + this.executableSignatures.put(operation.getName(), operation.getSignature()); + } + + Map routines = pap.getPMLRoutines(); + for (PMLRoutine routine : routines.values()) { + this.executableSignatures.put(routine.getName(), routine.getSignature()); + } + + Map constants = pap.getPMLConstants(); + for (Map.Entry constant : constants.entrySet()) { + this.constantVariables.put(constant.getKey(), + new Variable(constant.getKey(), constant.getValue().getType(), true)); + } + + Collection opNames = pap.query().operations().getAdminOperationNames(); + for (String opName : opNames) { + Operation operation = pap.query().operations().getAdminOperation(opName); + if (operation instanceof PMLStmtsOperation pmlStmtsOperation) { + this.executableSignatures.put(pmlStmtsOperation.getName(), pmlStmtsOperation.getSignature()); + } else { + this.executableSignatures.put(opName, new PMLOperationWrapper(operation).getSignature()); + } + } + + Collection routineNames = pap.query().routines().getAdminRoutineNames(); + for (String routineName : routineNames) { + Routine routine = pap.query().routines().getAdminRoutine(routineName); + if (routine instanceof PMLStmtsRoutine pmlStmtsRoutine) { + this.executableSignatures.put(routine.getName(), pmlStmtsRoutine.getSignature()); + } else { + this.executableSignatures.put(routineName, new PMLRoutineWrapper(routine).getSignature()); + } + } + } + + public Map getExecutableSignatures() { + return executableSignatures; + } + + public Map getConstantVariables() { + return constantVariables; + } + + public List compilePML(String input) throws PMException { + ErrorLog errorLog = new ErrorLog(); + + GlobalScope globalScope = new CompileGlobalScope(); + globalScope.addExecutables(executableSignatures); + globalScope.addConstants(constantVariables); + + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + // check for syntax errors + PMLVisitor pmlVisitor = new PMLVisitor(new VisitorContext(tokens, new Scope<>(globalScope), errorLog, pmlErrorHandler)); + PMLParser.PmlContext pmlCtx = parser.pml(); + if (!pmlErrorHandler.getErrors().isEmpty()) { + throw new PMLCompilationException(pmlErrorHandler.getErrors()); + } + + // compile + List compiled = pmlVisitor.visitPml(pmlCtx); + + // check for errors encountered during compilation + if (!errorLog.getErrors().isEmpty()) { + throw new PMLCompilationException(errorLog.getErrors()); + } + + return compiled; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/PMLErrorHandler.java b/src/main/java/gov/nist/csd/pm/pap/pml/PMLErrorHandler.java new file mode 100644 index 000000000..5a417fe25 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/PMLErrorHandler.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.pml.compiler.Position; +import gov.nist.csd.pm.pap.pml.compiler.error.CompileError; +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; + +import java.util.ArrayList; +import java.util.List; + +public class PMLErrorHandler extends BaseErrorListener { + + private final List errors = new ArrayList<>(); + + public List getErrors() { + return errors; + } + + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, + String msg, RecognitionException e) { + errors.add(new CompileError(new Position(line, charPositionInLine, 0), msg)); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.g4 b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.g4 new file mode 100644 index 000000000..3b8d69419 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.g4 @@ -0,0 +1,176 @@ +lexer grammar PMLLexer; + +OPERATION: 'operation'; +NODEOP: 'nodeop'; +CHECK: 'check'; +ROUTINE: 'routine'; + +CREATE : 'create' ; +DELETE : 'delete' ; + +// obligation keywords +POLICY_ELEMENT: 'policy element' | 'pe' ; +CONTAINED: 'contained'; +RULE: 'rule' ; +WHEN: 'when' ; +PERFORMS: 'performs' ; +AS: 'as' ; +ON: 'on' ; +IN: 'in' ; +DO: 'do' ; +ANY: 'any'; +ASCENDANT_OF: 'ascendant of' ; + +INTERSECTION: 'intersection' | 'inter'; +UNION: 'union' ; +PROCESS: 'process'; + +SET_RESOURCE_OPERATIONS: 'set resource operations'; +ASSIGN: 'assign' ; +DEASSIGN: 'deassign' ; +FROM: 'from' ; +SET_PROPERTIES: 'set properties' ; +WITH_PROPERTIES: 'with properties' ; +OF: 'of' ; +TO: 'to' ; +ASSOCIATE: 'associate' ; +AND: 'and' ; +WITH: 'with' ; +DISSOCIATE: 'dissociate' ; +DENY: 'deny'; +PROHIBITION: 'prohibition'; +OBLIGATION: 'obligation'; +ACCESS_RIGHTS: 'access rights' ; + +POLICY_CLASS: 'policy class' | 'pc' | 'PC' ; +OBJECT_ATTRIBUTE: 'object attribute' | 'oa' | 'OA' ; +USER_ATTRIBUTE: 'user attribute' | 'ua' | 'UA' ; +USER_ATTRIBUTES: 'user attributes' | 'uas' | 'UAs' ; +OBJECT_ATTRIBUTES: 'object attributes' | 'oas' | 'OAs' ; +OBJECT: 'object' | 'o' | 'O' ; +USER: 'user' | 'u' | 'U' ; +ATTRIBUTE: 'attribute'; +ASSOCIATIONS: 'associations' ; + +// Keywords + +BREAK : 'break'; +DEFAULT : 'default'; +MAP : 'map'; +ELSE : 'else'; +CONST : 'const'; +IF : 'if'; +RANGE : 'range'; +CONTINUE : 'continue'; +FOREACH : 'foreach'; +RETURN : 'return'; +VAR : 'var'; +STRING_TYPE : 'string' ; +BOOL_TYPE : 'bool' ; +VOID_TYPE : 'void' ; +ARRAY_TYPE : 'array' ; + +NIL_LIT : 'nil'; + +// boolean literals +TRUE: 'true'; +FALSE: 'false'; + + +ID : [a-zA-Z0-9_]+; + +// Punctuation + +OPEN_PAREN : '('; +CLOSE_PAREN : ')'; +OPEN_CURLY : '{'; +CLOSE_CURLY : '}'; +OPEN_BRACKET : '['; +CLOSE_BRACKET : ']'; +ASSIGN_EQUALS : '='; +COMMA : ','; +SEMI : ';'; +COLON : ':'; +DOT : '.'; +DECLARE_ASSIGN : ':='; + +// Logical + +LOGICAL_OR : '||'; +LOGICAL_AND : '&&'; + +// Relation operators + +EQUALS : '=='; +NOT_EQUALS : '!='; + +// Unary operators + +EXCLAMATION : '!'; + +// Mixed operators + +PLUS : '+'; + +// String literals + +DOUBLE_QUOTE_STRING : '"' (~["\\\r\n] | EscapeSequence)* '"'; + +// Hidden tokens +// WS: [ \t]+ -> channel(HIDDEN); +// NL: [\r\n]+ -> channel(HIDDEN); +WS: [ \t\r\n\u000C]+ -> channel(HIDDEN); + +COMMENT: '/*' .*? '*/' -> channel(HIDDEN); +LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN); + + +fragment EscapeSequence + : '\\' [btnfr"'\\] + | '\\' ([0-3]? [0-7])? [0-7] + | '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit + ; + +fragment HexDigits + : HexDigit ((HexDigit | '_')* HexDigit)? + ; + +fragment HexDigit + : [0-9a-fA-F] + ; + +/* + [The "BSD licence"] + Copyright (c) 2017 Sasa Coh, Michał Błotniak + Copyright (c) 2019 Ivan Kochurkin, kvanttt@gmail.com, Positive Technologies + Copyright (c) 2019 Dmitry Rassadin, flipparassa@gmail.com, Positive Technologies + Copyright (c) 2021 Martin Mirchev, mirchevmartin2203@gmail.com + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + * A Go grammar for ANTLR 4 derived from the Go Language Specification + * https://golang.org/ref/spec + */ \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.interp b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.interp new file mode 100644 index 000000000..c73cba751 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.interp @@ -0,0 +1,278 @@ +token literal names: +null +'operation' +'nodeop' +'check' +'routine' +'create' +'delete' +null +'contained' +'rule' +'when' +'performs' +'as' +'on' +'in' +'do' +'any' +'ascendant of' +null +'union' +'process' +'set resource operations' +'assign' +'deassign' +'from' +'set properties' +'with properties' +'of' +'to' +'associate' +'and' +'with' +'dissociate' +'deny' +'prohibition' +'obligation' +'access rights' +null +null +null +null +null +null +null +'attribute' +'associations' +'break' +'default' +'map' +'else' +'const' +'if' +'range' +'continue' +'foreach' +'return' +'var' +'string' +'bool' +'void' +'array' +'nil' +'true' +'false' +null +'(' +')' +'{' +'}' +'[' +']' +'=' +',' +';' +':' +'.' +':=' +'||' +'&&' +'==' +'!=' +'!' +'+' +null +null +null +null + +token symbolic names: +null +OPERATION +NODEOP +CHECK +ROUTINE +CREATE +DELETE +POLICY_ELEMENT +CONTAINED +RULE +WHEN +PERFORMS +AS +ON +IN +DO +ANY +ASCENDANT_OF +INTERSECTION +UNION +PROCESS +SET_RESOURCE_OPERATIONS +ASSIGN +DEASSIGN +FROM +SET_PROPERTIES +WITH_PROPERTIES +OF +TO +ASSOCIATE +AND +WITH +DISSOCIATE +DENY +PROHIBITION +OBLIGATION +ACCESS_RIGHTS +POLICY_CLASS +OBJECT_ATTRIBUTE +USER_ATTRIBUTE +USER_ATTRIBUTES +OBJECT_ATTRIBUTES +OBJECT +USER +ATTRIBUTE +ASSOCIATIONS +BREAK +DEFAULT +MAP +ELSE +CONST +IF +RANGE +CONTINUE +FOREACH +RETURN +VAR +STRING_TYPE +BOOL_TYPE +VOID_TYPE +ARRAY_TYPE +NIL_LIT +TRUE +FALSE +ID +OPEN_PAREN +CLOSE_PAREN +OPEN_CURLY +CLOSE_CURLY +OPEN_BRACKET +CLOSE_BRACKET +ASSIGN_EQUALS +COMMA +SEMI +COLON +DOT +DECLARE_ASSIGN +LOGICAL_OR +LOGICAL_AND +EQUALS +NOT_EQUALS +EXCLAMATION +PLUS +DOUBLE_QUOTE_STRING +WS +COMMENT +LINE_COMMENT + +rule names: +OPERATION +NODEOP +CHECK +ROUTINE +CREATE +DELETE +POLICY_ELEMENT +CONTAINED +RULE +WHEN +PERFORMS +AS +ON +IN +DO +ANY +ASCENDANT_OF +INTERSECTION +UNION +PROCESS +SET_RESOURCE_OPERATIONS +ASSIGN +DEASSIGN +FROM +SET_PROPERTIES +WITH_PROPERTIES +OF +TO +ASSOCIATE +AND +WITH +DISSOCIATE +DENY +PROHIBITION +OBLIGATION +ACCESS_RIGHTS +POLICY_CLASS +OBJECT_ATTRIBUTE +USER_ATTRIBUTE +USER_ATTRIBUTES +OBJECT_ATTRIBUTES +OBJECT +USER +ATTRIBUTE +ASSOCIATIONS +BREAK +DEFAULT +MAP +ELSE +CONST +IF +RANGE +CONTINUE +FOREACH +RETURN +VAR +STRING_TYPE +BOOL_TYPE +VOID_TYPE +ARRAY_TYPE +NIL_LIT +TRUE +FALSE +ID +OPEN_PAREN +CLOSE_PAREN +OPEN_CURLY +CLOSE_CURLY +OPEN_BRACKET +CLOSE_BRACKET +ASSIGN_EQUALS +COMMA +SEMI +COLON +DOT +DECLARE_ASSIGN +LOGICAL_OR +LOGICAL_AND +EQUALS +NOT_EQUALS +EXCLAMATION +PLUS +DOUBLE_QUOTE_STRING +WS +COMMENT +LINE_COMMENT +EscapeSequence +HexDigits +HexDigit + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 86, 862, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 241, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 318, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 504, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 526, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 546, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 569, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 594, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 603, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 610, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 4, 63, 740, 8, 63, 11, 63, 12, 63, 741, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 5, 82, 788, 8, 82, 10, 82, 12, 82, 791, 9, 82, 1, 82, 1, 82, 1, 83, 4, 83, 796, 8, 83, 11, 83, 12, 83, 797, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 5, 84, 806, 8, 84, 10, 84, 12, 84, 809, 9, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 5, 85, 820, 8, 85, 10, 85, 12, 85, 823, 9, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 831, 8, 86, 1, 86, 3, 86, 834, 8, 86, 1, 86, 1, 86, 1, 86, 4, 86, 839, 8, 86, 11, 86, 12, 86, 840, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 848, 8, 86, 1, 87, 1, 87, 1, 87, 5, 87, 853, 8, 87, 10, 87, 12, 87, 856, 9, 87, 1, 87, 3, 87, 859, 8, 87, 1, 88, 1, 88, 1, 807, 0, 89, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 0, 175, 0, 177, 0, 1, 0, 10, 2, 0, 79, 79, 111, 111, 2, 0, 85, 85, 117, 117, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 8, 0, 34, 34, 39, 39, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 1, 0, 48, 51, 1, 0, 48, 55, 3, 0, 48, 57, 65, 70, 97, 102, 886, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 1, 179, 1, 0, 0, 0, 3, 189, 1, 0, 0, 0, 5, 196, 1, 0, 0, 0, 7, 202, 1, 0, 0, 0, 9, 210, 1, 0, 0, 0, 11, 217, 1, 0, 0, 0, 13, 240, 1, 0, 0, 0, 15, 242, 1, 0, 0, 0, 17, 252, 1, 0, 0, 0, 19, 257, 1, 0, 0, 0, 21, 262, 1, 0, 0, 0, 23, 271, 1, 0, 0, 0, 25, 274, 1, 0, 0, 0, 27, 277, 1, 0, 0, 0, 29, 280, 1, 0, 0, 0, 31, 283, 1, 0, 0, 0, 33, 287, 1, 0, 0, 0, 35, 317, 1, 0, 0, 0, 37, 319, 1, 0, 0, 0, 39, 325, 1, 0, 0, 0, 41, 333, 1, 0, 0, 0, 43, 357, 1, 0, 0, 0, 45, 364, 1, 0, 0, 0, 47, 373, 1, 0, 0, 0, 49, 378, 1, 0, 0, 0, 51, 393, 1, 0, 0, 0, 53, 409, 1, 0, 0, 0, 55, 412, 1, 0, 0, 0, 57, 415, 1, 0, 0, 0, 59, 425, 1, 0, 0, 0, 61, 429, 1, 0, 0, 0, 63, 434, 1, 0, 0, 0, 65, 445, 1, 0, 0, 0, 67, 450, 1, 0, 0, 0, 69, 462, 1, 0, 0, 0, 71, 473, 1, 0, 0, 0, 73, 503, 1, 0, 0, 0, 75, 525, 1, 0, 0, 0, 77, 545, 1, 0, 0, 0, 79, 568, 1, 0, 0, 0, 81, 593, 1, 0, 0, 0, 83, 602, 1, 0, 0, 0, 85, 609, 1, 0, 0, 0, 87, 611, 1, 0, 0, 0, 89, 621, 1, 0, 0, 0, 91, 634, 1, 0, 0, 0, 93, 640, 1, 0, 0, 0, 95, 648, 1, 0, 0, 0, 97, 652, 1, 0, 0, 0, 99, 657, 1, 0, 0, 0, 101, 663, 1, 0, 0, 0, 103, 666, 1, 0, 0, 0, 105, 672, 1, 0, 0, 0, 107, 681, 1, 0, 0, 0, 109, 689, 1, 0, 0, 0, 111, 696, 1, 0, 0, 0, 113, 700, 1, 0, 0, 0, 115, 707, 1, 0, 0, 0, 117, 712, 1, 0, 0, 0, 119, 717, 1, 0, 0, 0, 121, 723, 1, 0, 0, 0, 123, 727, 1, 0, 0, 0, 125, 732, 1, 0, 0, 0, 127, 739, 1, 0, 0, 0, 129, 743, 1, 0, 0, 0, 131, 745, 1, 0, 0, 0, 133, 747, 1, 0, 0, 0, 135, 749, 1, 0, 0, 0, 137, 751, 1, 0, 0, 0, 139, 753, 1, 0, 0, 0, 141, 755, 1, 0, 0, 0, 143, 757, 1, 0, 0, 0, 145, 759, 1, 0, 0, 0, 147, 761, 1, 0, 0, 0, 149, 763, 1, 0, 0, 0, 151, 765, 1, 0, 0, 0, 153, 768, 1, 0, 0, 0, 155, 771, 1, 0, 0, 0, 157, 774, 1, 0, 0, 0, 159, 777, 1, 0, 0, 0, 161, 780, 1, 0, 0, 0, 163, 782, 1, 0, 0, 0, 165, 784, 1, 0, 0, 0, 167, 795, 1, 0, 0, 0, 169, 801, 1, 0, 0, 0, 171, 815, 1, 0, 0, 0, 173, 847, 1, 0, 0, 0, 175, 849, 1, 0, 0, 0, 177, 860, 1, 0, 0, 0, 179, 180, 5, 111, 0, 0, 180, 181, 5, 112, 0, 0, 181, 182, 5, 101, 0, 0, 182, 183, 5, 114, 0, 0, 183, 184, 5, 97, 0, 0, 184, 185, 5, 116, 0, 0, 185, 186, 5, 105, 0, 0, 186, 187, 5, 111, 0, 0, 187, 188, 5, 110, 0, 0, 188, 2, 1, 0, 0, 0, 189, 190, 5, 110, 0, 0, 190, 191, 5, 111, 0, 0, 191, 192, 5, 100, 0, 0, 192, 193, 5, 101, 0, 0, 193, 194, 5, 111, 0, 0, 194, 195, 5, 112, 0, 0, 195, 4, 1, 0, 0, 0, 196, 197, 5, 99, 0, 0, 197, 198, 5, 104, 0, 0, 198, 199, 5, 101, 0, 0, 199, 200, 5, 99, 0, 0, 200, 201, 5, 107, 0, 0, 201, 6, 1, 0, 0, 0, 202, 203, 5, 114, 0, 0, 203, 204, 5, 111, 0, 0, 204, 205, 5, 117, 0, 0, 205, 206, 5, 116, 0, 0, 206, 207, 5, 105, 0, 0, 207, 208, 5, 110, 0, 0, 208, 209, 5, 101, 0, 0, 209, 8, 1, 0, 0, 0, 210, 211, 5, 99, 0, 0, 211, 212, 5, 114, 0, 0, 212, 213, 5, 101, 0, 0, 213, 214, 5, 97, 0, 0, 214, 215, 5, 116, 0, 0, 215, 216, 5, 101, 0, 0, 216, 10, 1, 0, 0, 0, 217, 218, 5, 100, 0, 0, 218, 219, 5, 101, 0, 0, 219, 220, 5, 108, 0, 0, 220, 221, 5, 101, 0, 0, 221, 222, 5, 116, 0, 0, 222, 223, 5, 101, 0, 0, 223, 12, 1, 0, 0, 0, 224, 225, 5, 112, 0, 0, 225, 226, 5, 111, 0, 0, 226, 227, 5, 108, 0, 0, 227, 228, 5, 105, 0, 0, 228, 229, 5, 99, 0, 0, 229, 230, 5, 121, 0, 0, 230, 231, 5, 32, 0, 0, 231, 232, 5, 101, 0, 0, 232, 233, 5, 108, 0, 0, 233, 234, 5, 101, 0, 0, 234, 235, 5, 109, 0, 0, 235, 236, 5, 101, 0, 0, 236, 237, 5, 110, 0, 0, 237, 241, 5, 116, 0, 0, 238, 239, 5, 112, 0, 0, 239, 241, 5, 101, 0, 0, 240, 224, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 241, 14, 1, 0, 0, 0, 242, 243, 5, 99, 0, 0, 243, 244, 5, 111, 0, 0, 244, 245, 5, 110, 0, 0, 245, 246, 5, 116, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 110, 0, 0, 249, 250, 5, 101, 0, 0, 250, 251, 5, 100, 0, 0, 251, 16, 1, 0, 0, 0, 252, 253, 5, 114, 0, 0, 253, 254, 5, 117, 0, 0, 254, 255, 5, 108, 0, 0, 255, 256, 5, 101, 0, 0, 256, 18, 1, 0, 0, 0, 257, 258, 5, 119, 0, 0, 258, 259, 5, 104, 0, 0, 259, 260, 5, 101, 0, 0, 260, 261, 5, 110, 0, 0, 261, 20, 1, 0, 0, 0, 262, 263, 5, 112, 0, 0, 263, 264, 5, 101, 0, 0, 264, 265, 5, 114, 0, 0, 265, 266, 5, 102, 0, 0, 266, 267, 5, 111, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 109, 0, 0, 269, 270, 5, 115, 0, 0, 270, 22, 1, 0, 0, 0, 271, 272, 5, 97, 0, 0, 272, 273, 5, 115, 0, 0, 273, 24, 1, 0, 0, 0, 274, 275, 5, 111, 0, 0, 275, 276, 5, 110, 0, 0, 276, 26, 1, 0, 0, 0, 277, 278, 5, 105, 0, 0, 278, 279, 5, 110, 0, 0, 279, 28, 1, 0, 0, 0, 280, 281, 5, 100, 0, 0, 281, 282, 5, 111, 0, 0, 282, 30, 1, 0, 0, 0, 283, 284, 5, 97, 0, 0, 284, 285, 5, 110, 0, 0, 285, 286, 5, 121, 0, 0, 286, 32, 1, 0, 0, 0, 287, 288, 5, 97, 0, 0, 288, 289, 5, 115, 0, 0, 289, 290, 5, 99, 0, 0, 290, 291, 5, 101, 0, 0, 291, 292, 5, 110, 0, 0, 292, 293, 5, 100, 0, 0, 293, 294, 5, 97, 0, 0, 294, 295, 5, 110, 0, 0, 295, 296, 5, 116, 0, 0, 296, 297, 5, 32, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 102, 0, 0, 299, 34, 1, 0, 0, 0, 300, 301, 5, 105, 0, 0, 301, 302, 5, 110, 0, 0, 302, 303, 5, 116, 0, 0, 303, 304, 5, 101, 0, 0, 304, 305, 5, 114, 0, 0, 305, 306, 5, 115, 0, 0, 306, 307, 5, 101, 0, 0, 307, 308, 5, 99, 0, 0, 308, 309, 5, 116, 0, 0, 309, 310, 5, 105, 0, 0, 310, 311, 5, 111, 0, 0, 311, 318, 5, 110, 0, 0, 312, 313, 5, 105, 0, 0, 313, 314, 5, 110, 0, 0, 314, 315, 5, 116, 0, 0, 315, 316, 5, 101, 0, 0, 316, 318, 5, 114, 0, 0, 317, 300, 1, 0, 0, 0, 317, 312, 1, 0, 0, 0, 318, 36, 1, 0, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 110, 0, 0, 321, 322, 5, 105, 0, 0, 322, 323, 5, 111, 0, 0, 323, 324, 5, 110, 0, 0, 324, 38, 1, 0, 0, 0, 325, 326, 5, 112, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 101, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 115, 0, 0, 332, 40, 1, 0, 0, 0, 333, 334, 5, 115, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 116, 0, 0, 336, 337, 5, 32, 0, 0, 337, 338, 5, 114, 0, 0, 338, 339, 5, 101, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 111, 0, 0, 341, 342, 5, 117, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 99, 0, 0, 344, 345, 5, 101, 0, 0, 345, 346, 5, 32, 0, 0, 346, 347, 5, 111, 0, 0, 347, 348, 5, 112, 0, 0, 348, 349, 5, 101, 0, 0, 349, 350, 5, 114, 0, 0, 350, 351, 5, 97, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 105, 0, 0, 353, 354, 5, 111, 0, 0, 354, 355, 5, 110, 0, 0, 355, 356, 5, 115, 0, 0, 356, 42, 1, 0, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 115, 0, 0, 359, 360, 5, 115, 0, 0, 360, 361, 5, 105, 0, 0, 361, 362, 5, 103, 0, 0, 362, 363, 5, 110, 0, 0, 363, 44, 1, 0, 0, 0, 364, 365, 5, 100, 0, 0, 365, 366, 5, 101, 0, 0, 366, 367, 5, 97, 0, 0, 367, 368, 5, 115, 0, 0, 368, 369, 5, 115, 0, 0, 369, 370, 5, 105, 0, 0, 370, 371, 5, 103, 0, 0, 371, 372, 5, 110, 0, 0, 372, 46, 1, 0, 0, 0, 373, 374, 5, 102, 0, 0, 374, 375, 5, 114, 0, 0, 375, 376, 5, 111, 0, 0, 376, 377, 5, 109, 0, 0, 377, 48, 1, 0, 0, 0, 378, 379, 5, 115, 0, 0, 379, 380, 5, 101, 0, 0, 380, 381, 5, 116, 0, 0, 381, 382, 5, 32, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 114, 0, 0, 384, 385, 5, 111, 0, 0, 385, 386, 5, 112, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 116, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 101, 0, 0, 391, 392, 5, 115, 0, 0, 392, 50, 1, 0, 0, 0, 393, 394, 5, 119, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 116, 0, 0, 396, 397, 5, 104, 0, 0, 397, 398, 5, 32, 0, 0, 398, 399, 5, 112, 0, 0, 399, 400, 5, 114, 0, 0, 400, 401, 5, 111, 0, 0, 401, 402, 5, 112, 0, 0, 402, 403, 5, 101, 0, 0, 403, 404, 5, 114, 0, 0, 404, 405, 5, 116, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 101, 0, 0, 407, 408, 5, 115, 0, 0, 408, 52, 1, 0, 0, 0, 409, 410, 5, 111, 0, 0, 410, 411, 5, 102, 0, 0, 411, 54, 1, 0, 0, 0, 412, 413, 5, 116, 0, 0, 413, 414, 5, 111, 0, 0, 414, 56, 1, 0, 0, 0, 415, 416, 5, 97, 0, 0, 416, 417, 5, 115, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 99, 0, 0, 420, 421, 5, 105, 0, 0, 421, 422, 5, 97, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 101, 0, 0, 424, 58, 1, 0, 0, 0, 425, 426, 5, 97, 0, 0, 426, 427, 5, 110, 0, 0, 427, 428, 5, 100, 0, 0, 428, 60, 1, 0, 0, 0, 429, 430, 5, 119, 0, 0, 430, 431, 5, 105, 0, 0, 431, 432, 5, 116, 0, 0, 432, 433, 5, 104, 0, 0, 433, 62, 1, 0, 0, 0, 434, 435, 5, 100, 0, 0, 435, 436, 5, 105, 0, 0, 436, 437, 5, 115, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 99, 0, 0, 440, 441, 5, 105, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 116, 0, 0, 443, 444, 5, 101, 0, 0, 444, 64, 1, 0, 0, 0, 445, 446, 5, 100, 0, 0, 446, 447, 5, 101, 0, 0, 447, 448, 5, 110, 0, 0, 448, 449, 5, 121, 0, 0, 449, 66, 1, 0, 0, 0, 450, 451, 5, 112, 0, 0, 451, 452, 5, 114, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 104, 0, 0, 454, 455, 5, 105, 0, 0, 455, 456, 5, 98, 0, 0, 456, 457, 5, 105, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 110, 0, 0, 461, 68, 1, 0, 0, 0, 462, 463, 5, 111, 0, 0, 463, 464, 5, 98, 0, 0, 464, 465, 5, 108, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 103, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 116, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 111, 0, 0, 471, 472, 5, 110, 0, 0, 472, 70, 1, 0, 0, 0, 473, 474, 5, 97, 0, 0, 474, 475, 5, 99, 0, 0, 475, 476, 5, 99, 0, 0, 476, 477, 5, 101, 0, 0, 477, 478, 5, 115, 0, 0, 478, 479, 5, 115, 0, 0, 479, 480, 5, 32, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 105, 0, 0, 482, 483, 5, 103, 0, 0, 483, 484, 5, 104, 0, 0, 484, 485, 5, 116, 0, 0, 485, 486, 5, 115, 0, 0, 486, 72, 1, 0, 0, 0, 487, 488, 5, 112, 0, 0, 488, 489, 5, 111, 0, 0, 489, 490, 5, 108, 0, 0, 490, 491, 5, 105, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 121, 0, 0, 493, 494, 5, 32, 0, 0, 494, 495, 5, 99, 0, 0, 495, 496, 5, 108, 0, 0, 496, 497, 5, 97, 0, 0, 497, 498, 5, 115, 0, 0, 498, 504, 5, 115, 0, 0, 499, 500, 5, 112, 0, 0, 500, 504, 5, 99, 0, 0, 501, 502, 5, 80, 0, 0, 502, 504, 5, 67, 0, 0, 503, 487, 1, 0, 0, 0, 503, 499, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 74, 1, 0, 0, 0, 505, 506, 5, 111, 0, 0, 506, 507, 5, 98, 0, 0, 507, 508, 5, 106, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 99, 0, 0, 510, 511, 5, 116, 0, 0, 511, 512, 5, 32, 0, 0, 512, 513, 5, 97, 0, 0, 513, 514, 5, 116, 0, 0, 514, 515, 5, 116, 0, 0, 515, 516, 5, 114, 0, 0, 516, 517, 5, 105, 0, 0, 517, 518, 5, 98, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 116, 0, 0, 520, 526, 5, 101, 0, 0, 521, 522, 5, 111, 0, 0, 522, 526, 5, 97, 0, 0, 523, 524, 5, 79, 0, 0, 524, 526, 5, 65, 0, 0, 525, 505, 1, 0, 0, 0, 525, 521, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 526, 76, 1, 0, 0, 0, 527, 528, 5, 117, 0, 0, 528, 529, 5, 115, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 32, 0, 0, 532, 533, 5, 97, 0, 0, 533, 534, 5, 116, 0, 0, 534, 535, 5, 116, 0, 0, 535, 536, 5, 114, 0, 0, 536, 537, 5, 105, 0, 0, 537, 538, 5, 98, 0, 0, 538, 539, 5, 117, 0, 0, 539, 540, 5, 116, 0, 0, 540, 546, 5, 101, 0, 0, 541, 542, 5, 117, 0, 0, 542, 546, 5, 97, 0, 0, 543, 544, 5, 85, 0, 0, 544, 546, 5, 65, 0, 0, 545, 527, 1, 0, 0, 0, 545, 541, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 546, 78, 1, 0, 0, 0, 547, 548, 5, 117, 0, 0, 548, 549, 5, 115, 0, 0, 549, 550, 5, 101, 0, 0, 550, 551, 5, 114, 0, 0, 551, 552, 5, 32, 0, 0, 552, 553, 5, 97, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 116, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 105, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 117, 0, 0, 559, 560, 5, 116, 0, 0, 560, 561, 5, 101, 0, 0, 561, 569, 5, 115, 0, 0, 562, 563, 5, 117, 0, 0, 563, 564, 5, 97, 0, 0, 564, 569, 5, 115, 0, 0, 565, 566, 5, 85, 0, 0, 566, 567, 5, 65, 0, 0, 567, 569, 5, 115, 0, 0, 568, 547, 1, 0, 0, 0, 568, 562, 1, 0, 0, 0, 568, 565, 1, 0, 0, 0, 569, 80, 1, 0, 0, 0, 570, 571, 5, 111, 0, 0, 571, 572, 5, 98, 0, 0, 572, 573, 5, 106, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 116, 0, 0, 576, 577, 5, 32, 0, 0, 577, 578, 5, 97, 0, 0, 578, 579, 5, 116, 0, 0, 579, 580, 5, 116, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 105, 0, 0, 582, 583, 5, 98, 0, 0, 583, 584, 5, 117, 0, 0, 584, 585, 5, 116, 0, 0, 585, 586, 5, 101, 0, 0, 586, 594, 5, 115, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 97, 0, 0, 589, 594, 5, 115, 0, 0, 590, 591, 5, 79, 0, 0, 591, 592, 5, 65, 0, 0, 592, 594, 5, 115, 0, 0, 593, 570, 1, 0, 0, 0, 593, 587, 1, 0, 0, 0, 593, 590, 1, 0, 0, 0, 594, 82, 1, 0, 0, 0, 595, 596, 5, 111, 0, 0, 596, 597, 5, 98, 0, 0, 597, 598, 5, 106, 0, 0, 598, 599, 5, 101, 0, 0, 599, 600, 5, 99, 0, 0, 600, 603, 5, 116, 0, 0, 601, 603, 7, 0, 0, 0, 602, 595, 1, 0, 0, 0, 602, 601, 1, 0, 0, 0, 603, 84, 1, 0, 0, 0, 604, 605, 5, 117, 0, 0, 605, 606, 5, 115, 0, 0, 606, 607, 5, 101, 0, 0, 607, 610, 5, 114, 0, 0, 608, 610, 7, 1, 0, 0, 609, 604, 1, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 86, 1, 0, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 116, 0, 0, 613, 614, 5, 116, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 105, 0, 0, 616, 617, 5, 98, 0, 0, 617, 618, 5, 117, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 101, 0, 0, 620, 88, 1, 0, 0, 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 115, 0, 0, 623, 624, 5, 115, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 105, 0, 0, 627, 628, 5, 97, 0, 0, 628, 629, 5, 116, 0, 0, 629, 630, 5, 105, 0, 0, 630, 631, 5, 111, 0, 0, 631, 632, 5, 110, 0, 0, 632, 633, 5, 115, 0, 0, 633, 90, 1, 0, 0, 0, 634, 635, 5, 98, 0, 0, 635, 636, 5, 114, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 97, 0, 0, 638, 639, 5, 107, 0, 0, 639, 92, 1, 0, 0, 0, 640, 641, 5, 100, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 102, 0, 0, 643, 644, 5, 97, 0, 0, 644, 645, 5, 117, 0, 0, 645, 646, 5, 108, 0, 0, 646, 647, 5, 116, 0, 0, 647, 94, 1, 0, 0, 0, 648, 649, 5, 109, 0, 0, 649, 650, 5, 97, 0, 0, 650, 651, 5, 112, 0, 0, 651, 96, 1, 0, 0, 0, 652, 653, 5, 101, 0, 0, 653, 654, 5, 108, 0, 0, 654, 655, 5, 115, 0, 0, 655, 656, 5, 101, 0, 0, 656, 98, 1, 0, 0, 0, 657, 658, 5, 99, 0, 0, 658, 659, 5, 111, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 115, 0, 0, 661, 662, 5, 116, 0, 0, 662, 100, 1, 0, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 102, 0, 0, 665, 102, 1, 0, 0, 0, 666, 667, 5, 114, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 110, 0, 0, 669, 670, 5, 103, 0, 0, 670, 671, 5, 101, 0, 0, 671, 104, 1, 0, 0, 0, 672, 673, 5, 99, 0, 0, 673, 674, 5, 111, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 116, 0, 0, 676, 677, 5, 105, 0, 0, 677, 678, 5, 110, 0, 0, 678, 679, 5, 117, 0, 0, 679, 680, 5, 101, 0, 0, 680, 106, 1, 0, 0, 0, 681, 682, 5, 102, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 101, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 99, 0, 0, 687, 688, 5, 104, 0, 0, 688, 108, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 691, 5, 101, 0, 0, 691, 692, 5, 116, 0, 0, 692, 693, 5, 117, 0, 0, 693, 694, 5, 114, 0, 0, 694, 695, 5, 110, 0, 0, 695, 110, 1, 0, 0, 0, 696, 697, 5, 118, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 114, 0, 0, 699, 112, 1, 0, 0, 0, 700, 701, 5, 115, 0, 0, 701, 702, 5, 116, 0, 0, 702, 703, 5, 114, 0, 0, 703, 704, 5, 105, 0, 0, 704, 705, 5, 110, 0, 0, 705, 706, 5, 103, 0, 0, 706, 114, 1, 0, 0, 0, 707, 708, 5, 98, 0, 0, 708, 709, 5, 111, 0, 0, 709, 710, 5, 111, 0, 0, 710, 711, 5, 108, 0, 0, 711, 116, 1, 0, 0, 0, 712, 713, 5, 118, 0, 0, 713, 714, 5, 111, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 100, 0, 0, 716, 118, 1, 0, 0, 0, 717, 718, 5, 97, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 114, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 121, 0, 0, 722, 120, 1, 0, 0, 0, 723, 724, 5, 110, 0, 0, 724, 725, 5, 105, 0, 0, 725, 726, 5, 108, 0, 0, 726, 122, 1, 0, 0, 0, 727, 728, 5, 116, 0, 0, 728, 729, 5, 114, 0, 0, 729, 730, 5, 117, 0, 0, 730, 731, 5, 101, 0, 0, 731, 124, 1, 0, 0, 0, 732, 733, 5, 102, 0, 0, 733, 734, 5, 97, 0, 0, 734, 735, 5, 108, 0, 0, 735, 736, 5, 115, 0, 0, 736, 737, 5, 101, 0, 0, 737, 126, 1, 0, 0, 0, 738, 740, 7, 2, 0, 0, 739, 738, 1, 0, 0, 0, 740, 741, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 128, 1, 0, 0, 0, 743, 744, 5, 40, 0, 0, 744, 130, 1, 0, 0, 0, 745, 746, 5, 41, 0, 0, 746, 132, 1, 0, 0, 0, 747, 748, 5, 123, 0, 0, 748, 134, 1, 0, 0, 0, 749, 750, 5, 125, 0, 0, 750, 136, 1, 0, 0, 0, 751, 752, 5, 91, 0, 0, 752, 138, 1, 0, 0, 0, 753, 754, 5, 93, 0, 0, 754, 140, 1, 0, 0, 0, 755, 756, 5, 61, 0, 0, 756, 142, 1, 0, 0, 0, 757, 758, 5, 44, 0, 0, 758, 144, 1, 0, 0, 0, 759, 760, 5, 59, 0, 0, 760, 146, 1, 0, 0, 0, 761, 762, 5, 58, 0, 0, 762, 148, 1, 0, 0, 0, 763, 764, 5, 46, 0, 0, 764, 150, 1, 0, 0, 0, 765, 766, 5, 58, 0, 0, 766, 767, 5, 61, 0, 0, 767, 152, 1, 0, 0, 0, 768, 769, 5, 124, 0, 0, 769, 770, 5, 124, 0, 0, 770, 154, 1, 0, 0, 0, 771, 772, 5, 38, 0, 0, 772, 773, 5, 38, 0, 0, 773, 156, 1, 0, 0, 0, 774, 775, 5, 61, 0, 0, 775, 776, 5, 61, 0, 0, 776, 158, 1, 0, 0, 0, 777, 778, 5, 33, 0, 0, 778, 779, 5, 61, 0, 0, 779, 160, 1, 0, 0, 0, 780, 781, 5, 33, 0, 0, 781, 162, 1, 0, 0, 0, 782, 783, 5, 43, 0, 0, 783, 164, 1, 0, 0, 0, 784, 789, 5, 34, 0, 0, 785, 788, 8, 3, 0, 0, 786, 788, 3, 173, 86, 0, 787, 785, 1, 0, 0, 0, 787, 786, 1, 0, 0, 0, 788, 791, 1, 0, 0, 0, 789, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 792, 1, 0, 0, 0, 791, 789, 1, 0, 0, 0, 792, 793, 5, 34, 0, 0, 793, 166, 1, 0, 0, 0, 794, 796, 7, 4, 0, 0, 795, 794, 1, 0, 0, 0, 796, 797, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 797, 798, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 6, 83, 0, 0, 800, 168, 1, 0, 0, 0, 801, 802, 5, 47, 0, 0, 802, 803, 5, 42, 0, 0, 803, 807, 1, 0, 0, 0, 804, 806, 9, 0, 0, 0, 805, 804, 1, 0, 0, 0, 806, 809, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 807, 805, 1, 0, 0, 0, 808, 810, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 810, 811, 5, 42, 0, 0, 811, 812, 5, 47, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 6, 84, 0, 0, 814, 170, 1, 0, 0, 0, 815, 816, 5, 47, 0, 0, 816, 817, 5, 47, 0, 0, 817, 821, 1, 0, 0, 0, 818, 820, 8, 5, 0, 0, 819, 818, 1, 0, 0, 0, 820, 823, 1, 0, 0, 0, 821, 819, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 824, 1, 0, 0, 0, 823, 821, 1, 0, 0, 0, 824, 825, 6, 85, 0, 0, 825, 172, 1, 0, 0, 0, 826, 827, 5, 92, 0, 0, 827, 848, 7, 6, 0, 0, 828, 833, 5, 92, 0, 0, 829, 831, 7, 7, 0, 0, 830, 829, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 834, 7, 8, 0, 0, 833, 830, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 848, 7, 8, 0, 0, 836, 838, 5, 92, 0, 0, 837, 839, 5, 117, 0, 0, 838, 837, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 838, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 3, 177, 88, 0, 843, 844, 3, 177, 88, 0, 844, 845, 3, 177, 88, 0, 845, 846, 3, 177, 88, 0, 846, 848, 1, 0, 0, 0, 847, 826, 1, 0, 0, 0, 847, 828, 1, 0, 0, 0, 847, 836, 1, 0, 0, 0, 848, 174, 1, 0, 0, 0, 849, 858, 3, 177, 88, 0, 850, 853, 3, 177, 88, 0, 851, 853, 5, 95, 0, 0, 852, 850, 1, 0, 0, 0, 852, 851, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 857, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 857, 859, 3, 177, 88, 0, 858, 854, 1, 0, 0, 0, 858, 859, 1, 0, 0, 0, 859, 176, 1, 0, 0, 0, 860, 861, 7, 9, 0, 0, 861, 178, 1, 0, 0, 0, 23, 0, 240, 317, 503, 525, 545, 568, 593, 602, 609, 741, 787, 789, 797, 807, 821, 830, 833, 840, 847, 852, 854, 858, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.java new file mode 100644 index 000000000..ac9598478 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.java @@ -0,0 +1,679 @@ +// Generated from PMLLexer.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue", "this-escape"}) +public class PMLLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + OPERATION=1, NODEOP=2, CHECK=3, ROUTINE=4, CREATE=5, DELETE=6, POLICY_ELEMENT=7, + CONTAINED=8, RULE=9, WHEN=10, PERFORMS=11, AS=12, ON=13, IN=14, DO=15, + ANY=16, ASCENDANT_OF=17, INTERSECTION=18, UNION=19, PROCESS=20, SET_RESOURCE_OPERATIONS=21, + ASSIGN=22, DEASSIGN=23, FROM=24, SET_PROPERTIES=25, WITH_PROPERTIES=26, + OF=27, TO=28, ASSOCIATE=29, AND=30, WITH=31, DISSOCIATE=32, DENY=33, PROHIBITION=34, + OBLIGATION=35, ACCESS_RIGHTS=36, POLICY_CLASS=37, OBJECT_ATTRIBUTE=38, + USER_ATTRIBUTE=39, USER_ATTRIBUTES=40, OBJECT_ATTRIBUTES=41, OBJECT=42, + USER=43, ATTRIBUTE=44, ASSOCIATIONS=45, BREAK=46, DEFAULT=47, MAP=48, + ELSE=49, CONST=50, IF=51, RANGE=52, CONTINUE=53, FOREACH=54, RETURN=55, + VAR=56, STRING_TYPE=57, BOOL_TYPE=58, VOID_TYPE=59, ARRAY_TYPE=60, NIL_LIT=61, + TRUE=62, FALSE=63, ID=64, OPEN_PAREN=65, CLOSE_PAREN=66, OPEN_CURLY=67, + CLOSE_CURLY=68, OPEN_BRACKET=69, CLOSE_BRACKET=70, ASSIGN_EQUALS=71, COMMA=72, + SEMI=73, COLON=74, DOT=75, DECLARE_ASSIGN=76, LOGICAL_OR=77, LOGICAL_AND=78, + EQUALS=79, NOT_EQUALS=80, EXCLAMATION=81, PLUS=82, DOUBLE_QUOTE_STRING=83, + WS=84, COMMENT=85, LINE_COMMENT=86; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "OPERATION", "NODEOP", "CHECK", "ROUTINE", "CREATE", "DELETE", "POLICY_ELEMENT", + "CONTAINED", "RULE", "WHEN", "PERFORMS", "AS", "ON", "IN", "DO", "ANY", + "ASCENDANT_OF", "INTERSECTION", "UNION", "PROCESS", "SET_RESOURCE_OPERATIONS", + "ASSIGN", "DEASSIGN", "FROM", "SET_PROPERTIES", "WITH_PROPERTIES", "OF", + "TO", "ASSOCIATE", "AND", "WITH", "DISSOCIATE", "DENY", "PROHIBITION", + "OBLIGATION", "ACCESS_RIGHTS", "POLICY_CLASS", "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", + "USER_ATTRIBUTES", "OBJECT_ATTRIBUTES", "OBJECT", "USER", "ATTRIBUTE", + "ASSOCIATIONS", "BREAK", "DEFAULT", "MAP", "ELSE", "CONST", "IF", "RANGE", + "CONTINUE", "FOREACH", "RETURN", "VAR", "STRING_TYPE", "BOOL_TYPE", "VOID_TYPE", + "ARRAY_TYPE", "NIL_LIT", "TRUE", "FALSE", "ID", "OPEN_PAREN", "CLOSE_PAREN", + "OPEN_CURLY", "CLOSE_CURLY", "OPEN_BRACKET", "CLOSE_BRACKET", "ASSIGN_EQUALS", + "COMMA", "SEMI", "COLON", "DOT", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", + "EQUALS", "NOT_EQUALS", "EXCLAMATION", "PLUS", "DOUBLE_QUOTE_STRING", + "WS", "COMMENT", "LINE_COMMENT", "EscapeSequence", "HexDigits", "HexDigit" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'operation'", "'nodeop'", "'check'", "'routine'", "'create'", + "'delete'", null, "'contained'", "'rule'", "'when'", "'performs'", "'as'", + "'on'", "'in'", "'do'", "'any'", "'ascendant of'", null, "'union'", "'process'", + "'set resource operations'", "'assign'", "'deassign'", "'from'", "'set properties'", + "'with properties'", "'of'", "'to'", "'associate'", "'and'", "'with'", + "'dissociate'", "'deny'", "'prohibition'", "'obligation'", "'access rights'", + null, null, null, null, null, null, null, "'attribute'", "'associations'", + "'break'", "'default'", "'map'", "'else'", "'const'", "'if'", "'range'", + "'continue'", "'foreach'", "'return'", "'var'", "'string'", "'bool'", + "'void'", "'array'", "'nil'", "'true'", "'false'", null, "'('", "')'", + "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "':='", + "'||'", "'&&'", "'=='", "'!='", "'!'", "'+'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "OPERATION", "NODEOP", "CHECK", "ROUTINE", "CREATE", "DELETE", + "POLICY_ELEMENT", "CONTAINED", "RULE", "WHEN", "PERFORMS", "AS", "ON", + "IN", "DO", "ANY", "ASCENDANT_OF", "INTERSECTION", "UNION", "PROCESS", + "SET_RESOURCE_OPERATIONS", "ASSIGN", "DEASSIGN", "FROM", "SET_PROPERTIES", + "WITH_PROPERTIES", "OF", "TO", "ASSOCIATE", "AND", "WITH", "DISSOCIATE", + "DENY", "PROHIBITION", "OBLIGATION", "ACCESS_RIGHTS", "POLICY_CLASS", + "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", "USER_ATTRIBUTES", "OBJECT_ATTRIBUTES", + "OBJECT", "USER", "ATTRIBUTE", "ASSOCIATIONS", "BREAK", "DEFAULT", "MAP", + "ELSE", "CONST", "IF", "RANGE", "CONTINUE", "FOREACH", "RETURN", "VAR", + "STRING_TYPE", "BOOL_TYPE", "VOID_TYPE", "ARRAY_TYPE", "NIL_LIT", "TRUE", + "FALSE", "ID", "OPEN_PAREN", "CLOSE_PAREN", "OPEN_CURLY", "CLOSE_CURLY", + "OPEN_BRACKET", "CLOSE_BRACKET", "ASSIGN_EQUALS", "COMMA", "SEMI", "COLON", + "DOT", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", + "EXCLAMATION", "PLUS", "DOUBLE_QUOTE_STRING", "WS", "COMMENT", "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public PMLLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "PMLLexer.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000V\u035e\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004"+ + "\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005"+ + "\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006"+ + "\u0001\u0006\u0003\u0006\u00f1\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001"+ + "\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\f\u0001\f"+ + "\u0001\f\u0001\r\u0001\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001"+ + "\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001"+ + "\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0003\u0011\u013e\b\u0011\u0001"+ + "\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + " \u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001#\u0001"+ + "#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001"+ + "#\u0001#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0003$\u01f8"+ + "\b$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "%\u0003%\u020e\b%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001"+ + "&\u0003&\u0222\b&\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001\'\u0003\'\u0239\b\'\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001"+ + "(\u0001(\u0003(\u0252\b(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001)\u0001"+ + ")\u0003)\u025b\b)\u0001*\u0001*\u0001*\u0001*\u0001*\u0003*\u0262\b*\u0001"+ + "+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001"+ + ",\u0001,\u0001,\u0001-\u0001-\u0001-\u0001-\u0001-\u0001-\u0001.\u0001"+ + ".\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001/\u0001"+ + "/\u00010\u00010\u00010\u00010\u00010\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u0001"+ + "3\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0001"+ + "5\u00015\u00015\u00015\u00015\u00015\u00015\u00015\u00016\u00016\u0001"+ + "6\u00016\u00016\u00016\u00016\u00017\u00017\u00017\u00017\u00018\u0001"+ + "8\u00018\u00018\u00018\u00018\u00018\u00019\u00019\u00019\u00019\u0001"+ + "9\u0001:\u0001:\u0001:\u0001:\u0001:\u0001;\u0001;\u0001;\u0001;\u0001"+ + ";\u0001;\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001"+ + "=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0004?\u02e4\b?\u000b"+ + "?\f?\u02e5\u0001@\u0001@\u0001A\u0001A\u0001B\u0001B\u0001C\u0001C\u0001"+ + "D\u0001D\u0001E\u0001E\u0001F\u0001F\u0001G\u0001G\u0001H\u0001H\u0001"+ + "I\u0001I\u0001J\u0001J\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001"+ + "M\u0001M\u0001M\u0001N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001P\u0001"+ + "P\u0001Q\u0001Q\u0001R\u0001R\u0001R\u0005R\u0314\bR\nR\fR\u0317\tR\u0001"+ + "R\u0001R\u0001S\u0004S\u031c\bS\u000bS\fS\u031d\u0001S\u0001S\u0001T\u0001"+ + "T\u0001T\u0001T\u0005T\u0326\bT\nT\fT\u0329\tT\u0001T\u0001T\u0001T\u0001"+ + "T\u0001T\u0001U\u0001U\u0001U\u0001U\u0005U\u0334\bU\nU\fU\u0337\tU\u0001"+ + "U\u0001U\u0001V\u0001V\u0001V\u0001V\u0003V\u033f\bV\u0001V\u0003V\u0342"+ + "\bV\u0001V\u0001V\u0001V\u0004V\u0347\bV\u000bV\fV\u0348\u0001V\u0001"+ + "V\u0001V\u0001V\u0001V\u0003V\u0350\bV\u0001W\u0001W\u0001W\u0005W\u0355"+ + "\bW\nW\fW\u0358\tW\u0001W\u0003W\u035b\bW\u0001X\u0001X\u0001\u0327\u0000"+ + "Y\u0001\u0001\u0003\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006"+ + "\r\u0007\u000f\b\u0011\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e"+ + "\u001d\u000f\u001f\u0010!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017"+ + "/\u00181\u00193\u001a5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%"+ + "K&M\'O(Q)S*U+W,Y-[.]/_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083"+ + "B\u0085C\u0087D\u0089E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097"+ + "L\u0099M\u009bN\u009dO\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00ab"+ + "V\u00ad\u0000\u00af\u0000\u00b1\u0000\u0001\u0000\n\u0002\u0000OOoo\u0002"+ + "\u0000UUuu\u0004\u000009AZ__az\u0004\u0000\n\n\r\r\"\"\\\\\u0003\u0000"+ + "\t\n\f\r \u0002\u0000\n\n\r\r\b\u0000\"\"\'\'\\\\bbffnnrrtt\u0001\u0000"+ + "03\u0001\u000007\u0003\u000009AFaf\u0376\u0000\u0001\u0001\u0000\u0000"+ + "\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001\u0000\u0000"+ + "\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000\u0000\u0000"+ + "\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000\u0000\u0000"+ + "\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000\u0000\u0000"+ + "\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000\u0000\u0000"+ + "\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000\u0000\u0000"+ + "\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000\u0000\u0000"+ + "\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000\u0000#\u0001"+ + "\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'\u0001\u0000"+ + "\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000\u0000\u0000"+ + "\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000\u00001"+ + "\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005\u0001\u0000"+ + "\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000\u0000\u0000"+ + "\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000\u0000?"+ + "\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C\u0001\u0000"+ + "\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000\u0000\u0000"+ + "\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000\u0000M"+ + "\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q\u0001\u0000"+ + "\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000\u0000\u0000"+ + "\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000\u0000["+ + "\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_\u0001\u0000"+ + "\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000\u0000\u0000"+ + "\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000\u0000i"+ + "\u0001\u0000\u0000\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m\u0001\u0000"+ + "\u0000\u0000\u0000o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000\u0000\u0000"+ + "\u0000s\u0001\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000\u0000w"+ + "\u0001\u0000\u0000\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{\u0001\u0000"+ + "\u0000\u0000\u0000}\u0001\u0000\u0000\u0000\u0000\u007f\u0001\u0000\u0000"+ + "\u0000\u0000\u0081\u0001\u0000\u0000\u0000\u0000\u0083\u0001\u0000\u0000"+ + "\u0000\u0000\u0085\u0001\u0000\u0000\u0000\u0000\u0087\u0001\u0000\u0000"+ + "\u0000\u0000\u0089\u0001\u0000\u0000\u0000\u0000\u008b\u0001\u0000\u0000"+ + "\u0000\u0000\u008d\u0001\u0000\u0000\u0000\u0000\u008f\u0001\u0000\u0000"+ + "\u0000\u0000\u0091\u0001\u0000\u0000\u0000\u0000\u0093\u0001\u0000\u0000"+ + "\u0000\u0000\u0095\u0001\u0000\u0000\u0000\u0000\u0097\u0001\u0000\u0000"+ + "\u0000\u0000\u0099\u0001\u0000\u0000\u0000\u0000\u009b\u0001\u0000\u0000"+ + "\u0000\u0000\u009d\u0001\u0000\u0000\u0000\u0000\u009f\u0001\u0000\u0000"+ + "\u0000\u0000\u00a1\u0001\u0000\u0000\u0000\u0000\u00a3\u0001\u0000\u0000"+ + "\u0000\u0000\u00a5\u0001\u0000\u0000\u0000\u0000\u00a7\u0001\u0000\u0000"+ + "\u0000\u0000\u00a9\u0001\u0000\u0000\u0000\u0000\u00ab\u0001\u0000\u0000"+ + "\u0000\u0001\u00b3\u0001\u0000\u0000\u0000\u0003\u00bd\u0001\u0000\u0000"+ + "\u0000\u0005\u00c4\u0001\u0000\u0000\u0000\u0007\u00ca\u0001\u0000\u0000"+ + "\u0000\t\u00d2\u0001\u0000\u0000\u0000\u000b\u00d9\u0001\u0000\u0000\u0000"+ + "\r\u00f0\u0001\u0000\u0000\u0000\u000f\u00f2\u0001\u0000\u0000\u0000\u0011"+ + "\u00fc\u0001\u0000\u0000\u0000\u0013\u0101\u0001\u0000\u0000\u0000\u0015"+ + "\u0106\u0001\u0000\u0000\u0000\u0017\u010f\u0001\u0000\u0000\u0000\u0019"+ + "\u0112\u0001\u0000\u0000\u0000\u001b\u0115\u0001\u0000\u0000\u0000\u001d"+ + "\u0118\u0001\u0000\u0000\u0000\u001f\u011b\u0001\u0000\u0000\u0000!\u011f"+ + "\u0001\u0000\u0000\u0000#\u013d\u0001\u0000\u0000\u0000%\u013f\u0001\u0000"+ + "\u0000\u0000\'\u0145\u0001\u0000\u0000\u0000)\u014d\u0001\u0000\u0000"+ + "\u0000+\u0165\u0001\u0000\u0000\u0000-\u016c\u0001\u0000\u0000\u0000/"+ + "\u0175\u0001\u0000\u0000\u00001\u017a\u0001\u0000\u0000\u00003\u0189\u0001"+ + "\u0000\u0000\u00005\u0199\u0001\u0000\u0000\u00007\u019c\u0001\u0000\u0000"+ + "\u00009\u019f\u0001\u0000\u0000\u0000;\u01a9\u0001\u0000\u0000\u0000="+ + "\u01ad\u0001\u0000\u0000\u0000?\u01b2\u0001\u0000\u0000\u0000A\u01bd\u0001"+ + "\u0000\u0000\u0000C\u01c2\u0001\u0000\u0000\u0000E\u01ce\u0001\u0000\u0000"+ + "\u0000G\u01d9\u0001\u0000\u0000\u0000I\u01f7\u0001\u0000\u0000\u0000K"+ + "\u020d\u0001\u0000\u0000\u0000M\u0221\u0001\u0000\u0000\u0000O\u0238\u0001"+ + "\u0000\u0000\u0000Q\u0251\u0001\u0000\u0000\u0000S\u025a\u0001\u0000\u0000"+ + "\u0000U\u0261\u0001\u0000\u0000\u0000W\u0263\u0001\u0000\u0000\u0000Y"+ + "\u026d\u0001\u0000\u0000\u0000[\u027a\u0001\u0000\u0000\u0000]\u0280\u0001"+ + "\u0000\u0000\u0000_\u0288\u0001\u0000\u0000\u0000a\u028c\u0001\u0000\u0000"+ + "\u0000c\u0291\u0001\u0000\u0000\u0000e\u0297\u0001\u0000\u0000\u0000g"+ + "\u029a\u0001\u0000\u0000\u0000i\u02a0\u0001\u0000\u0000\u0000k\u02a9\u0001"+ + "\u0000\u0000\u0000m\u02b1\u0001\u0000\u0000\u0000o\u02b8\u0001\u0000\u0000"+ + "\u0000q\u02bc\u0001\u0000\u0000\u0000s\u02c3\u0001\u0000\u0000\u0000u"+ + "\u02c8\u0001\u0000\u0000\u0000w\u02cd\u0001\u0000\u0000\u0000y\u02d3\u0001"+ + "\u0000\u0000\u0000{\u02d7\u0001\u0000\u0000\u0000}\u02dc\u0001\u0000\u0000"+ + "\u0000\u007f\u02e3\u0001\u0000\u0000\u0000\u0081\u02e7\u0001\u0000\u0000"+ + "\u0000\u0083\u02e9\u0001\u0000\u0000\u0000\u0085\u02eb\u0001\u0000\u0000"+ + "\u0000\u0087\u02ed\u0001\u0000\u0000\u0000\u0089\u02ef\u0001\u0000\u0000"+ + "\u0000\u008b\u02f1\u0001\u0000\u0000\u0000\u008d\u02f3\u0001\u0000\u0000"+ + "\u0000\u008f\u02f5\u0001\u0000\u0000\u0000\u0091\u02f7\u0001\u0000\u0000"+ + "\u0000\u0093\u02f9\u0001\u0000\u0000\u0000\u0095\u02fb\u0001\u0000\u0000"+ + "\u0000\u0097\u02fd\u0001\u0000\u0000\u0000\u0099\u0300\u0001\u0000\u0000"+ + "\u0000\u009b\u0303\u0001\u0000\u0000\u0000\u009d\u0306\u0001\u0000\u0000"+ + "\u0000\u009f\u0309\u0001\u0000\u0000\u0000\u00a1\u030c\u0001\u0000\u0000"+ + "\u0000\u00a3\u030e\u0001\u0000\u0000\u0000\u00a5\u0310\u0001\u0000\u0000"+ + "\u0000\u00a7\u031b\u0001\u0000\u0000\u0000\u00a9\u0321\u0001\u0000\u0000"+ + "\u0000\u00ab\u032f\u0001\u0000\u0000\u0000\u00ad\u034f\u0001\u0000\u0000"+ + "\u0000\u00af\u0351\u0001\u0000\u0000\u0000\u00b1\u035c\u0001\u0000\u0000"+ + "\u0000\u00b3\u00b4\u0005o\u0000\u0000\u00b4\u00b5\u0005p\u0000\u0000\u00b5"+ + "\u00b6\u0005e\u0000\u0000\u00b6\u00b7\u0005r\u0000\u0000\u00b7\u00b8\u0005"+ + "a\u0000\u0000\u00b8\u00b9\u0005t\u0000\u0000\u00b9\u00ba\u0005i\u0000"+ + "\u0000\u00ba\u00bb\u0005o\u0000\u0000\u00bb\u00bc\u0005n\u0000\u0000\u00bc"+ + "\u0002\u0001\u0000\u0000\u0000\u00bd\u00be\u0005n\u0000\u0000\u00be\u00bf"+ + "\u0005o\u0000\u0000\u00bf\u00c0\u0005d\u0000\u0000\u00c0\u00c1\u0005e"+ + "\u0000\u0000\u00c1\u00c2\u0005o\u0000\u0000\u00c2\u00c3\u0005p\u0000\u0000"+ + "\u00c3\u0004\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005c\u0000\u0000\u00c5"+ + "\u00c6\u0005h\u0000\u0000\u00c6\u00c7\u0005e\u0000\u0000\u00c7\u00c8\u0005"+ + "c\u0000\u0000\u00c8\u00c9\u0005k\u0000\u0000\u00c9\u0006\u0001\u0000\u0000"+ + "\u0000\u00ca\u00cb\u0005r\u0000\u0000\u00cb\u00cc\u0005o\u0000\u0000\u00cc"+ + "\u00cd\u0005u\u0000\u0000\u00cd\u00ce\u0005t\u0000\u0000\u00ce\u00cf\u0005"+ + "i\u0000\u0000\u00cf\u00d0\u0005n\u0000\u0000\u00d0\u00d1\u0005e\u0000"+ + "\u0000\u00d1\b\u0001\u0000\u0000\u0000\u00d2\u00d3\u0005c\u0000\u0000"+ + "\u00d3\u00d4\u0005r\u0000\u0000\u00d4\u00d5\u0005e\u0000\u0000\u00d5\u00d6"+ + "\u0005a\u0000\u0000\u00d6\u00d7\u0005t\u0000\u0000\u00d7\u00d8\u0005e"+ + "\u0000\u0000\u00d8\n\u0001\u0000\u0000\u0000\u00d9\u00da\u0005d\u0000"+ + "\u0000\u00da\u00db\u0005e\u0000\u0000\u00db\u00dc\u0005l\u0000\u0000\u00dc"+ + "\u00dd\u0005e\u0000\u0000\u00dd\u00de\u0005t\u0000\u0000\u00de\u00df\u0005"+ + "e\u0000\u0000\u00df\f\u0001\u0000\u0000\u0000\u00e0\u00e1\u0005p\u0000"+ + "\u0000\u00e1\u00e2\u0005o\u0000\u0000\u00e2\u00e3\u0005l\u0000\u0000\u00e3"+ + "\u00e4\u0005i\u0000\u0000\u00e4\u00e5\u0005c\u0000\u0000\u00e5\u00e6\u0005"+ + "y\u0000\u0000\u00e6\u00e7\u0005 \u0000\u0000\u00e7\u00e8\u0005e\u0000"+ + "\u0000\u00e8\u00e9\u0005l\u0000\u0000\u00e9\u00ea\u0005e\u0000\u0000\u00ea"+ + "\u00eb\u0005m\u0000\u0000\u00eb\u00ec\u0005e\u0000\u0000\u00ec\u00ed\u0005"+ + "n\u0000\u0000\u00ed\u00f1\u0005t\u0000\u0000\u00ee\u00ef\u0005p\u0000"+ + "\u0000\u00ef\u00f1\u0005e\u0000\u0000\u00f0\u00e0\u0001\u0000\u0000\u0000"+ + "\u00f0\u00ee\u0001\u0000\u0000\u0000\u00f1\u000e\u0001\u0000\u0000\u0000"+ + "\u00f2\u00f3\u0005c\u0000\u0000\u00f3\u00f4\u0005o\u0000\u0000\u00f4\u00f5"+ + "\u0005n\u0000\u0000\u00f5\u00f6\u0005t\u0000\u0000\u00f6\u00f7\u0005a"+ + "\u0000\u0000\u00f7\u00f8\u0005i\u0000\u0000\u00f8\u00f9\u0005n\u0000\u0000"+ + "\u00f9\u00fa\u0005e\u0000\u0000\u00fa\u00fb\u0005d\u0000\u0000\u00fb\u0010"+ + "\u0001\u0000\u0000\u0000\u00fc\u00fd\u0005r\u0000\u0000\u00fd\u00fe\u0005"+ + "u\u0000\u0000\u00fe\u00ff\u0005l\u0000\u0000\u00ff\u0100\u0005e\u0000"+ + "\u0000\u0100\u0012\u0001\u0000\u0000\u0000\u0101\u0102\u0005w\u0000\u0000"+ + "\u0102\u0103\u0005h\u0000\u0000\u0103\u0104\u0005e\u0000\u0000\u0104\u0105"+ + "\u0005n\u0000\u0000\u0105\u0014\u0001\u0000\u0000\u0000\u0106\u0107\u0005"+ + "p\u0000\u0000\u0107\u0108\u0005e\u0000\u0000\u0108\u0109\u0005r\u0000"+ + "\u0000\u0109\u010a\u0005f\u0000\u0000\u010a\u010b\u0005o\u0000\u0000\u010b"+ + "\u010c\u0005r\u0000\u0000\u010c\u010d\u0005m\u0000\u0000\u010d\u010e\u0005"+ + "s\u0000\u0000\u010e\u0016\u0001\u0000\u0000\u0000\u010f\u0110\u0005a\u0000"+ + "\u0000\u0110\u0111\u0005s\u0000\u0000\u0111\u0018\u0001\u0000\u0000\u0000"+ + "\u0112\u0113\u0005o\u0000\u0000\u0113\u0114\u0005n\u0000\u0000\u0114\u001a"+ + "\u0001\u0000\u0000\u0000\u0115\u0116\u0005i\u0000\u0000\u0116\u0117\u0005"+ + "n\u0000\u0000\u0117\u001c\u0001\u0000\u0000\u0000\u0118\u0119\u0005d\u0000"+ + "\u0000\u0119\u011a\u0005o\u0000\u0000\u011a\u001e\u0001\u0000\u0000\u0000"+ + "\u011b\u011c\u0005a\u0000\u0000\u011c\u011d\u0005n\u0000\u0000\u011d\u011e"+ + "\u0005y\u0000\u0000\u011e \u0001\u0000\u0000\u0000\u011f\u0120\u0005a"+ + "\u0000\u0000\u0120\u0121\u0005s\u0000\u0000\u0121\u0122\u0005c\u0000\u0000"+ + "\u0122\u0123\u0005e\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u0125"+ + "\u0005d\u0000\u0000\u0125\u0126\u0005a\u0000\u0000\u0126\u0127\u0005n"+ + "\u0000\u0000\u0127\u0128\u0005t\u0000\u0000\u0128\u0129\u0005 \u0000\u0000"+ + "\u0129\u012a\u0005o\u0000\u0000\u012a\u012b\u0005f\u0000\u0000\u012b\""+ + "\u0001\u0000\u0000\u0000\u012c\u012d\u0005i\u0000\u0000\u012d\u012e\u0005"+ + "n\u0000\u0000\u012e\u012f\u0005t\u0000\u0000\u012f\u0130\u0005e\u0000"+ + "\u0000\u0130\u0131\u0005r\u0000\u0000\u0131\u0132\u0005s\u0000\u0000\u0132"+ + "\u0133\u0005e\u0000\u0000\u0133\u0134\u0005c\u0000\u0000\u0134\u0135\u0005"+ + "t\u0000\u0000\u0135\u0136\u0005i\u0000\u0000\u0136\u0137\u0005o\u0000"+ + "\u0000\u0137\u013e\u0005n\u0000\u0000\u0138\u0139\u0005i\u0000\u0000\u0139"+ + "\u013a\u0005n\u0000\u0000\u013a\u013b\u0005t\u0000\u0000\u013b\u013c\u0005"+ + "e\u0000\u0000\u013c\u013e\u0005r\u0000\u0000\u013d\u012c\u0001\u0000\u0000"+ + "\u0000\u013d\u0138\u0001\u0000\u0000\u0000\u013e$\u0001\u0000\u0000\u0000"+ + "\u013f\u0140\u0005u\u0000\u0000\u0140\u0141\u0005n\u0000\u0000\u0141\u0142"+ + "\u0005i\u0000\u0000\u0142\u0143\u0005o\u0000\u0000\u0143\u0144\u0005n"+ + "\u0000\u0000\u0144&\u0001\u0000\u0000\u0000\u0145\u0146\u0005p\u0000\u0000"+ + "\u0146\u0147\u0005r\u0000\u0000\u0147\u0148\u0005o\u0000\u0000\u0148\u0149"+ + "\u0005c\u0000\u0000\u0149\u014a\u0005e\u0000\u0000\u014a\u014b\u0005s"+ + "\u0000\u0000\u014b\u014c\u0005s\u0000\u0000\u014c(\u0001\u0000\u0000\u0000"+ + "\u014d\u014e\u0005s\u0000\u0000\u014e\u014f\u0005e\u0000\u0000\u014f\u0150"+ + "\u0005t\u0000\u0000\u0150\u0151\u0005 \u0000\u0000\u0151\u0152\u0005r"+ + "\u0000\u0000\u0152\u0153\u0005e\u0000\u0000\u0153\u0154\u0005s\u0000\u0000"+ + "\u0154\u0155\u0005o\u0000\u0000\u0155\u0156\u0005u\u0000\u0000\u0156\u0157"+ + "\u0005r\u0000\u0000\u0157\u0158\u0005c\u0000\u0000\u0158\u0159\u0005e"+ + "\u0000\u0000\u0159\u015a\u0005 \u0000\u0000\u015a\u015b\u0005o\u0000\u0000"+ + "\u015b\u015c\u0005p\u0000\u0000\u015c\u015d\u0005e\u0000\u0000\u015d\u015e"+ + "\u0005r\u0000\u0000\u015e\u015f\u0005a\u0000\u0000\u015f\u0160\u0005t"+ + "\u0000\u0000\u0160\u0161\u0005i\u0000\u0000\u0161\u0162\u0005o\u0000\u0000"+ + "\u0162\u0163\u0005n\u0000\u0000\u0163\u0164\u0005s\u0000\u0000\u0164*"+ + "\u0001\u0000\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005"+ + "s\u0000\u0000\u0167\u0168\u0005s\u0000\u0000\u0168\u0169\u0005i\u0000"+ + "\u0000\u0169\u016a\u0005g\u0000\u0000\u016a\u016b\u0005n\u0000\u0000\u016b"+ + ",\u0001\u0000\u0000\u0000\u016c\u016d\u0005d\u0000\u0000\u016d\u016e\u0005"+ + "e\u0000\u0000\u016e\u016f\u0005a\u0000\u0000\u016f\u0170\u0005s\u0000"+ + "\u0000\u0170\u0171\u0005s\u0000\u0000\u0171\u0172\u0005i\u0000\u0000\u0172"+ + "\u0173\u0005g\u0000\u0000\u0173\u0174\u0005n\u0000\u0000\u0174.\u0001"+ + "\u0000\u0000\u0000\u0175\u0176\u0005f\u0000\u0000\u0176\u0177\u0005r\u0000"+ + "\u0000\u0177\u0178\u0005o\u0000\u0000\u0178\u0179\u0005m\u0000\u0000\u0179"+ + "0\u0001\u0000\u0000\u0000\u017a\u017b\u0005s\u0000\u0000\u017b\u017c\u0005"+ + "e\u0000\u0000\u017c\u017d\u0005t\u0000\u0000\u017d\u017e\u0005 \u0000"+ + "\u0000\u017e\u017f\u0005p\u0000\u0000\u017f\u0180\u0005r\u0000\u0000\u0180"+ + "\u0181\u0005o\u0000\u0000\u0181\u0182\u0005p\u0000\u0000\u0182\u0183\u0005"+ + "e\u0000\u0000\u0183\u0184\u0005r\u0000\u0000\u0184\u0185\u0005t\u0000"+ + "\u0000\u0185\u0186\u0005i\u0000\u0000\u0186\u0187\u0005e\u0000\u0000\u0187"+ + "\u0188\u0005s\u0000\u0000\u01882\u0001\u0000\u0000\u0000\u0189\u018a\u0005"+ + "w\u0000\u0000\u018a\u018b\u0005i\u0000\u0000\u018b\u018c\u0005t\u0000"+ + "\u0000\u018c\u018d\u0005h\u0000\u0000\u018d\u018e\u0005 \u0000\u0000\u018e"+ + "\u018f\u0005p\u0000\u0000\u018f\u0190\u0005r\u0000\u0000\u0190\u0191\u0005"+ + "o\u0000\u0000\u0191\u0192\u0005p\u0000\u0000\u0192\u0193\u0005e\u0000"+ + "\u0000\u0193\u0194\u0005r\u0000\u0000\u0194\u0195\u0005t\u0000\u0000\u0195"+ + "\u0196\u0005i\u0000\u0000\u0196\u0197\u0005e\u0000\u0000\u0197\u0198\u0005"+ + "s\u0000\u0000\u01984\u0001\u0000\u0000\u0000\u0199\u019a\u0005o\u0000"+ + "\u0000\u019a\u019b\u0005f\u0000\u0000\u019b6\u0001\u0000\u0000\u0000\u019c"+ + "\u019d\u0005t\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e8\u0001"+ + "\u0000\u0000\u0000\u019f\u01a0\u0005a\u0000\u0000\u01a0\u01a1\u0005s\u0000"+ + "\u0000\u01a1\u01a2\u0005s\u0000\u0000\u01a2\u01a3\u0005o\u0000\u0000\u01a3"+ + "\u01a4\u0005c\u0000\u0000\u01a4\u01a5\u0005i\u0000\u0000\u01a5\u01a6\u0005"+ + "a\u0000\u0000\u01a6\u01a7\u0005t\u0000\u0000\u01a7\u01a8\u0005e\u0000"+ + "\u0000\u01a8:\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005a\u0000\u0000\u01aa"+ + "\u01ab\u0005n\u0000\u0000\u01ab\u01ac\u0005d\u0000\u0000\u01ac<\u0001"+ + "\u0000\u0000\u0000\u01ad\u01ae\u0005w\u0000\u0000\u01ae\u01af\u0005i\u0000"+ + "\u0000\u01af\u01b0\u0005t\u0000\u0000\u01b0\u01b1\u0005h\u0000\u0000\u01b1"+ + ">\u0001\u0000\u0000\u0000\u01b2\u01b3\u0005d\u0000\u0000\u01b3\u01b4\u0005"+ + "i\u0000\u0000\u01b4\u01b5\u0005s\u0000\u0000\u01b5\u01b6\u0005s\u0000"+ + "\u0000\u01b6\u01b7\u0005o\u0000\u0000\u01b7\u01b8\u0005c\u0000\u0000\u01b8"+ + "\u01b9\u0005i\u0000\u0000\u01b9\u01ba\u0005a\u0000\u0000\u01ba\u01bb\u0005"+ + "t\u0000\u0000\u01bb\u01bc\u0005e\u0000\u0000\u01bc@\u0001\u0000\u0000"+ + "\u0000\u01bd\u01be\u0005d\u0000\u0000\u01be\u01bf\u0005e\u0000\u0000\u01bf"+ + "\u01c0\u0005n\u0000\u0000\u01c0\u01c1\u0005y\u0000\u0000\u01c1B\u0001"+ + "\u0000\u0000\u0000\u01c2\u01c3\u0005p\u0000\u0000\u01c3\u01c4\u0005r\u0000"+ + "\u0000\u01c4\u01c5\u0005o\u0000\u0000\u01c5\u01c6\u0005h\u0000\u0000\u01c6"+ + "\u01c7\u0005i\u0000\u0000\u01c7\u01c8\u0005b\u0000\u0000\u01c8\u01c9\u0005"+ + "i\u0000\u0000\u01c9\u01ca\u0005t\u0000\u0000\u01ca\u01cb\u0005i\u0000"+ + "\u0000\u01cb\u01cc\u0005o\u0000\u0000\u01cc\u01cd\u0005n\u0000\u0000\u01cd"+ + "D\u0001\u0000\u0000\u0000\u01ce\u01cf\u0005o\u0000\u0000\u01cf\u01d0\u0005"+ + "b\u0000\u0000\u01d0\u01d1\u0005l\u0000\u0000\u01d1\u01d2\u0005i\u0000"+ + "\u0000\u01d2\u01d3\u0005g\u0000\u0000\u01d3\u01d4\u0005a\u0000\u0000\u01d4"+ + "\u01d5\u0005t\u0000\u0000\u01d5\u01d6\u0005i\u0000\u0000\u01d6\u01d7\u0005"+ + "o\u0000\u0000\u01d7\u01d8\u0005n\u0000\u0000\u01d8F\u0001\u0000\u0000"+ + "\u0000\u01d9\u01da\u0005a\u0000\u0000\u01da\u01db\u0005c\u0000\u0000\u01db"+ + "\u01dc\u0005c\u0000\u0000\u01dc\u01dd\u0005e\u0000\u0000\u01dd\u01de\u0005"+ + "s\u0000\u0000\u01de\u01df\u0005s\u0000\u0000\u01df\u01e0\u0005 \u0000"+ + "\u0000\u01e0\u01e1\u0005r\u0000\u0000\u01e1\u01e2\u0005i\u0000\u0000\u01e2"+ + "\u01e3\u0005g\u0000\u0000\u01e3\u01e4\u0005h\u0000\u0000\u01e4\u01e5\u0005"+ + "t\u0000\u0000\u01e5\u01e6\u0005s\u0000\u0000\u01e6H\u0001\u0000\u0000"+ + "\u0000\u01e7\u01e8\u0005p\u0000\u0000\u01e8\u01e9\u0005o\u0000\u0000\u01e9"+ + "\u01ea\u0005l\u0000\u0000\u01ea\u01eb\u0005i\u0000\u0000\u01eb\u01ec\u0005"+ + "c\u0000\u0000\u01ec\u01ed\u0005y\u0000\u0000\u01ed\u01ee\u0005 \u0000"+ + "\u0000\u01ee\u01ef\u0005c\u0000\u0000\u01ef\u01f0\u0005l\u0000\u0000\u01f0"+ + "\u01f1\u0005a\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f8\u0005"+ + "s\u0000\u0000\u01f3\u01f4\u0005p\u0000\u0000\u01f4\u01f8\u0005c\u0000"+ + "\u0000\u01f5\u01f6\u0005P\u0000\u0000\u01f6\u01f8\u0005C\u0000\u0000\u01f7"+ + "\u01e7\u0001\u0000\u0000\u0000\u01f7\u01f3\u0001\u0000\u0000\u0000\u01f7"+ + "\u01f5\u0001\u0000\u0000\u0000\u01f8J\u0001\u0000\u0000\u0000\u01f9\u01fa"+ + "\u0005o\u0000\u0000\u01fa\u01fb\u0005b\u0000\u0000\u01fb\u01fc\u0005j"+ + "\u0000\u0000\u01fc\u01fd\u0005e\u0000\u0000\u01fd\u01fe\u0005c\u0000\u0000"+ + "\u01fe\u01ff\u0005t\u0000\u0000\u01ff\u0200\u0005 \u0000\u0000\u0200\u0201"+ + "\u0005a\u0000\u0000\u0201\u0202\u0005t\u0000\u0000\u0202\u0203\u0005t"+ + "\u0000\u0000\u0203\u0204\u0005r\u0000\u0000\u0204\u0205\u0005i\u0000\u0000"+ + "\u0205\u0206\u0005b\u0000\u0000\u0206\u0207\u0005u\u0000\u0000\u0207\u0208"+ + "\u0005t\u0000\u0000\u0208\u020e\u0005e\u0000\u0000\u0209\u020a\u0005o"+ + "\u0000\u0000\u020a\u020e\u0005a\u0000\u0000\u020b\u020c\u0005O\u0000\u0000"+ + "\u020c\u020e\u0005A\u0000\u0000\u020d\u01f9\u0001\u0000\u0000\u0000\u020d"+ + "\u0209\u0001\u0000\u0000\u0000\u020d\u020b\u0001\u0000\u0000\u0000\u020e"+ + "L\u0001\u0000\u0000\u0000\u020f\u0210\u0005u\u0000\u0000\u0210\u0211\u0005"+ + "s\u0000\u0000\u0211\u0212\u0005e\u0000\u0000\u0212\u0213\u0005r\u0000"+ + "\u0000\u0213\u0214\u0005 \u0000\u0000\u0214\u0215\u0005a\u0000\u0000\u0215"+ + "\u0216\u0005t\u0000\u0000\u0216\u0217\u0005t\u0000\u0000\u0217\u0218\u0005"+ + "r\u0000\u0000\u0218\u0219\u0005i\u0000\u0000\u0219\u021a\u0005b\u0000"+ + "\u0000\u021a\u021b\u0005u\u0000\u0000\u021b\u021c\u0005t\u0000\u0000\u021c"+ + "\u0222\u0005e\u0000\u0000\u021d\u021e\u0005u\u0000\u0000\u021e\u0222\u0005"+ + "a\u0000\u0000\u021f\u0220\u0005U\u0000\u0000\u0220\u0222\u0005A\u0000"+ + "\u0000\u0221\u020f\u0001\u0000\u0000\u0000\u0221\u021d\u0001\u0000\u0000"+ + "\u0000\u0221\u021f\u0001\u0000\u0000\u0000\u0222N\u0001\u0000\u0000\u0000"+ + "\u0223\u0224\u0005u\u0000\u0000\u0224\u0225\u0005s\u0000\u0000\u0225\u0226"+ + "\u0005e\u0000\u0000\u0226\u0227\u0005r\u0000\u0000\u0227\u0228\u0005 "+ + "\u0000\u0000\u0228\u0229\u0005a\u0000\u0000\u0229\u022a\u0005t\u0000\u0000"+ + "\u022a\u022b\u0005t\u0000\u0000\u022b\u022c\u0005r\u0000\u0000\u022c\u022d"+ + "\u0005i\u0000\u0000\u022d\u022e\u0005b\u0000\u0000\u022e\u022f\u0005u"+ + "\u0000\u0000\u022f\u0230\u0005t\u0000\u0000\u0230\u0231\u0005e\u0000\u0000"+ + "\u0231\u0239\u0005s\u0000\u0000\u0232\u0233\u0005u\u0000\u0000\u0233\u0234"+ + "\u0005a\u0000\u0000\u0234\u0239\u0005s\u0000\u0000\u0235\u0236\u0005U"+ + "\u0000\u0000\u0236\u0237\u0005A\u0000\u0000\u0237\u0239\u0005s\u0000\u0000"+ + "\u0238\u0223\u0001\u0000\u0000\u0000\u0238\u0232\u0001\u0000\u0000\u0000"+ + "\u0238\u0235\u0001\u0000\u0000\u0000\u0239P\u0001\u0000\u0000\u0000\u023a"+ + "\u023b\u0005o\u0000\u0000\u023b\u023c\u0005b\u0000\u0000\u023c\u023d\u0005"+ + "j\u0000\u0000\u023d\u023e\u0005e\u0000\u0000\u023e\u023f\u0005c\u0000"+ + "\u0000\u023f\u0240\u0005t\u0000\u0000\u0240\u0241\u0005 \u0000\u0000\u0241"+ + "\u0242\u0005a\u0000\u0000\u0242\u0243\u0005t\u0000\u0000\u0243\u0244\u0005"+ + "t\u0000\u0000\u0244\u0245\u0005r\u0000\u0000\u0245\u0246\u0005i\u0000"+ + "\u0000\u0246\u0247\u0005b\u0000\u0000\u0247\u0248\u0005u\u0000\u0000\u0248"+ + "\u0249\u0005t\u0000\u0000\u0249\u024a\u0005e\u0000\u0000\u024a\u0252\u0005"+ + "s\u0000\u0000\u024b\u024c\u0005o\u0000\u0000\u024c\u024d\u0005a\u0000"+ + "\u0000\u024d\u0252\u0005s\u0000\u0000\u024e\u024f\u0005O\u0000\u0000\u024f"+ + "\u0250\u0005A\u0000\u0000\u0250\u0252\u0005s\u0000\u0000\u0251\u023a\u0001"+ + "\u0000\u0000\u0000\u0251\u024b\u0001\u0000\u0000\u0000\u0251\u024e\u0001"+ + "\u0000\u0000\u0000\u0252R\u0001\u0000\u0000\u0000\u0253\u0254\u0005o\u0000"+ + "\u0000\u0254\u0255\u0005b\u0000\u0000\u0255\u0256\u0005j\u0000\u0000\u0256"+ + "\u0257\u0005e\u0000\u0000\u0257\u0258\u0005c\u0000\u0000\u0258\u025b\u0005"+ + "t\u0000\u0000\u0259\u025b\u0007\u0000\u0000\u0000\u025a\u0253\u0001\u0000"+ + "\u0000\u0000\u025a\u0259\u0001\u0000\u0000\u0000\u025bT\u0001\u0000\u0000"+ + "\u0000\u025c\u025d\u0005u\u0000\u0000\u025d\u025e\u0005s\u0000\u0000\u025e"+ + "\u025f\u0005e\u0000\u0000\u025f\u0262\u0005r\u0000\u0000\u0260\u0262\u0007"+ + "\u0001\u0000\u0000\u0261\u025c\u0001\u0000\u0000\u0000\u0261\u0260\u0001"+ + "\u0000\u0000\u0000\u0262V\u0001\u0000\u0000\u0000\u0263\u0264\u0005a\u0000"+ + "\u0000\u0264\u0265\u0005t\u0000\u0000\u0265\u0266\u0005t\u0000\u0000\u0266"+ + "\u0267\u0005r\u0000\u0000\u0267\u0268\u0005i\u0000\u0000\u0268\u0269\u0005"+ + "b\u0000\u0000\u0269\u026a\u0005u\u0000\u0000\u026a\u026b\u0005t\u0000"+ + "\u0000\u026b\u026c\u0005e\u0000\u0000\u026cX\u0001\u0000\u0000\u0000\u026d"+ + "\u026e\u0005a\u0000\u0000\u026e\u026f\u0005s\u0000\u0000\u026f\u0270\u0005"+ + "s\u0000\u0000\u0270\u0271\u0005o\u0000\u0000\u0271\u0272\u0005c\u0000"+ + "\u0000\u0272\u0273\u0005i\u0000\u0000\u0273\u0274\u0005a\u0000\u0000\u0274"+ + "\u0275\u0005t\u0000\u0000\u0275\u0276\u0005i\u0000\u0000\u0276\u0277\u0005"+ + "o\u0000\u0000\u0277\u0278\u0005n\u0000\u0000\u0278\u0279\u0005s\u0000"+ + "\u0000\u0279Z\u0001\u0000\u0000\u0000\u027a\u027b\u0005b\u0000\u0000\u027b"+ + "\u027c\u0005r\u0000\u0000\u027c\u027d\u0005e\u0000\u0000\u027d\u027e\u0005"+ + "a\u0000\u0000\u027e\u027f\u0005k\u0000\u0000\u027f\\\u0001\u0000\u0000"+ + "\u0000\u0280\u0281\u0005d\u0000\u0000\u0281\u0282\u0005e\u0000\u0000\u0282"+ + "\u0283\u0005f\u0000\u0000\u0283\u0284\u0005a\u0000\u0000\u0284\u0285\u0005"+ + "u\u0000\u0000\u0285\u0286\u0005l\u0000\u0000\u0286\u0287\u0005t\u0000"+ + "\u0000\u0287^\u0001\u0000\u0000\u0000\u0288\u0289\u0005m\u0000\u0000\u0289"+ + "\u028a\u0005a\u0000\u0000\u028a\u028b\u0005p\u0000\u0000\u028b`\u0001"+ + "\u0000\u0000\u0000\u028c\u028d\u0005e\u0000\u0000\u028d\u028e\u0005l\u0000"+ + "\u0000\u028e\u028f\u0005s\u0000\u0000\u028f\u0290\u0005e\u0000\u0000\u0290"+ + "b\u0001\u0000\u0000\u0000\u0291\u0292\u0005c\u0000\u0000\u0292\u0293\u0005"+ + "o\u0000\u0000\u0293\u0294\u0005n\u0000\u0000\u0294\u0295\u0005s\u0000"+ + "\u0000\u0295\u0296\u0005t\u0000\u0000\u0296d\u0001\u0000\u0000\u0000\u0297"+ + "\u0298\u0005i\u0000\u0000\u0298\u0299\u0005f\u0000\u0000\u0299f\u0001"+ + "\u0000\u0000\u0000\u029a\u029b\u0005r\u0000\u0000\u029b\u029c\u0005a\u0000"+ + "\u0000\u029c\u029d\u0005n\u0000\u0000\u029d\u029e\u0005g\u0000\u0000\u029e"+ + "\u029f\u0005e\u0000\u0000\u029fh\u0001\u0000\u0000\u0000\u02a0\u02a1\u0005"+ + "c\u0000\u0000\u02a1\u02a2\u0005o\u0000\u0000\u02a2\u02a3\u0005n\u0000"+ + "\u0000\u02a3\u02a4\u0005t\u0000\u0000\u02a4\u02a5\u0005i\u0000\u0000\u02a5"+ + "\u02a6\u0005n\u0000\u0000\u02a6\u02a7\u0005u\u0000\u0000\u02a7\u02a8\u0005"+ + "e\u0000\u0000\u02a8j\u0001\u0000\u0000\u0000\u02a9\u02aa\u0005f\u0000"+ + "\u0000\u02aa\u02ab\u0005o\u0000\u0000\u02ab\u02ac\u0005r\u0000\u0000\u02ac"+ + "\u02ad\u0005e\u0000\u0000\u02ad\u02ae\u0005a\u0000\u0000\u02ae\u02af\u0005"+ + "c\u0000\u0000\u02af\u02b0\u0005h\u0000\u0000\u02b0l\u0001\u0000\u0000"+ + "\u0000\u02b1\u02b2\u0005r\u0000\u0000\u02b2\u02b3\u0005e\u0000\u0000\u02b3"+ + "\u02b4\u0005t\u0000\u0000\u02b4\u02b5\u0005u\u0000\u0000\u02b5\u02b6\u0005"+ + "r\u0000\u0000\u02b6\u02b7\u0005n\u0000\u0000\u02b7n\u0001\u0000\u0000"+ + "\u0000\u02b8\u02b9\u0005v\u0000\u0000\u02b9\u02ba\u0005a\u0000\u0000\u02ba"+ + "\u02bb\u0005r\u0000\u0000\u02bbp\u0001\u0000\u0000\u0000\u02bc\u02bd\u0005"+ + "s\u0000\u0000\u02bd\u02be\u0005t\u0000\u0000\u02be\u02bf\u0005r\u0000"+ + "\u0000\u02bf\u02c0\u0005i\u0000\u0000\u02c0\u02c1\u0005n\u0000\u0000\u02c1"+ + "\u02c2\u0005g\u0000\u0000\u02c2r\u0001\u0000\u0000\u0000\u02c3\u02c4\u0005"+ + "b\u0000\u0000\u02c4\u02c5\u0005o\u0000\u0000\u02c5\u02c6\u0005o\u0000"+ + "\u0000\u02c6\u02c7\u0005l\u0000\u0000\u02c7t\u0001\u0000\u0000\u0000\u02c8"+ + "\u02c9\u0005v\u0000\u0000\u02c9\u02ca\u0005o\u0000\u0000\u02ca\u02cb\u0005"+ + "i\u0000\u0000\u02cb\u02cc\u0005d\u0000\u0000\u02ccv\u0001\u0000\u0000"+ + "\u0000\u02cd\u02ce\u0005a\u0000\u0000\u02ce\u02cf\u0005r\u0000\u0000\u02cf"+ + "\u02d0\u0005r\u0000\u0000\u02d0\u02d1\u0005a\u0000\u0000\u02d1\u02d2\u0005"+ + "y\u0000\u0000\u02d2x\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005n\u0000"+ + "\u0000\u02d4\u02d5\u0005i\u0000\u0000\u02d5\u02d6\u0005l\u0000\u0000\u02d6"+ + "z\u0001\u0000\u0000\u0000\u02d7\u02d8\u0005t\u0000\u0000\u02d8\u02d9\u0005"+ + "r\u0000\u0000\u02d9\u02da\u0005u\u0000\u0000\u02da\u02db\u0005e\u0000"+ + "\u0000\u02db|\u0001\u0000\u0000\u0000\u02dc\u02dd\u0005f\u0000\u0000\u02dd"+ + "\u02de\u0005a\u0000\u0000\u02de\u02df\u0005l\u0000\u0000\u02df\u02e0\u0005"+ + "s\u0000\u0000\u02e0\u02e1\u0005e\u0000\u0000\u02e1~\u0001\u0000\u0000"+ + "\u0000\u02e2\u02e4\u0007\u0002\u0000\u0000\u02e3\u02e2\u0001\u0000\u0000"+ + "\u0000\u02e4\u02e5\u0001\u0000\u0000\u0000\u02e5\u02e3\u0001\u0000\u0000"+ + "\u0000\u02e5\u02e6\u0001\u0000\u0000\u0000\u02e6\u0080\u0001\u0000\u0000"+ + "\u0000\u02e7\u02e8\u0005(\u0000\u0000\u02e8\u0082\u0001\u0000\u0000\u0000"+ + "\u02e9\u02ea\u0005)\u0000\u0000\u02ea\u0084\u0001\u0000\u0000\u0000\u02eb"+ + "\u02ec\u0005{\u0000\u0000\u02ec\u0086\u0001\u0000\u0000\u0000\u02ed\u02ee"+ + "\u0005}\u0000\u0000\u02ee\u0088\u0001\u0000\u0000\u0000\u02ef\u02f0\u0005"+ + "[\u0000\u0000\u02f0\u008a\u0001\u0000\u0000\u0000\u02f1\u02f2\u0005]\u0000"+ + "\u0000\u02f2\u008c\u0001\u0000\u0000\u0000\u02f3\u02f4\u0005=\u0000\u0000"+ + "\u02f4\u008e\u0001\u0000\u0000\u0000\u02f5\u02f6\u0005,\u0000\u0000\u02f6"+ + "\u0090\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005;\u0000\u0000\u02f8\u0092"+ + "\u0001\u0000\u0000\u0000\u02f9\u02fa\u0005:\u0000\u0000\u02fa\u0094\u0001"+ + "\u0000\u0000\u0000\u02fb\u02fc\u0005.\u0000\u0000\u02fc\u0096\u0001\u0000"+ + "\u0000\u0000\u02fd\u02fe\u0005:\u0000\u0000\u02fe\u02ff\u0005=\u0000\u0000"+ + "\u02ff\u0098\u0001\u0000\u0000\u0000\u0300\u0301\u0005|\u0000\u0000\u0301"+ + "\u0302\u0005|\u0000\u0000\u0302\u009a\u0001\u0000\u0000\u0000\u0303\u0304"+ + "\u0005&\u0000\u0000\u0304\u0305\u0005&\u0000\u0000\u0305\u009c\u0001\u0000"+ + "\u0000\u0000\u0306\u0307\u0005=\u0000\u0000\u0307\u0308\u0005=\u0000\u0000"+ + "\u0308\u009e\u0001\u0000\u0000\u0000\u0309\u030a\u0005!\u0000\u0000\u030a"+ + "\u030b\u0005=\u0000\u0000\u030b\u00a0\u0001\u0000\u0000\u0000\u030c\u030d"+ + "\u0005!\u0000\u0000\u030d\u00a2\u0001\u0000\u0000\u0000\u030e\u030f\u0005"+ + "+\u0000\u0000\u030f\u00a4\u0001\u0000\u0000\u0000\u0310\u0315\u0005\""+ + "\u0000\u0000\u0311\u0314\b\u0003\u0000\u0000\u0312\u0314\u0003\u00adV"+ + "\u0000\u0313\u0311\u0001\u0000\u0000\u0000\u0313\u0312\u0001\u0000\u0000"+ + "\u0000\u0314\u0317\u0001\u0000\u0000\u0000\u0315\u0313\u0001\u0000\u0000"+ + "\u0000\u0315\u0316\u0001\u0000\u0000\u0000\u0316\u0318\u0001\u0000\u0000"+ + "\u0000\u0317\u0315\u0001\u0000\u0000\u0000\u0318\u0319\u0005\"\u0000\u0000"+ + "\u0319\u00a6\u0001\u0000\u0000\u0000\u031a\u031c\u0007\u0004\u0000\u0000"+ + "\u031b\u031a\u0001\u0000\u0000\u0000\u031c\u031d\u0001\u0000\u0000\u0000"+ + "\u031d\u031b\u0001\u0000\u0000\u0000\u031d\u031e\u0001\u0000\u0000\u0000"+ + "\u031e\u031f\u0001\u0000\u0000\u0000\u031f\u0320\u0006S\u0000\u0000\u0320"+ + "\u00a8\u0001\u0000\u0000\u0000\u0321\u0322\u0005/\u0000\u0000\u0322\u0323"+ + "\u0005*\u0000\u0000\u0323\u0327\u0001\u0000\u0000\u0000\u0324\u0326\t"+ + "\u0000\u0000\u0000\u0325\u0324\u0001\u0000\u0000\u0000\u0326\u0329\u0001"+ + "\u0000\u0000\u0000\u0327\u0328\u0001\u0000\u0000\u0000\u0327\u0325\u0001"+ + "\u0000\u0000\u0000\u0328\u032a\u0001\u0000\u0000\u0000\u0329\u0327\u0001"+ + "\u0000\u0000\u0000\u032a\u032b\u0005*\u0000\u0000\u032b\u032c\u0005/\u0000"+ + "\u0000\u032c\u032d\u0001\u0000\u0000\u0000\u032d\u032e\u0006T\u0000\u0000"+ + "\u032e\u00aa\u0001\u0000\u0000\u0000\u032f\u0330\u0005/\u0000\u0000\u0330"+ + "\u0331\u0005/\u0000\u0000\u0331\u0335\u0001\u0000\u0000\u0000\u0332\u0334"+ + "\b\u0005\u0000\u0000\u0333\u0332\u0001\u0000\u0000\u0000\u0334\u0337\u0001"+ + "\u0000\u0000\u0000\u0335\u0333\u0001\u0000\u0000\u0000\u0335\u0336\u0001"+ + "\u0000\u0000\u0000\u0336\u0338\u0001\u0000\u0000\u0000\u0337\u0335\u0001"+ + "\u0000\u0000\u0000\u0338\u0339\u0006U\u0000\u0000\u0339\u00ac\u0001\u0000"+ + "\u0000\u0000\u033a\u033b\u0005\\\u0000\u0000\u033b\u0350\u0007\u0006\u0000"+ + "\u0000\u033c\u0341\u0005\\\u0000\u0000\u033d\u033f\u0007\u0007\u0000\u0000"+ + "\u033e\u033d\u0001\u0000\u0000\u0000\u033e\u033f\u0001\u0000\u0000\u0000"+ + "\u033f\u0340\u0001\u0000\u0000\u0000\u0340\u0342\u0007\b\u0000\u0000\u0341"+ + "\u033e\u0001\u0000\u0000\u0000\u0341\u0342\u0001\u0000\u0000\u0000\u0342"+ + "\u0343\u0001\u0000\u0000\u0000\u0343\u0350\u0007\b\u0000\u0000\u0344\u0346"+ + "\u0005\\\u0000\u0000\u0345\u0347\u0005u\u0000\u0000\u0346\u0345\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0001\u0000\u0000\u0000\u0348\u0346\u0001"+ + "\u0000\u0000\u0000\u0348\u0349\u0001\u0000\u0000\u0000\u0349\u034a\u0001"+ + "\u0000\u0000\u0000\u034a\u034b\u0003\u00b1X\u0000\u034b\u034c\u0003\u00b1"+ + "X\u0000\u034c\u034d\u0003\u00b1X\u0000\u034d\u034e\u0003\u00b1X\u0000"+ + "\u034e\u0350\u0001\u0000\u0000\u0000\u034f\u033a\u0001\u0000\u0000\u0000"+ + "\u034f\u033c\u0001\u0000\u0000\u0000\u034f\u0344\u0001\u0000\u0000\u0000"+ + "\u0350\u00ae\u0001\u0000\u0000\u0000\u0351\u035a\u0003\u00b1X\u0000\u0352"+ + "\u0355\u0003\u00b1X\u0000\u0353\u0355\u0005_\u0000\u0000\u0354\u0352\u0001"+ + "\u0000\u0000\u0000\u0354\u0353\u0001\u0000\u0000\u0000\u0355\u0358\u0001"+ + "\u0000\u0000\u0000\u0356\u0354\u0001\u0000\u0000\u0000\u0356\u0357\u0001"+ + "\u0000\u0000\u0000\u0357\u0359\u0001\u0000\u0000\u0000\u0358\u0356\u0001"+ + "\u0000\u0000\u0000\u0359\u035b\u0003\u00b1X\u0000\u035a\u0356\u0001\u0000"+ + "\u0000\u0000\u035a\u035b\u0001\u0000\u0000\u0000\u035b\u00b0\u0001\u0000"+ + "\u0000\u0000\u035c\u035d\u0007\t\u0000\u0000\u035d\u00b2\u0001\u0000\u0000"+ + "\u0000\u0017\u0000\u00f0\u013d\u01f7\u020d\u0221\u0238\u0251\u025a\u0261"+ + "\u02e5\u0313\u0315\u031d\u0327\u0335\u033e\u0341\u0348\u034f\u0354\u0356"+ + "\u035a\u0001\u0000\u0001\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.tokens b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.tokens new file mode 100644 index 000000000..c0f8a0d1b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLLexer.tokens @@ -0,0 +1,158 @@ +OPERATION=1 +NODEOP=2 +CHECK=3 +ROUTINE=4 +CREATE=5 +DELETE=6 +POLICY_ELEMENT=7 +CONTAINED=8 +RULE=9 +WHEN=10 +PERFORMS=11 +AS=12 +ON=13 +IN=14 +DO=15 +ANY=16 +ASCENDANT_OF=17 +INTERSECTION=18 +UNION=19 +PROCESS=20 +SET_RESOURCE_OPERATIONS=21 +ASSIGN=22 +DEASSIGN=23 +FROM=24 +SET_PROPERTIES=25 +WITH_PROPERTIES=26 +OF=27 +TO=28 +ASSOCIATE=29 +AND=30 +WITH=31 +DISSOCIATE=32 +DENY=33 +PROHIBITION=34 +OBLIGATION=35 +ACCESS_RIGHTS=36 +POLICY_CLASS=37 +OBJECT_ATTRIBUTE=38 +USER_ATTRIBUTE=39 +USER_ATTRIBUTES=40 +OBJECT_ATTRIBUTES=41 +OBJECT=42 +USER=43 +ATTRIBUTE=44 +ASSOCIATIONS=45 +BREAK=46 +DEFAULT=47 +MAP=48 +ELSE=49 +CONST=50 +IF=51 +RANGE=52 +CONTINUE=53 +FOREACH=54 +RETURN=55 +VAR=56 +STRING_TYPE=57 +BOOL_TYPE=58 +VOID_TYPE=59 +ARRAY_TYPE=60 +NIL_LIT=61 +TRUE=62 +FALSE=63 +ID=64 +OPEN_PAREN=65 +CLOSE_PAREN=66 +OPEN_CURLY=67 +CLOSE_CURLY=68 +OPEN_BRACKET=69 +CLOSE_BRACKET=70 +ASSIGN_EQUALS=71 +COMMA=72 +SEMI=73 +COLON=74 +DOT=75 +DECLARE_ASSIGN=76 +LOGICAL_OR=77 +LOGICAL_AND=78 +EQUALS=79 +NOT_EQUALS=80 +EXCLAMATION=81 +PLUS=82 +DOUBLE_QUOTE_STRING=83 +WS=84 +COMMENT=85 +LINE_COMMENT=86 +'operation'=1 +'nodeop'=2 +'check'=3 +'routine'=4 +'create'=5 +'delete'=6 +'contained'=8 +'rule'=9 +'when'=10 +'performs'=11 +'as'=12 +'on'=13 +'in'=14 +'do'=15 +'any'=16 +'ascendant of'=17 +'union'=19 +'process'=20 +'set resource operations'=21 +'assign'=22 +'deassign'=23 +'from'=24 +'set properties'=25 +'with properties'=26 +'of'=27 +'to'=28 +'associate'=29 +'and'=30 +'with'=31 +'dissociate'=32 +'deny'=33 +'prohibition'=34 +'obligation'=35 +'access rights'=36 +'attribute'=44 +'associations'=45 +'break'=46 +'default'=47 +'map'=48 +'else'=49 +'const'=50 +'if'=51 +'range'=52 +'continue'=53 +'foreach'=54 +'return'=55 +'var'=56 +'string'=57 +'bool'=58 +'void'=59 +'array'=60 +'nil'=61 +'true'=62 +'false'=63 +'('=65 +')'=66 +'{'=67 +'}'=68 +'['=69 +']'=70 +'='=71 +','=72 +';'=73 +':'=74 +'.'=75 +':='=76 +'||'=77 +'&&'=78 +'=='=79 +'!='=80 +'!'=81 +'+'=82 diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.g4 b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.g4 new file mode 100644 index 000000000..cbff1633a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.g4 @@ -0,0 +1,221 @@ +parser grammar PMLParser; + +options { + tokenVocab = PMLLexer; +} + +pml: (statement)* EOF ; + +statement: ( + variableAssignmentStatement + | variableDeclarationStatement + | foreachStatement + | returnStatement + | breakStatement + | continueStatement + | functionInvokeStatement + | ifStatement + | createPolicyStatement + | createNonPCStatement + | createObligationStatement + | createProhibitionStatement + | setNodePropertiesStatement + | assignStatement + | deassignStatement + | associateStatement + | dissociateStatement + | setResourceOperationsStatement + | deleteStatement + | deleteRuleStatement + | functionDefinitionStatement +) ; + +statementBlock: OPEN_CURLY statement* CLOSE_CURLY ; + +createPolicyStatement: CREATE POLICY_CLASS name=expression; + +createNonPCStatement: + CREATE nonPCNodeType name=expression + IN in=expression ; +nonPCNodeType: + (OBJECT_ATTRIBUTE | USER_ATTRIBUTE | OBJECT | USER) ; + +createObligationStatement: + CREATE OBLIGATION expression OPEN_CURLY createRuleStatement* CLOSE_CURLY; +createRuleStatement: + CREATE RULE ruleName=expression + WHEN subjectPattern + PERFORMS operationPattern + (ON operandPattern)? + response ; + +// subject +subjectPattern: + ANY USER #AnyUserPattern + | USER subjectPatternExpression #UserPattern; + +subjectPatternExpression: + basicSubjectPatternExpr #BasicSubjectPatternExpression + | EXCLAMATION subjectPatternExpression #NegateSubjectPatternExpression + | OPEN_PAREN subjectPatternExpression CLOSE_PAREN #ParenSubjectPatternExpression + | left=subjectPatternExpression (LOGICAL_AND | LOGICAL_OR) right=subjectPatternExpression #LogicalSubjectPatternExpression ; + +basicSubjectPatternExpr: + IN stringLit #InSubject + | stringLit #UsernameSubject + | PROCESS stringLit #ProcessSubject ; + +// operation +operationPattern: + ANY OPERATION #AnyOperation + | stringLit #IDOperation ; + +// operands +operandPattern: OPEN_CURLY (operandPatternElement (COMMA operandPatternElement)*)? CLOSE_CURLY ; +operandPatternElement: key=ID COLON (single=operandPatternExpression | multiple=operandPatternExpressionArray); + +operandPatternExpressionArray: OPEN_BRACKET operandPatternExpression (COMMA operandPatternExpression)* CLOSE_BRACKET ; + +operandPatternExpression: + basicOperandPatternExpr #BasicOperandPatternExpression + | EXCLAMATION operandPatternExpression #NegateOperandPatternExpression + | OPEN_PAREN operandPatternExpression CLOSE_PAREN #ParenOperandPatternExpression + | left=operandPatternExpression (LOGICAL_AND | LOGICAL_OR) right=operandPatternExpression #LogicalOperandPatternExpression ; + +basicOperandPatternExpr: + ANY #AnyPolicyElement + | IN stringLit #InPolicyElement + | stringLit #PolicyElement ; + +// response +response: + DO OPEN_PAREN ID CLOSE_PAREN responseBlock; +responseBlock: + OPEN_CURLY responseStatement* CLOSE_CURLY ; +responseStatement: + statement + | createRuleStatement + | deleteRuleStatement ; + +createProhibitionStatement: + CREATE PROHIBITION name=expression + DENY (USER | USER_ATTRIBUTE | PROCESS) subject=expression + ACCESS_RIGHTS accessRights=expression + ON (INTERSECTION|UNION) OF containers=expression ; + +/* +uncomment for operaiton prohibitions +createProhibitionStatement: + CREATE PROHIBITION name=expression + DENY subject=expression + (ACCESS_RIGHTS accessRights=expression ON containers=expression) #Arset + | (OPERATION op=expression ON operandPatterns=patternMap) #Operation ;*/ + +setNodePropertiesStatement: + SET_PROPERTIES OF name=expression TO properties=expression ; + +assignStatement: + ASSIGN ascendantNode=expression TO descendantNodes=expression ; + +deassignStatement: + DEASSIGN ascendantNode=expression FROM descendantNodes=expression ; + +associateStatement: + ASSOCIATE ua=expression AND target=expression WITH accessRights=expression ; + +dissociateStatement: + DISSOCIATE ua=expression AND target=expression ; + +setResourceOperationsStatement: + SET_RESOURCE_OPERATIONS accessRightsArr=expression; + +deleteStatement: + DELETE deleteType expression ; +deleteType: + nodeType #DeleteNode + | OBLIGATION #DeleteObligation + | PROHIBITION #DeleteProhibition ; +nodeType: + (POLICY_CLASS | OBJECT_ATTRIBUTE | USER_ATTRIBUTE | OBJECT | USER) ; + +deleteRuleStatement: + DELETE RULE ruleName=expression FROM OBLIGATION obligationName=expression ; + +variableDeclarationStatement: + VAR (varSpec | OPEN_PAREN (varSpec)* CLOSE_PAREN) #VarDeclaration + | ID DECLARE_ASSIGN expression #ShortDeclaration; +varSpec: ID ASSIGN_EQUALS expression; + +variableAssignmentStatement: ID PLUS? ASSIGN_EQUALS expression; + +functionDefinitionStatement: functionSignature statementBlock ; +functionSignature: + (ROUTINE | OPERATION) ID OPEN_PAREN formalArgList CLOSE_PAREN + returnType=variableType? + checkStatementBlock?; +formalArgList: (formalArg (COMMA formalArg)*)? ; +formalArg: NODEOP? variableType ID; +returnStatement: RETURN expression?; + +checkStatement: CHECK ar=expression ON target=expression ; +checkStatementBlock: OPEN_CURLY checkStatement* CLOSE_CURLY ; + +idArr: OPEN_BRACKET (ID (COMMA ID)*)? CLOSE_BRACKET ; +functionInvokeStatement: functionInvoke; + +foreachStatement: FOREACH key=ID (COMMA value=ID)? IN expression statementBlock ; +breakStatement: BREAK ; +continueStatement: CONTINUE ; + +ifStatement: + IF condition=expression statementBlock + elseIfStatement* + elseStatement? ; +elseIfStatement: + ELSE IF condition=expression statementBlock ; +elseStatement: + ELSE statementBlock ; + +// basic elements +variableType: + STRING_TYPE #StringType + | BOOL_TYPE #BooleanType + | arrayType #ArrayVarType + | mapType #MapVarType + | ANY #AnyType ; +mapType: MAP OPEN_BRACKET keyType=variableType CLOSE_BRACKET valueType=variableType ; +arrayType: OPEN_BRACKET CLOSE_BRACKET variableType ; + +expression: + functionInvoke #FunctionInvokeExpression + | variableReference #VariableReferenceExpression + | literal #LiteralExpression + | EXCLAMATION expression #NegateExpression + | OPEN_PAREN expression CLOSE_PAREN #ParenExpression + | left=expression PLUS right=expression #PlusExpression + | left=expression (EQUALS | NOT_EQUALS) right=expression #EqualsExpression + | left=expression (LOGICAL_AND | LOGICAL_OR) right=expression #LogicalExpression ; +expressionList: expression (COMMA expression)* ; + +literal: + stringLit #StringLiteral + | boolLit #BoolLiteral + | arrayLit #ArrayLiteral + | mapLit #MapLiteral; +stringLit: DOUBLE_QUOTE_STRING; +boolLit: TRUE | FALSE; +arrayLit: OPEN_BRACKET expressionList? CLOSE_BRACKET ; +stringArrayLit: OPEN_BRACKET (stringLit (COMMA stringLit)*)? CLOSE_BRACKET ; +mapLit: OPEN_CURLY (element (COMMA element)*)? CLOSE_CURLY ; +element: key=expression COLON value=expression ; + +variableReference: + ID #ReferenceByID + | variableReference index #ReferenceByIndex ; +index: + OPEN_BRACKET key=expression CLOSE_BRACKET #BracketIndex + | DOT key=id #DotIndex; +id: ID; + +functionInvoke: ID functionInvokeArgs ; +functionInvokeArgs: OPEN_PAREN expressionList? CLOSE_PAREN ; \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.interp b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.interp new file mode 100644 index 000000000..a15783bc5 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.interp @@ -0,0 +1,249 @@ +token literal names: +null +'operation' +'nodeop' +'check' +'routine' +'create' +'delete' +null +'contained' +'rule' +'when' +'performs' +'as' +'on' +'in' +'do' +'any' +'ascendant of' +null +'union' +'process' +'set resource operations' +'assign' +'deassign' +'from' +'set properties' +'with properties' +'of' +'to' +'associate' +'and' +'with' +'dissociate' +'deny' +'prohibition' +'obligation' +'access rights' +null +null +null +null +null +null +null +'attribute' +'associations' +'break' +'default' +'map' +'else' +'const' +'if' +'range' +'continue' +'foreach' +'return' +'var' +'string' +'bool' +'void' +'array' +'nil' +'true' +'false' +null +'(' +')' +'{' +'}' +'[' +']' +'=' +',' +';' +':' +'.' +':=' +'||' +'&&' +'==' +'!=' +'!' +'+' +null +null +null +null + +token symbolic names: +null +OPERATION +NODEOP +CHECK +ROUTINE +CREATE +DELETE +POLICY_ELEMENT +CONTAINED +RULE +WHEN +PERFORMS +AS +ON +IN +DO +ANY +ASCENDANT_OF +INTERSECTION +UNION +PROCESS +SET_RESOURCE_OPERATIONS +ASSIGN +DEASSIGN +FROM +SET_PROPERTIES +WITH_PROPERTIES +OF +TO +ASSOCIATE +AND +WITH +DISSOCIATE +DENY +PROHIBITION +OBLIGATION +ACCESS_RIGHTS +POLICY_CLASS +OBJECT_ATTRIBUTE +USER_ATTRIBUTE +USER_ATTRIBUTES +OBJECT_ATTRIBUTES +OBJECT +USER +ATTRIBUTE +ASSOCIATIONS +BREAK +DEFAULT +MAP +ELSE +CONST +IF +RANGE +CONTINUE +FOREACH +RETURN +VAR +STRING_TYPE +BOOL_TYPE +VOID_TYPE +ARRAY_TYPE +NIL_LIT +TRUE +FALSE +ID +OPEN_PAREN +CLOSE_PAREN +OPEN_CURLY +CLOSE_CURLY +OPEN_BRACKET +CLOSE_BRACKET +ASSIGN_EQUALS +COMMA +SEMI +COLON +DOT +DECLARE_ASSIGN +LOGICAL_OR +LOGICAL_AND +EQUALS +NOT_EQUALS +EXCLAMATION +PLUS +DOUBLE_QUOTE_STRING +WS +COMMENT +LINE_COMMENT + +rule names: +pml +statement +statementBlock +createPolicyStatement +createNonPCStatement +nonPCNodeType +createObligationStatement +createRuleStatement +subjectPattern +subjectPatternExpression +basicSubjectPatternExpr +operationPattern +operandPattern +operandPatternElement +operandPatternExpressionArray +operandPatternExpression +basicOperandPatternExpr +response +responseBlock +responseStatement +createProhibitionStatement +setNodePropertiesStatement +assignStatement +deassignStatement +associateStatement +dissociateStatement +setResourceOperationsStatement +deleteStatement +deleteType +nodeType +deleteRuleStatement +variableDeclarationStatement +varSpec +variableAssignmentStatement +functionDefinitionStatement +functionSignature +formalArgList +formalArg +returnStatement +checkStatement +checkStatementBlock +idArr +functionInvokeStatement +foreachStatement +breakStatement +continueStatement +ifStatement +elseIfStatement +elseStatement +variableType +mapType +arrayType +expression +expressionList +literal +stringLit +boolLit +arrayLit +stringArrayLit +mapLit +element +variableReference +index +id +functionInvoke +functionInvokeArgs + + +atn: +[4, 1, 86, 633, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 1, 0, 5, 0, 134, 8, 0, 10, 0, 12, 0, 137, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 162, 8, 1, 1, 2, 1, 2, 5, 2, 166, 8, 2, 10, 2, 12, 2, 169, 9, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 5, 6, 190, 8, 6, 10, 6, 12, 6, 193, 9, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 206, 8, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 214, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 224, 8, 9, 1, 9, 1, 9, 1, 9, 5, 9, 229, 8, 9, 10, 9, 12, 9, 232, 9, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 239, 8, 10, 1, 11, 1, 11, 1, 11, 3, 11, 244, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 250, 8, 12, 10, 12, 12, 12, 253, 9, 12, 3, 12, 255, 8, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 263, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 269, 8, 14, 10, 14, 12, 14, 272, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 284, 8, 15, 1, 15, 1, 15, 1, 15, 5, 15, 289, 8, 15, 10, 15, 12, 15, 292, 9, 15, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 298, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 308, 8, 18, 10, 18, 12, 18, 311, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 318, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 3, 28, 371, 8, 28, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 386, 8, 31, 10, 31, 12, 31, 389, 9, 31, 1, 31, 3, 31, 392, 8, 31, 1, 31, 1, 31, 1, 31, 3, 31, 397, 8, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 3, 33, 405, 8, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 419, 8, 35, 1, 35, 3, 35, 422, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 427, 8, 36, 10, 36, 12, 36, 430, 9, 36, 3, 36, 432, 8, 36, 1, 37, 3, 37, 435, 8, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 3, 38, 442, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 5, 40, 451, 8, 40, 10, 40, 12, 40, 454, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 462, 8, 41, 10, 41, 12, 41, 465, 9, 41, 3, 41, 467, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 477, 8, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 491, 8, 46, 10, 46, 12, 46, 494, 9, 46, 1, 46, 3, 46, 497, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 512, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 534, 8, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 5, 52, 545, 8, 52, 10, 52, 12, 52, 548, 9, 52, 1, 53, 1, 53, 1, 53, 5, 53, 553, 8, 53, 10, 53, 12, 53, 556, 9, 53, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 562, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 3, 57, 570, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 578, 8, 58, 10, 58, 12, 58, 581, 9, 58, 3, 58, 583, 8, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 591, 8, 59, 10, 59, 12, 59, 594, 9, 59, 3, 59, 596, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 609, 8, 61, 10, 61, 12, 61, 612, 9, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 620, 8, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 3, 65, 629, 8, 65, 1, 65, 1, 65, 1, 65, 0, 4, 18, 30, 104, 122, 66, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 0, 8, 2, 0, 38, 39, 42, 43, 1, 0, 77, 78, 3, 0, 20, 20, 39, 39, 43, 43, 1, 0, 18, 19, 2, 0, 37, 39, 42, 43, 2, 0, 1, 1, 4, 4, 1, 0, 79, 80, 1, 0, 62, 63, 650, 0, 135, 1, 0, 0, 0, 2, 161, 1, 0, 0, 0, 4, 163, 1, 0, 0, 0, 6, 172, 1, 0, 0, 0, 8, 176, 1, 0, 0, 0, 10, 182, 1, 0, 0, 0, 12, 184, 1, 0, 0, 0, 14, 196, 1, 0, 0, 0, 16, 213, 1, 0, 0, 0, 18, 223, 1, 0, 0, 0, 20, 238, 1, 0, 0, 0, 22, 243, 1, 0, 0, 0, 24, 245, 1, 0, 0, 0, 26, 258, 1, 0, 0, 0, 28, 264, 1, 0, 0, 0, 30, 283, 1, 0, 0, 0, 32, 297, 1, 0, 0, 0, 34, 299, 1, 0, 0, 0, 36, 305, 1, 0, 0, 0, 38, 317, 1, 0, 0, 0, 40, 319, 1, 0, 0, 0, 42, 332, 1, 0, 0, 0, 44, 338, 1, 0, 0, 0, 46, 343, 1, 0, 0, 0, 48, 348, 1, 0, 0, 0, 50, 355, 1, 0, 0, 0, 52, 360, 1, 0, 0, 0, 54, 363, 1, 0, 0, 0, 56, 370, 1, 0, 0, 0, 58, 372, 1, 0, 0, 0, 60, 374, 1, 0, 0, 0, 62, 396, 1, 0, 0, 0, 64, 398, 1, 0, 0, 0, 66, 402, 1, 0, 0, 0, 68, 409, 1, 0, 0, 0, 70, 412, 1, 0, 0, 0, 72, 431, 1, 0, 0, 0, 74, 434, 1, 0, 0, 0, 76, 439, 1, 0, 0, 0, 78, 443, 1, 0, 0, 0, 80, 448, 1, 0, 0, 0, 82, 457, 1, 0, 0, 0, 84, 470, 1, 0, 0, 0, 86, 472, 1, 0, 0, 0, 88, 482, 1, 0, 0, 0, 90, 484, 1, 0, 0, 0, 92, 486, 1, 0, 0, 0, 94, 498, 1, 0, 0, 0, 96, 503, 1, 0, 0, 0, 98, 511, 1, 0, 0, 0, 100, 513, 1, 0, 0, 0, 102, 519, 1, 0, 0, 0, 104, 533, 1, 0, 0, 0, 106, 549, 1, 0, 0, 0, 108, 561, 1, 0, 0, 0, 110, 563, 1, 0, 0, 0, 112, 565, 1, 0, 0, 0, 114, 567, 1, 0, 0, 0, 116, 573, 1, 0, 0, 0, 118, 586, 1, 0, 0, 0, 120, 599, 1, 0, 0, 0, 122, 603, 1, 0, 0, 0, 124, 619, 1, 0, 0, 0, 126, 621, 1, 0, 0, 0, 128, 623, 1, 0, 0, 0, 130, 626, 1, 0, 0, 0, 132, 134, 3, 2, 1, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 0, 0, 1, 139, 1, 1, 0, 0, 0, 140, 162, 3, 66, 33, 0, 141, 162, 3, 62, 31, 0, 142, 162, 3, 86, 43, 0, 143, 162, 3, 76, 38, 0, 144, 162, 3, 88, 44, 0, 145, 162, 3, 90, 45, 0, 146, 162, 3, 84, 42, 0, 147, 162, 3, 92, 46, 0, 148, 162, 3, 6, 3, 0, 149, 162, 3, 8, 4, 0, 150, 162, 3, 12, 6, 0, 151, 162, 3, 40, 20, 0, 152, 162, 3, 42, 21, 0, 153, 162, 3, 44, 22, 0, 154, 162, 3, 46, 23, 0, 155, 162, 3, 48, 24, 0, 156, 162, 3, 50, 25, 0, 157, 162, 3, 52, 26, 0, 158, 162, 3, 54, 27, 0, 159, 162, 3, 60, 30, 0, 160, 162, 3, 68, 34, 0, 161, 140, 1, 0, 0, 0, 161, 141, 1, 0, 0, 0, 161, 142, 1, 0, 0, 0, 161, 143, 1, 0, 0, 0, 161, 144, 1, 0, 0, 0, 161, 145, 1, 0, 0, 0, 161, 146, 1, 0, 0, 0, 161, 147, 1, 0, 0, 0, 161, 148, 1, 0, 0, 0, 161, 149, 1, 0, 0, 0, 161, 150, 1, 0, 0, 0, 161, 151, 1, 0, 0, 0, 161, 152, 1, 0, 0, 0, 161, 153, 1, 0, 0, 0, 161, 154, 1, 0, 0, 0, 161, 155, 1, 0, 0, 0, 161, 156, 1, 0, 0, 0, 161, 157, 1, 0, 0, 0, 161, 158, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 161, 160, 1, 0, 0, 0, 162, 3, 1, 0, 0, 0, 163, 167, 5, 67, 0, 0, 164, 166, 3, 2, 1, 0, 165, 164, 1, 0, 0, 0, 166, 169, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 168, 1, 0, 0, 0, 168, 170, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 170, 171, 5, 68, 0, 0, 171, 5, 1, 0, 0, 0, 172, 173, 5, 5, 0, 0, 173, 174, 5, 37, 0, 0, 174, 175, 3, 104, 52, 0, 175, 7, 1, 0, 0, 0, 176, 177, 5, 5, 0, 0, 177, 178, 3, 10, 5, 0, 178, 179, 3, 104, 52, 0, 179, 180, 5, 14, 0, 0, 180, 181, 3, 104, 52, 0, 181, 9, 1, 0, 0, 0, 182, 183, 7, 0, 0, 0, 183, 11, 1, 0, 0, 0, 184, 185, 5, 5, 0, 0, 185, 186, 5, 35, 0, 0, 186, 187, 3, 104, 52, 0, 187, 191, 5, 67, 0, 0, 188, 190, 3, 14, 7, 0, 189, 188, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 194, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 195, 5, 68, 0, 0, 195, 13, 1, 0, 0, 0, 196, 197, 5, 5, 0, 0, 197, 198, 5, 9, 0, 0, 198, 199, 3, 104, 52, 0, 199, 200, 5, 10, 0, 0, 200, 201, 3, 16, 8, 0, 201, 202, 5, 11, 0, 0, 202, 205, 3, 22, 11, 0, 203, 204, 5, 13, 0, 0, 204, 206, 3, 24, 12, 0, 205, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 3, 34, 17, 0, 208, 15, 1, 0, 0, 0, 209, 210, 5, 16, 0, 0, 210, 214, 5, 43, 0, 0, 211, 212, 5, 43, 0, 0, 212, 214, 3, 18, 9, 0, 213, 209, 1, 0, 0, 0, 213, 211, 1, 0, 0, 0, 214, 17, 1, 0, 0, 0, 215, 216, 6, 9, -1, 0, 216, 224, 3, 20, 10, 0, 217, 218, 5, 81, 0, 0, 218, 224, 3, 18, 9, 3, 219, 220, 5, 65, 0, 0, 220, 221, 3, 18, 9, 0, 221, 222, 5, 66, 0, 0, 222, 224, 1, 0, 0, 0, 223, 215, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 224, 230, 1, 0, 0, 0, 225, 226, 10, 1, 0, 0, 226, 227, 7, 1, 0, 0, 227, 229, 3, 18, 9, 2, 228, 225, 1, 0, 0, 0, 229, 232, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 19, 1, 0, 0, 0, 232, 230, 1, 0, 0, 0, 233, 234, 5, 14, 0, 0, 234, 239, 3, 110, 55, 0, 235, 239, 3, 110, 55, 0, 236, 237, 5, 20, 0, 0, 237, 239, 3, 110, 55, 0, 238, 233, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 239, 21, 1, 0, 0, 0, 240, 241, 5, 16, 0, 0, 241, 244, 5, 1, 0, 0, 242, 244, 3, 110, 55, 0, 243, 240, 1, 0, 0, 0, 243, 242, 1, 0, 0, 0, 244, 23, 1, 0, 0, 0, 245, 254, 5, 67, 0, 0, 246, 251, 3, 26, 13, 0, 247, 248, 5, 72, 0, 0, 248, 250, 3, 26, 13, 0, 249, 247, 1, 0, 0, 0, 250, 253, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 254, 246, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 5, 68, 0, 0, 257, 25, 1, 0, 0, 0, 258, 259, 5, 64, 0, 0, 259, 262, 5, 74, 0, 0, 260, 263, 3, 30, 15, 0, 261, 263, 3, 28, 14, 0, 262, 260, 1, 0, 0, 0, 262, 261, 1, 0, 0, 0, 263, 27, 1, 0, 0, 0, 264, 265, 5, 69, 0, 0, 265, 270, 3, 30, 15, 0, 266, 267, 5, 72, 0, 0, 267, 269, 3, 30, 15, 0, 268, 266, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 70, 0, 0, 274, 29, 1, 0, 0, 0, 275, 276, 6, 15, -1, 0, 276, 284, 3, 32, 16, 0, 277, 278, 5, 81, 0, 0, 278, 284, 3, 30, 15, 3, 279, 280, 5, 65, 0, 0, 280, 281, 3, 30, 15, 0, 281, 282, 5, 66, 0, 0, 282, 284, 1, 0, 0, 0, 283, 275, 1, 0, 0, 0, 283, 277, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 284, 290, 1, 0, 0, 0, 285, 286, 10, 1, 0, 0, 286, 287, 7, 1, 0, 0, 287, 289, 3, 30, 15, 2, 288, 285, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 31, 1, 0, 0, 0, 292, 290, 1, 0, 0, 0, 293, 298, 5, 16, 0, 0, 294, 295, 5, 14, 0, 0, 295, 298, 3, 110, 55, 0, 296, 298, 3, 110, 55, 0, 297, 293, 1, 0, 0, 0, 297, 294, 1, 0, 0, 0, 297, 296, 1, 0, 0, 0, 298, 33, 1, 0, 0, 0, 299, 300, 5, 15, 0, 0, 300, 301, 5, 65, 0, 0, 301, 302, 5, 64, 0, 0, 302, 303, 5, 66, 0, 0, 303, 304, 3, 36, 18, 0, 304, 35, 1, 0, 0, 0, 305, 309, 5, 67, 0, 0, 306, 308, 3, 38, 19, 0, 307, 306, 1, 0, 0, 0, 308, 311, 1, 0, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 309, 1, 0, 0, 0, 312, 313, 5, 68, 0, 0, 313, 37, 1, 0, 0, 0, 314, 318, 3, 2, 1, 0, 315, 318, 3, 14, 7, 0, 316, 318, 3, 60, 30, 0, 317, 314, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 316, 1, 0, 0, 0, 318, 39, 1, 0, 0, 0, 319, 320, 5, 5, 0, 0, 320, 321, 5, 34, 0, 0, 321, 322, 3, 104, 52, 0, 322, 323, 5, 33, 0, 0, 323, 324, 7, 2, 0, 0, 324, 325, 3, 104, 52, 0, 325, 326, 5, 36, 0, 0, 326, 327, 3, 104, 52, 0, 327, 328, 5, 13, 0, 0, 328, 329, 7, 3, 0, 0, 329, 330, 5, 27, 0, 0, 330, 331, 3, 104, 52, 0, 331, 41, 1, 0, 0, 0, 332, 333, 5, 25, 0, 0, 333, 334, 5, 27, 0, 0, 334, 335, 3, 104, 52, 0, 335, 336, 5, 28, 0, 0, 336, 337, 3, 104, 52, 0, 337, 43, 1, 0, 0, 0, 338, 339, 5, 22, 0, 0, 339, 340, 3, 104, 52, 0, 340, 341, 5, 28, 0, 0, 341, 342, 3, 104, 52, 0, 342, 45, 1, 0, 0, 0, 343, 344, 5, 23, 0, 0, 344, 345, 3, 104, 52, 0, 345, 346, 5, 24, 0, 0, 346, 347, 3, 104, 52, 0, 347, 47, 1, 0, 0, 0, 348, 349, 5, 29, 0, 0, 349, 350, 3, 104, 52, 0, 350, 351, 5, 30, 0, 0, 351, 352, 3, 104, 52, 0, 352, 353, 5, 31, 0, 0, 353, 354, 3, 104, 52, 0, 354, 49, 1, 0, 0, 0, 355, 356, 5, 32, 0, 0, 356, 357, 3, 104, 52, 0, 357, 358, 5, 30, 0, 0, 358, 359, 3, 104, 52, 0, 359, 51, 1, 0, 0, 0, 360, 361, 5, 21, 0, 0, 361, 362, 3, 104, 52, 0, 362, 53, 1, 0, 0, 0, 363, 364, 5, 6, 0, 0, 364, 365, 3, 56, 28, 0, 365, 366, 3, 104, 52, 0, 366, 55, 1, 0, 0, 0, 367, 371, 3, 58, 29, 0, 368, 371, 5, 35, 0, 0, 369, 371, 5, 34, 0, 0, 370, 367, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 57, 1, 0, 0, 0, 372, 373, 7, 4, 0, 0, 373, 59, 1, 0, 0, 0, 374, 375, 5, 6, 0, 0, 375, 376, 5, 9, 0, 0, 376, 377, 3, 104, 52, 0, 377, 378, 5, 24, 0, 0, 378, 379, 5, 35, 0, 0, 379, 380, 3, 104, 52, 0, 380, 61, 1, 0, 0, 0, 381, 391, 5, 56, 0, 0, 382, 392, 3, 64, 32, 0, 383, 387, 5, 65, 0, 0, 384, 386, 3, 64, 32, 0, 385, 384, 1, 0, 0, 0, 386, 389, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 390, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 390, 392, 5, 66, 0, 0, 391, 382, 1, 0, 0, 0, 391, 383, 1, 0, 0, 0, 392, 397, 1, 0, 0, 0, 393, 394, 5, 64, 0, 0, 394, 395, 5, 76, 0, 0, 395, 397, 3, 104, 52, 0, 396, 381, 1, 0, 0, 0, 396, 393, 1, 0, 0, 0, 397, 63, 1, 0, 0, 0, 398, 399, 5, 64, 0, 0, 399, 400, 5, 71, 0, 0, 400, 401, 3, 104, 52, 0, 401, 65, 1, 0, 0, 0, 402, 404, 5, 64, 0, 0, 403, 405, 5, 82, 0, 0, 404, 403, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 407, 5, 71, 0, 0, 407, 408, 3, 104, 52, 0, 408, 67, 1, 0, 0, 0, 409, 410, 3, 70, 35, 0, 410, 411, 3, 4, 2, 0, 411, 69, 1, 0, 0, 0, 412, 413, 7, 5, 0, 0, 413, 414, 5, 64, 0, 0, 414, 415, 5, 65, 0, 0, 415, 416, 3, 72, 36, 0, 416, 418, 5, 66, 0, 0, 417, 419, 3, 98, 49, 0, 418, 417, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 421, 1, 0, 0, 0, 420, 422, 3, 80, 40, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 71, 1, 0, 0, 0, 423, 428, 3, 74, 37, 0, 424, 425, 5, 72, 0, 0, 425, 427, 3, 74, 37, 0, 426, 424, 1, 0, 0, 0, 427, 430, 1, 0, 0, 0, 428, 426, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 431, 423, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 73, 1, 0, 0, 0, 433, 435, 5, 2, 0, 0, 434, 433, 1, 0, 0, 0, 434, 435, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 3, 98, 49, 0, 437, 438, 5, 64, 0, 0, 438, 75, 1, 0, 0, 0, 439, 441, 5, 55, 0, 0, 440, 442, 3, 104, 52, 0, 441, 440, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 77, 1, 0, 0, 0, 443, 444, 5, 3, 0, 0, 444, 445, 3, 104, 52, 0, 445, 446, 5, 13, 0, 0, 446, 447, 3, 104, 52, 0, 447, 79, 1, 0, 0, 0, 448, 452, 5, 67, 0, 0, 449, 451, 3, 78, 39, 0, 450, 449, 1, 0, 0, 0, 451, 454, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 455, 1, 0, 0, 0, 454, 452, 1, 0, 0, 0, 455, 456, 5, 68, 0, 0, 456, 81, 1, 0, 0, 0, 457, 466, 5, 69, 0, 0, 458, 463, 5, 64, 0, 0, 459, 460, 5, 72, 0, 0, 460, 462, 5, 64, 0, 0, 461, 459, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 458, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 5, 70, 0, 0, 469, 83, 1, 0, 0, 0, 470, 471, 3, 128, 64, 0, 471, 85, 1, 0, 0, 0, 472, 473, 5, 54, 0, 0, 473, 476, 5, 64, 0, 0, 474, 475, 5, 72, 0, 0, 475, 477, 5, 64, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 5, 14, 0, 0, 479, 480, 3, 104, 52, 0, 480, 481, 3, 4, 2, 0, 481, 87, 1, 0, 0, 0, 482, 483, 5, 46, 0, 0, 483, 89, 1, 0, 0, 0, 484, 485, 5, 53, 0, 0, 485, 91, 1, 0, 0, 0, 486, 487, 5, 51, 0, 0, 487, 488, 3, 104, 52, 0, 488, 492, 3, 4, 2, 0, 489, 491, 3, 94, 47, 0, 490, 489, 1, 0, 0, 0, 491, 494, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 496, 1, 0, 0, 0, 494, 492, 1, 0, 0, 0, 495, 497, 3, 96, 48, 0, 496, 495, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 93, 1, 0, 0, 0, 498, 499, 5, 49, 0, 0, 499, 500, 5, 51, 0, 0, 500, 501, 3, 104, 52, 0, 501, 502, 3, 4, 2, 0, 502, 95, 1, 0, 0, 0, 503, 504, 5, 49, 0, 0, 504, 505, 3, 4, 2, 0, 505, 97, 1, 0, 0, 0, 506, 512, 5, 57, 0, 0, 507, 512, 5, 58, 0, 0, 508, 512, 3, 102, 51, 0, 509, 512, 3, 100, 50, 0, 510, 512, 5, 16, 0, 0, 511, 506, 1, 0, 0, 0, 511, 507, 1, 0, 0, 0, 511, 508, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 511, 510, 1, 0, 0, 0, 512, 99, 1, 0, 0, 0, 513, 514, 5, 48, 0, 0, 514, 515, 5, 69, 0, 0, 515, 516, 3, 98, 49, 0, 516, 517, 5, 70, 0, 0, 517, 518, 3, 98, 49, 0, 518, 101, 1, 0, 0, 0, 519, 520, 5, 69, 0, 0, 520, 521, 5, 70, 0, 0, 521, 522, 3, 98, 49, 0, 522, 103, 1, 0, 0, 0, 523, 524, 6, 52, -1, 0, 524, 534, 3, 128, 64, 0, 525, 534, 3, 122, 61, 0, 526, 534, 3, 108, 54, 0, 527, 528, 5, 81, 0, 0, 528, 534, 3, 104, 52, 5, 529, 530, 5, 65, 0, 0, 530, 531, 3, 104, 52, 0, 531, 532, 5, 66, 0, 0, 532, 534, 1, 0, 0, 0, 533, 523, 1, 0, 0, 0, 533, 525, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 527, 1, 0, 0, 0, 533, 529, 1, 0, 0, 0, 534, 546, 1, 0, 0, 0, 535, 536, 10, 3, 0, 0, 536, 537, 5, 82, 0, 0, 537, 545, 3, 104, 52, 4, 538, 539, 10, 2, 0, 0, 539, 540, 7, 6, 0, 0, 540, 545, 3, 104, 52, 3, 541, 542, 10, 1, 0, 0, 542, 543, 7, 1, 0, 0, 543, 545, 3, 104, 52, 2, 544, 535, 1, 0, 0, 0, 544, 538, 1, 0, 0, 0, 544, 541, 1, 0, 0, 0, 545, 548, 1, 0, 0, 0, 546, 544, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 105, 1, 0, 0, 0, 548, 546, 1, 0, 0, 0, 549, 554, 3, 104, 52, 0, 550, 551, 5, 72, 0, 0, 551, 553, 3, 104, 52, 0, 552, 550, 1, 0, 0, 0, 553, 556, 1, 0, 0, 0, 554, 552, 1, 0, 0, 0, 554, 555, 1, 0, 0, 0, 555, 107, 1, 0, 0, 0, 556, 554, 1, 0, 0, 0, 557, 562, 3, 110, 55, 0, 558, 562, 3, 112, 56, 0, 559, 562, 3, 114, 57, 0, 560, 562, 3, 118, 59, 0, 561, 557, 1, 0, 0, 0, 561, 558, 1, 0, 0, 0, 561, 559, 1, 0, 0, 0, 561, 560, 1, 0, 0, 0, 562, 109, 1, 0, 0, 0, 563, 564, 5, 83, 0, 0, 564, 111, 1, 0, 0, 0, 565, 566, 7, 7, 0, 0, 566, 113, 1, 0, 0, 0, 567, 569, 5, 69, 0, 0, 568, 570, 3, 106, 53, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 70, 0, 0, 572, 115, 1, 0, 0, 0, 573, 582, 5, 69, 0, 0, 574, 579, 3, 110, 55, 0, 575, 576, 5, 72, 0, 0, 576, 578, 3, 110, 55, 0, 577, 575, 1, 0, 0, 0, 578, 581, 1, 0, 0, 0, 579, 577, 1, 0, 0, 0, 579, 580, 1, 0, 0, 0, 580, 583, 1, 0, 0, 0, 581, 579, 1, 0, 0, 0, 582, 574, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 585, 5, 70, 0, 0, 585, 117, 1, 0, 0, 0, 586, 595, 5, 67, 0, 0, 587, 592, 3, 120, 60, 0, 588, 589, 5, 72, 0, 0, 589, 591, 3, 120, 60, 0, 590, 588, 1, 0, 0, 0, 591, 594, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 596, 1, 0, 0, 0, 594, 592, 1, 0, 0, 0, 595, 587, 1, 0, 0, 0, 595, 596, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 5, 68, 0, 0, 598, 119, 1, 0, 0, 0, 599, 600, 3, 104, 52, 0, 600, 601, 5, 74, 0, 0, 601, 602, 3, 104, 52, 0, 602, 121, 1, 0, 0, 0, 603, 604, 6, 61, -1, 0, 604, 605, 5, 64, 0, 0, 605, 610, 1, 0, 0, 0, 606, 607, 10, 1, 0, 0, 607, 609, 3, 124, 62, 0, 608, 606, 1, 0, 0, 0, 609, 612, 1, 0, 0, 0, 610, 608, 1, 0, 0, 0, 610, 611, 1, 0, 0, 0, 611, 123, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 614, 5, 69, 0, 0, 614, 615, 3, 104, 52, 0, 615, 616, 5, 70, 0, 0, 616, 620, 1, 0, 0, 0, 617, 618, 5, 75, 0, 0, 618, 620, 3, 126, 63, 0, 619, 613, 1, 0, 0, 0, 619, 617, 1, 0, 0, 0, 620, 125, 1, 0, 0, 0, 621, 622, 5, 64, 0, 0, 622, 127, 1, 0, 0, 0, 623, 624, 5, 64, 0, 0, 624, 625, 3, 130, 65, 0, 625, 129, 1, 0, 0, 0, 626, 628, 5, 65, 0, 0, 627, 629, 3, 106, 53, 0, 628, 627, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 631, 5, 66, 0, 0, 631, 131, 1, 0, 0, 0, 50, 135, 161, 167, 191, 205, 213, 223, 230, 238, 243, 251, 254, 262, 270, 283, 290, 297, 309, 317, 370, 387, 391, 396, 404, 418, 421, 428, 431, 434, 441, 452, 463, 466, 476, 492, 496, 511, 533, 544, 546, 554, 561, 569, 579, 582, 592, 595, 610, 619, 628] \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.java new file mode 100644 index 000000000..69a5445bc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.java @@ -0,0 +1,6127 @@ +// Generated from PMLParser.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast", "CheckReturnValue"}) +public class PMLParser extends Parser { + static { RuntimeMetaData.checkVersion("4.13.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + OPERATION=1, NODEOP=2, CHECK=3, ROUTINE=4, CREATE=5, DELETE=6, POLICY_ELEMENT=7, + CONTAINED=8, RULE=9, WHEN=10, PERFORMS=11, AS=12, ON=13, IN=14, DO=15, + ANY=16, ASCENDANT_OF=17, INTERSECTION=18, UNION=19, PROCESS=20, SET_RESOURCE_OPERATIONS=21, + ASSIGN=22, DEASSIGN=23, FROM=24, SET_PROPERTIES=25, WITH_PROPERTIES=26, + OF=27, TO=28, ASSOCIATE=29, AND=30, WITH=31, DISSOCIATE=32, DENY=33, PROHIBITION=34, + OBLIGATION=35, ACCESS_RIGHTS=36, POLICY_CLASS=37, OBJECT_ATTRIBUTE=38, + USER_ATTRIBUTE=39, USER_ATTRIBUTES=40, OBJECT_ATTRIBUTES=41, OBJECT=42, + USER=43, ATTRIBUTE=44, ASSOCIATIONS=45, BREAK=46, DEFAULT=47, MAP=48, + ELSE=49, CONST=50, IF=51, RANGE=52, CONTINUE=53, FOREACH=54, RETURN=55, + VAR=56, STRING_TYPE=57, BOOL_TYPE=58, VOID_TYPE=59, ARRAY_TYPE=60, NIL_LIT=61, + TRUE=62, FALSE=63, ID=64, OPEN_PAREN=65, CLOSE_PAREN=66, OPEN_CURLY=67, + CLOSE_CURLY=68, OPEN_BRACKET=69, CLOSE_BRACKET=70, ASSIGN_EQUALS=71, COMMA=72, + SEMI=73, COLON=74, DOT=75, DECLARE_ASSIGN=76, LOGICAL_OR=77, LOGICAL_AND=78, + EQUALS=79, NOT_EQUALS=80, EXCLAMATION=81, PLUS=82, DOUBLE_QUOTE_STRING=83, + WS=84, COMMENT=85, LINE_COMMENT=86; + public static final int + RULE_pml = 0, RULE_statement = 1, RULE_statementBlock = 2, RULE_createPolicyStatement = 3, + RULE_createNonPCStatement = 4, RULE_nonPCNodeType = 5, RULE_createObligationStatement = 6, + RULE_createRuleStatement = 7, RULE_subjectPattern = 8, RULE_subjectPatternExpression = 9, + RULE_basicSubjectPatternExpr = 10, RULE_operationPattern = 11, RULE_operandPattern = 12, + RULE_operandPatternElement = 13, RULE_operandPatternExpressionArray = 14, + RULE_operandPatternExpression = 15, RULE_basicOperandPatternExpr = 16, + RULE_response = 17, RULE_responseBlock = 18, RULE_responseStatement = 19, + RULE_createProhibitionStatement = 20, RULE_setNodePropertiesStatement = 21, + RULE_assignStatement = 22, RULE_deassignStatement = 23, RULE_associateStatement = 24, + RULE_dissociateStatement = 25, RULE_setResourceOperationsStatement = 26, + RULE_deleteStatement = 27, RULE_deleteType = 28, RULE_nodeType = 29, RULE_deleteRuleStatement = 30, + RULE_variableDeclarationStatement = 31, RULE_varSpec = 32, RULE_variableAssignmentStatement = 33, + RULE_functionDefinitionStatement = 34, RULE_functionSignature = 35, RULE_formalArgList = 36, + RULE_formalArg = 37, RULE_returnStatement = 38, RULE_checkStatement = 39, + RULE_checkStatementBlock = 40, RULE_idArr = 41, RULE_functionInvokeStatement = 42, + RULE_foreachStatement = 43, RULE_breakStatement = 44, RULE_continueStatement = 45, + RULE_ifStatement = 46, RULE_elseIfStatement = 47, RULE_elseStatement = 48, + RULE_variableType = 49, RULE_mapType = 50, RULE_arrayType = 51, RULE_expression = 52, + RULE_expressionList = 53, RULE_literal = 54, RULE_stringLit = 55, RULE_boolLit = 56, + RULE_arrayLit = 57, RULE_stringArrayLit = 58, RULE_mapLit = 59, RULE_element = 60, + RULE_variableReference = 61, RULE_index = 62, RULE_id = 63, RULE_functionInvoke = 64, + RULE_functionInvokeArgs = 65; + private static String[] makeRuleNames() { + return new String[] { + "pml", "statement", "statementBlock", "createPolicyStatement", "createNonPCStatement", + "nonPCNodeType", "createObligationStatement", "createRuleStatement", + "subjectPattern", "subjectPatternExpression", "basicSubjectPatternExpr", + "operationPattern", "operandPattern", "operandPatternElement", "operandPatternExpressionArray", + "operandPatternExpression", "basicOperandPatternExpr", "response", "responseBlock", + "responseStatement", "createProhibitionStatement", "setNodePropertiesStatement", + "assignStatement", "deassignStatement", "associateStatement", "dissociateStatement", + "setResourceOperationsStatement", "deleteStatement", "deleteType", "nodeType", + "deleteRuleStatement", "variableDeclarationStatement", "varSpec", "variableAssignmentStatement", + "functionDefinitionStatement", "functionSignature", "formalArgList", + "formalArg", "returnStatement", "checkStatement", "checkStatementBlock", + "idArr", "functionInvokeStatement", "foreachStatement", "breakStatement", + "continueStatement", "ifStatement", "elseIfStatement", "elseStatement", + "variableType", "mapType", "arrayType", "expression", "expressionList", + "literal", "stringLit", "boolLit", "arrayLit", "stringArrayLit", "mapLit", + "element", "variableReference", "index", "id", "functionInvoke", "functionInvokeArgs" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'operation'", "'nodeop'", "'check'", "'routine'", "'create'", + "'delete'", null, "'contained'", "'rule'", "'when'", "'performs'", "'as'", + "'on'", "'in'", "'do'", "'any'", "'ascendant of'", null, "'union'", "'process'", + "'set resource operations'", "'assign'", "'deassign'", "'from'", "'set properties'", + "'with properties'", "'of'", "'to'", "'associate'", "'and'", "'with'", + "'dissociate'", "'deny'", "'prohibition'", "'obligation'", "'access rights'", + null, null, null, null, null, null, null, "'attribute'", "'associations'", + "'break'", "'default'", "'map'", "'else'", "'const'", "'if'", "'range'", + "'continue'", "'foreach'", "'return'", "'var'", "'string'", "'bool'", + "'void'", "'array'", "'nil'", "'true'", "'false'", null, "'('", "')'", + "'{'", "'}'", "'['", "']'", "'='", "','", "';'", "':'", "'.'", "':='", + "'||'", "'&&'", "'=='", "'!='", "'!'", "'+'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "OPERATION", "NODEOP", "CHECK", "ROUTINE", "CREATE", "DELETE", + "POLICY_ELEMENT", "CONTAINED", "RULE", "WHEN", "PERFORMS", "AS", "ON", + "IN", "DO", "ANY", "ASCENDANT_OF", "INTERSECTION", "UNION", "PROCESS", + "SET_RESOURCE_OPERATIONS", "ASSIGN", "DEASSIGN", "FROM", "SET_PROPERTIES", + "WITH_PROPERTIES", "OF", "TO", "ASSOCIATE", "AND", "WITH", "DISSOCIATE", + "DENY", "PROHIBITION", "OBLIGATION", "ACCESS_RIGHTS", "POLICY_CLASS", + "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", "USER_ATTRIBUTES", "OBJECT_ATTRIBUTES", + "OBJECT", "USER", "ATTRIBUTE", "ASSOCIATIONS", "BREAK", "DEFAULT", "MAP", + "ELSE", "CONST", "IF", "RANGE", "CONTINUE", "FOREACH", "RETURN", "VAR", + "STRING_TYPE", "BOOL_TYPE", "VOID_TYPE", "ARRAY_TYPE", "NIL_LIT", "TRUE", + "FALSE", "ID", "OPEN_PAREN", "CLOSE_PAREN", "OPEN_CURLY", "CLOSE_CURLY", + "OPEN_BRACKET", "CLOSE_BRACKET", "ASSIGN_EQUALS", "COMMA", "SEMI", "COLON", + "DOT", "DECLARE_ASSIGN", "LOGICAL_OR", "LOGICAL_AND", "EQUALS", "NOT_EQUALS", + "EXCLAMATION", "PLUS", "DOUBLE_QUOTE_STRING", "WS", "COMMENT", "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "PMLParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public PMLParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @SuppressWarnings("CheckReturnValue") + public static class PmlContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(PMLParser.EOF, 0); } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public PmlContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pml; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterPml(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitPml(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitPml(this); + else return visitor.visitChildren(this); + } + } + + public final PmlContext pml() throws RecognitionException { + PmlContext _localctx = new PmlContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_pml); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(135); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 1)) & ~0x3f) == 0 && ((1L << (_la - 1)) & -9154656955725250503L) != 0)) { + { + { + setState(132); + statement(); + } + } + setState(137); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(138); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementContext extends ParserRuleContext { + public VariableAssignmentStatementContext variableAssignmentStatement() { + return getRuleContext(VariableAssignmentStatementContext.class,0); + } + public VariableDeclarationStatementContext variableDeclarationStatement() { + return getRuleContext(VariableDeclarationStatementContext.class,0); + } + public ForeachStatementContext foreachStatement() { + return getRuleContext(ForeachStatementContext.class,0); + } + public ReturnStatementContext returnStatement() { + return getRuleContext(ReturnStatementContext.class,0); + } + public BreakStatementContext breakStatement() { + return getRuleContext(BreakStatementContext.class,0); + } + public ContinueStatementContext continueStatement() { + return getRuleContext(ContinueStatementContext.class,0); + } + public FunctionInvokeStatementContext functionInvokeStatement() { + return getRuleContext(FunctionInvokeStatementContext.class,0); + } + public IfStatementContext ifStatement() { + return getRuleContext(IfStatementContext.class,0); + } + public CreatePolicyStatementContext createPolicyStatement() { + return getRuleContext(CreatePolicyStatementContext.class,0); + } + public CreateNonPCStatementContext createNonPCStatement() { + return getRuleContext(CreateNonPCStatementContext.class,0); + } + public CreateObligationStatementContext createObligationStatement() { + return getRuleContext(CreateObligationStatementContext.class,0); + } + public CreateProhibitionStatementContext createProhibitionStatement() { + return getRuleContext(CreateProhibitionStatementContext.class,0); + } + public SetNodePropertiesStatementContext setNodePropertiesStatement() { + return getRuleContext(SetNodePropertiesStatementContext.class,0); + } + public AssignStatementContext assignStatement() { + return getRuleContext(AssignStatementContext.class,0); + } + public DeassignStatementContext deassignStatement() { + return getRuleContext(DeassignStatementContext.class,0); + } + public AssociateStatementContext associateStatement() { + return getRuleContext(AssociateStatementContext.class,0); + } + public DissociateStatementContext dissociateStatement() { + return getRuleContext(DissociateStatementContext.class,0); + } + public SetResourceOperationsStatementContext setResourceOperationsStatement() { + return getRuleContext(SetResourceOperationsStatementContext.class,0); + } + public DeleteStatementContext deleteStatement() { + return getRuleContext(DeleteStatementContext.class,0); + } + public DeleteRuleStatementContext deleteRuleStatement() { + return getRuleContext(DeleteRuleStatementContext.class,0); + } + public FunctionDefinitionStatementContext functionDefinitionStatement() { + return getRuleContext(FunctionDefinitionStatementContext.class,0); + } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStatement(this); + else return visitor.visitChildren(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_statement); + try { + enterOuterAlt(_localctx, 1); + { + setState(161); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + { + setState(140); + variableAssignmentStatement(); + } + break; + case 2: + { + setState(141); + variableDeclarationStatement(); + } + break; + case 3: + { + setState(142); + foreachStatement(); + } + break; + case 4: + { + setState(143); + returnStatement(); + } + break; + case 5: + { + setState(144); + breakStatement(); + } + break; + case 6: + { + setState(145); + continueStatement(); + } + break; + case 7: + { + setState(146); + functionInvokeStatement(); + } + break; + case 8: + { + setState(147); + ifStatement(); + } + break; + case 9: + { + setState(148); + createPolicyStatement(); + } + break; + case 10: + { + setState(149); + createNonPCStatement(); + } + break; + case 11: + { + setState(150); + createObligationStatement(); + } + break; + case 12: + { + setState(151); + createProhibitionStatement(); + } + break; + case 13: + { + setState(152); + setNodePropertiesStatement(); + } + break; + case 14: + { + setState(153); + assignStatement(); + } + break; + case 15: + { + setState(154); + deassignStatement(); + } + break; + case 16: + { + setState(155); + associateStatement(); + } + break; + case 17: + { + setState(156); + dissociateStatement(); + } + break; + case 18: + { + setState(157); + setResourceOperationsStatement(); + } + break; + case 19: + { + setState(158); + deleteStatement(); + } + break; + case 20: + { + setState(159); + deleteRuleStatement(); + } + break; + case 21: + { + setState(160); + functionDefinitionStatement(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StatementBlockContext extends ParserRuleContext { + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public StatementBlockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statementBlock; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStatementBlock(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStatementBlock(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStatementBlock(this); + else return visitor.visitChildren(this); + } + } + + public final StatementBlockContext statementBlock() throws RecognitionException { + StatementBlockContext _localctx = new StatementBlockContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_statementBlock); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(163); + match(OPEN_CURLY); + setState(167); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 1)) & ~0x3f) == 0 && ((1L << (_la - 1)) & -9154656955725250503L) != 0)) { + { + { + setState(164); + statement(); + } + } + setState(169); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(170); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreatePolicyStatementContext extends ParserRuleContext { + public ExpressionContext name; + public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } + public TerminalNode POLICY_CLASS() { return getToken(PMLParser.POLICY_CLASS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public CreatePolicyStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createPolicyStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCreatePolicyStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCreatePolicyStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCreatePolicyStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CreatePolicyStatementContext createPolicyStatement() throws RecognitionException { + CreatePolicyStatementContext _localctx = new CreatePolicyStatementContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_createPolicyStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(172); + match(CREATE); + setState(173); + match(POLICY_CLASS); + setState(174); + ((CreatePolicyStatementContext)_localctx).name = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreateNonPCStatementContext extends ParserRuleContext { + public ExpressionContext name; + public ExpressionContext in; + public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } + public NonPCNodeTypeContext nonPCNodeType() { + return getRuleContext(NonPCNodeTypeContext.class,0); + } + public TerminalNode IN() { return getToken(PMLParser.IN, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public CreateNonPCStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createNonPCStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCreateNonPCStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCreateNonPCStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCreateNonPCStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CreateNonPCStatementContext createNonPCStatement() throws RecognitionException { + CreateNonPCStatementContext _localctx = new CreateNonPCStatementContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_createNonPCStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(176); + match(CREATE); + setState(177); + nonPCNodeType(); + setState(178); + ((CreateNonPCStatementContext)_localctx).name = expression(0); + setState(179); + match(IN); + setState(180); + ((CreateNonPCStatementContext)_localctx).in = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NonPCNodeTypeContext extends ParserRuleContext { + public TerminalNode OBJECT_ATTRIBUTE() { return getToken(PMLParser.OBJECT_ATTRIBUTE, 0); } + public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } + public TerminalNode OBJECT() { return getToken(PMLParser.OBJECT, 0); } + public TerminalNode USER() { return getToken(PMLParser.USER, 0); } + public NonPCNodeTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nonPCNodeType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterNonPCNodeType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitNonPCNodeType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitNonPCNodeType(this); + else return visitor.visitChildren(this); + } + } + + public final NonPCNodeTypeContext nonPCNodeType() throws RecognitionException { + NonPCNodeTypeContext _localctx = new NonPCNodeTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_nonPCNodeType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(182); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 14018773254144L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreateObligationStatementContext extends ParserRuleContext { + public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } + public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List createRuleStatement() { + return getRuleContexts(CreateRuleStatementContext.class); + } + public CreateRuleStatementContext createRuleStatement(int i) { + return getRuleContext(CreateRuleStatementContext.class,i); + } + public CreateObligationStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createObligationStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCreateObligationStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCreateObligationStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCreateObligationStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CreateObligationStatementContext createObligationStatement() throws RecognitionException { + CreateObligationStatementContext _localctx = new CreateObligationStatementContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_createObligationStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(184); + match(CREATE); + setState(185); + match(OBLIGATION); + setState(186); + expression(0); + setState(187); + match(OPEN_CURLY); + setState(191); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==CREATE) { + { + { + setState(188); + createRuleStatement(); + } + } + setState(193); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(194); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreateRuleStatementContext extends ParserRuleContext { + public ExpressionContext ruleName; + public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } + public TerminalNode RULE() { return getToken(PMLParser.RULE, 0); } + public TerminalNode WHEN() { return getToken(PMLParser.WHEN, 0); } + public SubjectPatternContext subjectPattern() { + return getRuleContext(SubjectPatternContext.class,0); + } + public TerminalNode PERFORMS() { return getToken(PMLParser.PERFORMS, 0); } + public OperationPatternContext operationPattern() { + return getRuleContext(OperationPatternContext.class,0); + } + public ResponseContext response() { + return getRuleContext(ResponseContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode ON() { return getToken(PMLParser.ON, 0); } + public OperandPatternContext operandPattern() { + return getRuleContext(OperandPatternContext.class,0); + } + public CreateRuleStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createRuleStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCreateRuleStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCreateRuleStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCreateRuleStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CreateRuleStatementContext createRuleStatement() throws RecognitionException { + CreateRuleStatementContext _localctx = new CreateRuleStatementContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_createRuleStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(196); + match(CREATE); + setState(197); + match(RULE); + setState(198); + ((CreateRuleStatementContext)_localctx).ruleName = expression(0); + setState(199); + match(WHEN); + setState(200); + subjectPattern(); + setState(201); + match(PERFORMS); + setState(202); + operationPattern(); + setState(205); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ON) { + { + setState(203); + match(ON); + setState(204); + operandPattern(); + } + } + + setState(207); + response(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SubjectPatternContext extends ParserRuleContext { + public SubjectPatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_subjectPattern; } + + public SubjectPatternContext() { } + public void copyFrom(SubjectPatternContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AnyUserPatternContext extends SubjectPatternContext { + public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } + public TerminalNode USER() { return getToken(PMLParser.USER, 0); } + public AnyUserPatternContext(SubjectPatternContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAnyUserPattern(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAnyUserPattern(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAnyUserPattern(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class UserPatternContext extends SubjectPatternContext { + public TerminalNode USER() { return getToken(PMLParser.USER, 0); } + public SubjectPatternExpressionContext subjectPatternExpression() { + return getRuleContext(SubjectPatternExpressionContext.class,0); + } + public UserPatternContext(SubjectPatternContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterUserPattern(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitUserPattern(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitUserPattern(this); + else return visitor.visitChildren(this); + } + } + + public final SubjectPatternContext subjectPattern() throws RecognitionException { + SubjectPatternContext _localctx = new SubjectPatternContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_subjectPattern); + try { + setState(213); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ANY: + _localctx = new AnyUserPatternContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(209); + match(ANY); + setState(210); + match(USER); + } + break; + case USER: + _localctx = new UserPatternContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(211); + match(USER); + setState(212); + subjectPatternExpression(0); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SubjectPatternExpressionContext extends ParserRuleContext { + public SubjectPatternExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_subjectPatternExpression; } + + public SubjectPatternExpressionContext() { } + public void copyFrom(SubjectPatternExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BasicSubjectPatternExpressionContext extends SubjectPatternExpressionContext { + public BasicSubjectPatternExprContext basicSubjectPatternExpr() { + return getRuleContext(BasicSubjectPatternExprContext.class,0); + } + public BasicSubjectPatternExpressionContext(SubjectPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBasicSubjectPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBasicSubjectPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBasicSubjectPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ParenSubjectPatternExpressionContext extends SubjectPatternExpressionContext { + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public SubjectPatternExpressionContext subjectPatternExpression() { + return getRuleContext(SubjectPatternExpressionContext.class,0); + } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public ParenSubjectPatternExpressionContext(SubjectPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterParenSubjectPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitParenSubjectPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitParenSubjectPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NegateSubjectPatternExpressionContext extends SubjectPatternExpressionContext { + public TerminalNode EXCLAMATION() { return getToken(PMLParser.EXCLAMATION, 0); } + public SubjectPatternExpressionContext subjectPatternExpression() { + return getRuleContext(SubjectPatternExpressionContext.class,0); + } + public NegateSubjectPatternExpressionContext(SubjectPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterNegateSubjectPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitNegateSubjectPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitNegateSubjectPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalSubjectPatternExpressionContext extends SubjectPatternExpressionContext { + public SubjectPatternExpressionContext left; + public SubjectPatternExpressionContext right; + public List subjectPatternExpression() { + return getRuleContexts(SubjectPatternExpressionContext.class); + } + public SubjectPatternExpressionContext subjectPatternExpression(int i) { + return getRuleContext(SubjectPatternExpressionContext.class,i); + } + public TerminalNode LOGICAL_AND() { return getToken(PMLParser.LOGICAL_AND, 0); } + public TerminalNode LOGICAL_OR() { return getToken(PMLParser.LOGICAL_OR, 0); } + public LogicalSubjectPatternExpressionContext(SubjectPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterLogicalSubjectPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitLogicalSubjectPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitLogicalSubjectPatternExpression(this); + else return visitor.visitChildren(this); + } + } + + public final SubjectPatternExpressionContext subjectPatternExpression() throws RecognitionException { + return subjectPatternExpression(0); + } + + private SubjectPatternExpressionContext subjectPatternExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + SubjectPatternExpressionContext _localctx = new SubjectPatternExpressionContext(_ctx, _parentState); + SubjectPatternExpressionContext _prevctx = _localctx; + int _startState = 18; + enterRecursionRule(_localctx, 18, RULE_subjectPatternExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(223); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IN: + case PROCESS: + case DOUBLE_QUOTE_STRING: + { + _localctx = new BasicSubjectPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(216); + basicSubjectPatternExpr(); + } + break; + case EXCLAMATION: + { + _localctx = new NegateSubjectPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(217); + match(EXCLAMATION); + setState(218); + subjectPatternExpression(3); + } + break; + case OPEN_PAREN: + { + _localctx = new ParenSubjectPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(219); + match(OPEN_PAREN); + setState(220); + subjectPatternExpression(0); + setState(221); + match(CLOSE_PAREN); + } + break; + default: + throw new NoViableAltException(this); + } + _ctx.stop = _input.LT(-1); + setState(230); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,7,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + { + _localctx = new LogicalSubjectPatternExpressionContext(new SubjectPatternExpressionContext(_parentctx, _parentState)); + ((LogicalSubjectPatternExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_subjectPatternExpression); + setState(225); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(226); + _la = _input.LA(1); + if ( !(_la==LOGICAL_OR || _la==LOGICAL_AND) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(227); + ((LogicalSubjectPatternExpressionContext)_localctx).right = subjectPatternExpression(2); + } + } + } + setState(232); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,7,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BasicSubjectPatternExprContext extends ParserRuleContext { + public BasicSubjectPatternExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_basicSubjectPatternExpr; } + + public BasicSubjectPatternExprContext() { } + public void copyFrom(BasicSubjectPatternExprContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class InSubjectContext extends BasicSubjectPatternExprContext { + public TerminalNode IN() { return getToken(PMLParser.IN, 0); } + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public InSubjectContext(BasicSubjectPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterInSubject(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitInSubject(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitInSubject(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class UsernameSubjectContext extends BasicSubjectPatternExprContext { + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public UsernameSubjectContext(BasicSubjectPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterUsernameSubject(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitUsernameSubject(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitUsernameSubject(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ProcessSubjectContext extends BasicSubjectPatternExprContext { + public TerminalNode PROCESS() { return getToken(PMLParser.PROCESS, 0); } + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public ProcessSubjectContext(BasicSubjectPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterProcessSubject(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitProcessSubject(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitProcessSubject(this); + else return visitor.visitChildren(this); + } + } + + public final BasicSubjectPatternExprContext basicSubjectPatternExpr() throws RecognitionException { + BasicSubjectPatternExprContext _localctx = new BasicSubjectPatternExprContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_basicSubjectPatternExpr); + try { + setState(238); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IN: + _localctx = new InSubjectContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(233); + match(IN); + setState(234); + stringLit(); + } + break; + case DOUBLE_QUOTE_STRING: + _localctx = new UsernameSubjectContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(235); + stringLit(); + } + break; + case PROCESS: + _localctx = new ProcessSubjectContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(236); + match(PROCESS); + setState(237); + stringLit(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperationPatternContext extends ParserRuleContext { + public OperationPatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operationPattern; } + + public OperationPatternContext() { } + public void copyFrom(OperationPatternContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AnyOperationContext extends OperationPatternContext { + public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } + public TerminalNode OPERATION() { return getToken(PMLParser.OPERATION, 0); } + public AnyOperationContext(OperationPatternContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAnyOperation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAnyOperation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAnyOperation(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class IDOperationContext extends OperationPatternContext { + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public IDOperationContext(OperationPatternContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterIDOperation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitIDOperation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitIDOperation(this); + else return visitor.visitChildren(this); + } + } + + public final OperationPatternContext operationPattern() throws RecognitionException { + OperationPatternContext _localctx = new OperationPatternContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_operationPattern); + try { + setState(243); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ANY: + _localctx = new AnyOperationContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(240); + match(ANY); + setState(241); + match(OPERATION); + } + break; + case DOUBLE_QUOTE_STRING: + _localctx = new IDOperationContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(242); + stringLit(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperandPatternContext extends ParserRuleContext { + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List operandPatternElement() { + return getRuleContexts(OperandPatternElementContext.class); + } + public OperandPatternElementContext operandPatternElement(int i) { + return getRuleContext(OperandPatternElementContext.class,i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public OperandPatternContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operandPattern; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterOperandPattern(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitOperandPattern(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitOperandPattern(this); + else return visitor.visitChildren(this); + } + } + + public final OperandPatternContext operandPattern() throws RecognitionException { + OperandPatternContext _localctx = new OperandPatternContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_operandPattern); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(245); + match(OPEN_CURLY); + setState(254); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ID) { + { + setState(246); + operandPatternElement(); + setState(251); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(247); + match(COMMA); + setState(248); + operandPatternElement(); + } + } + setState(253); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(256); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperandPatternElementContext extends ParserRuleContext { + public Token key; + public OperandPatternExpressionContext single; + public OperandPatternExpressionArrayContext multiple; + public TerminalNode COLON() { return getToken(PMLParser.COLON, 0); } + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public OperandPatternExpressionContext operandPatternExpression() { + return getRuleContext(OperandPatternExpressionContext.class,0); + } + public OperandPatternExpressionArrayContext operandPatternExpressionArray() { + return getRuleContext(OperandPatternExpressionArrayContext.class,0); + } + public OperandPatternElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operandPatternElement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterOperandPatternElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitOperandPatternElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitOperandPatternElement(this); + else return visitor.visitChildren(this); + } + } + + public final OperandPatternElementContext operandPatternElement() throws RecognitionException { + OperandPatternElementContext _localctx = new OperandPatternElementContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_operandPatternElement); + try { + enterOuterAlt(_localctx, 1); + { + setState(258); + ((OperandPatternElementContext)_localctx).key = match(ID); + setState(259); + match(COLON); + setState(262); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IN: + case ANY: + case OPEN_PAREN: + case EXCLAMATION: + case DOUBLE_QUOTE_STRING: + { + setState(260); + ((OperandPatternElementContext)_localctx).single = operandPatternExpression(0); + } + break; + case OPEN_BRACKET: + { + setState(261); + ((OperandPatternElementContext)_localctx).multiple = operandPatternExpressionArray(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperandPatternExpressionArrayContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public List operandPatternExpression() { + return getRuleContexts(OperandPatternExpressionContext.class); + } + public OperandPatternExpressionContext operandPatternExpression(int i) { + return getRuleContext(OperandPatternExpressionContext.class,i); + } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public OperandPatternExpressionArrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operandPatternExpressionArray; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterOperandPatternExpressionArray(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitOperandPatternExpressionArray(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitOperandPatternExpressionArray(this); + else return visitor.visitChildren(this); + } + } + + public final OperandPatternExpressionArrayContext operandPatternExpressionArray() throws RecognitionException { + OperandPatternExpressionArrayContext _localctx = new OperandPatternExpressionArrayContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_operandPatternExpressionArray); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(264); + match(OPEN_BRACKET); + setState(265); + operandPatternExpression(0); + setState(270); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(266); + match(COMMA); + setState(267); + operandPatternExpression(0); + } + } + setState(272); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(273); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class OperandPatternExpressionContext extends ParserRuleContext { + public OperandPatternExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operandPatternExpression; } + + public OperandPatternExpressionContext() { } + public void copyFrom(OperandPatternExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ParenOperandPatternExpressionContext extends OperandPatternExpressionContext { + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public OperandPatternExpressionContext operandPatternExpression() { + return getRuleContext(OperandPatternExpressionContext.class,0); + } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public ParenOperandPatternExpressionContext(OperandPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterParenOperandPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitParenOperandPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitParenOperandPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NegateOperandPatternExpressionContext extends OperandPatternExpressionContext { + public TerminalNode EXCLAMATION() { return getToken(PMLParser.EXCLAMATION, 0); } + public OperandPatternExpressionContext operandPatternExpression() { + return getRuleContext(OperandPatternExpressionContext.class,0); + } + public NegateOperandPatternExpressionContext(OperandPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterNegateOperandPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitNegateOperandPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitNegateOperandPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BasicOperandPatternExpressionContext extends OperandPatternExpressionContext { + public BasicOperandPatternExprContext basicOperandPatternExpr() { + return getRuleContext(BasicOperandPatternExprContext.class,0); + } + public BasicOperandPatternExpressionContext(OperandPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBasicOperandPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBasicOperandPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBasicOperandPatternExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalOperandPatternExpressionContext extends OperandPatternExpressionContext { + public OperandPatternExpressionContext left; + public OperandPatternExpressionContext right; + public List operandPatternExpression() { + return getRuleContexts(OperandPatternExpressionContext.class); + } + public OperandPatternExpressionContext operandPatternExpression(int i) { + return getRuleContext(OperandPatternExpressionContext.class,i); + } + public TerminalNode LOGICAL_AND() { return getToken(PMLParser.LOGICAL_AND, 0); } + public TerminalNode LOGICAL_OR() { return getToken(PMLParser.LOGICAL_OR, 0); } + public LogicalOperandPatternExpressionContext(OperandPatternExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterLogicalOperandPatternExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitLogicalOperandPatternExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitLogicalOperandPatternExpression(this); + else return visitor.visitChildren(this); + } + } + + public final OperandPatternExpressionContext operandPatternExpression() throws RecognitionException { + return operandPatternExpression(0); + } + + private OperandPatternExpressionContext operandPatternExpression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + OperandPatternExpressionContext _localctx = new OperandPatternExpressionContext(_ctx, _parentState); + OperandPatternExpressionContext _prevctx = _localctx; + int _startState = 30; + enterRecursionRule(_localctx, 30, RULE_operandPatternExpression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(283); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IN: + case ANY: + case DOUBLE_QUOTE_STRING: + { + _localctx = new BasicOperandPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(276); + basicOperandPatternExpr(); + } + break; + case EXCLAMATION: + { + _localctx = new NegateOperandPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(277); + match(EXCLAMATION); + setState(278); + operandPatternExpression(3); + } + break; + case OPEN_PAREN: + { + _localctx = new ParenOperandPatternExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(279); + match(OPEN_PAREN); + setState(280); + operandPatternExpression(0); + setState(281); + match(CLOSE_PAREN); + } + break; + default: + throw new NoViableAltException(this); + } + _ctx.stop = _input.LT(-1); + setState(290); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + { + _localctx = new LogicalOperandPatternExpressionContext(new OperandPatternExpressionContext(_parentctx, _parentState)); + ((LogicalOperandPatternExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_operandPatternExpression); + setState(285); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(286); + _la = _input.LA(1); + if ( !(_la==LOGICAL_OR || _la==LOGICAL_AND) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(287); + ((LogicalOperandPatternExpressionContext)_localctx).right = operandPatternExpression(2); + } + } + } + setState(292); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,15,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BasicOperandPatternExprContext extends ParserRuleContext { + public BasicOperandPatternExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_basicOperandPatternExpr; } + + public BasicOperandPatternExprContext() { } + public void copyFrom(BasicOperandPatternExprContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AnyPolicyElementContext extends BasicOperandPatternExprContext { + public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } + public AnyPolicyElementContext(BasicOperandPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAnyPolicyElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAnyPolicyElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAnyPolicyElement(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class InPolicyElementContext extends BasicOperandPatternExprContext { + public TerminalNode IN() { return getToken(PMLParser.IN, 0); } + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public InPolicyElementContext(BasicOperandPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterInPolicyElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitInPolicyElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitInPolicyElement(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class PolicyElementContext extends BasicOperandPatternExprContext { + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public PolicyElementContext(BasicOperandPatternExprContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterPolicyElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitPolicyElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitPolicyElement(this); + else return visitor.visitChildren(this); + } + } + + public final BasicOperandPatternExprContext basicOperandPatternExpr() throws RecognitionException { + BasicOperandPatternExprContext _localctx = new BasicOperandPatternExprContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_basicOperandPatternExpr); + try { + setState(297); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ANY: + _localctx = new AnyPolicyElementContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(293); + match(ANY); + } + break; + case IN: + _localctx = new InPolicyElementContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(294); + match(IN); + setState(295); + stringLit(); + } + break; + case DOUBLE_QUOTE_STRING: + _localctx = new PolicyElementContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(296); + stringLit(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ResponseContext extends ParserRuleContext { + public TerminalNode DO() { return getToken(PMLParser.DO, 0); } + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public ResponseBlockContext responseBlock() { + return getRuleContext(ResponseBlockContext.class,0); + } + public ResponseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_response; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterResponse(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitResponse(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitResponse(this); + else return visitor.visitChildren(this); + } + } + + public final ResponseContext response() throws RecognitionException { + ResponseContext _localctx = new ResponseContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_response); + try { + enterOuterAlt(_localctx, 1); + { + setState(299); + match(DO); + setState(300); + match(OPEN_PAREN); + setState(301); + match(ID); + setState(302); + match(CLOSE_PAREN); + setState(303); + responseBlock(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ResponseBlockContext extends ParserRuleContext { + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List responseStatement() { + return getRuleContexts(ResponseStatementContext.class); + } + public ResponseStatementContext responseStatement(int i) { + return getRuleContext(ResponseStatementContext.class,i); + } + public ResponseBlockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_responseBlock; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterResponseBlock(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitResponseBlock(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitResponseBlock(this); + else return visitor.visitChildren(this); + } + } + + public final ResponseBlockContext responseBlock() throws RecognitionException { + ResponseBlockContext _localctx = new ResponseBlockContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_responseBlock); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(305); + match(OPEN_CURLY); + setState(309); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 1)) & ~0x3f) == 0 && ((1L << (_la - 1)) & -9154656955725250503L) != 0)) { + { + { + setState(306); + responseStatement(); + } + } + setState(311); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(312); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ResponseStatementContext extends ParserRuleContext { + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public CreateRuleStatementContext createRuleStatement() { + return getRuleContext(CreateRuleStatementContext.class,0); + } + public DeleteRuleStatementContext deleteRuleStatement() { + return getRuleContext(DeleteRuleStatementContext.class,0); + } + public ResponseStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_responseStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterResponseStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitResponseStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitResponseStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ResponseStatementContext responseStatement() throws RecognitionException { + ResponseStatementContext _localctx = new ResponseStatementContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_responseStatement); + try { + setState(317); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(314); + statement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(315); + createRuleStatement(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(316); + deleteRuleStatement(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CreateProhibitionStatementContext extends ParserRuleContext { + public ExpressionContext name; + public ExpressionContext subject; + public ExpressionContext accessRights; + public ExpressionContext containers; + public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } + public TerminalNode PROHIBITION() { return getToken(PMLParser.PROHIBITION, 0); } + public TerminalNode DENY() { return getToken(PMLParser.DENY, 0); } + public TerminalNode ACCESS_RIGHTS() { return getToken(PMLParser.ACCESS_RIGHTS, 0); } + public TerminalNode ON() { return getToken(PMLParser.ON, 0); } + public TerminalNode OF() { return getToken(PMLParser.OF, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode USER() { return getToken(PMLParser.USER, 0); } + public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } + public TerminalNode PROCESS() { return getToken(PMLParser.PROCESS, 0); } + public TerminalNode INTERSECTION() { return getToken(PMLParser.INTERSECTION, 0); } + public TerminalNode UNION() { return getToken(PMLParser.UNION, 0); } + public CreateProhibitionStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_createProhibitionStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCreateProhibitionStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCreateProhibitionStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCreateProhibitionStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CreateProhibitionStatementContext createProhibitionStatement() throws RecognitionException { + CreateProhibitionStatementContext _localctx = new CreateProhibitionStatementContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_createProhibitionStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(319); + match(CREATE); + setState(320); + match(PROHIBITION); + setState(321); + ((CreateProhibitionStatementContext)_localctx).name = expression(0); + setState(322); + match(DENY); + setState(323); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 9345849884672L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(324); + ((CreateProhibitionStatementContext)_localctx).subject = expression(0); + setState(325); + match(ACCESS_RIGHTS); + setState(326); + ((CreateProhibitionStatementContext)_localctx).accessRights = expression(0); + setState(327); + match(ON); + setState(328); + _la = _input.LA(1); + if ( !(_la==INTERSECTION || _la==UNION) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(329); + match(OF); + setState(330); + ((CreateProhibitionStatementContext)_localctx).containers = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SetNodePropertiesStatementContext extends ParserRuleContext { + public ExpressionContext name; + public ExpressionContext properties; + public TerminalNode SET_PROPERTIES() { return getToken(PMLParser.SET_PROPERTIES, 0); } + public TerminalNode OF() { return getToken(PMLParser.OF, 0); } + public TerminalNode TO() { return getToken(PMLParser.TO, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public SetNodePropertiesStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_setNodePropertiesStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterSetNodePropertiesStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitSetNodePropertiesStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitSetNodePropertiesStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SetNodePropertiesStatementContext setNodePropertiesStatement() throws RecognitionException { + SetNodePropertiesStatementContext _localctx = new SetNodePropertiesStatementContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_setNodePropertiesStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(332); + match(SET_PROPERTIES); + setState(333); + match(OF); + setState(334); + ((SetNodePropertiesStatementContext)_localctx).name = expression(0); + setState(335); + match(TO); + setState(336); + ((SetNodePropertiesStatementContext)_localctx).properties = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AssignStatementContext extends ParserRuleContext { + public ExpressionContext ascendantNode; + public ExpressionContext descendantNodes; + public TerminalNode ASSIGN() { return getToken(PMLParser.ASSIGN, 0); } + public TerminalNode TO() { return getToken(PMLParser.TO, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public AssignStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAssignStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAssignStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAssignStatement(this); + else return visitor.visitChildren(this); + } + } + + public final AssignStatementContext assignStatement() throws RecognitionException { + AssignStatementContext _localctx = new AssignStatementContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_assignStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(338); + match(ASSIGN); + setState(339); + ((AssignStatementContext)_localctx).ascendantNode = expression(0); + setState(340); + match(TO); + setState(341); + ((AssignStatementContext)_localctx).descendantNodes = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DeassignStatementContext extends ParserRuleContext { + public ExpressionContext ascendantNode; + public ExpressionContext descendantNodes; + public TerminalNode DEASSIGN() { return getToken(PMLParser.DEASSIGN, 0); } + public TerminalNode FROM() { return getToken(PMLParser.FROM, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public DeassignStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_deassignStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeassignStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeassignStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeassignStatement(this); + else return visitor.visitChildren(this); + } + } + + public final DeassignStatementContext deassignStatement() throws RecognitionException { + DeassignStatementContext _localctx = new DeassignStatementContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_deassignStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(343); + match(DEASSIGN); + setState(344); + ((DeassignStatementContext)_localctx).ascendantNode = expression(0); + setState(345); + match(FROM); + setState(346); + ((DeassignStatementContext)_localctx).descendantNodes = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class AssociateStatementContext extends ParserRuleContext { + public ExpressionContext ua; + public ExpressionContext target; + public ExpressionContext accessRights; + public TerminalNode ASSOCIATE() { return getToken(PMLParser.ASSOCIATE, 0); } + public TerminalNode AND() { return getToken(PMLParser.AND, 0); } + public TerminalNode WITH() { return getToken(PMLParser.WITH, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public AssociateStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_associateStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAssociateStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAssociateStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAssociateStatement(this); + else return visitor.visitChildren(this); + } + } + + public final AssociateStatementContext associateStatement() throws RecognitionException { + AssociateStatementContext _localctx = new AssociateStatementContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_associateStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(348); + match(ASSOCIATE); + setState(349); + ((AssociateStatementContext)_localctx).ua = expression(0); + setState(350); + match(AND); + setState(351); + ((AssociateStatementContext)_localctx).target = expression(0); + setState(352); + match(WITH); + setState(353); + ((AssociateStatementContext)_localctx).accessRights = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DissociateStatementContext extends ParserRuleContext { + public ExpressionContext ua; + public ExpressionContext target; + public TerminalNode DISSOCIATE() { return getToken(PMLParser.DISSOCIATE, 0); } + public TerminalNode AND() { return getToken(PMLParser.AND, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public DissociateStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_dissociateStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDissociateStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDissociateStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDissociateStatement(this); + else return visitor.visitChildren(this); + } + } + + public final DissociateStatementContext dissociateStatement() throws RecognitionException { + DissociateStatementContext _localctx = new DissociateStatementContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_dissociateStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(355); + match(DISSOCIATE); + setState(356); + ((DissociateStatementContext)_localctx).ua = expression(0); + setState(357); + match(AND); + setState(358); + ((DissociateStatementContext)_localctx).target = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class SetResourceOperationsStatementContext extends ParserRuleContext { + public ExpressionContext accessRightsArr; + public TerminalNode SET_RESOURCE_OPERATIONS() { return getToken(PMLParser.SET_RESOURCE_OPERATIONS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SetResourceOperationsStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_setResourceOperationsStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterSetResourceOperationsStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitSetResourceOperationsStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitSetResourceOperationsStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SetResourceOperationsStatementContext setResourceOperationsStatement() throws RecognitionException { + SetResourceOperationsStatementContext _localctx = new SetResourceOperationsStatementContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_setResourceOperationsStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(360); + match(SET_RESOURCE_OPERATIONS); + setState(361); + ((SetResourceOperationsStatementContext)_localctx).accessRightsArr = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DeleteStatementContext extends ParserRuleContext { + public TerminalNode DELETE() { return getToken(PMLParser.DELETE, 0); } + public DeleteTypeContext deleteType() { + return getRuleContext(DeleteTypeContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public DeleteStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_deleteStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeleteStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeleteStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeleteStatement(this); + else return visitor.visitChildren(this); + } + } + + public final DeleteStatementContext deleteStatement() throws RecognitionException { + DeleteStatementContext _localctx = new DeleteStatementContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_deleteStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(363); + match(DELETE); + setState(364); + deleteType(); + setState(365); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DeleteTypeContext extends ParserRuleContext { + public DeleteTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_deleteType; } + + public DeleteTypeContext() { } + public void copyFrom(DeleteTypeContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DeleteNodeContext extends DeleteTypeContext { + public NodeTypeContext nodeType() { + return getRuleContext(NodeTypeContext.class,0); + } + public DeleteNodeContext(DeleteTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeleteNode(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeleteNode(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeleteNode(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DeleteProhibitionContext extends DeleteTypeContext { + public TerminalNode PROHIBITION() { return getToken(PMLParser.PROHIBITION, 0); } + public DeleteProhibitionContext(DeleteTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeleteProhibition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeleteProhibition(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeleteProhibition(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DeleteObligationContext extends DeleteTypeContext { + public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } + public DeleteObligationContext(DeleteTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeleteObligation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeleteObligation(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeleteObligation(this); + else return visitor.visitChildren(this); + } + } + + public final DeleteTypeContext deleteType() throws RecognitionException { + DeleteTypeContext _localctx = new DeleteTypeContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_deleteType); + try { + setState(370); + _errHandler.sync(this); + switch (_input.LA(1)) { + case POLICY_CLASS: + case OBJECT_ATTRIBUTE: + case USER_ATTRIBUTE: + case OBJECT: + case USER: + _localctx = new DeleteNodeContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(367); + nodeType(); + } + break; + case OBLIGATION: + _localctx = new DeleteObligationContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(368); + match(OBLIGATION); + } + break; + case PROHIBITION: + _localctx = new DeleteProhibitionContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(369); + match(PROHIBITION); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class NodeTypeContext extends ParserRuleContext { + public TerminalNode POLICY_CLASS() { return getToken(PMLParser.POLICY_CLASS, 0); } + public TerminalNode OBJECT_ATTRIBUTE() { return getToken(PMLParser.OBJECT_ATTRIBUTE, 0); } + public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } + public TerminalNode OBJECT() { return getToken(PMLParser.OBJECT, 0); } + public TerminalNode USER() { return getToken(PMLParser.USER, 0); } + public NodeTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_nodeType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterNodeType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitNodeType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitNodeType(this); + else return visitor.visitChildren(this); + } + } + + public final NodeTypeContext nodeType() throws RecognitionException { + NodeTypeContext _localctx = new NodeTypeContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_nodeType); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(372); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & 14156212207616L) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class DeleteRuleStatementContext extends ParserRuleContext { + public ExpressionContext ruleName; + public ExpressionContext obligationName; + public TerminalNode DELETE() { return getToken(PMLParser.DELETE, 0); } + public TerminalNode RULE() { return getToken(PMLParser.RULE, 0); } + public TerminalNode FROM() { return getToken(PMLParser.FROM, 0); } + public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public DeleteRuleStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_deleteRuleStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDeleteRuleStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDeleteRuleStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDeleteRuleStatement(this); + else return visitor.visitChildren(this); + } + } + + public final DeleteRuleStatementContext deleteRuleStatement() throws RecognitionException { + DeleteRuleStatementContext _localctx = new DeleteRuleStatementContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_deleteRuleStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(374); + match(DELETE); + setState(375); + match(RULE); + setState(376); + ((DeleteRuleStatementContext)_localctx).ruleName = expression(0); + setState(377); + match(FROM); + setState(378); + match(OBLIGATION); + setState(379); + ((DeleteRuleStatementContext)_localctx).obligationName = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableDeclarationStatementContext extends ParserRuleContext { + public VariableDeclarationStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableDeclarationStatement; } + + public VariableDeclarationStatementContext() { } + public void copyFrom(VariableDeclarationStatementContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class VarDeclarationContext extends VariableDeclarationStatementContext { + public TerminalNode VAR() { return getToken(PMLParser.VAR, 0); } + public List varSpec() { + return getRuleContexts(VarSpecContext.class); + } + public VarSpecContext varSpec(int i) { + return getRuleContext(VarSpecContext.class,i); + } + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public VarDeclarationContext(VariableDeclarationStatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterVarDeclaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitVarDeclaration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitVarDeclaration(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ShortDeclarationContext extends VariableDeclarationStatementContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode DECLARE_ASSIGN() { return getToken(PMLParser.DECLARE_ASSIGN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ShortDeclarationContext(VariableDeclarationStatementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterShortDeclaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitShortDeclaration(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitShortDeclaration(this); + else return visitor.visitChildren(this); + } + } + + public final VariableDeclarationStatementContext variableDeclarationStatement() throws RecognitionException { + VariableDeclarationStatementContext _localctx = new VariableDeclarationStatementContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_variableDeclarationStatement); + int _la; + try { + setState(396); + _errHandler.sync(this); + switch (_input.LA(1)) { + case VAR: + _localctx = new VarDeclarationContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(381); + match(VAR); + setState(391); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ID: + { + setState(382); + varSpec(); + } + break; + case OPEN_PAREN: + { + setState(383); + match(OPEN_PAREN); + setState(387); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==ID) { + { + { + setState(384); + varSpec(); + } + } + setState(389); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(390); + match(CLOSE_PAREN); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case ID: + _localctx = new ShortDeclarationContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(393); + match(ID); + setState(394); + match(DECLARE_ASSIGN); + setState(395); + expression(0); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VarSpecContext extends ParserRuleContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode ASSIGN_EQUALS() { return getToken(PMLParser.ASSIGN_EQUALS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public VarSpecContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_varSpec; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterVarSpec(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitVarSpec(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitVarSpec(this); + else return visitor.visitChildren(this); + } + } + + public final VarSpecContext varSpec() throws RecognitionException { + VarSpecContext _localctx = new VarSpecContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_varSpec); + try { + enterOuterAlt(_localctx, 1); + { + setState(398); + match(ID); + setState(399); + match(ASSIGN_EQUALS); + setState(400); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableAssignmentStatementContext extends ParserRuleContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode ASSIGN_EQUALS() { return getToken(PMLParser.ASSIGN_EQUALS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode PLUS() { return getToken(PMLParser.PLUS, 0); } + public VariableAssignmentStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableAssignmentStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterVariableAssignmentStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitVariableAssignmentStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitVariableAssignmentStatement(this); + else return visitor.visitChildren(this); + } + } + + public final VariableAssignmentStatementContext variableAssignmentStatement() throws RecognitionException { + VariableAssignmentStatementContext _localctx = new VariableAssignmentStatementContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_variableAssignmentStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(402); + match(ID); + setState(404); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==PLUS) { + { + setState(403); + match(PLUS); + } + } + + setState(406); + match(ASSIGN_EQUALS); + setState(407); + expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionDefinitionStatementContext extends ParserRuleContext { + public FunctionSignatureContext functionSignature() { + return getRuleContext(FunctionSignatureContext.class,0); + } + public StatementBlockContext statementBlock() { + return getRuleContext(StatementBlockContext.class,0); + } + public FunctionDefinitionStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionDefinitionStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionDefinitionStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionDefinitionStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionDefinitionStatement(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionDefinitionStatementContext functionDefinitionStatement() throws RecognitionException { + FunctionDefinitionStatementContext _localctx = new FunctionDefinitionStatementContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_functionDefinitionStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(409); + functionSignature(); + setState(410); + statementBlock(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionSignatureContext extends ParserRuleContext { + public VariableTypeContext returnType; + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public FormalArgListContext formalArgList() { + return getRuleContext(FormalArgListContext.class,0); + } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public TerminalNode ROUTINE() { return getToken(PMLParser.ROUTINE, 0); } + public TerminalNode OPERATION() { return getToken(PMLParser.OPERATION, 0); } + public CheckStatementBlockContext checkStatementBlock() { + return getRuleContext(CheckStatementBlockContext.class,0); + } + public VariableTypeContext variableType() { + return getRuleContext(VariableTypeContext.class,0); + } + public FunctionSignatureContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionSignature; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionSignature(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionSignature(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionSignature(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionSignatureContext functionSignature() throws RecognitionException { + FunctionSignatureContext _localctx = new FunctionSignatureContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_functionSignature); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(412); + _la = _input.LA(1); + if ( !(_la==OPERATION || _la==ROUTINE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(413); + match(ID); + setState(414); + match(OPEN_PAREN); + setState(415); + formalArgList(); + setState(416); + match(CLOSE_PAREN); + setState(418); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 16)) & ~0x3f) == 0 && ((1L << (_la - 16)) & 9013800619474945L) != 0)) { + { + setState(417); + ((FunctionSignatureContext)_localctx).returnType = variableType(); + } + } + + setState(421); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + case 1: + { + setState(420); + checkStatementBlock(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FormalArgListContext extends ParserRuleContext { + public List formalArg() { + return getRuleContexts(FormalArgContext.class); + } + public FormalArgContext formalArg(int i) { + return getRuleContext(FormalArgContext.class,i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public FormalArgListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_formalArgList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFormalArgList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFormalArgList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFormalArgList(this); + else return visitor.visitChildren(this); + } + } + + public final FormalArgListContext formalArgList() throws RecognitionException { + FormalArgListContext _localctx = new FormalArgListContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_formalArgList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(431); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & 432627039204343812L) != 0) || _la==OPEN_BRACKET) { + { + setState(423); + formalArg(); + setState(428); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(424); + match(COMMA); + setState(425); + formalArg(); + } + } + setState(430); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FormalArgContext extends ParserRuleContext { + public VariableTypeContext variableType() { + return getRuleContext(VariableTypeContext.class,0); + } + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public TerminalNode NODEOP() { return getToken(PMLParser.NODEOP, 0); } + public FormalArgContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_formalArg; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFormalArg(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFormalArg(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFormalArg(this); + else return visitor.visitChildren(this); + } + } + + public final FormalArgContext formalArg() throws RecognitionException { + FormalArgContext _localctx = new FormalArgContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_formalArg); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(434); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NODEOP) { + { + setState(433); + match(NODEOP); + } + } + + setState(436); + variableType(); + setState(437); + match(ID); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ReturnStatementContext extends ParserRuleContext { + public TerminalNode RETURN() { return getToken(PMLParser.RETURN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ReturnStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_returnStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterReturnStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitReturnStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitReturnStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ReturnStatementContext returnStatement() throws RecognitionException { + ReturnStatementContext _localctx = new ReturnStatementContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_returnStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(439); + match(RETURN); + setState(441); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + case 1: + { + setState(440); + expression(0); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CheckStatementContext extends ParserRuleContext { + public ExpressionContext ar; + public ExpressionContext target; + public TerminalNode CHECK() { return getToken(PMLParser.CHECK, 0); } + public TerminalNode ON() { return getToken(PMLParser.ON, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public CheckStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_checkStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCheckStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCheckStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCheckStatement(this); + else return visitor.visitChildren(this); + } + } + + public final CheckStatementContext checkStatement() throws RecognitionException { + CheckStatementContext _localctx = new CheckStatementContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_checkStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(443); + match(CHECK); + setState(444); + ((CheckStatementContext)_localctx).ar = expression(0); + setState(445); + match(ON); + setState(446); + ((CheckStatementContext)_localctx).target = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class CheckStatementBlockContext extends ParserRuleContext { + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List checkStatement() { + return getRuleContexts(CheckStatementContext.class); + } + public CheckStatementContext checkStatement(int i) { + return getRuleContext(CheckStatementContext.class,i); + } + public CheckStatementBlockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_checkStatementBlock; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterCheckStatementBlock(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitCheckStatementBlock(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitCheckStatementBlock(this); + else return visitor.visitChildren(this); + } + } + + public final CheckStatementBlockContext checkStatementBlock() throws RecognitionException { + CheckStatementBlockContext _localctx = new CheckStatementBlockContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_checkStatementBlock); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(448); + match(OPEN_CURLY); + setState(452); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==CHECK) { + { + { + setState(449); + checkStatement(); + } + } + setState(454); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(455); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdArrContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public List ID() { return getTokens(PMLParser.ID); } + public TerminalNode ID(int i) { + return getToken(PMLParser.ID, i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public IdArrContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_idArr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterIdArr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitIdArr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitIdArr(this); + else return visitor.visitChildren(this); + } + } + + public final IdArrContext idArr() throws RecognitionException { + IdArrContext _localctx = new IdArrContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_idArr); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(457); + match(OPEN_BRACKET); + setState(466); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ID) { + { + setState(458); + match(ID); + setState(463); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(459); + match(COMMA); + setState(460); + match(ID); + } + } + setState(465); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(468); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionInvokeStatementContext extends ParserRuleContext { + public FunctionInvokeContext functionInvoke() { + return getRuleContext(FunctionInvokeContext.class,0); + } + public FunctionInvokeStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionInvokeStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionInvokeStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionInvokeStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionInvokeStatement(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionInvokeStatementContext functionInvokeStatement() throws RecognitionException { + FunctionInvokeStatementContext _localctx = new FunctionInvokeStatementContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_functionInvokeStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(470); + functionInvoke(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ForeachStatementContext extends ParserRuleContext { + public Token key; + public Token value; + public TerminalNode FOREACH() { return getToken(PMLParser.FOREACH, 0); } + public TerminalNode IN() { return getToken(PMLParser.IN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementBlockContext statementBlock() { + return getRuleContext(StatementBlockContext.class,0); + } + public List ID() { return getTokens(PMLParser.ID); } + public TerminalNode ID(int i) { + return getToken(PMLParser.ID, i); + } + public TerminalNode COMMA() { return getToken(PMLParser.COMMA, 0); } + public ForeachStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_foreachStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterForeachStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitForeachStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitForeachStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ForeachStatementContext foreachStatement() throws RecognitionException { + ForeachStatementContext _localctx = new ForeachStatementContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_foreachStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(472); + match(FOREACH); + setState(473); + ((ForeachStatementContext)_localctx).key = match(ID); + setState(476); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(474); + match(COMMA); + setState(475); + ((ForeachStatementContext)_localctx).value = match(ID); + } + } + + setState(478); + match(IN); + setState(479); + expression(0); + setState(480); + statementBlock(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BreakStatementContext extends ParserRuleContext { + public TerminalNode BREAK() { return getToken(PMLParser.BREAK, 0); } + public BreakStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_breakStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBreakStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBreakStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBreakStatement(this); + else return visitor.visitChildren(this); + } + } + + public final BreakStatementContext breakStatement() throws RecognitionException { + BreakStatementContext _localctx = new BreakStatementContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_breakStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(482); + match(BREAK); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ContinueStatementContext extends ParserRuleContext { + public TerminalNode CONTINUE() { return getToken(PMLParser.CONTINUE, 0); } + public ContinueStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_continueStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterContinueStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitContinueStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitContinueStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ContinueStatementContext continueStatement() throws RecognitionException { + ContinueStatementContext _localctx = new ContinueStatementContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_continueStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(484); + match(CONTINUE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IfStatementContext extends ParserRuleContext { + public ExpressionContext condition; + public TerminalNode IF() { return getToken(PMLParser.IF, 0); } + public StatementBlockContext statementBlock() { + return getRuleContext(StatementBlockContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public List elseIfStatement() { + return getRuleContexts(ElseIfStatementContext.class); + } + public ElseIfStatementContext elseIfStatement(int i) { + return getRuleContext(ElseIfStatementContext.class,i); + } + public ElseStatementContext elseStatement() { + return getRuleContext(ElseStatementContext.class,0); + } + public IfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ifStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterIfStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitIfStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitIfStatement(this); + else return visitor.visitChildren(this); + } + } + + public final IfStatementContext ifStatement() throws RecognitionException { + IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_ifStatement); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(486); + match(IF); + setState(487); + ((IfStatementContext)_localctx).condition = expression(0); + setState(488); + statementBlock(); + setState(492); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(489); + elseIfStatement(); + } + } + } + setState(494); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,34,_ctx); + } + setState(496); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ELSE) { + { + setState(495); + elseStatement(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElseIfStatementContext extends ParserRuleContext { + public ExpressionContext condition; + public TerminalNode ELSE() { return getToken(PMLParser.ELSE, 0); } + public TerminalNode IF() { return getToken(PMLParser.IF, 0); } + public StatementBlockContext statementBlock() { + return getRuleContext(StatementBlockContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ElseIfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elseIfStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterElseIfStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitElseIfStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitElseIfStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ElseIfStatementContext elseIfStatement() throws RecognitionException { + ElseIfStatementContext _localctx = new ElseIfStatementContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_elseIfStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(498); + match(ELSE); + setState(499); + match(IF); + setState(500); + ((ElseIfStatementContext)_localctx).condition = expression(0); + setState(501); + statementBlock(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElseStatementContext extends ParserRuleContext { + public TerminalNode ELSE() { return getToken(PMLParser.ELSE, 0); } + public StatementBlockContext statementBlock() { + return getRuleContext(StatementBlockContext.class,0); + } + public ElseStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_elseStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterElseStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitElseStatement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitElseStatement(this); + else return visitor.visitChildren(this); + } + } + + public final ElseStatementContext elseStatement() throws RecognitionException { + ElseStatementContext _localctx = new ElseStatementContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_elseStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(503); + match(ELSE); + setState(504); + statementBlock(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableTypeContext extends ParserRuleContext { + public VariableTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableType; } + + public VariableTypeContext() { } + public void copyFrom(VariableTypeContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class MapVarTypeContext extends VariableTypeContext { + public MapTypeContext mapType() { + return getRuleContext(MapTypeContext.class,0); + } + public MapVarTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterMapVarType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitMapVarType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitMapVarType(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class StringTypeContext extends VariableTypeContext { + public TerminalNode STRING_TYPE() { return getToken(PMLParser.STRING_TYPE, 0); } + public StringTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStringType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStringType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStringType(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ArrayVarTypeContext extends VariableTypeContext { + public ArrayTypeContext arrayType() { + return getRuleContext(ArrayTypeContext.class,0); + } + public ArrayVarTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterArrayVarType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitArrayVarType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitArrayVarType(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BooleanTypeContext extends VariableTypeContext { + public TerminalNode BOOL_TYPE() { return getToken(PMLParser.BOOL_TYPE, 0); } + public BooleanTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBooleanType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBooleanType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBooleanType(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class AnyTypeContext extends VariableTypeContext { + public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } + public AnyTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterAnyType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitAnyType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitAnyType(this); + else return visitor.visitChildren(this); + } + } + + public final VariableTypeContext variableType() throws RecognitionException { + VariableTypeContext _localctx = new VariableTypeContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_variableType); + try { + setState(511); + _errHandler.sync(this); + switch (_input.LA(1)) { + case STRING_TYPE: + _localctx = new StringTypeContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(506); + match(STRING_TYPE); + } + break; + case BOOL_TYPE: + _localctx = new BooleanTypeContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(507); + match(BOOL_TYPE); + } + break; + case OPEN_BRACKET: + _localctx = new ArrayVarTypeContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(508); + arrayType(); + } + break; + case MAP: + _localctx = new MapVarTypeContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(509); + mapType(); + } + break; + case ANY: + _localctx = new AnyTypeContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(510); + match(ANY); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MapTypeContext extends ParserRuleContext { + public VariableTypeContext keyType; + public VariableTypeContext valueType; + public TerminalNode MAP() { return getToken(PMLParser.MAP, 0); } + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public List variableType() { + return getRuleContexts(VariableTypeContext.class); + } + public VariableTypeContext variableType(int i) { + return getRuleContext(VariableTypeContext.class,i); + } + public MapTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mapType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterMapType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitMapType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitMapType(this); + else return visitor.visitChildren(this); + } + } + + public final MapTypeContext mapType() throws RecognitionException { + MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_mapType); + try { + enterOuterAlt(_localctx, 1); + { + setState(513); + match(MAP); + setState(514); + match(OPEN_BRACKET); + setState(515); + ((MapTypeContext)_localctx).keyType = variableType(); + setState(516); + match(CLOSE_BRACKET); + setState(517); + ((MapTypeContext)_localctx).valueType = variableType(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayTypeContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public VariableTypeContext variableType() { + return getRuleContext(VariableTypeContext.class,0); + } + public ArrayTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterArrayType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitArrayType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitArrayType(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayTypeContext arrayType() throws RecognitionException { + ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_arrayType); + try { + enterOuterAlt(_localctx, 1); + { + setState(519); + match(OPEN_BRACKET); + setState(520); + match(CLOSE_BRACKET); + setState(521); + variableType(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionContext extends ParserRuleContext { + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + + public ExpressionContext() { } + public void copyFrom(ExpressionContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class NegateExpressionContext extends ExpressionContext { + public TerminalNode EXCLAMATION() { return getToken(PMLParser.EXCLAMATION, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public NegateExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterNegateExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitNegateExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitNegateExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LogicalExpressionContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode LOGICAL_AND() { return getToken(PMLParser.LOGICAL_AND, 0); } + public TerminalNode LOGICAL_OR() { return getToken(PMLParser.LOGICAL_OR, 0); } + public LogicalExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterLogicalExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitLogicalExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitLogicalExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class PlusExpressionContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + public TerminalNode PLUS() { return getToken(PMLParser.PLUS, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public PlusExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterPlusExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitPlusExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitPlusExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class FunctionInvokeExpressionContext extends ExpressionContext { + public FunctionInvokeContext functionInvoke() { + return getRuleContext(FunctionInvokeContext.class,0); + } + public FunctionInvokeExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionInvokeExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionInvokeExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionInvokeExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class VariableReferenceExpressionContext extends ExpressionContext { + public VariableReferenceContext variableReference() { + return getRuleContext(VariableReferenceContext.class,0); + } + public VariableReferenceExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterVariableReferenceExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitVariableReferenceExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitVariableReferenceExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class LiteralExpressionContext extends ExpressionContext { + public LiteralContext literal() { + return getRuleContext(LiteralContext.class,0); + } + public LiteralExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterLiteralExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitLiteralExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitLiteralExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ParenExpressionContext extends ExpressionContext { + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public ParenExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterParenExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitParenExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitParenExpression(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class EqualsExpressionContext extends ExpressionContext { + public ExpressionContext left; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode EQUALS() { return getToken(PMLParser.EQUALS, 0); } + public TerminalNode NOT_EQUALS() { return getToken(PMLParser.NOT_EQUALS, 0); } + public EqualsExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterEqualsExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitEqualsExpression(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitEqualsExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + return expression(0); + } + + private ExpressionContext expression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); + ExpressionContext _prevctx = _localctx; + int _startState = 104; + enterRecursionRule(_localctx, 104, RULE_expression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(533); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + { + _localctx = new FunctionInvokeExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(524); + functionInvoke(); + } + break; + case 2: + { + _localctx = new VariableReferenceExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(525); + variableReference(0); + } + break; + case 3: + { + _localctx = new LiteralExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(526); + literal(); + } + break; + case 4: + { + _localctx = new NegateExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(527); + match(EXCLAMATION); + setState(528); + expression(5); + } + break; + case 5: + { + _localctx = new ParenExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(529); + match(OPEN_PAREN); + setState(530); + expression(0); + setState(531); + match(CLOSE_PAREN); + } + break; + } + _ctx.stop = _input.LT(-1); + setState(546); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(544); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + { + _localctx = new PlusExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((PlusExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(535); + if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); + setState(536); + match(PLUS); + setState(537); + ((PlusExpressionContext)_localctx).right = expression(4); + } + break; + case 2: + { + _localctx = new EqualsExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((EqualsExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(538); + if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); + setState(539); + _la = _input.LA(1); + if ( !(_la==EQUALS || _la==NOT_EQUALS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(540); + ((EqualsExpressionContext)_localctx).right = expression(3); + } + break; + case 3: + { + _localctx = new LogicalExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((LogicalExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(541); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(542); + _la = _input.LA(1); + if ( !(_la==LOGICAL_OR || _la==LOGICAL_AND) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(543); + ((LogicalExpressionContext)_localctx).right = expression(2); + } + break; + } + } + } + setState(548); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ExpressionListContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public ExpressionListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expressionList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterExpressionList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitExpressionList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitExpressionList(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionListContext expressionList() throws RecognitionException { + ExpressionListContext _localctx = new ExpressionListContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_expressionList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(549); + expression(0); + setState(554); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(550); + match(COMMA); + setState(551); + expression(0); + } + } + setState(556); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class LiteralContext extends ParserRuleContext { + public LiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_literal; } + + public LiteralContext() { } + public void copyFrom(LiteralContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class MapLiteralContext extends LiteralContext { + public MapLitContext mapLit() { + return getRuleContext(MapLitContext.class,0); + } + public MapLiteralContext(LiteralContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterMapLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitMapLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitMapLiteral(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class StringLiteralContext extends LiteralContext { + public StringLitContext stringLit() { + return getRuleContext(StringLitContext.class,0); + } + public StringLiteralContext(LiteralContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStringLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStringLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStringLiteral(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BoolLiteralContext extends LiteralContext { + public BoolLitContext boolLit() { + return getRuleContext(BoolLitContext.class,0); + } + public BoolLiteralContext(LiteralContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBoolLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBoolLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBoolLiteral(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ArrayLiteralContext extends LiteralContext { + public ArrayLitContext arrayLit() { + return getRuleContext(ArrayLitContext.class,0); + } + public ArrayLiteralContext(LiteralContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterArrayLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitArrayLiteral(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitArrayLiteral(this); + else return visitor.visitChildren(this); + } + } + + public final LiteralContext literal() throws RecognitionException { + LiteralContext _localctx = new LiteralContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_literal); + try { + setState(561); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DOUBLE_QUOTE_STRING: + _localctx = new StringLiteralContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(557); + stringLit(); + } + break; + case TRUE: + case FALSE: + _localctx = new BoolLiteralContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(558); + boolLit(); + } + break; + case OPEN_BRACKET: + _localctx = new ArrayLiteralContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(559); + arrayLit(); + } + break; + case OPEN_CURLY: + _localctx = new MapLiteralContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(560); + mapLit(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StringLitContext extends ParserRuleContext { + public TerminalNode DOUBLE_QUOTE_STRING() { return getToken(PMLParser.DOUBLE_QUOTE_STRING, 0); } + public StringLitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stringLit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStringLit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStringLit(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStringLit(this); + else return visitor.visitChildren(this); + } + } + + public final StringLitContext stringLit() throws RecognitionException { + StringLitContext _localctx = new StringLitContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_stringLit); + try { + enterOuterAlt(_localctx, 1); + { + setState(563); + match(DOUBLE_QUOTE_STRING); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class BoolLitContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(PMLParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(PMLParser.FALSE, 0); } + public BoolLitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_boolLit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBoolLit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBoolLit(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBoolLit(this); + else return visitor.visitChildren(this); + } + } + + public final BoolLitContext boolLit() throws RecognitionException { + BoolLitContext _localctx = new BoolLitContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_boolLit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(565); + _la = _input.LA(1); + if ( !(_la==TRUE || _la==FALSE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ArrayLitContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public ExpressionListContext expressionList() { + return getRuleContext(ExpressionListContext.class,0); + } + public ArrayLitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayLit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterArrayLit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitArrayLit(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitArrayLit(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayLitContext arrayLit() throws RecognitionException { + ArrayLitContext _localctx = new ArrayLitContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_arrayLit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(567); + match(OPEN_BRACKET); + setState(569); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & 2621615L) != 0)) { + { + setState(568); + expressionList(); + } + } + + setState(571); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class StringArrayLitContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public List stringLit() { + return getRuleContexts(StringLitContext.class); + } + public StringLitContext stringLit(int i) { + return getRuleContext(StringLitContext.class,i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public StringArrayLitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stringArrayLit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterStringArrayLit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitStringArrayLit(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitStringArrayLit(this); + else return visitor.visitChildren(this); + } + } + + public final StringArrayLitContext stringArrayLit() throws RecognitionException { + StringArrayLitContext _localctx = new StringArrayLitContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_stringArrayLit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(573); + match(OPEN_BRACKET); + setState(582); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==DOUBLE_QUOTE_STRING) { + { + setState(574); + stringLit(); + setState(579); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(575); + match(COMMA); + setState(576); + stringLit(); + } + } + setState(581); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(584); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class MapLitContext extends ParserRuleContext { + public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } + public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } + public List element() { + return getRuleContexts(ElementContext.class); + } + public ElementContext element(int i) { + return getRuleContext(ElementContext.class,i); + } + public List COMMA() { return getTokens(PMLParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(PMLParser.COMMA, i); + } + public MapLitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_mapLit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterMapLit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitMapLit(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitMapLit(this); + else return visitor.visitChildren(this); + } + } + + public final MapLitContext mapLit() throws RecognitionException { + MapLitContext _localctx = new MapLitContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_mapLit); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(586); + match(OPEN_CURLY); + setState(595); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & 2621615L) != 0)) { + { + setState(587); + element(); + setState(592); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(588); + match(COMMA); + setState(589); + element(); + } + } + setState(594); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(597); + match(CLOSE_CURLY); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class ElementContext extends ParserRuleContext { + public ExpressionContext key; + public ExpressionContext value; + public TerminalNode COLON() { return getToken(PMLParser.COLON, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public ElementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterElement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitElement(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitElement(this); + else return visitor.visitChildren(this); + } + } + + public final ElementContext element() throws RecognitionException { + ElementContext _localctx = new ElementContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_element); + try { + enterOuterAlt(_localctx, 1); + { + setState(599); + ((ElementContext)_localctx).key = expression(0); + setState(600); + match(COLON); + setState(601); + ((ElementContext)_localctx).value = expression(0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class VariableReferenceContext extends ParserRuleContext { + public VariableReferenceContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variableReference; } + + public VariableReferenceContext() { } + public void copyFrom(VariableReferenceContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ReferenceByIndexContext extends VariableReferenceContext { + public VariableReferenceContext variableReference() { + return getRuleContext(VariableReferenceContext.class,0); + } + public IndexContext index() { + return getRuleContext(IndexContext.class,0); + } + public ReferenceByIndexContext(VariableReferenceContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterReferenceByIndex(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitReferenceByIndex(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitReferenceByIndex(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class ReferenceByIDContext extends VariableReferenceContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public ReferenceByIDContext(VariableReferenceContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterReferenceByID(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitReferenceByID(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitReferenceByID(this); + else return visitor.visitChildren(this); + } + } + + public final VariableReferenceContext variableReference() throws RecognitionException { + return variableReference(0); + } + + private VariableReferenceContext variableReference(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + VariableReferenceContext _localctx = new VariableReferenceContext(_ctx, _parentState); + VariableReferenceContext _prevctx = _localctx; + int _startState = 122; + enterRecursionRule(_localctx, 122, RULE_variableReference, _p); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + { + _localctx = new ReferenceByIDContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(604); + match(ID); + } + _ctx.stop = _input.LT(-1); + setState(610); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + { + _localctx = new ReferenceByIndexContext(new VariableReferenceContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_variableReference); + setState(606); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); + setState(607); + index(); + } + } + } + setState(612); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,47,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IndexContext extends ParserRuleContext { + public IndexContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_index; } + + public IndexContext() { } + public void copyFrom(IndexContext ctx) { + super.copyFrom(ctx); + } + } + @SuppressWarnings("CheckReturnValue") + public static class DotIndexContext extends IndexContext { + public IdContext key; + public TerminalNode DOT() { return getToken(PMLParser.DOT, 0); } + public IdContext id() { + return getRuleContext(IdContext.class,0); + } + public DotIndexContext(IndexContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterDotIndex(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitDotIndex(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitDotIndex(this); + else return visitor.visitChildren(this); + } + } + @SuppressWarnings("CheckReturnValue") + public static class BracketIndexContext extends IndexContext { + public ExpressionContext key; + public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public BracketIndexContext(IndexContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterBracketIndex(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitBracketIndex(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitBracketIndex(this); + else return visitor.visitChildren(this); + } + } + + public final IndexContext index() throws RecognitionException { + IndexContext _localctx = new IndexContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_index); + try { + setState(619); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACKET: + _localctx = new BracketIndexContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(613); + match(OPEN_BRACKET); + setState(614); + ((BracketIndexContext)_localctx).key = expression(0); + setState(615); + match(CLOSE_BRACKET); + } + break; + case DOT: + _localctx = new DotIndexContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(617); + match(DOT); + setState(618); + ((DotIndexContext)_localctx).key = id(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class IdContext extends ParserRuleContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public IdContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_id; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterId(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitId(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitId(this); + else return visitor.visitChildren(this); + } + } + + public final IdContext id() throws RecognitionException { + IdContext _localctx = new IdContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_id); + try { + enterOuterAlt(_localctx, 1); + { + setState(621); + match(ID); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionInvokeContext extends ParserRuleContext { + public TerminalNode ID() { return getToken(PMLParser.ID, 0); } + public FunctionInvokeArgsContext functionInvokeArgs() { + return getRuleContext(FunctionInvokeArgsContext.class,0); + } + public FunctionInvokeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionInvoke; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionInvoke(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionInvoke(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionInvoke(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionInvokeContext functionInvoke() throws RecognitionException { + FunctionInvokeContext _localctx = new FunctionInvokeContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_functionInvoke); + try { + enterOuterAlt(_localctx, 1); + { + setState(623); + match(ID); + setState(624); + functionInvokeArgs(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + @SuppressWarnings("CheckReturnValue") + public static class FunctionInvokeArgsContext extends ParserRuleContext { + public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } + public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } + public ExpressionListContext expressionList() { + return getRuleContext(ExpressionListContext.class,0); + } + public FunctionInvokeArgsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionInvokeArgs; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).enterFunctionInvokeArgs(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof PMLParserListener ) ((PMLParserListener)listener).exitFunctionInvokeArgs(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof PMLParserVisitor ) return ((PMLParserVisitor)visitor).visitFunctionInvokeArgs(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionInvokeArgsContext functionInvokeArgs() throws RecognitionException { + FunctionInvokeArgsContext _localctx = new FunctionInvokeArgsContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_functionInvokeArgs); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(626); + match(OPEN_PAREN); + setState(628); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & 2621615L) != 0)) { + { + setState(627); + expressionList(); + } + } + + setState(630); + match(CLOSE_PAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 9: + return subjectPatternExpression_sempred((SubjectPatternExpressionContext)_localctx, predIndex); + case 15: + return operandPatternExpression_sempred((OperandPatternExpressionContext)_localctx, predIndex); + case 52: + return expression_sempred((ExpressionContext)_localctx, predIndex); + case 61: + return variableReference_sempred((VariableReferenceContext)_localctx, predIndex); + } + return true; + } + private boolean subjectPatternExpression_sempred(SubjectPatternExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 1); + } + return true; + } + private boolean operandPatternExpression_sempred(OperandPatternExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return precpred(_ctx, 1); + } + return true; + } + private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return precpred(_ctx, 3); + case 3: + return precpred(_ctx, 2); + case 4: + return precpred(_ctx, 1); + } + return true; + } + private boolean variableReference_sempred(VariableReferenceContext _localctx, int predIndex) { + switch (predIndex) { + case 5: + return precpred(_ctx, 1); + } + return true; + } + + public static final String _serializedATN = + "\u0004\u0001V\u0279\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ + "2\u00072\u00023\u00073\u00024\u00074\u00025\u00075\u00026\u00076\u0002"+ + "7\u00077\u00028\u00078\u00029\u00079\u0002:\u0007:\u0002;\u0007;\u0002"+ + "<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007?\u0002@\u0007@\u0002"+ + "A\u0007A\u0001\u0000\u0005\u0000\u0086\b\u0000\n\u0000\f\u0000\u0089\t"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003"+ + "\u0001\u00a2\b\u0001\u0001\u0002\u0001\u0002\u0005\u0002\u00a6\b\u0002"+ + "\n\u0002\f\u0002\u00a9\t\u0002\u0001\u0002\u0001\u0002\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0005\u0006\u00be\b\u0006\n"+ + "\u0006\f\u0006\u00c1\t\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0003\u0007\u00ce\b\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0003\b\u00d6\b\b\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u00e0\b\t\u0001\t\u0001\t\u0001"+ + "\t\u0005\t\u00e5\b\t\n\t\f\t\u00e8\t\t\u0001\n\u0001\n\u0001\n\u0001\n"+ + "\u0001\n\u0003\n\u00ef\b\n\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b"+ + "\u00f4\b\u000b\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u00fa\b\f\n\f\f"+ + "\f\u00fd\t\f\u0003\f\u00ff\b\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r"+ + "\u0001\r\u0003\r\u0107\b\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0005\u000e\u010d\b\u000e\n\u000e\f\u000e\u0110\t\u000e\u0001\u000e\u0001"+ + "\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0001\u000f\u0003\u000f\u011c\b\u000f\u0001\u000f\u0001"+ + "\u000f\u0001\u000f\u0005\u000f\u0121\b\u000f\n\u000f\f\u000f\u0124\t\u000f"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u012a\b\u0010"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0012\u0001\u0012\u0005\u0012\u0134\b\u0012\n\u0012\f\u0012\u0137"+ + "\t\u0012\u0001\u0012\u0001\u0012\u0001\u0013\u0001\u0013\u0001\u0013\u0003"+ + "\u0013\u013e\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001"+ + "\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001"+ + "\u0015\u0001\u0015\u0001\u0015\u0001\u0016\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001"+ + "\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001"+ + "\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u0019\u0001\u0019\u0001"+ + "\u0019\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0003\u001c\u0173"+ + "\b\u001c\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0005\u001f\u0182\b\u001f\n\u001f\f\u001f\u0185\t\u001f"+ + "\u0001\u001f\u0003\u001f\u0188\b\u001f\u0001\u001f\u0001\u001f\u0001\u001f"+ + "\u0003\u001f\u018d\b\u001f\u0001 \u0001 \u0001 \u0001 \u0001!\u0001!\u0003"+ + "!\u0195\b!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001#\u0001#"+ + "\u0001#\u0001#\u0001#\u0001#\u0003#\u01a3\b#\u0001#\u0003#\u01a6\b#\u0001"+ + "$\u0001$\u0001$\u0005$\u01ab\b$\n$\f$\u01ae\t$\u0003$\u01b0\b$\u0001%"+ + "\u0003%\u01b3\b%\u0001%\u0001%\u0001%\u0001&\u0001&\u0003&\u01ba\b&\u0001"+ + "\'\u0001\'\u0001\'\u0001\'\u0001\'\u0001(\u0001(\u0005(\u01c3\b(\n(\f"+ + "(\u01c6\t(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0005)\u01ce\b)\n"+ + ")\f)\u01d1\t)\u0003)\u01d3\b)\u0001)\u0001)\u0001*\u0001*\u0001+\u0001"+ + "+\u0001+\u0001+\u0003+\u01dd\b+\u0001+\u0001+\u0001+\u0001+\u0001,\u0001"+ + ",\u0001-\u0001-\u0001.\u0001.\u0001.\u0001.\u0005.\u01eb\b.\n.\f.\u01ee"+ + "\t.\u0001.\u0003.\u01f1\b.\u0001/\u0001/\u0001/\u0001/\u0001/\u00010\u0001"+ + "0\u00010\u00011\u00011\u00011\u00011\u00011\u00031\u0200\b1\u00012\u0001"+ + "2\u00012\u00012\u00012\u00012\u00013\u00013\u00013\u00013\u00014\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00034\u0216"+ + "\b4\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u00014\u0005"+ + "4\u0221\b4\n4\f4\u0224\t4\u00015\u00015\u00015\u00055\u0229\b5\n5\f5\u022c"+ + "\t5\u00016\u00016\u00016\u00016\u00036\u0232\b6\u00017\u00017\u00018\u0001"+ + "8\u00019\u00019\u00039\u023a\b9\u00019\u00019\u0001:\u0001:\u0001:\u0001"+ + ":\u0005:\u0242\b:\n:\f:\u0245\t:\u0003:\u0247\b:\u0001:\u0001:\u0001;"+ + "\u0001;\u0001;\u0001;\u0005;\u024f\b;\n;\f;\u0252\t;\u0003;\u0254\b;\u0001"+ + ";\u0001;\u0001<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001"+ + "=\u0005=\u0261\b=\n=\f=\u0264\t=\u0001>\u0001>\u0001>\u0001>\u0001>\u0001"+ + ">\u0003>\u026c\b>\u0001?\u0001?\u0001@\u0001@\u0001@\u0001A\u0001A\u0003"+ + "A\u0275\bA\u0001A\u0001A\u0001A\u0000\u0004\u0012\u001ehzB\u0000\u0002"+ + "\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e"+ + " \"$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0000\b"+ + "\u0002\u0000&\'*+\u0001\u0000MN\u0003\u0000\u0014\u0014\'\'++\u0001\u0000"+ + "\u0012\u0013\u0002\u0000%\'*+\u0002\u0000\u0001\u0001\u0004\u0004\u0001"+ + "\u0000OP\u0001\u0000>?\u028a\u0000\u0087\u0001\u0000\u0000\u0000\u0002"+ + "\u00a1\u0001\u0000\u0000\u0000\u0004\u00a3\u0001\u0000\u0000\u0000\u0006"+ + "\u00ac\u0001\u0000\u0000\u0000\b\u00b0\u0001\u0000\u0000\u0000\n\u00b6"+ + "\u0001\u0000\u0000\u0000\f\u00b8\u0001\u0000\u0000\u0000\u000e\u00c4\u0001"+ + "\u0000\u0000\u0000\u0010\u00d5\u0001\u0000\u0000\u0000\u0012\u00df\u0001"+ + "\u0000\u0000\u0000\u0014\u00ee\u0001\u0000\u0000\u0000\u0016\u00f3\u0001"+ + "\u0000\u0000\u0000\u0018\u00f5\u0001\u0000\u0000\u0000\u001a\u0102\u0001"+ + "\u0000\u0000\u0000\u001c\u0108\u0001\u0000\u0000\u0000\u001e\u011b\u0001"+ + "\u0000\u0000\u0000 \u0129\u0001\u0000\u0000\u0000\"\u012b\u0001\u0000"+ + "\u0000\u0000$\u0131\u0001\u0000\u0000\u0000&\u013d\u0001\u0000\u0000\u0000"+ + "(\u013f\u0001\u0000\u0000\u0000*\u014c\u0001\u0000\u0000\u0000,\u0152"+ + "\u0001\u0000\u0000\u0000.\u0157\u0001\u0000\u0000\u00000\u015c\u0001\u0000"+ + "\u0000\u00002\u0163\u0001\u0000\u0000\u00004\u0168\u0001\u0000\u0000\u0000"+ + "6\u016b\u0001\u0000\u0000\u00008\u0172\u0001\u0000\u0000\u0000:\u0174"+ + "\u0001\u0000\u0000\u0000<\u0176\u0001\u0000\u0000\u0000>\u018c\u0001\u0000"+ + "\u0000\u0000@\u018e\u0001\u0000\u0000\u0000B\u0192\u0001\u0000\u0000\u0000"+ + "D\u0199\u0001\u0000\u0000\u0000F\u019c\u0001\u0000\u0000\u0000H\u01af"+ + "\u0001\u0000\u0000\u0000J\u01b2\u0001\u0000\u0000\u0000L\u01b7\u0001\u0000"+ + "\u0000\u0000N\u01bb\u0001\u0000\u0000\u0000P\u01c0\u0001\u0000\u0000\u0000"+ + "R\u01c9\u0001\u0000\u0000\u0000T\u01d6\u0001\u0000\u0000\u0000V\u01d8"+ + "\u0001\u0000\u0000\u0000X\u01e2\u0001\u0000\u0000\u0000Z\u01e4\u0001\u0000"+ + "\u0000\u0000\\\u01e6\u0001\u0000\u0000\u0000^\u01f2\u0001\u0000\u0000"+ + "\u0000`\u01f7\u0001\u0000\u0000\u0000b\u01ff\u0001\u0000\u0000\u0000d"+ + "\u0201\u0001\u0000\u0000\u0000f\u0207\u0001\u0000\u0000\u0000h\u0215\u0001"+ + "\u0000\u0000\u0000j\u0225\u0001\u0000\u0000\u0000l\u0231\u0001\u0000\u0000"+ + "\u0000n\u0233\u0001\u0000\u0000\u0000p\u0235\u0001\u0000\u0000\u0000r"+ + "\u0237\u0001\u0000\u0000\u0000t\u023d\u0001\u0000\u0000\u0000v\u024a\u0001"+ + "\u0000\u0000\u0000x\u0257\u0001\u0000\u0000\u0000z\u025b\u0001\u0000\u0000"+ + "\u0000|\u026b\u0001\u0000\u0000\u0000~\u026d\u0001\u0000\u0000\u0000\u0080"+ + "\u026f\u0001\u0000\u0000\u0000\u0082\u0272\u0001\u0000\u0000\u0000\u0084"+ + "\u0086\u0003\u0002\u0001\u0000\u0085\u0084\u0001\u0000\u0000\u0000\u0086"+ + "\u0089\u0001\u0000\u0000\u0000\u0087\u0085\u0001\u0000\u0000\u0000\u0087"+ + "\u0088\u0001\u0000\u0000\u0000\u0088\u008a\u0001\u0000\u0000\u0000\u0089"+ + "\u0087\u0001\u0000\u0000\u0000\u008a\u008b\u0005\u0000\u0000\u0001\u008b"+ + "\u0001\u0001\u0000\u0000\u0000\u008c\u00a2\u0003B!\u0000\u008d\u00a2\u0003"+ + ">\u001f\u0000\u008e\u00a2\u0003V+\u0000\u008f\u00a2\u0003L&\u0000\u0090"+ + "\u00a2\u0003X,\u0000\u0091\u00a2\u0003Z-\u0000\u0092\u00a2\u0003T*\u0000"+ + "\u0093\u00a2\u0003\\.\u0000\u0094\u00a2\u0003\u0006\u0003\u0000\u0095"+ + "\u00a2\u0003\b\u0004\u0000\u0096\u00a2\u0003\f\u0006\u0000\u0097\u00a2"+ + "\u0003(\u0014\u0000\u0098\u00a2\u0003*\u0015\u0000\u0099\u00a2\u0003,"+ + "\u0016\u0000\u009a\u00a2\u0003.\u0017\u0000\u009b\u00a2\u00030\u0018\u0000"+ + "\u009c\u00a2\u00032\u0019\u0000\u009d\u00a2\u00034\u001a\u0000\u009e\u00a2"+ + "\u00036\u001b\u0000\u009f\u00a2\u0003<\u001e\u0000\u00a0\u00a2\u0003D"+ + "\"\u0000\u00a1\u008c\u0001\u0000\u0000\u0000\u00a1\u008d\u0001\u0000\u0000"+ + "\u0000\u00a1\u008e\u0001\u0000\u0000\u0000\u00a1\u008f\u0001\u0000\u0000"+ + "\u0000\u00a1\u0090\u0001\u0000\u0000\u0000\u00a1\u0091\u0001\u0000\u0000"+ + "\u0000\u00a1\u0092\u0001\u0000\u0000\u0000\u00a1\u0093\u0001\u0000\u0000"+ + "\u0000\u00a1\u0094\u0001\u0000\u0000\u0000\u00a1\u0095\u0001\u0000\u0000"+ + "\u0000\u00a1\u0096\u0001\u0000\u0000\u0000\u00a1\u0097\u0001\u0000\u0000"+ + "\u0000\u00a1\u0098\u0001\u0000\u0000\u0000\u00a1\u0099\u0001\u0000\u0000"+ + "\u0000\u00a1\u009a\u0001\u0000\u0000\u0000\u00a1\u009b\u0001\u0000\u0000"+ + "\u0000\u00a1\u009c\u0001\u0000\u0000\u0000\u00a1\u009d\u0001\u0000\u0000"+ + "\u0000\u00a1\u009e\u0001\u0000\u0000\u0000\u00a1\u009f\u0001\u0000\u0000"+ + "\u0000\u00a1\u00a0\u0001\u0000\u0000\u0000\u00a2\u0003\u0001\u0000\u0000"+ + "\u0000\u00a3\u00a7\u0005C\u0000\u0000\u00a4\u00a6\u0003\u0002\u0001\u0000"+ + "\u00a5\u00a4\u0001\u0000\u0000\u0000\u00a6\u00a9\u0001\u0000\u0000\u0000"+ + "\u00a7\u00a5\u0001\u0000\u0000\u0000\u00a7\u00a8\u0001\u0000\u0000\u0000"+ + "\u00a8\u00aa\u0001\u0000\u0000\u0000\u00a9\u00a7\u0001\u0000\u0000\u0000"+ + "\u00aa\u00ab\u0005D\u0000\u0000\u00ab\u0005\u0001\u0000\u0000\u0000\u00ac"+ + "\u00ad\u0005\u0005\u0000\u0000\u00ad\u00ae\u0005%\u0000\u0000\u00ae\u00af"+ + "\u0003h4\u0000\u00af\u0007\u0001\u0000\u0000\u0000\u00b0\u00b1\u0005\u0005"+ + "\u0000\u0000\u00b1\u00b2\u0003\n\u0005\u0000\u00b2\u00b3\u0003h4\u0000"+ + "\u00b3\u00b4\u0005\u000e\u0000\u0000\u00b4\u00b5\u0003h4\u0000\u00b5\t"+ + "\u0001\u0000\u0000\u0000\u00b6\u00b7\u0007\u0000\u0000\u0000\u00b7\u000b"+ + "\u0001\u0000\u0000\u0000\u00b8\u00b9\u0005\u0005\u0000\u0000\u00b9\u00ba"+ + "\u0005#\u0000\u0000\u00ba\u00bb\u0003h4\u0000\u00bb\u00bf\u0005C\u0000"+ + "\u0000\u00bc\u00be\u0003\u000e\u0007\u0000\u00bd\u00bc\u0001\u0000\u0000"+ + "\u0000\u00be\u00c1\u0001\u0000\u0000\u0000\u00bf\u00bd\u0001\u0000\u0000"+ + "\u0000\u00bf\u00c0\u0001\u0000\u0000\u0000\u00c0\u00c2\u0001\u0000\u0000"+ + "\u0000\u00c1\u00bf\u0001\u0000\u0000\u0000\u00c2\u00c3\u0005D\u0000\u0000"+ + "\u00c3\r\u0001\u0000\u0000\u0000\u00c4\u00c5\u0005\u0005\u0000\u0000\u00c5"+ + "\u00c6\u0005\t\u0000\u0000\u00c6\u00c7\u0003h4\u0000\u00c7\u00c8\u0005"+ + "\n\u0000\u0000\u00c8\u00c9\u0003\u0010\b\u0000\u00c9\u00ca\u0005\u000b"+ + "\u0000\u0000\u00ca\u00cd\u0003\u0016\u000b\u0000\u00cb\u00cc\u0005\r\u0000"+ + "\u0000\u00cc\u00ce\u0003\u0018\f\u0000\u00cd\u00cb\u0001\u0000\u0000\u0000"+ + "\u00cd\u00ce\u0001\u0000\u0000\u0000\u00ce\u00cf\u0001\u0000\u0000\u0000"+ + "\u00cf\u00d0\u0003\"\u0011\u0000\u00d0\u000f\u0001\u0000\u0000\u0000\u00d1"+ + "\u00d2\u0005\u0010\u0000\u0000\u00d2\u00d6\u0005+\u0000\u0000\u00d3\u00d4"+ + "\u0005+\u0000\u0000\u00d4\u00d6\u0003\u0012\t\u0000\u00d5\u00d1\u0001"+ + "\u0000\u0000\u0000\u00d5\u00d3\u0001\u0000\u0000\u0000\u00d6\u0011\u0001"+ + "\u0000\u0000\u0000\u00d7\u00d8\u0006\t\uffff\uffff\u0000\u00d8\u00e0\u0003"+ + "\u0014\n\u0000\u00d9\u00da\u0005Q\u0000\u0000\u00da\u00e0\u0003\u0012"+ + "\t\u0003\u00db\u00dc\u0005A\u0000\u0000\u00dc\u00dd\u0003\u0012\t\u0000"+ + "\u00dd\u00de\u0005B\u0000\u0000\u00de\u00e0\u0001\u0000\u0000\u0000\u00df"+ + "\u00d7\u0001\u0000\u0000\u0000\u00df\u00d9\u0001\u0000\u0000\u0000\u00df"+ + "\u00db\u0001\u0000\u0000\u0000\u00e0\u00e6\u0001\u0000\u0000\u0000\u00e1"+ + "\u00e2\n\u0001\u0000\u0000\u00e2\u00e3\u0007\u0001\u0000\u0000\u00e3\u00e5"+ + "\u0003\u0012\t\u0002\u00e4\u00e1\u0001\u0000\u0000\u0000\u00e5\u00e8\u0001"+ + "\u0000\u0000\u0000\u00e6\u00e4\u0001\u0000\u0000\u0000\u00e6\u00e7\u0001"+ + "\u0000\u0000\u0000\u00e7\u0013\u0001\u0000\u0000\u0000\u00e8\u00e6\u0001"+ + "\u0000\u0000\u0000\u00e9\u00ea\u0005\u000e\u0000\u0000\u00ea\u00ef\u0003"+ + "n7\u0000\u00eb\u00ef\u0003n7\u0000\u00ec\u00ed\u0005\u0014\u0000\u0000"+ + "\u00ed\u00ef\u0003n7\u0000\u00ee\u00e9\u0001\u0000\u0000\u0000\u00ee\u00eb"+ + "\u0001\u0000\u0000\u0000\u00ee\u00ec\u0001\u0000\u0000\u0000\u00ef\u0015"+ + "\u0001\u0000\u0000\u0000\u00f0\u00f1\u0005\u0010\u0000\u0000\u00f1\u00f4"+ + "\u0005\u0001\u0000\u0000\u00f2\u00f4\u0003n7\u0000\u00f3\u00f0\u0001\u0000"+ + "\u0000\u0000\u00f3\u00f2\u0001\u0000\u0000\u0000\u00f4\u0017\u0001\u0000"+ + "\u0000\u0000\u00f5\u00fe\u0005C\u0000\u0000\u00f6\u00fb\u0003\u001a\r"+ + "\u0000\u00f7\u00f8\u0005H\u0000\u0000\u00f8\u00fa\u0003\u001a\r\u0000"+ + "\u00f9\u00f7\u0001\u0000\u0000\u0000\u00fa\u00fd\u0001\u0000\u0000\u0000"+ + "\u00fb\u00f9\u0001\u0000\u0000\u0000\u00fb\u00fc\u0001\u0000\u0000\u0000"+ + "\u00fc\u00ff\u0001\u0000\u0000\u0000\u00fd\u00fb\u0001\u0000\u0000\u0000"+ + "\u00fe\u00f6\u0001\u0000\u0000\u0000\u00fe\u00ff\u0001\u0000\u0000\u0000"+ + "\u00ff\u0100\u0001\u0000\u0000\u0000\u0100\u0101\u0005D\u0000\u0000\u0101"+ + "\u0019\u0001\u0000\u0000\u0000\u0102\u0103\u0005@\u0000\u0000\u0103\u0106"+ + "\u0005J\u0000\u0000\u0104\u0107\u0003\u001e\u000f\u0000\u0105\u0107\u0003"+ + "\u001c\u000e\u0000\u0106\u0104\u0001\u0000\u0000\u0000\u0106\u0105\u0001"+ + "\u0000\u0000\u0000\u0107\u001b\u0001\u0000\u0000\u0000\u0108\u0109\u0005"+ + "E\u0000\u0000\u0109\u010e\u0003\u001e\u000f\u0000\u010a\u010b\u0005H\u0000"+ + "\u0000\u010b\u010d\u0003\u001e\u000f\u0000\u010c\u010a\u0001\u0000\u0000"+ + "\u0000\u010d\u0110\u0001\u0000\u0000\u0000\u010e\u010c\u0001\u0000\u0000"+ + "\u0000\u010e\u010f\u0001\u0000\u0000\u0000\u010f\u0111\u0001\u0000\u0000"+ + "\u0000\u0110\u010e\u0001\u0000\u0000\u0000\u0111\u0112\u0005F\u0000\u0000"+ + "\u0112\u001d\u0001\u0000\u0000\u0000\u0113\u0114\u0006\u000f\uffff\uffff"+ + "\u0000\u0114\u011c\u0003 \u0010\u0000\u0115\u0116\u0005Q\u0000\u0000\u0116"+ + "\u011c\u0003\u001e\u000f\u0003\u0117\u0118\u0005A\u0000\u0000\u0118\u0119"+ + "\u0003\u001e\u000f\u0000\u0119\u011a\u0005B\u0000\u0000\u011a\u011c\u0001"+ + "\u0000\u0000\u0000\u011b\u0113\u0001\u0000\u0000\u0000\u011b\u0115\u0001"+ + "\u0000\u0000\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011c\u0122\u0001"+ + "\u0000\u0000\u0000\u011d\u011e\n\u0001\u0000\u0000\u011e\u011f\u0007\u0001"+ + "\u0000\u0000\u011f\u0121\u0003\u001e\u000f\u0002\u0120\u011d\u0001\u0000"+ + "\u0000\u0000\u0121\u0124\u0001\u0000\u0000\u0000\u0122\u0120\u0001\u0000"+ + "\u0000\u0000\u0122\u0123\u0001\u0000\u0000\u0000\u0123\u001f\u0001\u0000"+ + "\u0000\u0000\u0124\u0122\u0001\u0000\u0000\u0000\u0125\u012a\u0005\u0010"+ + "\u0000\u0000\u0126\u0127\u0005\u000e\u0000\u0000\u0127\u012a\u0003n7\u0000"+ + "\u0128\u012a\u0003n7\u0000\u0129\u0125\u0001\u0000\u0000\u0000\u0129\u0126"+ + "\u0001\u0000\u0000\u0000\u0129\u0128\u0001\u0000\u0000\u0000\u012a!\u0001"+ + "\u0000\u0000\u0000\u012b\u012c\u0005\u000f\u0000\u0000\u012c\u012d\u0005"+ + "A\u0000\u0000\u012d\u012e\u0005@\u0000\u0000\u012e\u012f\u0005B\u0000"+ + "\u0000\u012f\u0130\u0003$\u0012\u0000\u0130#\u0001\u0000\u0000\u0000\u0131"+ + "\u0135\u0005C\u0000\u0000\u0132\u0134\u0003&\u0013\u0000\u0133\u0132\u0001"+ + "\u0000\u0000\u0000\u0134\u0137\u0001\u0000\u0000\u0000\u0135\u0133\u0001"+ + "\u0000\u0000\u0000\u0135\u0136\u0001\u0000\u0000\u0000\u0136\u0138\u0001"+ + "\u0000\u0000\u0000\u0137\u0135\u0001\u0000\u0000\u0000\u0138\u0139\u0005"+ + "D\u0000\u0000\u0139%\u0001\u0000\u0000\u0000\u013a\u013e\u0003\u0002\u0001"+ + "\u0000\u013b\u013e\u0003\u000e\u0007\u0000\u013c\u013e\u0003<\u001e\u0000"+ + "\u013d\u013a\u0001\u0000\u0000\u0000\u013d\u013b\u0001\u0000\u0000\u0000"+ + "\u013d\u013c\u0001\u0000\u0000\u0000\u013e\'\u0001\u0000\u0000\u0000\u013f"+ + "\u0140\u0005\u0005\u0000\u0000\u0140\u0141\u0005\"\u0000\u0000\u0141\u0142"+ + "\u0003h4\u0000\u0142\u0143\u0005!\u0000\u0000\u0143\u0144\u0007\u0002"+ + "\u0000\u0000\u0144\u0145\u0003h4\u0000\u0145\u0146\u0005$\u0000\u0000"+ + "\u0146\u0147\u0003h4\u0000\u0147\u0148\u0005\r\u0000\u0000\u0148\u0149"+ + "\u0007\u0003\u0000\u0000\u0149\u014a\u0005\u001b\u0000\u0000\u014a\u014b"+ + "\u0003h4\u0000\u014b)\u0001\u0000\u0000\u0000\u014c\u014d\u0005\u0019"+ + "\u0000\u0000\u014d\u014e\u0005\u001b\u0000\u0000\u014e\u014f\u0003h4\u0000"+ + "\u014f\u0150\u0005\u001c\u0000\u0000\u0150\u0151\u0003h4\u0000\u0151+"+ + "\u0001\u0000\u0000\u0000\u0152\u0153\u0005\u0016\u0000\u0000\u0153\u0154"+ + "\u0003h4\u0000\u0154\u0155\u0005\u001c\u0000\u0000\u0155\u0156\u0003h"+ + "4\u0000\u0156-\u0001\u0000\u0000\u0000\u0157\u0158\u0005\u0017\u0000\u0000"+ + "\u0158\u0159\u0003h4\u0000\u0159\u015a\u0005\u0018\u0000\u0000\u015a\u015b"+ + "\u0003h4\u0000\u015b/\u0001\u0000\u0000\u0000\u015c\u015d\u0005\u001d"+ + "\u0000\u0000\u015d\u015e\u0003h4\u0000\u015e\u015f\u0005\u001e\u0000\u0000"+ + "\u015f\u0160\u0003h4\u0000\u0160\u0161\u0005\u001f\u0000\u0000\u0161\u0162"+ + "\u0003h4\u0000\u01621\u0001\u0000\u0000\u0000\u0163\u0164\u0005 \u0000"+ + "\u0000\u0164\u0165\u0003h4\u0000\u0165\u0166\u0005\u001e\u0000\u0000\u0166"+ + "\u0167\u0003h4\u0000\u01673\u0001\u0000\u0000\u0000\u0168\u0169\u0005"+ + "\u0015\u0000\u0000\u0169\u016a\u0003h4\u0000\u016a5\u0001\u0000\u0000"+ + "\u0000\u016b\u016c\u0005\u0006\u0000\u0000\u016c\u016d\u00038\u001c\u0000"+ + "\u016d\u016e\u0003h4\u0000\u016e7\u0001\u0000\u0000\u0000\u016f\u0173"+ + "\u0003:\u001d\u0000\u0170\u0173\u0005#\u0000\u0000\u0171\u0173\u0005\""+ + "\u0000\u0000\u0172\u016f\u0001\u0000\u0000\u0000\u0172\u0170\u0001\u0000"+ + "\u0000\u0000\u0172\u0171\u0001\u0000\u0000\u0000\u01739\u0001\u0000\u0000"+ + "\u0000\u0174\u0175\u0007\u0004\u0000\u0000\u0175;\u0001\u0000\u0000\u0000"+ + "\u0176\u0177\u0005\u0006\u0000\u0000\u0177\u0178\u0005\t\u0000\u0000\u0178"+ + "\u0179\u0003h4\u0000\u0179\u017a\u0005\u0018\u0000\u0000\u017a\u017b\u0005"+ + "#\u0000\u0000\u017b\u017c\u0003h4\u0000\u017c=\u0001\u0000\u0000\u0000"+ + "\u017d\u0187\u00058\u0000\u0000\u017e\u0188\u0003@ \u0000\u017f\u0183"+ + "\u0005A\u0000\u0000\u0180\u0182\u0003@ \u0000\u0181\u0180\u0001\u0000"+ + "\u0000\u0000\u0182\u0185\u0001\u0000\u0000\u0000\u0183\u0181\u0001\u0000"+ + "\u0000\u0000\u0183\u0184\u0001\u0000\u0000\u0000\u0184\u0186\u0001\u0000"+ + "\u0000\u0000\u0185\u0183\u0001\u0000\u0000\u0000\u0186\u0188\u0005B\u0000"+ + "\u0000\u0187\u017e\u0001\u0000\u0000\u0000\u0187\u017f\u0001\u0000\u0000"+ + "\u0000\u0188\u018d\u0001\u0000\u0000\u0000\u0189\u018a\u0005@\u0000\u0000"+ + "\u018a\u018b\u0005L\u0000\u0000\u018b\u018d\u0003h4\u0000\u018c\u017d"+ + "\u0001\u0000\u0000\u0000\u018c\u0189\u0001\u0000\u0000\u0000\u018d?\u0001"+ + "\u0000\u0000\u0000\u018e\u018f\u0005@\u0000\u0000\u018f\u0190\u0005G\u0000"+ + "\u0000\u0190\u0191\u0003h4\u0000\u0191A\u0001\u0000\u0000\u0000\u0192"+ + "\u0194\u0005@\u0000\u0000\u0193\u0195\u0005R\u0000\u0000\u0194\u0193\u0001"+ + "\u0000\u0000\u0000\u0194\u0195\u0001\u0000\u0000\u0000\u0195\u0196\u0001"+ + "\u0000\u0000\u0000\u0196\u0197\u0005G\u0000\u0000\u0197\u0198\u0003h4"+ + "\u0000\u0198C\u0001\u0000\u0000\u0000\u0199\u019a\u0003F#\u0000\u019a"+ + "\u019b\u0003\u0004\u0002\u0000\u019bE\u0001\u0000\u0000\u0000\u019c\u019d"+ + "\u0007\u0005\u0000\u0000\u019d\u019e\u0005@\u0000\u0000\u019e\u019f\u0005"+ + "A\u0000\u0000\u019f\u01a0\u0003H$\u0000\u01a0\u01a2\u0005B\u0000\u0000"+ + "\u01a1\u01a3\u0003b1\u0000\u01a2\u01a1\u0001\u0000\u0000\u0000\u01a2\u01a3"+ + "\u0001\u0000\u0000\u0000\u01a3\u01a5\u0001\u0000\u0000\u0000\u01a4\u01a6"+ + "\u0003P(\u0000\u01a5\u01a4\u0001\u0000\u0000\u0000\u01a5\u01a6\u0001\u0000"+ + "\u0000\u0000\u01a6G\u0001\u0000\u0000\u0000\u01a7\u01ac\u0003J%\u0000"+ + "\u01a8\u01a9\u0005H\u0000\u0000\u01a9\u01ab\u0003J%\u0000\u01aa\u01a8"+ + "\u0001\u0000\u0000\u0000\u01ab\u01ae\u0001\u0000\u0000\u0000\u01ac\u01aa"+ + "\u0001\u0000\u0000\u0000\u01ac\u01ad\u0001\u0000\u0000\u0000\u01ad\u01b0"+ + "\u0001\u0000\u0000\u0000\u01ae\u01ac\u0001\u0000\u0000\u0000\u01af\u01a7"+ + "\u0001\u0000\u0000\u0000\u01af\u01b0\u0001\u0000\u0000\u0000\u01b0I\u0001"+ + "\u0000\u0000\u0000\u01b1\u01b3\u0005\u0002\u0000\u0000\u01b2\u01b1\u0001"+ + "\u0000\u0000\u0000\u01b2\u01b3\u0001\u0000\u0000\u0000\u01b3\u01b4\u0001"+ + "\u0000\u0000\u0000\u01b4\u01b5\u0003b1\u0000\u01b5\u01b6\u0005@\u0000"+ + "\u0000\u01b6K\u0001\u0000\u0000\u0000\u01b7\u01b9\u00057\u0000\u0000\u01b8"+ + "\u01ba\u0003h4\u0000\u01b9\u01b8\u0001\u0000\u0000\u0000\u01b9\u01ba\u0001"+ + "\u0000\u0000\u0000\u01baM\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005\u0003"+ + "\u0000\u0000\u01bc\u01bd\u0003h4\u0000\u01bd\u01be\u0005\r\u0000\u0000"+ + "\u01be\u01bf\u0003h4\u0000\u01bfO\u0001\u0000\u0000\u0000\u01c0\u01c4"+ + "\u0005C\u0000\u0000\u01c1\u01c3\u0003N\'\u0000\u01c2\u01c1\u0001\u0000"+ + "\u0000\u0000\u01c3\u01c6\u0001\u0000\u0000\u0000\u01c4\u01c2\u0001\u0000"+ + "\u0000\u0000\u01c4\u01c5\u0001\u0000\u0000\u0000\u01c5\u01c7\u0001\u0000"+ + "\u0000\u0000\u01c6\u01c4\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005D\u0000"+ + "\u0000\u01c8Q\u0001\u0000\u0000\u0000\u01c9\u01d2\u0005E\u0000\u0000\u01ca"+ + "\u01cf\u0005@\u0000\u0000\u01cb\u01cc\u0005H\u0000\u0000\u01cc\u01ce\u0005"+ + "@\u0000\u0000\u01cd\u01cb\u0001\u0000\u0000\u0000\u01ce\u01d1\u0001\u0000"+ + "\u0000\u0000\u01cf\u01cd\u0001\u0000\u0000\u0000\u01cf\u01d0\u0001\u0000"+ + "\u0000\u0000\u01d0\u01d3\u0001\u0000\u0000\u0000\u01d1\u01cf\u0001\u0000"+ + "\u0000\u0000\u01d2\u01ca\u0001\u0000\u0000\u0000\u01d2\u01d3\u0001\u0000"+ + "\u0000\u0000\u01d3\u01d4\u0001\u0000\u0000\u0000\u01d4\u01d5\u0005F\u0000"+ + "\u0000\u01d5S\u0001\u0000\u0000\u0000\u01d6\u01d7\u0003\u0080@\u0000\u01d7"+ + "U\u0001\u0000\u0000\u0000\u01d8\u01d9\u00056\u0000\u0000\u01d9\u01dc\u0005"+ + "@\u0000\u0000\u01da\u01db\u0005H\u0000\u0000\u01db\u01dd\u0005@\u0000"+ + "\u0000\u01dc\u01da\u0001\u0000\u0000\u0000\u01dc\u01dd\u0001\u0000\u0000"+ + "\u0000\u01dd\u01de\u0001\u0000\u0000\u0000\u01de\u01df\u0005\u000e\u0000"+ + "\u0000\u01df\u01e0\u0003h4\u0000\u01e0\u01e1\u0003\u0004\u0002\u0000\u01e1"+ + "W\u0001\u0000\u0000\u0000\u01e2\u01e3\u0005.\u0000\u0000\u01e3Y\u0001"+ + "\u0000\u0000\u0000\u01e4\u01e5\u00055\u0000\u0000\u01e5[\u0001\u0000\u0000"+ + "\u0000\u01e6\u01e7\u00053\u0000\u0000\u01e7\u01e8\u0003h4\u0000\u01e8"+ + "\u01ec\u0003\u0004\u0002\u0000\u01e9\u01eb\u0003^/\u0000\u01ea\u01e9\u0001"+ + "\u0000\u0000\u0000\u01eb\u01ee\u0001\u0000\u0000\u0000\u01ec\u01ea\u0001"+ + "\u0000\u0000\u0000\u01ec\u01ed\u0001\u0000\u0000\u0000\u01ed\u01f0\u0001"+ + "\u0000\u0000\u0000\u01ee\u01ec\u0001\u0000\u0000\u0000\u01ef\u01f1\u0003"+ + "`0\u0000\u01f0\u01ef\u0001\u0000\u0000\u0000\u01f0\u01f1\u0001\u0000\u0000"+ + "\u0000\u01f1]\u0001\u0000\u0000\u0000\u01f2\u01f3\u00051\u0000\u0000\u01f3"+ + "\u01f4\u00053\u0000\u0000\u01f4\u01f5\u0003h4\u0000\u01f5\u01f6\u0003"+ + "\u0004\u0002\u0000\u01f6_\u0001\u0000\u0000\u0000\u01f7\u01f8\u00051\u0000"+ + "\u0000\u01f8\u01f9\u0003\u0004\u0002\u0000\u01f9a\u0001\u0000\u0000\u0000"+ + "\u01fa\u0200\u00059\u0000\u0000\u01fb\u0200\u0005:\u0000\u0000\u01fc\u0200"+ + "\u0003f3\u0000\u01fd\u0200\u0003d2\u0000\u01fe\u0200\u0005\u0010\u0000"+ + "\u0000\u01ff\u01fa\u0001\u0000\u0000\u0000\u01ff\u01fb\u0001\u0000\u0000"+ + "\u0000\u01ff\u01fc\u0001\u0000\u0000\u0000\u01ff\u01fd\u0001\u0000\u0000"+ + "\u0000\u01ff\u01fe\u0001\u0000\u0000\u0000\u0200c\u0001\u0000\u0000\u0000"+ + "\u0201\u0202\u00050\u0000\u0000\u0202\u0203\u0005E\u0000\u0000\u0203\u0204"+ + "\u0003b1\u0000\u0204\u0205\u0005F\u0000\u0000\u0205\u0206\u0003b1\u0000"+ + "\u0206e\u0001\u0000\u0000\u0000\u0207\u0208\u0005E\u0000\u0000\u0208\u0209"+ + "\u0005F\u0000\u0000\u0209\u020a\u0003b1\u0000\u020ag\u0001\u0000\u0000"+ + "\u0000\u020b\u020c\u00064\uffff\uffff\u0000\u020c\u0216\u0003\u0080@\u0000"+ + "\u020d\u0216\u0003z=\u0000\u020e\u0216\u0003l6\u0000\u020f\u0210\u0005"+ + "Q\u0000\u0000\u0210\u0216\u0003h4\u0005\u0211\u0212\u0005A\u0000\u0000"+ + "\u0212\u0213\u0003h4\u0000\u0213\u0214\u0005B\u0000\u0000\u0214\u0216"+ + "\u0001\u0000\u0000\u0000\u0215\u020b\u0001\u0000\u0000\u0000\u0215\u020d"+ + "\u0001\u0000\u0000\u0000\u0215\u020e\u0001\u0000\u0000\u0000\u0215\u020f"+ + "\u0001\u0000\u0000\u0000\u0215\u0211\u0001\u0000\u0000\u0000\u0216\u0222"+ + "\u0001\u0000\u0000\u0000\u0217\u0218\n\u0003\u0000\u0000\u0218\u0219\u0005"+ + "R\u0000\u0000\u0219\u0221\u0003h4\u0004\u021a\u021b\n\u0002\u0000\u0000"+ + "\u021b\u021c\u0007\u0006\u0000\u0000\u021c\u0221\u0003h4\u0003\u021d\u021e"+ + "\n\u0001\u0000\u0000\u021e\u021f\u0007\u0001\u0000\u0000\u021f\u0221\u0003"+ + "h4\u0002\u0220\u0217\u0001\u0000\u0000\u0000\u0220\u021a\u0001\u0000\u0000"+ + "\u0000\u0220\u021d\u0001\u0000\u0000\u0000\u0221\u0224\u0001\u0000\u0000"+ + "\u0000\u0222\u0220\u0001\u0000\u0000\u0000\u0222\u0223\u0001\u0000\u0000"+ + "\u0000\u0223i\u0001\u0000\u0000\u0000\u0224\u0222\u0001\u0000\u0000\u0000"+ + "\u0225\u022a\u0003h4\u0000\u0226\u0227\u0005H\u0000\u0000\u0227\u0229"+ + "\u0003h4\u0000\u0228\u0226\u0001\u0000\u0000\u0000\u0229\u022c\u0001\u0000"+ + "\u0000\u0000\u022a\u0228\u0001\u0000\u0000\u0000\u022a\u022b\u0001\u0000"+ + "\u0000\u0000\u022bk\u0001\u0000\u0000\u0000\u022c\u022a\u0001\u0000\u0000"+ + "\u0000\u022d\u0232\u0003n7\u0000\u022e\u0232\u0003p8\u0000\u022f\u0232"+ + "\u0003r9\u0000\u0230\u0232\u0003v;\u0000\u0231\u022d\u0001\u0000\u0000"+ + "\u0000\u0231\u022e\u0001\u0000\u0000\u0000\u0231\u022f\u0001\u0000\u0000"+ + "\u0000\u0231\u0230\u0001\u0000\u0000\u0000\u0232m\u0001\u0000\u0000\u0000"+ + "\u0233\u0234\u0005S\u0000\u0000\u0234o\u0001\u0000\u0000\u0000\u0235\u0236"+ + "\u0007\u0007\u0000\u0000\u0236q\u0001\u0000\u0000\u0000\u0237\u0239\u0005"+ + "E\u0000\u0000\u0238\u023a\u0003j5\u0000\u0239\u0238\u0001\u0000\u0000"+ + "\u0000\u0239\u023a\u0001\u0000\u0000\u0000\u023a\u023b\u0001\u0000\u0000"+ + "\u0000\u023b\u023c\u0005F\u0000\u0000\u023cs\u0001\u0000\u0000\u0000\u023d"+ + "\u0246\u0005E\u0000\u0000\u023e\u0243\u0003n7\u0000\u023f\u0240\u0005"+ + "H\u0000\u0000\u0240\u0242\u0003n7\u0000\u0241\u023f\u0001\u0000\u0000"+ + "\u0000\u0242\u0245\u0001\u0000\u0000\u0000\u0243\u0241\u0001\u0000\u0000"+ + "\u0000\u0243\u0244\u0001\u0000\u0000\u0000\u0244\u0247\u0001\u0000\u0000"+ + "\u0000\u0245\u0243\u0001\u0000\u0000\u0000\u0246\u023e\u0001\u0000\u0000"+ + "\u0000\u0246\u0247\u0001\u0000\u0000\u0000\u0247\u0248\u0001\u0000\u0000"+ + "\u0000\u0248\u0249\u0005F\u0000\u0000\u0249u\u0001\u0000\u0000\u0000\u024a"+ + "\u0253\u0005C\u0000\u0000\u024b\u0250\u0003x<\u0000\u024c\u024d\u0005"+ + "H\u0000\u0000\u024d\u024f\u0003x<\u0000\u024e\u024c\u0001\u0000\u0000"+ + "\u0000\u024f\u0252\u0001\u0000\u0000\u0000\u0250\u024e\u0001\u0000\u0000"+ + "\u0000\u0250\u0251\u0001\u0000\u0000\u0000\u0251\u0254\u0001\u0000\u0000"+ + "\u0000\u0252\u0250\u0001\u0000\u0000\u0000\u0253\u024b\u0001\u0000\u0000"+ + "\u0000\u0253\u0254\u0001\u0000\u0000\u0000\u0254\u0255\u0001\u0000\u0000"+ + "\u0000\u0255\u0256\u0005D\u0000\u0000\u0256w\u0001\u0000\u0000\u0000\u0257"+ + "\u0258\u0003h4\u0000\u0258\u0259\u0005J\u0000\u0000\u0259\u025a\u0003"+ + "h4\u0000\u025ay\u0001\u0000\u0000\u0000\u025b\u025c\u0006=\uffff\uffff"+ + "\u0000\u025c\u025d\u0005@\u0000\u0000\u025d\u0262\u0001\u0000\u0000\u0000"+ + "\u025e\u025f\n\u0001\u0000\u0000\u025f\u0261\u0003|>\u0000\u0260\u025e"+ + "\u0001\u0000\u0000\u0000\u0261\u0264\u0001\u0000\u0000\u0000\u0262\u0260"+ + "\u0001\u0000\u0000\u0000\u0262\u0263\u0001\u0000\u0000\u0000\u0263{\u0001"+ + "\u0000\u0000\u0000\u0264\u0262\u0001\u0000\u0000\u0000\u0265\u0266\u0005"+ + "E\u0000\u0000\u0266\u0267\u0003h4\u0000\u0267\u0268\u0005F\u0000\u0000"+ + "\u0268\u026c\u0001\u0000\u0000\u0000\u0269\u026a\u0005K\u0000\u0000\u026a"+ + "\u026c\u0003~?\u0000\u026b\u0265\u0001\u0000\u0000\u0000\u026b\u0269\u0001"+ + "\u0000\u0000\u0000\u026c}\u0001\u0000\u0000\u0000\u026d\u026e\u0005@\u0000"+ + "\u0000\u026e\u007f\u0001\u0000\u0000\u0000\u026f\u0270\u0005@\u0000\u0000"+ + "\u0270\u0271\u0003\u0082A\u0000\u0271\u0081\u0001\u0000\u0000\u0000\u0272"+ + "\u0274\u0005A\u0000\u0000\u0273\u0275\u0003j5\u0000\u0274\u0273\u0001"+ + "\u0000\u0000\u0000\u0274\u0275\u0001\u0000\u0000\u0000\u0275\u0276\u0001"+ + "\u0000\u0000\u0000\u0276\u0277\u0005B\u0000\u0000\u0277\u0083\u0001\u0000"+ + "\u0000\u00002\u0087\u00a1\u00a7\u00bf\u00cd\u00d5\u00df\u00e6\u00ee\u00f3"+ + "\u00fb\u00fe\u0106\u010e\u011b\u0122\u0129\u0135\u013d\u0172\u0183\u0187"+ + "\u018c\u0194\u01a2\u01a5\u01ac\u01af\u01b2\u01b9\u01c4\u01cf\u01d2\u01dc"+ + "\u01ec\u01f0\u01ff\u0215\u0220\u0222\u022a\u0231\u0239\u0243\u0246\u0250"+ + "\u0253\u0262\u026b\u0274"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.tokens b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.tokens new file mode 100644 index 000000000..c0f8a0d1b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParser.tokens @@ -0,0 +1,158 @@ +OPERATION=1 +NODEOP=2 +CHECK=3 +ROUTINE=4 +CREATE=5 +DELETE=6 +POLICY_ELEMENT=7 +CONTAINED=8 +RULE=9 +WHEN=10 +PERFORMS=11 +AS=12 +ON=13 +IN=14 +DO=15 +ANY=16 +ASCENDANT_OF=17 +INTERSECTION=18 +UNION=19 +PROCESS=20 +SET_RESOURCE_OPERATIONS=21 +ASSIGN=22 +DEASSIGN=23 +FROM=24 +SET_PROPERTIES=25 +WITH_PROPERTIES=26 +OF=27 +TO=28 +ASSOCIATE=29 +AND=30 +WITH=31 +DISSOCIATE=32 +DENY=33 +PROHIBITION=34 +OBLIGATION=35 +ACCESS_RIGHTS=36 +POLICY_CLASS=37 +OBJECT_ATTRIBUTE=38 +USER_ATTRIBUTE=39 +USER_ATTRIBUTES=40 +OBJECT_ATTRIBUTES=41 +OBJECT=42 +USER=43 +ATTRIBUTE=44 +ASSOCIATIONS=45 +BREAK=46 +DEFAULT=47 +MAP=48 +ELSE=49 +CONST=50 +IF=51 +RANGE=52 +CONTINUE=53 +FOREACH=54 +RETURN=55 +VAR=56 +STRING_TYPE=57 +BOOL_TYPE=58 +VOID_TYPE=59 +ARRAY_TYPE=60 +NIL_LIT=61 +TRUE=62 +FALSE=63 +ID=64 +OPEN_PAREN=65 +CLOSE_PAREN=66 +OPEN_CURLY=67 +CLOSE_CURLY=68 +OPEN_BRACKET=69 +CLOSE_BRACKET=70 +ASSIGN_EQUALS=71 +COMMA=72 +SEMI=73 +COLON=74 +DOT=75 +DECLARE_ASSIGN=76 +LOGICAL_OR=77 +LOGICAL_AND=78 +EQUALS=79 +NOT_EQUALS=80 +EXCLAMATION=81 +PLUS=82 +DOUBLE_QUOTE_STRING=83 +WS=84 +COMMENT=85 +LINE_COMMENT=86 +'operation'=1 +'nodeop'=2 +'check'=3 +'routine'=4 +'create'=5 +'delete'=6 +'contained'=8 +'rule'=9 +'when'=10 +'performs'=11 +'as'=12 +'on'=13 +'in'=14 +'do'=15 +'any'=16 +'ascendant of'=17 +'union'=19 +'process'=20 +'set resource operations'=21 +'assign'=22 +'deassign'=23 +'from'=24 +'set properties'=25 +'with properties'=26 +'of'=27 +'to'=28 +'associate'=29 +'and'=30 +'with'=31 +'dissociate'=32 +'deny'=33 +'prohibition'=34 +'obligation'=35 +'access rights'=36 +'attribute'=44 +'associations'=45 +'break'=46 +'default'=47 +'map'=48 +'else'=49 +'const'=50 +'if'=51 +'range'=52 +'continue'=53 +'foreach'=54 +'return'=55 +'var'=56 +'string'=57 +'bool'=58 +'void'=59 +'array'=60 +'nil'=61 +'true'=62 +'false'=63 +'('=65 +')'=66 +'{'=67 +'}'=68 +'['=69 +']'=70 +'='=71 +','=72 +';'=73 +':'=74 +'.'=75 +':='=76 +'||'=77 +'&&'=78 +'=='=79 +'!='=80 +'!'=81 +'+'=82 diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseListener.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseListener.java new file mode 100644 index 000000000..f854bc53d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseListener.java @@ -0,0 +1,1204 @@ +// Generated from PMLParser.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link PMLParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +@SuppressWarnings("CheckReturnValue") +public class PMLParserBaseListener implements PMLParserListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPml(PMLParser.PmlContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPml(PMLParser.PmlContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStatement(PMLParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStatement(PMLParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStatementBlock(PMLParser.StatementBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStatementBlock(PMLParser.StatementBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnyUserPattern(PMLParser.AnyUserPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnyUserPattern(PMLParser.AnyUserPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUserPattern(PMLParser.UserPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUserPattern(PMLParser.UserPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInSubject(PMLParser.InSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInSubject(PMLParser.InSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsernameSubject(PMLParser.UsernameSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsernameSubject(PMLParser.UsernameSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterProcessSubject(PMLParser.ProcessSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitProcessSubject(PMLParser.ProcessSubjectContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnyOperation(PMLParser.AnyOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnyOperation(PMLParser.AnyOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIDOperation(PMLParser.IDOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIDOperation(PMLParser.IDOperationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOperandPattern(PMLParser.OperandPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOperandPattern(PMLParser.OperandPatternContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOperandPatternElement(PMLParser.OperandPatternElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOperandPatternElement(PMLParser.OperandPatternElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInPolicyElement(PMLParser.InPolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInPolicyElement(PMLParser.InPolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPolicyElement(PMLParser.PolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPolicyElement(PMLParser.PolicyElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResponse(PMLParser.ResponseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResponse(PMLParser.ResponseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResponseBlock(PMLParser.ResponseBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResponseBlock(PMLParser.ResponseBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResponseStatement(PMLParser.ResponseStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResponseStatement(PMLParser.ResponseStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssignStatement(PMLParser.AssignStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssignStatement(PMLParser.AssignStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeassignStatement(PMLParser.DeassignStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeassignStatement(PMLParser.DeassignStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssociateStatement(PMLParser.AssociateStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssociateStatement(PMLParser.AssociateStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDissociateStatement(PMLParser.DissociateStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDissociateStatement(PMLParser.DissociateStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteStatement(PMLParser.DeleteStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteStatement(PMLParser.DeleteStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteNode(PMLParser.DeleteNodeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteNode(PMLParser.DeleteNodeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteObligation(PMLParser.DeleteObligationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteObligation(PMLParser.DeleteObligationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNodeType(PMLParser.NodeTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNodeType(PMLParser.NodeTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVarDeclaration(PMLParser.VarDeclarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVarDeclaration(PMLParser.VarDeclarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShortDeclaration(PMLParser.ShortDeclarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShortDeclaration(PMLParser.ShortDeclarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVarSpec(PMLParser.VarSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVarSpec(PMLParser.VarSpecContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionSignature(PMLParser.FunctionSignatureContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionSignature(PMLParser.FunctionSignatureContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFormalArgList(PMLParser.FormalArgListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFormalArgList(PMLParser.FormalArgListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFormalArg(PMLParser.FormalArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFormalArg(PMLParser.FormalArgContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReturnStatement(PMLParser.ReturnStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReturnStatement(PMLParser.ReturnStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCheckStatement(PMLParser.CheckStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCheckStatement(PMLParser.CheckStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdArr(PMLParser.IdArrContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdArr(PMLParser.IdArrContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterForeachStatement(PMLParser.ForeachStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitForeachStatement(PMLParser.ForeachStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBreakStatement(PMLParser.BreakStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBreakStatement(PMLParser.BreakStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterContinueStatement(PMLParser.ContinueStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitContinueStatement(PMLParser.ContinueStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIfStatement(PMLParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIfStatement(PMLParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterElseIfStatement(PMLParser.ElseIfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitElseIfStatement(PMLParser.ElseIfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterElseStatement(PMLParser.ElseStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitElseStatement(PMLParser.ElseStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringType(PMLParser.StringTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringType(PMLParser.StringTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBooleanType(PMLParser.BooleanTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBooleanType(PMLParser.BooleanTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayVarType(PMLParser.ArrayVarTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayVarType(PMLParser.ArrayVarTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMapVarType(PMLParser.MapVarTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMapVarType(PMLParser.MapVarTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnyType(PMLParser.AnyTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnyType(PMLParser.AnyTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMapType(PMLParser.MapTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMapType(PMLParser.MapTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayType(PMLParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayType(PMLParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNegateExpression(PMLParser.NegateExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNegateExpression(PMLParser.NegateExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLogicalExpression(PMLParser.LogicalExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLogicalExpression(PMLParser.LogicalExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPlusExpression(PMLParser.PlusExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPlusExpression(PMLParser.PlusExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLiteralExpression(PMLParser.LiteralExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLiteralExpression(PMLParser.LiteralExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenExpression(PMLParser.ParenExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenExpression(PMLParser.ParenExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEqualsExpression(PMLParser.EqualsExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEqualsExpression(PMLParser.EqualsExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpressionList(PMLParser.ExpressionListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpressionList(PMLParser.ExpressionListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringLiteral(PMLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringLiteral(PMLParser.StringLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolLiteral(PMLParser.BoolLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolLiteral(PMLParser.BoolLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayLiteral(PMLParser.ArrayLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMapLiteral(PMLParser.MapLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMapLiteral(PMLParser.MapLiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringLit(PMLParser.StringLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringLit(PMLParser.StringLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolLit(PMLParser.BoolLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolLit(PMLParser.BoolLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayLit(PMLParser.ArrayLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayLit(PMLParser.ArrayLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStringArrayLit(PMLParser.StringArrayLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStringArrayLit(PMLParser.StringArrayLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMapLit(PMLParser.MapLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMapLit(PMLParser.MapLitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterElement(PMLParser.ElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitElement(PMLParser.ElementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReferenceByIndex(PMLParser.ReferenceByIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReferenceByIndex(PMLParser.ReferenceByIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReferenceByID(PMLParser.ReferenceByIDContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReferenceByID(PMLParser.ReferenceByIDContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBracketIndex(PMLParser.BracketIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBracketIndex(PMLParser.BracketIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDotIndex(PMLParser.DotIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDotIndex(PMLParser.DotIndexContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterId(PMLParser.IdContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitId(PMLParser.IdContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseVisitor.java new file mode 100644 index 000000000..970abca2c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserBaseVisitor.java @@ -0,0 +1,694 @@ +// Generated from PMLParser.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link PMLParserVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +@SuppressWarnings("CheckReturnValue") +public class PMLParserBaseVisitor extends AbstractParseTreeVisitor implements PMLParserVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPml(PMLParser.PmlContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStatement(PMLParser.StatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStatementBlock(PMLParser.StatementBlockContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyUserPattern(PMLParser.AnyUserPatternContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUserPattern(PMLParser.UserPatternContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInSubject(PMLParser.InSubjectContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUsernameSubject(PMLParser.UsernameSubjectContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitProcessSubject(PMLParser.ProcessSubjectContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyOperation(PMLParser.AnyOperationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIDOperation(PMLParser.IDOperationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOperandPattern(PMLParser.OperandPatternContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOperandPatternElement(PMLParser.OperandPatternElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitInPolicyElement(PMLParser.InPolicyElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPolicyElement(PMLParser.PolicyElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResponse(PMLParser.ResponseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResponseBlock(PMLParser.ResponseBlockContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitResponseStatement(PMLParser.ResponseStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssignStatement(PMLParser.AssignStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteNode(PMLParser.DeleteNodeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteObligation(PMLParser.DeleteObligationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNodeType(PMLParser.NodeTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVarDeclaration(PMLParser.VarDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitShortDeclaration(PMLParser.ShortDeclarationContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVarSpec(PMLParser.VarSpecContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionSignature(PMLParser.FunctionSignatureContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFormalArgList(PMLParser.FormalArgListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFormalArg(PMLParser.FormalArgContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReturnStatement(PMLParser.ReturnStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCheckStatement(PMLParser.CheckStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdArr(PMLParser.IdArrContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForeachStatement(PMLParser.ForeachStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBreakStatement(PMLParser.BreakStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitContinueStatement(PMLParser.ContinueStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIfStatement(PMLParser.IfStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElseIfStatement(PMLParser.ElseIfStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElseStatement(PMLParser.ElseStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStringType(PMLParser.StringTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBooleanType(PMLParser.BooleanTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayVarType(PMLParser.ArrayVarTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMapVarType(PMLParser.MapVarTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnyType(PMLParser.AnyTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMapType(PMLParser.MapTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayType(PMLParser.ArrayTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNegateExpression(PMLParser.NegateExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLogicalExpression(PMLParser.LogicalExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPlusExpression(PMLParser.PlusExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitLiteralExpression(PMLParser.LiteralExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenExpression(PMLParser.ParenExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitEqualsExpression(PMLParser.EqualsExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpressionList(PMLParser.ExpressionListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStringLiteral(PMLParser.StringLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBoolLiteral(PMLParser.BoolLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMapLiteral(PMLParser.MapLiteralContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStringLit(PMLParser.StringLitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBoolLit(PMLParser.BoolLitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayLit(PMLParser.ArrayLitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitStringArrayLit(PMLParser.StringArrayLitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMapLit(PMLParser.MapLitContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitElement(PMLParser.ElementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReferenceByIndex(PMLParser.ReferenceByIndexContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitReferenceByID(PMLParser.ReferenceByIDContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBracketIndex(PMLParser.BracketIndexContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDotIndex(PMLParser.DotIndexContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitId(PMLParser.IdContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserListener.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserListener.java new file mode 100644 index 000000000..3428e8f64 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserListener.java @@ -0,0 +1,1068 @@ +// Generated from PMLParser.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link PMLParser}. + */ +public interface PMLParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link PMLParser#pml}. + * @param ctx the parse tree + */ + void enterPml(PMLParser.PmlContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#pml}. + * @param ctx the parse tree + */ + void exitPml(PMLParser.PmlContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#statement}. + * @param ctx the parse tree + */ + void enterStatement(PMLParser.StatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#statement}. + * @param ctx the parse tree + */ + void exitStatement(PMLParser.StatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#statementBlock}. + * @param ctx the parse tree + */ + void enterStatementBlock(PMLParser.StatementBlockContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#statementBlock}. + * @param ctx the parse tree + */ + void exitStatementBlock(PMLParser.StatementBlockContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#createPolicyStatement}. + * @param ctx the parse tree + */ + void enterCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#createPolicyStatement}. + * @param ctx the parse tree + */ + void exitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#createNonPCStatement}. + * @param ctx the parse tree + */ + void enterCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#createNonPCStatement}. + * @param ctx the parse tree + */ + void exitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#nonPCNodeType}. + * @param ctx the parse tree + */ + void enterNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#nonPCNodeType}. + * @param ctx the parse tree + */ + void exitNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#createObligationStatement}. + * @param ctx the parse tree + */ + void enterCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#createObligationStatement}. + * @param ctx the parse tree + */ + void exitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#createRuleStatement}. + * @param ctx the parse tree + */ + void enterCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#createRuleStatement}. + * @param ctx the parse tree + */ + void exitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); + /** + * Enter a parse tree produced by the {@code AnyUserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + */ + void enterAnyUserPattern(PMLParser.AnyUserPatternContext ctx); + /** + * Exit a parse tree produced by the {@code AnyUserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + */ + void exitAnyUserPattern(PMLParser.AnyUserPatternContext ctx); + /** + * Enter a parse tree produced by the {@code UserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + */ + void enterUserPattern(PMLParser.UserPatternContext ctx); + /** + * Exit a parse tree produced by the {@code UserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + */ + void exitUserPattern(PMLParser.UserPatternContext ctx); + /** + * Enter a parse tree produced by the {@code BasicSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void enterBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code BasicSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void exitBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code ParenSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void enterParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code ParenSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void exitParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code NegateSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void enterNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code NegateSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void exitNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code LogicalSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void enterLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code LogicalSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + */ + void exitLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code InSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void enterInSubject(PMLParser.InSubjectContext ctx); + /** + * Exit a parse tree produced by the {@code InSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void exitInSubject(PMLParser.InSubjectContext ctx); + /** + * Enter a parse tree produced by the {@code UsernameSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void enterUsernameSubject(PMLParser.UsernameSubjectContext ctx); + /** + * Exit a parse tree produced by the {@code UsernameSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void exitUsernameSubject(PMLParser.UsernameSubjectContext ctx); + /** + * Enter a parse tree produced by the {@code ProcessSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void enterProcessSubject(PMLParser.ProcessSubjectContext ctx); + /** + * Exit a parse tree produced by the {@code ProcessSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + */ + void exitProcessSubject(PMLParser.ProcessSubjectContext ctx); + /** + * Enter a parse tree produced by the {@code AnyOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + */ + void enterAnyOperation(PMLParser.AnyOperationContext ctx); + /** + * Exit a parse tree produced by the {@code AnyOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + */ + void exitAnyOperation(PMLParser.AnyOperationContext ctx); + /** + * Enter a parse tree produced by the {@code IDOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + */ + void enterIDOperation(PMLParser.IDOperationContext ctx); + /** + * Exit a parse tree produced by the {@code IDOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + */ + void exitIDOperation(PMLParser.IDOperationContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#operandPattern}. + * @param ctx the parse tree + */ + void enterOperandPattern(PMLParser.OperandPatternContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#operandPattern}. + * @param ctx the parse tree + */ + void exitOperandPattern(PMLParser.OperandPatternContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#operandPatternElement}. + * @param ctx the parse tree + */ + void enterOperandPatternElement(PMLParser.OperandPatternElementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#operandPatternElement}. + * @param ctx the parse tree + */ + void exitOperandPatternElement(PMLParser.OperandPatternElementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#operandPatternExpressionArray}. + * @param ctx the parse tree + */ + void enterOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#operandPatternExpressionArray}. + * @param ctx the parse tree + */ + void exitOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx); + /** + * Enter a parse tree produced by the {@code ParenOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void enterParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code ParenOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void exitParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code NegateOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void enterNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code NegateOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void exitNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code BasicOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void enterBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code BasicOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void exitBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code LogicalOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void enterLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code LogicalOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + */ + void exitLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code AnyPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void enterAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); + /** + * Exit a parse tree produced by the {@code AnyPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void exitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); + /** + * Enter a parse tree produced by the {@code InPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void enterInPolicyElement(PMLParser.InPolicyElementContext ctx); + /** + * Exit a parse tree produced by the {@code InPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void exitInPolicyElement(PMLParser.InPolicyElementContext ctx); + /** + * Enter a parse tree produced by the {@code PolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void enterPolicyElement(PMLParser.PolicyElementContext ctx); + /** + * Exit a parse tree produced by the {@code PolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + */ + void exitPolicyElement(PMLParser.PolicyElementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#response}. + * @param ctx the parse tree + */ + void enterResponse(PMLParser.ResponseContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#response}. + * @param ctx the parse tree + */ + void exitResponse(PMLParser.ResponseContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#responseBlock}. + * @param ctx the parse tree + */ + void enterResponseBlock(PMLParser.ResponseBlockContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#responseBlock}. + * @param ctx the parse tree + */ + void exitResponseBlock(PMLParser.ResponseBlockContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#responseStatement}. + * @param ctx the parse tree + */ + void enterResponseStatement(PMLParser.ResponseStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#responseStatement}. + * @param ctx the parse tree + */ + void exitResponseStatement(PMLParser.ResponseStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#createProhibitionStatement}. + * @param ctx the parse tree + */ + void enterCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#createProhibitionStatement}. + * @param ctx the parse tree + */ + void exitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. + * @param ctx the parse tree + */ + void enterSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. + * @param ctx the parse tree + */ + void exitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#assignStatement}. + * @param ctx the parse tree + */ + void enterAssignStatement(PMLParser.AssignStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#assignStatement}. + * @param ctx the parse tree + */ + void exitAssignStatement(PMLParser.AssignStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#deassignStatement}. + * @param ctx the parse tree + */ + void enterDeassignStatement(PMLParser.DeassignStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#deassignStatement}. + * @param ctx the parse tree + */ + void exitDeassignStatement(PMLParser.DeassignStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#associateStatement}. + * @param ctx the parse tree + */ + void enterAssociateStatement(PMLParser.AssociateStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#associateStatement}. + * @param ctx the parse tree + */ + void exitAssociateStatement(PMLParser.AssociateStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#dissociateStatement}. + * @param ctx the parse tree + */ + void enterDissociateStatement(PMLParser.DissociateStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#dissociateStatement}. + * @param ctx the parse tree + */ + void exitDissociateStatement(PMLParser.DissociateStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#setResourceOperationsStatement}. + * @param ctx the parse tree + */ + void enterSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#setResourceOperationsStatement}. + * @param ctx the parse tree + */ + void exitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#deleteStatement}. + * @param ctx the parse tree + */ + void enterDeleteStatement(PMLParser.DeleteStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#deleteStatement}. + * @param ctx the parse tree + */ + void exitDeleteStatement(PMLParser.DeleteStatementContext ctx); + /** + * Enter a parse tree produced by the {@code DeleteNode} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void enterDeleteNode(PMLParser.DeleteNodeContext ctx); + /** + * Exit a parse tree produced by the {@code DeleteNode} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void exitDeleteNode(PMLParser.DeleteNodeContext ctx); + /** + * Enter a parse tree produced by the {@code DeleteObligation} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void enterDeleteObligation(PMLParser.DeleteObligationContext ctx); + /** + * Exit a parse tree produced by the {@code DeleteObligation} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void exitDeleteObligation(PMLParser.DeleteObligationContext ctx); + /** + * Enter a parse tree produced by the {@code DeleteProhibition} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void enterDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); + /** + * Exit a parse tree produced by the {@code DeleteProhibition} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + */ + void exitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#nodeType}. + * @param ctx the parse tree + */ + void enterNodeType(PMLParser.NodeTypeContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#nodeType}. + * @param ctx the parse tree + */ + void exitNodeType(PMLParser.NodeTypeContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#deleteRuleStatement}. + * @param ctx the parse tree + */ + void enterDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#deleteRuleStatement}. + * @param ctx the parse tree + */ + void exitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); + /** + * Enter a parse tree produced by the {@code VarDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + */ + void enterVarDeclaration(PMLParser.VarDeclarationContext ctx); + /** + * Exit a parse tree produced by the {@code VarDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + */ + void exitVarDeclaration(PMLParser.VarDeclarationContext ctx); + /** + * Enter a parse tree produced by the {@code ShortDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + */ + void enterShortDeclaration(PMLParser.ShortDeclarationContext ctx); + /** + * Exit a parse tree produced by the {@code ShortDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + */ + void exitShortDeclaration(PMLParser.ShortDeclarationContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#varSpec}. + * @param ctx the parse tree + */ + void enterVarSpec(PMLParser.VarSpecContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#varSpec}. + * @param ctx the parse tree + */ + void exitVarSpec(PMLParser.VarSpecContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#variableAssignmentStatement}. + * @param ctx the parse tree + */ + void enterVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#variableAssignmentStatement}. + * @param ctx the parse tree + */ + void exitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#functionDefinitionStatement}. + * @param ctx the parse tree + */ + void enterFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#functionDefinitionStatement}. + * @param ctx the parse tree + */ + void exitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#functionSignature}. + * @param ctx the parse tree + */ + void enterFunctionSignature(PMLParser.FunctionSignatureContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#functionSignature}. + * @param ctx the parse tree + */ + void exitFunctionSignature(PMLParser.FunctionSignatureContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#formalArgList}. + * @param ctx the parse tree + */ + void enterFormalArgList(PMLParser.FormalArgListContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#formalArgList}. + * @param ctx the parse tree + */ + void exitFormalArgList(PMLParser.FormalArgListContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#formalArg}. + * @param ctx the parse tree + */ + void enterFormalArg(PMLParser.FormalArgContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#formalArg}. + * @param ctx the parse tree + */ + void exitFormalArg(PMLParser.FormalArgContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#returnStatement}. + * @param ctx the parse tree + */ + void enterReturnStatement(PMLParser.ReturnStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#returnStatement}. + * @param ctx the parse tree + */ + void exitReturnStatement(PMLParser.ReturnStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#checkStatement}. + * @param ctx the parse tree + */ + void enterCheckStatement(PMLParser.CheckStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#checkStatement}. + * @param ctx the parse tree + */ + void exitCheckStatement(PMLParser.CheckStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#checkStatementBlock}. + * @param ctx the parse tree + */ + void enterCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#checkStatementBlock}. + * @param ctx the parse tree + */ + void exitCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#idArr}. + * @param ctx the parse tree + */ + void enterIdArr(PMLParser.IdArrContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#idArr}. + * @param ctx the parse tree + */ + void exitIdArr(PMLParser.IdArrContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#functionInvokeStatement}. + * @param ctx the parse tree + */ + void enterFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#functionInvokeStatement}. + * @param ctx the parse tree + */ + void exitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#foreachStatement}. + * @param ctx the parse tree + */ + void enterForeachStatement(PMLParser.ForeachStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#foreachStatement}. + * @param ctx the parse tree + */ + void exitForeachStatement(PMLParser.ForeachStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#breakStatement}. + * @param ctx the parse tree + */ + void enterBreakStatement(PMLParser.BreakStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#breakStatement}. + * @param ctx the parse tree + */ + void exitBreakStatement(PMLParser.BreakStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#continueStatement}. + * @param ctx the parse tree + */ + void enterContinueStatement(PMLParser.ContinueStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#continueStatement}. + * @param ctx the parse tree + */ + void exitContinueStatement(PMLParser.ContinueStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#ifStatement}. + * @param ctx the parse tree + */ + void enterIfStatement(PMLParser.IfStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#ifStatement}. + * @param ctx the parse tree + */ + void exitIfStatement(PMLParser.IfStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#elseIfStatement}. + * @param ctx the parse tree + */ + void enterElseIfStatement(PMLParser.ElseIfStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#elseIfStatement}. + * @param ctx the parse tree + */ + void exitElseIfStatement(PMLParser.ElseIfStatementContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#elseStatement}. + * @param ctx the parse tree + */ + void enterElseStatement(PMLParser.ElseStatementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#elseStatement}. + * @param ctx the parse tree + */ + void exitElseStatement(PMLParser.ElseStatementContext ctx); + /** + * Enter a parse tree produced by the {@code StringType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void enterStringType(PMLParser.StringTypeContext ctx); + /** + * Exit a parse tree produced by the {@code StringType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void exitStringType(PMLParser.StringTypeContext ctx); + /** + * Enter a parse tree produced by the {@code BooleanType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void enterBooleanType(PMLParser.BooleanTypeContext ctx); + /** + * Exit a parse tree produced by the {@code BooleanType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void exitBooleanType(PMLParser.BooleanTypeContext ctx); + /** + * Enter a parse tree produced by the {@code ArrayVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void enterArrayVarType(PMLParser.ArrayVarTypeContext ctx); + /** + * Exit a parse tree produced by the {@code ArrayVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void exitArrayVarType(PMLParser.ArrayVarTypeContext ctx); + /** + * Enter a parse tree produced by the {@code MapVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void enterMapVarType(PMLParser.MapVarTypeContext ctx); + /** + * Exit a parse tree produced by the {@code MapVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void exitMapVarType(PMLParser.MapVarTypeContext ctx); + /** + * Enter a parse tree produced by the {@code AnyType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void enterAnyType(PMLParser.AnyTypeContext ctx); + /** + * Exit a parse tree produced by the {@code AnyType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + */ + void exitAnyType(PMLParser.AnyTypeContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#mapType}. + * @param ctx the parse tree + */ + void enterMapType(PMLParser.MapTypeContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#mapType}. + * @param ctx the parse tree + */ + void exitMapType(PMLParser.MapTypeContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#arrayType}. + * @param ctx the parse tree + */ + void enterArrayType(PMLParser.ArrayTypeContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#arrayType}. + * @param ctx the parse tree + */ + void exitArrayType(PMLParser.ArrayTypeContext ctx); + /** + * Enter a parse tree produced by the {@code NegateExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterNegateExpression(PMLParser.NegateExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code NegateExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitNegateExpression(PMLParser.NegateExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code LogicalExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterLogicalExpression(PMLParser.LogicalExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code LogicalExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitLogicalExpression(PMLParser.LogicalExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code PlusExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterPlusExpression(PMLParser.PlusExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code PlusExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitPlusExpression(PMLParser.PlusExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code FunctionInvokeExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code FunctionInvokeExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code VariableReferenceExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code VariableReferenceExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code LiteralExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterLiteralExpression(PMLParser.LiteralExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code LiteralExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitLiteralExpression(PMLParser.LiteralExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code ParenExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterParenExpression(PMLParser.ParenExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code ParenExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitParenExpression(PMLParser.ParenExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code EqualsExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void enterEqualsExpression(PMLParser.EqualsExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code EqualsExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + */ + void exitEqualsExpression(PMLParser.EqualsExpressionContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#expressionList}. + * @param ctx the parse tree + */ + void enterExpressionList(PMLParser.ExpressionListContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#expressionList}. + * @param ctx the parse tree + */ + void exitExpressionList(PMLParser.ExpressionListContext ctx); + /** + * Enter a parse tree produced by the {@code StringLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void enterStringLiteral(PMLParser.StringLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code StringLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void exitStringLiteral(PMLParser.StringLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code BoolLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void enterBoolLiteral(PMLParser.BoolLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code BoolLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void exitBoolLiteral(PMLParser.BoolLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code ArrayLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void enterArrayLiteral(PMLParser.ArrayLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code ArrayLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void exitArrayLiteral(PMLParser.ArrayLiteralContext ctx); + /** + * Enter a parse tree produced by the {@code MapLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void enterMapLiteral(PMLParser.MapLiteralContext ctx); + /** + * Exit a parse tree produced by the {@code MapLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + */ + void exitMapLiteral(PMLParser.MapLiteralContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#stringLit}. + * @param ctx the parse tree + */ + void enterStringLit(PMLParser.StringLitContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#stringLit}. + * @param ctx the parse tree + */ + void exitStringLit(PMLParser.StringLitContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#boolLit}. + * @param ctx the parse tree + */ + void enterBoolLit(PMLParser.BoolLitContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#boolLit}. + * @param ctx the parse tree + */ + void exitBoolLit(PMLParser.BoolLitContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#arrayLit}. + * @param ctx the parse tree + */ + void enterArrayLit(PMLParser.ArrayLitContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#arrayLit}. + * @param ctx the parse tree + */ + void exitArrayLit(PMLParser.ArrayLitContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#stringArrayLit}. + * @param ctx the parse tree + */ + void enterStringArrayLit(PMLParser.StringArrayLitContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#stringArrayLit}. + * @param ctx the parse tree + */ + void exitStringArrayLit(PMLParser.StringArrayLitContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#mapLit}. + * @param ctx the parse tree + */ + void enterMapLit(PMLParser.MapLitContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#mapLit}. + * @param ctx the parse tree + */ + void exitMapLit(PMLParser.MapLitContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#element}. + * @param ctx the parse tree + */ + void enterElement(PMLParser.ElementContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#element}. + * @param ctx the parse tree + */ + void exitElement(PMLParser.ElementContext ctx); + /** + * Enter a parse tree produced by the {@code ReferenceByIndex} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + */ + void enterReferenceByIndex(PMLParser.ReferenceByIndexContext ctx); + /** + * Exit a parse tree produced by the {@code ReferenceByIndex} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + */ + void exitReferenceByIndex(PMLParser.ReferenceByIndexContext ctx); + /** + * Enter a parse tree produced by the {@code ReferenceByID} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + */ + void enterReferenceByID(PMLParser.ReferenceByIDContext ctx); + /** + * Exit a parse tree produced by the {@code ReferenceByID} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + */ + void exitReferenceByID(PMLParser.ReferenceByIDContext ctx); + /** + * Enter a parse tree produced by the {@code BracketIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + */ + void enterBracketIndex(PMLParser.BracketIndexContext ctx); + /** + * Exit a parse tree produced by the {@code BracketIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + */ + void exitBracketIndex(PMLParser.BracketIndexContext ctx); + /** + * Enter a parse tree produced by the {@code DotIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + */ + void enterDotIndex(PMLParser.DotIndexContext ctx); + /** + * Exit a parse tree produced by the {@code DotIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + */ + void exitDotIndex(PMLParser.DotIndexContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#id}. + * @param ctx the parse tree + */ + void enterId(PMLParser.IdContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#id}. + * @param ctx the parse tree + */ + void exitId(PMLParser.IdContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#functionInvoke}. + * @param ctx the parse tree + */ + void enterFunctionInvoke(PMLParser.FunctionInvokeContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#functionInvoke}. + * @param ctx the parse tree + */ + void exitFunctionInvoke(PMLParser.FunctionInvokeContext ctx); + /** + * Enter a parse tree produced by {@link PMLParser#functionInvokeArgs}. + * @param ctx the parse tree + */ + void enterFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); + /** + * Exit a parse tree produced by {@link PMLParser#functionInvokeArgs}. + * @param ctx the parse tree + */ + void exitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserVisitor.java new file mode 100644 index 000000000..fb501024c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/antlr/PMLParserVisitor.java @@ -0,0 +1,639 @@ +// Generated from PMLParser.g4 by ANTLR 4.13.1 +package gov.nist.csd.pm.pap.pml.antlr; +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link PMLParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface PMLParserVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link PMLParser#pml}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPml(PMLParser.PmlContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatement(PMLParser.StatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#statementBlock}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatementBlock(PMLParser.StatementBlockContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#createPolicyStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#createNonPCStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#nonPCNodeType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNonPCNodeType(PMLParser.NonPCNodeTypeContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#createObligationStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#createRuleStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); + /** + * Visit a parse tree produced by the {@code AnyUserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyUserPattern(PMLParser.AnyUserPatternContext ctx); + /** + * Visit a parse tree produced by the {@code UserPattern} + * labeled alternative in {@link PMLParser#subjectPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUserPattern(PMLParser.UserPatternContext ctx); + /** + * Visit a parse tree produced by the {@code BasicSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code ParenSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code NegateSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code LogicalSubjectPatternExpression} + * labeled alternative in {@link PMLParser#subjectPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code InSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInSubject(PMLParser.InSubjectContext ctx); + /** + * Visit a parse tree produced by the {@code UsernameSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUsernameSubject(PMLParser.UsernameSubjectContext ctx); + /** + * Visit a parse tree produced by the {@code ProcessSubject} + * labeled alternative in {@link PMLParser#basicSubjectPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitProcessSubject(PMLParser.ProcessSubjectContext ctx); + /** + * Visit a parse tree produced by the {@code AnyOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyOperation(PMLParser.AnyOperationContext ctx); + /** + * Visit a parse tree produced by the {@code IDOperation} + * labeled alternative in {@link PMLParser#operationPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIDOperation(PMLParser.IDOperationContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#operandPattern}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOperandPattern(PMLParser.OperandPatternContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#operandPatternElement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOperandPatternElement(PMLParser.OperandPatternElementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#operandPatternExpressionArray}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOperandPatternExpressionArray(PMLParser.OperandPatternExpressionArrayContext ctx); + /** + * Visit a parse tree produced by the {@code ParenOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code NegateOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code BasicOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code LogicalOperandPatternExpression} + * labeled alternative in {@link PMLParser#operandPatternExpression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code AnyPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); + /** + * Visit a parse tree produced by the {@code InPolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInPolicyElement(PMLParser.InPolicyElementContext ctx); + /** + * Visit a parse tree produced by the {@code PolicyElement} + * labeled alternative in {@link PMLParser#basicOperandPatternExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPolicyElement(PMLParser.PolicyElementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#response}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResponse(PMLParser.ResponseContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#responseBlock}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResponseBlock(PMLParser.ResponseBlockContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#responseStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitResponseStatement(PMLParser.ResponseStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#createProhibitionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#assignStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssignStatement(PMLParser.AssignStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#deassignStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeassignStatement(PMLParser.DeassignStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#associateStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssociateStatement(PMLParser.AssociateStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#dissociateStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDissociateStatement(PMLParser.DissociateStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#setResourceOperationsStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#deleteStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteStatement(PMLParser.DeleteStatementContext ctx); + /** + * Visit a parse tree produced by the {@code DeleteNode} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteNode(PMLParser.DeleteNodeContext ctx); + /** + * Visit a parse tree produced by the {@code DeleteObligation} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteObligation(PMLParser.DeleteObligationContext ctx); + /** + * Visit a parse tree produced by the {@code DeleteProhibition} + * labeled alternative in {@link PMLParser#deleteType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#nodeType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNodeType(PMLParser.NodeTypeContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#deleteRuleStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); + /** + * Visit a parse tree produced by the {@code VarDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVarDeclaration(PMLParser.VarDeclarationContext ctx); + /** + * Visit a parse tree produced by the {@code ShortDeclaration} + * labeled alternative in {@link PMLParser#variableDeclarationStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitShortDeclaration(PMLParser.ShortDeclarationContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#varSpec}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVarSpec(PMLParser.VarSpecContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#variableAssignmentStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#functionDefinitionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#functionSignature}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionSignature(PMLParser.FunctionSignatureContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#formalArgList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFormalArgList(PMLParser.FormalArgListContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#formalArg}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFormalArg(PMLParser.FormalArgContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#returnStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReturnStatement(PMLParser.ReturnStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#checkStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCheckStatement(PMLParser.CheckStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#checkStatementBlock}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#idArr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdArr(PMLParser.IdArrContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#functionInvokeStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#foreachStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForeachStatement(PMLParser.ForeachStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#breakStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBreakStatement(PMLParser.BreakStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#continueStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitContinueStatement(PMLParser.ContinueStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#ifStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIfStatement(PMLParser.IfStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#elseIfStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElseIfStatement(PMLParser.ElseIfStatementContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#elseStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElseStatement(PMLParser.ElseStatementContext ctx); + /** + * Visit a parse tree produced by the {@code StringType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringType(PMLParser.StringTypeContext ctx); + /** + * Visit a parse tree produced by the {@code BooleanType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBooleanType(PMLParser.BooleanTypeContext ctx); + /** + * Visit a parse tree produced by the {@code ArrayVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayVarType(PMLParser.ArrayVarTypeContext ctx); + /** + * Visit a parse tree produced by the {@code MapVarType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMapVarType(PMLParser.MapVarTypeContext ctx); + /** + * Visit a parse tree produced by the {@code AnyType} + * labeled alternative in {@link PMLParser#variableType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnyType(PMLParser.AnyTypeContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#mapType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMapType(PMLParser.MapTypeContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#arrayType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayType(PMLParser.ArrayTypeContext ctx); + /** + * Visit a parse tree produced by the {@code NegateExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNegateExpression(PMLParser.NegateExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code LogicalExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLogicalExpression(PMLParser.LogicalExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code PlusExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPlusExpression(PMLParser.PlusExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code FunctionInvokeExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code VariableReferenceExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code LiteralExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitLiteralExpression(PMLParser.LiteralExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code ParenExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenExpression(PMLParser.ParenExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code EqualsExpression} + * labeled alternative in {@link PMLParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEqualsExpression(PMLParser.EqualsExpressionContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#expressionList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpressionList(PMLParser.ExpressionListContext ctx); + /** + * Visit a parse tree produced by the {@code StringLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringLiteral(PMLParser.StringLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code BoolLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBoolLiteral(PMLParser.BoolLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code ArrayLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayLiteral(PMLParser.ArrayLiteralContext ctx); + /** + * Visit a parse tree produced by the {@code MapLiteral} + * labeled alternative in {@link PMLParser#literal}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMapLiteral(PMLParser.MapLiteralContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#stringLit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringLit(PMLParser.StringLitContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#boolLit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBoolLit(PMLParser.BoolLitContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#arrayLit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayLit(PMLParser.ArrayLitContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#stringArrayLit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStringArrayLit(PMLParser.StringArrayLitContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#mapLit}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMapLit(PMLParser.MapLitContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#element}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitElement(PMLParser.ElementContext ctx); + /** + * Visit a parse tree produced by the {@code ReferenceByIndex} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReferenceByIndex(PMLParser.ReferenceByIndexContext ctx); + /** + * Visit a parse tree produced by the {@code ReferenceByID} + * labeled alternative in {@link PMLParser#variableReference}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReferenceByID(PMLParser.ReferenceByIDContext ctx); + /** + * Visit a parse tree produced by the {@code BracketIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBracketIndex(PMLParser.BracketIndexContext ctx); + /** + * Visit a parse tree produced by the {@code DotIndex} + * labeled alternative in {@link PMLParser#index}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDotIndex(PMLParser.DotIndexContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#id}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitId(PMLParser.IdContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#functionInvoke}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx); + /** + * Visit a parse tree produced by {@link PMLParser#functionInvokeArgs}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/Position.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/Position.java similarity index 96% rename from src/main/java/gov/nist/csd/pm/policy/pml/compiler/Position.java rename to src/main/java/gov/nist/csd/pm/pap/pml/compiler/Position.java index 3c0f11df5..444104c5b 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/Position.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/Position.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.pml.compiler; +package gov.nist.csd.pm.pap.pml.compiler; import org.antlr.v4.runtime.ParserRuleContext; diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/Variable.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/Variable.java similarity index 84% rename from src/main/java/gov/nist/csd/pm/policy/pml/compiler/Variable.java rename to src/main/java/gov/nist/csd/pm/pap/pml/compiler/Variable.java index 9b58625f9..ba63b4337 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/Variable.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/Variable.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.pml.compiler; +package gov.nist.csd.pm.pap.pml.compiler; -import gov.nist.csd.pm.policy.pml.model.expression.Type; +import gov.nist.csd.pm.pap.pml.type.Type; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/CompileError.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/CompileError.java new file mode 100644 index 000000000..07c1fb84d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/CompileError.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.pml.compiler.error; + +import gov.nist.csd.pm.pap.pml.compiler.Position; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.misc.Interval; + +import java.util.Objects; + +public record CompileError(Position position, String errorMessage) { + + public static String getText(ParserRuleContext ctx) { + int startIndex = ctx.start.getStartIndex(); + int stopIndex = ctx.stop.getStopIndex(); + Interval interval = new Interval(startIndex, stopIndex); + return ctx.start.getInputStream().getText(interval); + } + + public static CompileError fromParserRuleContext(ParserRuleContext ctx, String message) { + return new CompileError( + new Position(ctx), + message + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + CompileError that = (CompileError) o; + return Objects.equals(position, that.position) && Objects.equals(errorMessage, that.errorMessage); + } + + @Override + public int hashCode() { + return Objects.hash(position, errorMessage); + } + + @Override + public String toString() { + return "CompileError{" + + "position=" + position + + ", errorMessage='" + errorMessage + '\'' + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/ErrorLog.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/ErrorLog.java similarity index 85% rename from src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/ErrorLog.java rename to src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/ErrorLog.java index cb702692c..a531a46aa 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/ErrorLog.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/error/ErrorLog.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.pml.compiler.error; +package gov.nist.csd.pm.pap.pml.compiler.error; -import gov.nist.csd.pm.policy.pml.compiler.Position; +import gov.nist.csd.pm.pap.pml.compiler.Position; import org.antlr.v4.runtime.ParserRuleContext; import java.util.ArrayList; @@ -30,6 +30,10 @@ public ErrorLog addError(int line, int charPos, int end, String msg) { return this; } + public void addErrors(List errors) { + this.errors.addAll(errors); + } + private void addError(CompileError error) { if (this.errors.contains(error)) { return; diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitor.java new file mode 100644 index 000000000..b7cf47b8c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitor.java @@ -0,0 +1,22 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.AssignStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class AssignStmtVisitor extends PMLBaseVisitor { + + public AssignStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public AssignStatement visitAssignStatement(PMLParser.AssignStatementContext ctx) { + Expression ascendant = Expression.compile(visitorCtx, ctx.ascendantNode, Type.string()); + Expression descendants = Expression.compile(visitorCtx, ctx.descendantNodes, Type.array(Type.string())); + + return new AssignStatement(ascendant, descendants); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitor.java new file mode 100644 index 000000000..c3e66329f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitor.java @@ -0,0 +1,23 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.AssociateStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class AssociateStmtVisitor extends PMLBaseVisitor { + + public AssociateStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public AssociateStatement visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { + Expression ua = Expression.compile(visitorCtx, ctx.ua, Type.string()); + Expression target = Expression.compile(visitorCtx, ctx.target, Type.string()); + Expression accessRights = Expression.compile(visitorCtx, ctx.accessRights, Type.array(Type.string())); + + return new AssociateStatement(ua, target, accessRights); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitor.java new file mode 100644 index 000000000..c245104b4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitor.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.statement.BreakStatement; +import org.antlr.v4.runtime.ParserRuleContext; + +public class BreakStmtVisitor extends PMLBaseVisitor { + + public BreakStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public BreakStatement visitBreakStatement(PMLParser.BreakStatementContext ctx) { + // check that there is a for loop descendant + if (!inFor(ctx)) { + throw new PMLCompilationRuntimeException(ctx, "break statement not in foreach"); + } + + return new BreakStatement(); + } + + private boolean inFor(ParserRuleContext ctx) { + if (ctx instanceof PMLParser.ForeachStatementContext) { + return true; + } else if (ctx == null) { + return false; + } + + return inFor(ctx.getParent()); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementBlockVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementBlockVisitor.java new file mode 100644 index 000000000..e18958bde --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementBlockVisitor.java @@ -0,0 +1,33 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; + +import java.util.ArrayList; +import java.util.List; + +public class CheckStatementBlockVisitor extends PMLBaseVisitor{ + + public CheckStatementBlockVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public PMLStatementBlock visitCheckStatementBlock(PMLParser.CheckStatementBlockContext ctx) { + List statements = new ArrayList<>(); + + if (ctx == null) { + return new PMLStatementBlock(statements); + } + + CheckStatementVisitor checkVisitor = new CheckStatementVisitor(visitorCtx); + + for (PMLParser.CheckStatementContext checkStatementContext : ctx.checkStatement()) { + statements.add(checkVisitor.visitCheckStatement(checkStatementContext)); + } + + return new PMLStatementBlock(statements); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementVisitor.java new file mode 100644 index 000000000..ff45c8634 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CheckStatementVisitor.java @@ -0,0 +1,21 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.statement.operation.CheckStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class CheckStatementVisitor extends PMLBaseVisitor { + public CheckStatementVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CheckStatement visitCheckStatement(PMLParser.CheckStatementContext ctx) { + Expression arExpr = Expression.compile(visitorCtx, ctx.ar, Type.string()); + Expression targetExpr = Expression.compile(visitorCtx, ctx.target, Type.string(), Type.array(Type.string())); + + return new CheckStatement(arExpr, targetExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitor.java new file mode 100644 index 000000000..79ecc46f0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitor.java @@ -0,0 +1,37 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.statement.ContinueStatement; +import org.antlr.v4.runtime.ParserRuleContext; + +public class ContinueStmtVisitor extends PMLBaseVisitor { + + public ContinueStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public ContinueStatement visitContinueStatement(PMLParser.ContinueStatementContext ctx) { + // check that there is a for loop descendant + if (!inFor(ctx)) { + throw new PMLCompilationRuntimeException( + ctx, + "continue statement not in foreach" + ); + } + + return new ContinueStatement(); + } + + private boolean inFor(ParserRuleContext ctx) { + if (ctx instanceof PMLParser.ForeachStatementContext) { + return true; + } else if (ctx == null) { + return false; + } + + return inFor(ctx.getParent()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitor.java new file mode 100644 index 000000000..32e646c6b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitor.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateNonPCStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.OA; + +public class CreateNonPCStmtVisitor extends PMLBaseVisitor { + + public CreateNonPCStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateNonPCStatement visitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { + NodeType type = getNodeType(ctx.nonPCNodeType()); + Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); + Expression assignTo = Expression.compile(visitorCtx, ctx.in, Type.array(Type.string())); + + return new CreateNonPCStatement(name, type, assignTo); + } + + private NodeType getNodeType(PMLParser.NonPCNodeTypeContext nodeType) { + if (nodeType.OBJECT_ATTRIBUTE() != null) { + return OA; + } else if (nodeType.USER_ATTRIBUTE() != null) { + return NodeType.UA; + } else if (nodeType.OBJECT() != null) { + return NodeType.O; + } else { + return NodeType.U; + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitor.java new file mode 100644 index 000000000..c27de10be --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitor.java @@ -0,0 +1,32 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateObligationStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.List; + +public class CreateObligationStmtVisitor extends PMLBaseVisitor { + + public CreateObligationStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateObligationStatement visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { + Expression name = Expression.compile(visitorCtx, ctx.expression(), Type.string()); + + List ruleStmts = new ArrayList<>(); + for (PMLParser.CreateRuleStatementContext ruleStmt : ctx.createRuleStatement()) { + CreateRuleStatement createRuleStmt = new CreateRuleStmtVisitor(visitorCtx) + .visitCreateRuleStatement(ruleStmt); + ruleStmts.add(createRuleStmt); + } + + return new CreateObligationStatement(name, ruleStmts); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitor.java new file mode 100644 index 000000000..b23f2979b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitor.java @@ -0,0 +1,21 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class CreatePolicyStmtVisitor extends PMLBaseVisitor { + + public CreatePolicyStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreatePolicyStatement visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { + Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); + + return new CreatePolicyStatement(name); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitor.java new file mode 100644 index 000000000..44ea487e9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitor.java @@ -0,0 +1,37 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateProhibitionStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class CreateProhibitionStmtVisitor extends PMLBaseVisitor { + + public CreateProhibitionStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateProhibitionStatement visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { + Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); + Expression subject = Expression.compile(visitorCtx, ctx.subject, Type.string()); + ProhibitionSubject.Type type; + if (ctx.USER() != null) { + type = ProhibitionSubject.Type.USER; + } else if (ctx.USER_ATTRIBUTE() != null) { + type = ProhibitionSubject.Type.USER_ATTRIBUTE; + } else { + type = ProhibitionSubject.Type.PROCESS; + } + + Expression accessRights = Expression.compile(visitorCtx, ctx.accessRights, Type.array(Type.string())); + + boolean isIntersection = ctx.INTERSECTION() != null; + + Expression cc = Expression.compile(visitorCtx, ctx.containers, Type.array(Type.string())); + + return new CreateProhibitionStatement(name, subject, type, accessRights, isIntersection, cc); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitor.java new file mode 100644 index 000000000..5b5231c64 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitor.java @@ -0,0 +1,285 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.LiteralVisitor; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.*; +import gov.nist.csd.pm.pap.pml.pattern.subject.*; +import gov.nist.csd.pm.pap.pml.scope.VariableAlreadyDefinedInScopeException; +import gov.nist.csd.pm.pap.pml.statement.*; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateFunctionStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class CreateRuleStmtVisitor extends PMLBaseVisitor { + + public CreateRuleStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateRuleStatement visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { + SubjectPatternVisitor subjectPatternVisitor = new SubjectPatternVisitor(visitorCtx); + OperationPatternVisitor operationPatternVisitor = new OperationPatternVisitor(visitorCtx); + OperandMapVisitor operandMapVisitor = new OperandMapVisitor(visitorCtx); + ResponseVisitor responseVisitor = new ResponseVisitor(visitorCtx); + + Expression name = Expression.compile(visitorCtx, ctx.ruleName, Type.string()); + + return new CreateRuleStatement( + name, + subjectPatternVisitor.visit(ctx.subjectPattern()), + operationPatternVisitor.visit(ctx.operationPattern()), + operandMapVisitor.visitOperandPattern(ctx.operandPattern()), + responseVisitor.visitResponse(ctx.response()) + ); + } + + static class SubjectPatternVisitor extends PMLBaseVisitor { + + private LiteralVisitor literalVisitor; + private SubjectPatternExpressionVisitor subjectPatternExpressionVisitor; + + public SubjectPatternVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + + this.literalVisitor = new LiteralVisitor(visitorCtx); + this.subjectPatternExpressionVisitor = new SubjectPatternExpressionVisitor(visitorCtx); + } + + @Override + public SubjectPattern visitAnyUserPattern(PMLParser.AnyUserPatternContext ctx) { + return new SubjectPattern(); + } + + @Override + public SubjectPattern visitUserPattern(PMLParser.UserPatternContext ctx) { + SubjectPatternExpression expr = subjectPatternExpressionVisitor.visit(ctx.subjectPatternExpression()); + return new SubjectPattern(expr); + } + } + + static class SubjectPatternExpressionVisitor extends PMLBaseVisitor { + private LiteralVisitor literalVisitor; + public SubjectPatternExpressionVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + this.literalVisitor = new LiteralVisitor(visitorCtx); + } + + @Override + public SubjectPatternExpression visitBasicSubjectPatternExpression(PMLParser.BasicSubjectPatternExpressionContext ctx) { + return visit(ctx.basicSubjectPatternExpr()); + } + + @Override + public SubjectPatternExpression visitParenSubjectPatternExpression(PMLParser.ParenSubjectPatternExpressionContext ctx) { + return new ParenSubjectPatternExpression(visit(ctx.subjectPatternExpression())); + } + + @Override + public SubjectPatternExpression visitNegateSubjectPatternExpression(PMLParser.NegateSubjectPatternExpressionContext ctx) { + return new NegateSubjectPatternExpression(visit(ctx.subjectPatternExpression())); + } + + @Override + public SubjectPatternExpression visitLogicalSubjectPatternExpression(PMLParser.LogicalSubjectPatternExpressionContext ctx) { + return new LogicalSubjectPatternExpression( + visit(ctx.left), + visit(ctx.right), + ctx.LOGICAL_AND() != null + ); + } + + @Override + public SubjectPatternExpression visitInSubject(PMLParser.InSubjectContext ctx) { + return new InSubjectPattern(literalVisitor.visitStringLit(ctx.stringLit())); + } + + @Override + public SubjectPatternExpression visitUsernameSubject(PMLParser.UsernameSubjectContext ctx) { + return new UsernamePattern(literalVisitor.visitStringLit(ctx.stringLit())); + } + + @Override + public SubjectPatternExpression visitProcessSubject(PMLParser.ProcessSubjectContext ctx) { + return new ProcessSubjectPattern(literalVisitor.visitStringLit(ctx.stringLit())); + } + } + + static class OperationPatternVisitor extends PMLBaseVisitor { + + private LiteralVisitor literalVisitor; + + public OperationPatternVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + + this.literalVisitor = new LiteralVisitor(visitorCtx); + } + + @Override + public OperationPattern visitAnyOperation(PMLParser.AnyOperationContext ctx) { + return new OperationPattern(); + } + + @Override + public OperationPattern visitIDOperation(PMLParser.IDOperationContext ctx) { + return new OperationPattern(literalVisitor.visitStringLit(ctx.stringLit()).getValue()); + } + } + + static class OperandPatternVisitor extends PMLBaseVisitor { + + private LiteralVisitor literalVisitor; + + public OperandPatternVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + + this.literalVisitor = new LiteralVisitor(visitorCtx); + } + + @Override + public OperandPatternExpression visitParenOperandPatternExpression(PMLParser.ParenOperandPatternExpressionContext ctx) { + return new ParenOperandPatternExpression(visit(ctx.operandPatternExpression())); + } + + @Override + public OperandPatternExpression visitNegateOperandPatternExpression(PMLParser.NegateOperandPatternExpressionContext ctx) { + return new NegateOperandPatternExpression(visit(ctx.operandPatternExpression())); + } + + @Override + public OperandPatternExpression visitBasicOperandPatternExpression(PMLParser.BasicOperandPatternExpressionContext ctx) { + return visit(ctx.basicOperandPatternExpr()); + } + + @Override + public OperandPatternExpression visitLogicalOperandPatternExpression(PMLParser.LogicalOperandPatternExpressionContext ctx) { + return new LogicalOperandPatternExpression( + visit(ctx.left), + visit(ctx.right), + ctx.LOGICAL_AND() != null + ); + } + + @Override + public OperandPatternExpression visitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { + return new AnyOperandPattern(); + } + + @Override + public OperandPatternExpression visitInPolicyElement(PMLParser.InPolicyElementContext ctx) { + return new InOperandPattern(literalVisitor.visitStringLit(ctx.stringLit())); + } + + @Override + public OperandPatternExpression visitPolicyElement(PMLParser.PolicyElementContext ctx) { + return new NodeOperandPattern(literalVisitor.visitStringLit(ctx.stringLit())); + } + } + + static class OperandMapVisitor extends PMLBaseVisitor>> { + + private OperandPatternVisitor operandPatternVisitor = new OperandPatternVisitor(visitorCtx); + + public OperandMapVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + + this.operandPatternVisitor = new OperandPatternVisitor(visitorCtx); + } + + @Override + public Map> visitOperandPattern(PMLParser.OperandPatternContext ctx) { + Map> map = new HashMap<>(); + + if (ctx == null) { + return new HashMap<>(); + } + + for (PMLParser.OperandPatternElementContext operandPatternElementContext : ctx.operandPatternElement()) { + Map> elementMap = visitOperandPatternElement(operandPatternElementContext); + map.putAll(elementMap); + } + + return map; + } + + @Override + public Map> visitOperandPatternElement(PMLParser.OperandPatternElementContext ctx) { + String key = ctx.key.getText(); + + List expressions = new ArrayList<>(); + if (ctx.single != null) { + OperandPatternExpression pattern = operandPatternVisitor.visit(ctx.single); + expressions.add(pattern); + } else if (ctx.multiple != null) { + for (PMLParser.OperandPatternExpressionContext operandCtx : ctx.multiple.operandPatternExpression()) { + expressions.add(operandPatternVisitor.visit(operandCtx)); + } + } else { + throw new PMLCompilationRuntimeException(ctx, "Invalid operand pattern expression: " + ctx.getText()); + } + + return Map.of(key, expressions); + } + } + + static class ResponseVisitor extends PMLBaseVisitor { + + public ResponseVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateRuleStatement.ResponseBlock visitResponse(PMLParser.ResponseContext ctx) { + String evtVar = ctx.ID().getText(); + + // create a new local parser scope for the response block + // add the event name and event context map to the local parser scope + VisitorContext localVisitorCtx = visitorCtx.copy(); + try { + localVisitorCtx.scope().addVariable(evtVar, new Variable(evtVar, Type.map(Type.string(), Type.any()), true)); + } catch (VariableAlreadyDefinedInScopeException e) { + throw new PMLCompilationRuntimeException(e); + } + + PMLParser.ResponseBlockContext responseBlockCtx = ctx.responseBlock(); + List responseStmtsCtx = responseBlockCtx.responseStatement(); + + StatementVisitor statementVisitor = new StatementVisitor(localVisitorCtx); + CreateRuleStmtVisitor createRuleStmtVisitor = new CreateRuleStmtVisitor(localVisitorCtx); + DeleteRuleStmtVisitor deleteRuleStmtVisitor = new DeleteRuleStmtVisitor(localVisitorCtx); + + List stmts = new ArrayList<>(); + for (PMLParser.ResponseStatementContext responseStmtCtx : responseStmtsCtx) { + PMLStatement stmt = null; + + if (responseStmtCtx.statement() != null) { + stmt = statementVisitor.visitStatement(responseStmtCtx.statement()); + } else if (responseStmtCtx.createRuleStatement() != null) { + stmt = createRuleStmtVisitor.visitCreateRuleStatement(responseStmtCtx.createRuleStatement()); + } else if (responseStmtCtx.deleteRuleStatement() != null) { + stmt = deleteRuleStmtVisitor.visitDeleteRuleStatement(responseStmtCtx.deleteRuleStatement()); + } + + if (stmt instanceof CreateFunctionStatement) { + throw new PMLCompilationRuntimeException(responseStmtCtx, "operations/routines are not allowed inside response blocks"); + } + + stmts.add(stmt); + } + + CreateRuleStatement.ResponseBlock responseBlock = new CreateRuleStatement.ResponseBlock(evtVar, stmts); + + return responseBlock; + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitor.java new file mode 100644 index 000000000..3c4aba979 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitor.java @@ -0,0 +1,23 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.DeassignStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + + +public class DeassignStmtVisitor extends PMLBaseVisitor { + + public DeassignStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public DeassignStatement visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { + Expression name = Expression.compile(visitorCtx, ctx.ascendantNode, Type.string()); + Expression descendants = Expression.compile(visitorCtx, ctx.descendantNodes, Type.array(Type.string())); + + return new DeassignStatement(name, descendants); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitor.java new file mode 100644 index 000000000..83017915e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitor.java @@ -0,0 +1,22 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.DeleteRuleStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + + +public class DeleteRuleStmtVisitor extends PMLBaseVisitor { + + public DeleteRuleStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public DeleteRuleStatement visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { + Expression ruleNameExpr = Expression.compile(visitorCtx, ctx.ruleName, Type.string()); + Expression oblNameExpr = Expression.compile(visitorCtx, ctx.obligationName, Type.string()); + return new DeleteRuleStatement(ruleNameExpr, oblNameExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitor.java new file mode 100644 index 000000000..7d99953c1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitor.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.DeleteStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + + +public class DeleteStmtVisitor extends PMLBaseVisitor { + + public DeleteStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public DeleteStatement visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { + Expression nameExpr = Expression.compile(visitorCtx, ctx.expression(), Type.string()); + + PMLParser.DeleteTypeContext deleteTypeCtx = ctx.deleteType(); + DeleteStatement.Type deleteType = null; + if (deleteTypeCtx instanceof PMLParser.DeleteNodeContext deleteNodeCtx) { + PMLParser.NodeTypeContext nodeTypeCtx = deleteNodeCtx.nodeType(); + if (nodeTypeCtx.POLICY_CLASS() != null) { + deleteType = DeleteStatement.Type.POLICY_CLASS; + } else if (nodeTypeCtx.OBJECT_ATTRIBUTE() != null) { + deleteType = DeleteStatement.Type.OBJECT_ATTRIBUTE; + } else if (nodeTypeCtx.USER_ATTRIBUTE() != null) { + deleteType = DeleteStatement.Type.USER_ATTRIBUTE; + } else if (nodeTypeCtx.OBJECT() != null) { + deleteType = DeleteStatement.Type.OBJECT; + } else { + deleteType = DeleteStatement.Type.USER; + } + } else if (deleteTypeCtx instanceof PMLParser.DeleteProhibitionContext) { + deleteType = DeleteStatement.Type.PROHIBITION; + } else { + deleteType = DeleteStatement.Type.OBLIGATION; + } + + return new DeleteStatement(deleteType, nameExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitor.java new file mode 100644 index 000000000..50f590909 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitor.java @@ -0,0 +1,21 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.DissociateStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class DissociateStmtVisitor extends PMLBaseVisitor { + + public DissociateStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public DissociateStatement visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { + Expression ua = Expression.compile(visitorCtx, ctx.ua, Type.string()); + Expression target = Expression.compile(visitorCtx, ctx.target, Type.string()); + return new DissociateStatement(ua, target); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitor.java new file mode 100644 index 000000000..033d8a4e0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitor.java @@ -0,0 +1,77 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.statement.ForeachStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.List; + +public class ForeachStmtVisitor extends PMLBaseVisitor { + + public ForeachStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public ForeachStatement visitForeachStatement(PMLParser.ForeachStatementContext ctx) { + boolean isMapFor = ctx.value != null; + + Expression iter; + if (isMapFor) { + iter = Expression.compile(visitorCtx, ctx.expression(), Type.map(Type.any(), Type.any())); + } else { + iter = Expression.compile(visitorCtx, ctx.expression(), Type.array(Type.any())); + } + + Type iterType; + try { + iterType = iter.getType(visitorCtx.scope()); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + String varName = ctx.key.getText(); + String mapValueVarName = null; + if (isMapFor) { + mapValueVarName = ctx.value.getText(); + } + + List block = new ArrayList<>(); + Type keyType; + Type valueType = null; + if (isMapFor) { + keyType = iterType.getMapKeyType(); + valueType = iterType.getMapValueType(); + } else { + keyType = iterType.getArrayElementType(); + } + + VisitorContext localVisitorCtx = visitorCtx.copy(); + + try { + localVisitorCtx.scope().addVariable(varName, new Variable(varName, keyType, false)); + if (valueType != null) { + localVisitorCtx.scope().addVariable(mapValueVarName, new Variable(mapValueVarName, valueType, false)); + } + }catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + for (PMLParser.StatementContext stmtCtx : ctx.statementBlock().statement()) { + PMLStatement statement = new StatementVisitor(localVisitorCtx) + .visitStatement(stmtCtx); + block.add(statement); + + visitorCtx.scope().local().overwriteFromLocalScope(localVisitorCtx.scope().local()); + } + + return new ForeachStatement(varName, mapValueVarName, iter, block); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionDefinitionVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionDefinitionVisitor.java new file mode 100644 index 000000000..611fd0ae4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionDefinitionVisitor.java @@ -0,0 +1,183 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperationSignature; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineSignature; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLStmtsRoutine; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateFunctionStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateOperationStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRoutineStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.*; + +public class FunctionDefinitionVisitor extends PMLBaseVisitor { + + public FunctionDefinitionVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public CreateFunctionStatement visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { + PMLParser.FunctionSignatureContext functionSignatureContext = ctx.functionSignature(); + boolean isOp = functionSignatureContext.OPERATION() != null; + + PMLExecutableSignature signature = new FunctionSignatureVisitor(visitorCtx, isOp).visitFunctionSignature(functionSignatureContext); + + PMLStatementBlock body = parseBody(ctx, signature.getOperands(), signature.getOperandTypes(), signature.getReturnType()); + + // check if the function is an operation + if (signature instanceof PMLStmtsOperationSignature pmlOperationSignature) { + return new CreateOperationStatement(new PMLStmtsOperation( + pmlOperationSignature.getFunctionName(), + pmlOperationSignature.getReturnType(), + pmlOperationSignature.getOperands(), + pmlOperationSignature.getNodeOperands(), + pmlOperationSignature.getOperandTypes(), + pmlOperationSignature.getChecks(), + body + )); + } else { + return new CreateRoutineStatement(new PMLStmtsRoutine( + signature.getFunctionName(), + signature.getReturnType(), + signature.getOperands(), + signature.getOperandTypes(), + body + )); + } + } + + private PMLStatementBlock parseBody(PMLParser.FunctionDefinitionStatementContext ctx, + List operandNames, + Map operandTypes, + Type returnType) { + // create a new scope for the function body + VisitorContext localVisitorCtx = visitorCtx.copy(); + + // add the args to the local scope, overwriting any variables with the same ID as the formal args + for (int i = 0; i < operandNames.size(); i++) { + String name = operandNames.get(i); + Type type = operandTypes.get(name); + + localVisitorCtx.scope().addOrOverwriteVariable( + name, + new Variable(name, type, false) + ); + } + + StatementBlockVisitor statementBlockVisitor = new StatementBlockVisitor(localVisitorCtx, returnType); + StatementBlockVisitor.Result result = statementBlockVisitor.visitStatementBlock(ctx.statementBlock()); + + if (!result.allPathsReturned() && !returnType.isVoid()) { + throw new PMLCompilationRuntimeException(ctx, "not all conditional paths return"); + } + + return new PMLStatementBlock(result.stmts()); + } + + public static class FunctionSignatureVisitor extends PMLBaseVisitor { + + private boolean isOp; + + public FunctionSignatureVisitor(VisitorContext visitorCtx, boolean isOp) { + super(visitorCtx); + + this.isOp = isOp; + } + + @Override + public PMLExecutableSignature visitFunctionSignature(PMLParser.FunctionSignatureContext ctx) { + String funcName = ctx.ID().getText(); + List args = parseFormalArgs(ctx.formalArgList()); + List operandNames = new ArrayList<>(); + List nodeops = new ArrayList<>(); + Map operandTypes = new HashMap<>(); + + for (FormalOperand operand : args) { + operandNames.add(operand.name); + operandTypes.put(operand.name, operand.type); + + if (operand.isNodeop) { + nodeops.add(operand.name); + } + } + + // write operands to scope for compiling check block + VisitorContext copy = visitorCtx.copy(); + for (int i = 0; i < operandNames.size(); i++) { + String name = operandNames.get(i); + Type type = operandTypes.get(name); + + copy.scope().addOrOverwriteVariable( + name, + new Variable(name, type, false) + ); + } + + Type returnType = parseReturnType(ctx.returnType); + + CheckStatementBlockVisitor checkStatementBlockVisitor = new CheckStatementBlockVisitor(copy); + PMLStatementBlock block = checkStatementBlockVisitor.visitCheckStatementBlock(ctx.checkStatementBlock()); + + if (isOp) { + return new PMLStmtsOperationSignature( + funcName, + returnType, + operandNames, + nodeops, + operandTypes, + block + ); + } else { + return new PMLRoutineSignature(funcName, returnType, operandNames, operandTypes); + } + } + + private record FormalOperand(String name, Type type, boolean isNodeop) {} + + private List parseFormalArgs(PMLParser.FormalArgListContext formalArgListCtx) { + List formalArgs = new ArrayList<>(); + Set argNames = new HashSet<>(); + for (int i = 0; i < formalArgListCtx.formalArg().size(); i++) { + PMLParser.FormalArgContext formalArgCtx = formalArgListCtx.formalArg().get(i); + String name = formalArgCtx.ID().getText(); + boolean isNodeop = formalArgCtx.NODEOP() != null; + + // check that two formal args dont have the same name and that there are no constants with the same name + if (argNames.contains(name)) { + throw new PMLCompilationRuntimeException( + formalArgCtx, + String.format("formal arg '%s' already defined in signature", name) + ); + } + + // get arg type + PMLParser.VariableTypeContext varTypeContext = formalArgCtx.variableType(); + Type type = Type.toType(varTypeContext); + + // req cap if operation + formalArgs.add(new FormalOperand(name, type, isNodeop)); + + argNames.add(name); + } + + return formalArgs; + } + + private Type parseReturnType(PMLParser.VariableTypeContext variableTypeContext) { + if (variableTypeContext == null) { + return Type.voidType(); + } + + return Type.toType(variableTypeContext); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitor.java new file mode 100644 index 000000000..ac8ca09e7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitor.java @@ -0,0 +1,98 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.FunctionInvokeExpression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.UnknownFunctionInScopeException; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FunctionInvokeStmtVisitor extends PMLBaseVisitor { + + public FunctionInvokeStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public FunctionInvokeExpression visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { + return parse(ctx); + } + + @Override + public FunctionInvokeExpression visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { + return parse(ctx.functionInvoke()); + } + + private FunctionInvokeExpression parse(PMLParser.FunctionInvokeContext funcCallCtx) { + String funcName = funcCallCtx.ID().getText(); + + // get actual arg expressions + PMLParser.FunctionInvokeArgsContext funcCallArgsCtx = funcCallCtx.functionInvokeArgs(); + List actualArgs = new ArrayList<>(); + + PMLParser.ExpressionListContext expressionListContext = funcCallArgsCtx.expressionList(); + if (expressionListContext != null) { + for (PMLParser.ExpressionContext exprCtx : expressionListContext.expression()) { + Expression expr = Expression.compile(visitorCtx, exprCtx, Type.any()); + + actualArgs.add(expr); + } + } + + // check the function is in scope and the args are correct + PMLExecutableSignature signature; + try { + signature = visitorCtx.scope().getFunction(funcName); + } catch (UnknownFunctionInScopeException e) { + throw new PMLCompilationRuntimeException(funcCallCtx, e.getMessage()); + } + + // check that the actual args are correct type only if the function is not a pattern function + // pattern operations are handled differently because we do not want to invoke them now, just + // prepare them to be invoked during the event processing flow + List formalArgs = signature.getOperands(); + if (formalArgs.size() != actualArgs.size()) { + throw new PMLCompilationRuntimeException( + funcCallCtx, + "wrong number of args for function call " + funcName + ": " + + "expected " + formalArgs.size() + ", got " + actualArgs.size() + ); + } else { + for (int i = 0; i < actualArgs.size(); i++) { + try { + Expression actual = actualArgs.get(i); + Type actualType = actual.getType(visitorCtx.scope()); + String operand = formalArgs.get(i); + Type formalType = signature.getOperandTypes().get(operand); + + if (!actual.getType(visitorCtx.scope()).equals(formalType)) { + throw new PMLCompilationRuntimeException( + funcCallCtx, + "invalid argument type: expected " + formalType + ", got " + + actualType + " at arg " + i + ); + } + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(funcCallCtx, e.getMessage()); + } + } + } + + Map operands = new HashMap<>(); + for (int i = 0; i < actualArgs.size(); i++) { + String operand = formalArgs.get(i); + operands.put(operand, actualArgs.get(i)); + } + + return new FunctionInvokeExpression(signature, operands); + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionReturnStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionReturnStmtVisitor.java new file mode 100644 index 000000000..292d0ced2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionReturnStmtVisitor.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.FunctionReturnStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.antlr.v4.runtime.ParserRuleContext; + +public class FunctionReturnStmtVisitor extends PMLBaseVisitor { + + public FunctionReturnStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public FunctionReturnStatement visitReturnStatement(PMLParser.ReturnStatementContext ctx) { + ParserRuleContext enclosingCtx = getEnclosingContext(ctx); + if (enclosingCtx == null) { + throw new PMLCompilationRuntimeException( + ctx, + "return statement not in function definition or obligation response" + ); + } + + if (ctx.expression() == null) { + return new FunctionReturnStatement(); + } else if (enclosingCtx instanceof PMLParser.ResponseContext) { + throw new PMLCompilationRuntimeException( + ctx, + "return statement in response cannot return a value" + ); + } + + Expression e = Expression.compile(visitorCtx, ctx.expression(), Type.any()); + + return new FunctionReturnStatement(e); + } + + private ParserRuleContext getEnclosingContext(ParserRuleContext ctx) { + if (ctx instanceof PMLParser.FunctionDefinitionStatementContext || + ctx instanceof PMLParser.ResponseContext) { + return ctx; + } else if (ctx == null) { + return null; + } + + return getEnclosingContext(ctx.getParent()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitor.java new file mode 100644 index 000000000..65f4ca47d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitor.java @@ -0,0 +1,71 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.IfStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.List; + +public class IfStmtVisitor extends PMLBaseVisitor { + + public IfStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public PMLStatement visitIfStatement(PMLParser.IfStatementContext ctx) { + // if block + VisitorContext localVisitorCtx = visitorCtx.copy(); + Expression condition = Expression.compile(localVisitorCtx, ctx.condition, Type.bool()); + + List block = new ArrayList<>(); + StatementVisitor statementVisitor = new StatementVisitor(localVisitorCtx); + for (PMLParser.StatementContext stmtCtx : ctx.statementBlock().statement()) { + PMLStatement statement = statementVisitor.visitStatement(stmtCtx); + block.add(statement); + } + + // update outer scoped variables + visitorCtx.scope().local().overwriteFromLocalScope(localVisitorCtx.scope().local()); + + IfStatement.ConditionalBlock ifBlock = new IfStatement.ConditionalBlock(condition, new PMLStatementBlock(block)); + + // else ifs + localVisitorCtx = visitorCtx.copy(); + statementVisitor = new StatementVisitor(localVisitorCtx); + List elseIfs = new ArrayList<>(); + for (PMLParser.ElseIfStatementContext elseIfStmtCtx : ctx.elseIfStatement()) { + condition = Expression.compile(visitorCtx, elseIfStmtCtx.condition, Type.bool()); + block = new ArrayList<>(); + for (PMLParser.StatementContext stmtCtx : elseIfStmtCtx.statementBlock().statement()) { + PMLStatement statement = statementVisitor.visitStatement(stmtCtx); + block.add(statement); + } + elseIfs.add(new IfStatement.ConditionalBlock(condition, new PMLStatementBlock(block))); + + // update outer scoped variables + visitorCtx.scope().local().overwriteFromLocalScope(localVisitorCtx.scope().local()); + } + + // else + localVisitorCtx = visitorCtx.copy(); + statementVisitor = new StatementVisitor(localVisitorCtx); + block = new ArrayList<>(); + if (ctx.elseStatement() != null) { + for (PMLParser.StatementContext stmtCtx : ctx.elseStatement().statementBlock().statement()) { + PMLStatement statement = statementVisitor.visitStatement(stmtCtx); + block.add(statement); + } + + // update outer scoped variables + visitorCtx.scope().local().overwriteFromLocalScope(localVisitorCtx.scope().local()); + } + + return new IfStatement(ifBlock, elseIfs, new PMLStatementBlock(block)); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLBaseVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLBaseVisitor.java new file mode 100644 index 000000000..f38503629 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLBaseVisitor.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParserBaseVisitor; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; + +public abstract class PMLBaseVisitor extends PMLParserBaseVisitor { + + protected VisitorContext visitorCtx; + + public PMLBaseVisitor(VisitorContext visitorCtx) { + this.visitorCtx = visitorCtx; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLVisitor.java new file mode 100644 index 000000000..4d1cebaa4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/PMLVisitor.java @@ -0,0 +1,129 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.CompiledPML; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.statement.*; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateFunctionStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateOperationStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRoutineStatement; + +import java.util.*; + +public class PMLVisitor extends PMLBaseVisitor> { + + public PMLVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public List visitPml(PMLParser.PmlContext ctx) { + SortedStatements sortedStatements = sortStatements(ctx); + + VisitorContext copy = visitorCtx.copy(); + CompiledExecutables executables = compileExecutables(copy, sortedStatements.functionCtxs); + + List stmts = new ArrayList<>(); + stmts.addAll(executables.operations); + stmts.addAll(executables.routines); + stmts.addAll(compileStatements(sortedStatements.statementCtxs)); + + return stmts; + } + + private SortedStatements sortStatements(PMLParser.PmlContext ctx) { + List functionCtxs = new ArrayList<>(); + List statementCtxs = new ArrayList<>(); + + for (PMLParser.StatementContext stmtCtx : ctx.statement()) { + if (stmtCtx.functionDefinitionStatement() != null) { + functionCtxs.add(stmtCtx.functionDefinitionStatement()); + } else { + statementCtxs.add(stmtCtx); + } + } + + return new SortedStatements(functionCtxs, statementCtxs); + } + + private record SortedStatements(List functionCtxs, + List statementCtxs) {} + + private CompiledExecutables compileExecutables(VisitorContext visitorCtx, List functionSignatureCtxs) { + Map executables = new HashMap<>(visitorCtx.scope().global().getExecutables()); + // track the function definitions statements to be processed, + // any function with an error won't be processed but execution will continue inorder to find anymore errors + Map validFunctionDefs = new HashMap<>(); + + for (PMLParser.FunctionDefinitionStatementContext functionDefinitionStatementContext : functionSignatureCtxs) { + boolean isOp = functionDefinitionStatementContext.functionSignature().OPERATION() != null; + + FunctionDefinitionVisitor.FunctionSignatureVisitor functionSignatureVisitor = + new FunctionDefinitionVisitor.FunctionSignatureVisitor(visitorCtx, isOp); + + // visit the signature which will add to the scope, if an error occurs, log it and continue + try { + PMLExecutableSignature signature = functionSignatureVisitor.visitFunctionSignature( + functionDefinitionStatementContext.functionSignature()); + + // check that the function isn't already defined in the pml or global scope + if (executables.containsKey(signature.getFunctionName())) { + visitorCtx.errorLog().addError(functionDefinitionStatementContext, + "function '" + signature.getFunctionName() + "' already defined in scope"); + continue; + } + + executables.put(signature.getFunctionName(), signature); + validFunctionDefs.put(signature.getFunctionName(), functionDefinitionStatementContext); + } catch (PMLCompilationRuntimeException e) { + visitorCtx.errorLog().addErrors(e.getErrors()); + } + } + + // store all function signatures for use in compiling function bodies + visitorCtx.scope().global().addExecutables(executables); + + // compile function bodies + FunctionDefinitionVisitor functionDefinitionVisitor = new FunctionDefinitionVisitor(visitorCtx); + List operations = new ArrayList<>(); + List routines = new ArrayList<>(); + + for (PMLParser.FunctionDefinitionStatementContext functionDefinitionStatementContext : validFunctionDefs.values()) { + // visit the definition which will return the statement with body + try { + CreateFunctionStatement funcStmt = + functionDefinitionVisitor.visitFunctionDefinitionStatement(functionDefinitionStatementContext); + if (funcStmt instanceof CreateOperationStatement createOperationStatement) { + operations.add(createOperationStatement); + } else if (funcStmt instanceof CreateRoutineStatement createRoutineStatement) { + routines.add(createRoutineStatement); + } + } catch (PMLCompilationRuntimeException e) { + visitorCtx.errorLog().addErrors(e.getErrors()); + } + } + + return new CompiledExecutables(operations, routines); + } + + private record CompiledExecutables(List operations, List routines) {} + + private List compileStatements(List statementCtxs) { + List statements = new ArrayList<>(); + for (PMLParser.StatementContext stmtCtx : statementCtxs) { + StatementVisitor statementVisitor = new StatementVisitor(visitorCtx); + + try { + PMLStatement statement = statementVisitor.visitStatement(stmtCtx); + statements.add(statement); + } catch (PMLCompilationRuntimeException e) { + visitorCtx.errorLog().addErrors(e.getErrors()); + } + } + + return statements; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java new file mode 100644 index 000000000..d3829fd5a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java @@ -0,0 +1,22 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.operation.SetNodePropertiesStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +public class SetNodePropertiesStmtVisitor extends PMLBaseVisitor { + + public SetNodePropertiesStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public SetNodePropertiesStatement visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { + Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); + Expression props = Expression.compile(visitorCtx, ctx.properties, Type.map(Type.string(), Type.string())); + + return new SetNodePropertiesStatement(name, props); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitor.java new file mode 100644 index 000000000..ae66a08a4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitor.java @@ -0,0 +1,28 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.LiteralVisitor; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.statement.operation.SetResourceOperationsStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.antlr.v4.runtime.tree.TerminalNode; + +import java.util.ArrayList; +import java.util.List; + +public class SetResourceOperationsStmtVisitor extends PMLBaseVisitor { + + public SetResourceOperationsStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public SetResourceOperationsStatement visitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { + Expression expression = Expression.compile(visitorCtx, ctx.accessRightsArr, Type.array(Type.string())); + + return new SetResourceOperationsStatement(expression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitor.java new file mode 100644 index 000000000..77e596ee8 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitor.java @@ -0,0 +1,112 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateFunctionStatement; +import gov.nist.csd.pm.pap.pml.statement.FunctionReturnStatement; +import gov.nist.csd.pm.pap.pml.statement.IfStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.List; + +public class StatementBlockVisitor extends PMLBaseVisitor { + + private Type returnType; + + public StatementBlockVisitor(VisitorContext visitorCtx, Type returnType) { + super(visitorCtx); + this.returnType = returnType; + } + + @Override + public Result visitStatementBlock(PMLParser.StatementBlockContext ctx) { + List stmts = new ArrayList<>(); + StatementVisitor statementVisitor = new StatementVisitor(visitorCtx); + for (PMLParser.StatementContext statementContext : ctx.statement()) { + PMLStatement pmlStatement = statementVisitor.visitStatement(statementContext); + + if (pmlStatement instanceof CreateFunctionStatement) { + throw new PMLCompilationRuntimeException(statementContext, "operations are not allowed inside statement blocks"); + } + + stmts.add(pmlStatement); + } + + try { + boolean allPathsReturned = checkAllPathsReturned(visitorCtx, stmts, returnType); + return new Result(allPathsReturned, stmts); + } catch (PMException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + } + + public static boolean checkAllPathsReturned(VisitorContext visitorCtx, List statements, Type returnType) + throws PMException { + if (statements.isEmpty()) { + return false; + } + + PMLStatement lastStmt = statements.getLast(); + if (lastStmt instanceof FunctionReturnStatement functionReturnStatement) { + if (!functionReturnStatement.matchesReturnType(returnType, visitorCtx.scope())) { + throw new PMException("return statement \"" + functionReturnStatement + "\" does not match return type " + returnType); + } + + return true; + } + + + boolean allPathsReturned = false; + PMLStatement pmlStatement; + for (int i = 0; i < statements.size(); i++) { + pmlStatement = statements.get(i); + + if (pmlStatement instanceof FunctionReturnStatement functionReturnStatement) { + if (i < statements.size() - 1) { + throw new PMException("function return should be last statement in block"); + } + + if (!functionReturnStatement.matchesReturnType(returnType, visitorCtx.scope())) { + throw new PMException("return statement \"" + functionReturnStatement + "\" does not match return type " + returnType); + } + + return true; + } else if (pmlStatement instanceof IfStatement ifStatement) { + if (!allIfStatementPathsReturned(visitorCtx, ifStatement, returnType)) { + return false; + } else { + allPathsReturned = true; + } + } + } + + return allPathsReturned; + } + + private static boolean allIfStatementPathsReturned(VisitorContext visitorCtx, IfStatement ifStatement, Type returnType) + throws PMException { + boolean check = checkAllPathsReturned(visitorCtx, ifStatement.getIfBlock().block().getStmts(), returnType); + if (!check) { + return false; + } + + // check else ifs + for (IfStatement.ConditionalBlock conditionalBlock : ifStatement.getIfElseBlocks()) { + check = checkAllPathsReturned(visitorCtx, conditionalBlock.block().getStmts(), returnType); + if (!check) { + return false; + } + } + + // check else + return checkAllPathsReturned(visitorCtx, ifStatement.getElseBlock().getStmts(), returnType); + } + + public record Result(boolean allPathsReturned, List stmts) { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementVisitor.java new file mode 100644 index 000000000..de5f262a1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementVisitor.java @@ -0,0 +1,127 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; + +public class StatementVisitor extends PMLBaseVisitor { + + public StatementVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public PMLStatement visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { + return new CreatePolicyStmtVisitor(visitorCtx).visitCreatePolicyStatement(ctx); + } + + @Override + public PMLStatement visitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { + return new CreateNonPCStmtVisitor(visitorCtx).visitCreateNonPCStatement(ctx); + } + + @Override + public PMLStatement visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { + return new CreateObligationStmtVisitor(visitorCtx).visitCreateObligationStatement(ctx); + } + + @Override + public PMLStatement visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { + return new CreateProhibitionStmtVisitor(visitorCtx).visitCreateProhibitionStatement(ctx); + } + + @Override + public PMLStatement visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { + return new SetNodePropertiesStmtVisitor(visitorCtx).visitSetNodePropertiesStatement(ctx); + } + + @Override + public PMLStatement visitAssignStatement(PMLParser.AssignStatementContext ctx) { + return new AssignStmtVisitor(visitorCtx).visitAssignStatement(ctx); + } + + @Override + public PMLStatement visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { + return new DeassignStmtVisitor(visitorCtx).visitDeassignStatement(ctx); + } + + @Override + public PMLStatement visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { + return new AssociateStmtVisitor(visitorCtx).visitAssociateStatement(ctx); + } + + @Override + public PMLStatement visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { + return new DissociateStmtVisitor(visitorCtx).visitDissociateStatement(ctx); + } + + @Override + public PMLStatement visitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { + return new SetResourceOperationsStmtVisitor(visitorCtx).visitSetResourceOperationsStatement(ctx); + } + + @Override + public PMLStatement visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { + return new DeleteStmtVisitor(visitorCtx).visitDeleteStatement(ctx); + } + + @Override + public PMLStatement visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { + return new DeleteRuleStmtVisitor(visitorCtx).visitDeleteRuleStatement(ctx); + } + + @Override + public PMLStatement visitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { + return new VarStmtVisitor(visitorCtx).visitVariableAssignmentStatement(ctx); + } + + @Override + public PMLStatement visitVarDeclaration(PMLParser.VarDeclarationContext ctx) { + return new VarStmtVisitor(visitorCtx).visitVarDeclaration(ctx); + } + + @Override + public PMLStatement visitShortDeclaration(PMLParser.ShortDeclarationContext ctx) { + return new VarStmtVisitor(visitorCtx).visitShortDeclaration(ctx); + } + + @Override + public PMLStatement visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { + return new FunctionDefinitionVisitor(visitorCtx).visitFunctionDefinitionStatement(ctx); + } + + @Override + public PMLStatement visitReturnStatement(PMLParser.ReturnStatementContext ctx) { + return new FunctionReturnStmtVisitor(visitorCtx).visitReturnStatement(ctx); + } + + @Override + public PMLStatement visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { + return new FunctionInvokeStmtVisitor(visitorCtx).visitFunctionInvokeStatement(ctx); + } + + @Override + public PMLStatement visitForeachStatement(PMLParser.ForeachStatementContext ctx) { + return new ForeachStmtVisitor(visitorCtx).visitForeachStatement(ctx); + } + + @Override + public PMLStatement visitBreakStatement(PMLParser.BreakStatementContext ctx) { + return new BreakStmtVisitor(visitorCtx).visitBreakStatement(ctx); + } + + @Override + public PMLStatement visitContinueStatement(PMLParser.ContinueStatementContext ctx) { + return new ContinueStmtVisitor(visitorCtx).visitContinueStatement(ctx); + } + + @Override + public PMLStatement visitIfStatement(PMLParser.IfStatementContext ctx) { + return new IfStmtVisitor(visitorCtx).visitIfStatement(ctx); + } + + @Override + public PMLStatement visitCheckStatement(PMLParser.CheckStatementContext ctx) { + return new CheckStatementVisitor(visitorCtx).visitCheckStatement(ctx); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitor.java new file mode 100644 index 000000000..c146b956d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitor.java @@ -0,0 +1,87 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.statement.*; +import gov.nist.csd.pm.pap.pml.statement.ShortDeclarationStatement; +import gov.nist.csd.pm.pap.pml.statement.VariableAssignmentStatement; +import gov.nist.csd.pm.pap.pml.statement.VariableDeclarationStatement; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.List; + +public class VarStmtVisitor extends PMLBaseVisitor { + + + public VarStmtVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public PMLStatement visitVarDeclaration(PMLParser.VarDeclarationContext ctx) { + List decls = new ArrayList<>(); + for (PMLParser.VarSpecContext varSpecContext : ctx.varSpec()) { + String varName = varSpecContext.ID().getText(); + Expression expr = Expression.compile(visitorCtx, varSpecContext.expression(), Type.any()); + + try { + visitorCtx.scope().addVariable(varName, new Variable(varName, expr.getType(visitorCtx.scope()), false)); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + decls.add(new VariableDeclarationStatement.Declaration(varName, expr)); + } + + return new VariableDeclarationStatement(decls); + } + + @Override + public PMLStatement visitShortDeclaration(PMLParser.ShortDeclarationContext ctx) { + String varName = ctx.ID().getText(); + Expression expr = Expression.compile(visitorCtx, ctx.expression(), Type.any()); + + ShortDeclarationStatement stmt = new ShortDeclarationStatement(varName, expr); + + try { + if (visitorCtx.scope().variableExists(varName)) { + throw new PMLCompilationRuntimeException(ctx, "variable " + varName + " already exists"); + } + + visitorCtx.scope().addVariable(varName, new Variable(varName, expr.getType(visitorCtx.scope()), false)); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + return stmt; + } + + @Override + public PMLStatement visitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { + String varName = ctx.ID().getText(); + Expression expr = Expression.compile(visitorCtx, ctx.expression(), Type.any()); + + VariableAssignmentStatement stmt = new VariableAssignmentStatement( + varName, + ctx.PLUS() != null, + expr + ); + + try { + if (visitorCtx.scope().getVariable(varName).isConst()) { + throw new PMLCompilationRuntimeException(ctx, "cannot reassign const variable"); + } + + // don't need to update variable since the name and type are the only thing that matter during compilation + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + return stmt; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/context/ExecutionContext.java b/src/main/java/gov/nist/csd/pm/pap/pml/context/ExecutionContext.java new file mode 100644 index 000000000..d0b92e015 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/context/ExecutionContext.java @@ -0,0 +1,110 @@ +package gov.nist.csd.pm.pap.pml.context; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.pml.scope.ExecuteGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.*; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.scope.Scope; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ExecutionContext implements Serializable { + + protected final UserContext author; + protected final Scope> scope; + protected final PAP pap; + + public ExecutionContext(UserContext author, PAP pap) throws PMException { + this.author = author; + this.scope = new Scope<>(new ExecuteGlobalScope(pap)); + this.pap = pap; + } + + public ExecutionContext(UserContext author, PAP pap, Scope> scope) throws PMException { + this.author = author; + this.scope = scope; + this.pap = pap; + } + + public UserContext author() { + return author; + } + + public Scope> scope() { + return scope; + } + + public ExecutionContext copy() throws PMException { + return new ExecutionContext(author, pap, scope.copy()); + } + + public Value executeStatements(List stmts, Map operands) throws PMException { + ExecutionContext copy = writeOperandsToScope(operands); + + for (PMLStatement statement : stmts) { + Value value = statement.execute(copy, pap); + + scope.local().overwriteFromLocalScope(copy.scope.local()); + + if (value instanceof ReturnValue || value instanceof BreakValue || value instanceof ContinueValue) { + return value; + } + } + + return new VoidValue(); + } + + public Value executeOperationStatements(List stmts, Map operands) throws PMException { + return executeStatements(stmts, operands); + } + + public Value executeRoutineStatements(List stmts, Map operands) throws PMException { + return executeStatements(stmts, operands); + } + + protected ExecutionContext writeOperandsToScope(Map operands) throws PMException { + ExecutionContext copy = this.copy(); + + for (Map.Entry entry : operands.entrySet()) { + String key = entry.getKey(); + Object o = entry.getValue(); + + Value value; + if (o instanceof Value) { + value = (Value) o; + } else { + value = Value.fromObject(o); + } + + copy.scope.local().addOrOverwriteVariable(key, value); + } + + return copy; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof ExecutionContext that)) { + return false; + } + return Objects.equals(author, that.author) && Objects.equals( + scope, + that.scope + ); + } + + @Override + public int hashCode() { + return Objects.hash(author, scope); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/context/VisitorContext.java b/src/main/java/gov/nist/csd/pm/pap/pml/context/VisitorContext.java new file mode 100644 index 000000000..301d59687 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/context/VisitorContext.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.context; + +import gov.nist.csd.pm.pap.pml.PMLErrorHandler; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.compiler.error.ErrorLog; +import gov.nist.csd.pm.pap.pml.exception.PMLExecutionException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ListTokenSource; + +import java.util.List; +import java.util.Objects; + +public record VisitorContext(CommonTokenStream tokens, Scope scope, ErrorLog errorLog, PMLErrorHandler pmlErrorHandler) { + + public VisitorContext(Scope scope) { + this(new CommonTokenStream(new ListTokenSource(List.of())), scope, new ErrorLog(), new PMLErrorHandler()); + } + + public VisitorContext(GlobalScope globalScope) { + this(new CommonTokenStream(new ListTokenSource(List.of())), new Scope<>(globalScope), new ErrorLog(), new PMLErrorHandler()); + } + + public VisitorContext copy() { + // want to persist the error tracker and tokens + return new VisitorContext(this.tokens, scope.copy(), this.errorLog, this.pmlErrorHandler); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + VisitorContext that = (VisitorContext) o; + return Objects.equals(tokens, that.tokens) && Objects.equals( + scope, that.scope) && Objects.equals(errorLog, that.errorLog); + } + + @Override + public int hashCode() { + return Objects.hash(tokens, scope, errorLog); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationException.java b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationException.java new file mode 100644 index 000000000..b3836b233 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationException.java @@ -0,0 +1,42 @@ +package gov.nist.csd.pm.pap.pml.exception; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.compiler.error.CompileError; +import gov.nist.csd.pm.pap.pml.compiler.error.ErrorLog; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class PMLCompilationException extends PMException { + + private final List errors; + + public PMLCompilationException(ErrorLog errorLog) { + super(errorLog.toString()); + this.errors = new ArrayList<>(errorLog.getErrors()); + } + + public PMLCompilationException(List errors) { + super(errors.toString()); + this.errors = errors; + } + + public PMLCompilationException(CompileError error) { + super(error.errorMessage()); + this.errors = Arrays.asList(error); + } + + public List getErrors() { + return errors; + } + + @Override + public String getMessage() { + StringBuilder s = new StringBuilder(); + for (CompileError e : errors) { + s.append(e.toString()).append("\n"); + } + return s.toString(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationRuntimeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationRuntimeException.java new file mode 100644 index 000000000..563c9765b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLCompilationRuntimeException.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.pap.pml.exception; + +import gov.nist.csd.pm.pap.pml.compiler.Position; +import gov.nist.csd.pm.pap.pml.compiler.error.CompileError; +import org.antlr.v4.runtime.ParserRuleContext; + +import java.util.ArrayList; +import java.util.List; + +public class PMLCompilationRuntimeException extends RuntimeException { + + private List errors; + + public PMLCompilationRuntimeException(ParserRuleContext ctx, String message) { + this.errors = List.of(CompileError.fromParserRuleContext(ctx, message)); + } + + public PMLCompilationRuntimeException(String message) { + this.errors = new ArrayList<>(); + this.errors.add(new CompileError(new Position(0, 0, 0), message)); + } + + public PMLCompilationRuntimeException(List errors) { + this.errors = errors; + } + + public PMLCompilationRuntimeException(Throwable cause) { + super(cause); + } + + public List getErrors() { + return errors; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLExecutionException.java b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLExecutionException.java new file mode 100644 index 000000000..f60e520f3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/exception/PMLExecutionException.java @@ -0,0 +1,18 @@ +package gov.nist.csd.pm.pap.pml.exception; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; + +public class PMLExecutionException extends PMException { + public PMLExecutionException(PMLStatementSerializable stmt, Exception e) { + super("error executing: " + stmt.toString(), e); + } + + public PMLExecutionException(String msg) { + super(msg); + } + + public PMLExecutionException(Exception e) { + super(e); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/PMLExecutableSignature.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/PMLExecutableSignature.java new file mode 100644 index 000000000..f7f34d6a7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/PMLExecutableSignature.java @@ -0,0 +1,72 @@ +package gov.nist.csd.pm.pap.pml.executable; + +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PMLExecutableSignature implements PMLStatementSerializable { + + protected String functionName; + protected Type returnType; + protected List operands; + protected Map operandTypes; + + public PMLExecutableSignature(String functionName, Type returnType, List operands, Map operandTypes) { + this.functionName = functionName; + this.returnType = returnType; + this.operands = operands; + this.operandTypes = operandTypes; + } + + public String getFunctionName() { + return functionName; + } + + public Type getReturnType() { + return returnType; + } + + public List getOperands() { + return operands; + } + + public Map getOperandTypes() { + return operandTypes; + } + + protected String serializeFormalArgs() { + String pml = ""; + for (int i = 0; i < operands.size(); i++) { + String operand = operands.get(i); + Type operandType = operandTypes.get(operand); + + if (!pml.isEmpty()) { + pml += ", "; + } + + pml += operandType.toString() + " " + operand; + } + return pml; + } + + @Override + public String toFormattedString(int indentLevel) { + // by default a signature does not need a formatted string, classes that do need a formatted string will override + return ""; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PMLExecutableSignature signature)) return false; + return Objects.equals(functionName, signature.functionName) && Objects.equals(returnType, signature.returnType) && Objects.equals(operands, signature.operands) && Objects.equals(operandTypes, signature.operandTypes); + } + + @Override + public int hashCode() { + return Objects.hash(functionName, returnType, operands, operandTypes); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLBuiltinOperations.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLBuiltinOperations.java new file mode 100644 index 000000000..f15a43623 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLBuiltinOperations.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.pml.executable.operation.builtin.*; + +import java.util.HashMap; +import java.util.Map; + +public class PMLBuiltinOperations { + + // util operations + private static final Concat concat = new Concat(); + private static final Equals equals = new Equals(); + private static final Contains contains = new Contains(); + private static final ContainsKey containsKey = new ContainsKey(); + + // policy operations + private static final GetAssociationsWithSource getAssociationsWithSource = new GetAssociationsWithSource(); + private static final GetAssociationsWithTarget getAssociationsWithTarget = new GetAssociationsWithTarget(); + private static final GetAdjacentAscendants getAdjacentAscendants = new GetAdjacentAscendants(); + private static final GetAdjacentDescendants getAdjacentDescendants = new GetAdjacentDescendants(); + private static final GetNodeProperties getNodeProperties = new GetNodeProperties(); + private static final GetNodeType getNodeType = new GetNodeType(); + private static final HasPropertyKey hasPropertyKey = new HasPropertyKey(); + private static final HasPropertyValue hasPropertyValue = new HasPropertyValue(); + private static final NodeExists nodeExists = new NodeExists(); + private static final GetNode getNode = new GetNode(); + private static final Search search = new Search(); + private static final Append append = new Append(); + private static final AppendAll appendAll = new AppendAll(); + + private static final Map BUILTIN_FUNCTIONS = new HashMap<>(); + + static { + BUILTIN_FUNCTIONS.put(concat.getName(), concat); + BUILTIN_FUNCTIONS.put(equals.getName(), equals); + BUILTIN_FUNCTIONS.put(contains.getName(), contains); + BUILTIN_FUNCTIONS.put(containsKey.getName(), containsKey); + BUILTIN_FUNCTIONS.put(appendAll.getName(), appendAll); + BUILTIN_FUNCTIONS.put(append.getName(), append); + + BUILTIN_FUNCTIONS.put(getAssociationsWithSource.getName(), getAssociationsWithSource); + BUILTIN_FUNCTIONS.put(getAssociationsWithTarget.getName(), getAssociationsWithTarget); + BUILTIN_FUNCTIONS.put(getAdjacentAscendants.getName(), getAdjacentAscendants); + BUILTIN_FUNCTIONS.put(getAdjacentDescendants.getName(), getAdjacentDescendants); + BUILTIN_FUNCTIONS.put(getNodeProperties.getName(), getNodeProperties); + BUILTIN_FUNCTIONS.put(getNodeType.getName(), getNodeType); + BUILTIN_FUNCTIONS.put(hasPropertyKey.getName(), hasPropertyKey); + BUILTIN_FUNCTIONS.put(hasPropertyValue.getName(), hasPropertyValue); + BUILTIN_FUNCTIONS.put(nodeExists.getName(), nodeExists); + BUILTIN_FUNCTIONS.put(getNode.getName(), getNode); + BUILTIN_FUNCTIONS.put(search.getName(), search); + } + + public static Map builtinFunctions() { + return new HashMap<>(BUILTIN_FUNCTIONS); + } + + public static boolean isBuiltinFunction(String functionName) { + return BUILTIN_FUNCTIONS.containsKey(functionName); + } + + private PMLBuiltinOperations() {} +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperation.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperation.java new file mode 100644 index 000000000..1f058a4ee --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperation.java @@ -0,0 +1,110 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.exception.OperandsDoNotMatchException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PreparedOperation; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class PMLOperation extends Operation { + + private Type returnType; + private Map operandTypes; + protected ExecutionContext ctx; + + public PMLOperation(String name, + Type returnType, + List allOperands, + List nodeOperands, + Map operandTypes) { + super(name, allOperands, nodeOperands); + + validateOperands(allOperands, nodeOperands, operandTypes); + + this.returnType = returnType; + this.operandTypes = operandTypes; + } + + public PMLOperation(String name, + Type returnType, + List allOperands, + Map operandTypes) { + super(name, allOperands, new ArrayList<>()); + + validateOperands(allOperands, List.of(), operandTypes); + + this.returnType = returnType; + this.operandTypes = operandTypes; + + } + + public PMLOperation(String name, + Type returnType) { + super(name, new ArrayList<>(), new ArrayList<>()); + + this.returnType = returnType; + this.operandTypes = new HashMap<>(); + } + + private void validateOperands(List allOperands, List nodeOperands, Map operandTypes) { + if (operandTypes.size() != allOperands.size()) { + throw new IllegalArgumentException("expected " + allOperands.size() + + " operand types but got " + operandTypes.size()); + } else if (!(operandTypes.keySet().containsAll(allOperands) || operandTypes.keySet().containsAll(nodeOperands))) { + throw new IllegalArgumentException("operand types must contain all defined operands"); + } + + // check each node operand is a string or string array + for (String nodeOperand : nodeOperands) { + Type type = operandTypes.get(nodeOperand); + if (type.isString() || (type.isArray() && type.getArrayElementType().isString())) { + continue; + } + + throw new IllegalArgumentException("node operands must be of type string or string array"); + } + } + + public PMLExecutableSignature getSignature() { + return new PMLOperationSignature( + getName(), + getReturnType(), + getOperandNames(), + getNodeOperands(), + getOperandTypes() + ); + } + + public Type getReturnType() { + return returnType; + } + + public Map getOperandTypes() { + return operandTypes; + } + + public ExecutionContext getCtx() { + if (ctx == null) { + throw new IllegalArgumentException("execution context has not been set"); + } + + return ctx; + } + + public void setCtx(ExecutionContext ctx) { + this.ctx = ctx; + } + + @Override + public PreparedOperation withOperands(Map actualOperands) throws OperandsDoNotMatchException { + return new PMLPreparedOperation(this, actualOperands); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignature.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignature.java new file mode 100644 index 000000000..62d51db2e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignature.java @@ -0,0 +1,60 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Stream; + +public class PMLOperationSignature extends PMLExecutableSignature { + + private List nodeOperands; + + public PMLOperationSignature(String functionName, Type returnType, List allOperands, + List nodeOperands, Map operandTypes) { + super(functionName, returnType, allOperands, operandTypes); + + this.nodeOperands = nodeOperands; + } + + public List getNodeOperands() { + return nodeOperands; + } + + @Override + public String toFormattedString(int indentLevel) { + String argsStr = serializeFormalArgs(); + String indent = indent(indentLevel); + return String.format( + "%s%s %s(%s) %s", + indent, + "operation", + functionName, + argsStr, + returnType.isVoid() ? "" : returnType.toString() + " " + ); + } + + @Override + protected String serializeFormalArgs() { + String pml = ""; + for (int i = 0; i < operands.size(); i++) { + String operand = operands.get(i); + Type operandType = operandTypes.get(operand); + + if (!pml.isEmpty()) { + pml += ", "; + } + + pml += (nodeOperands.contains(operand) ? "nodeop " : "") + operandType.toString() + " " + operand; + } + return pml; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapper.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapper.java new file mode 100644 index 000000000..713b711ca --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapper.java @@ -0,0 +1,54 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PMLOperationWrapper extends PMLOperation { + + private Operation operation; + + public PMLOperationWrapper(Operation operation) { + super( + operation.getName(), + Type.any(), + operation.getOperandNames(), + operation.getNodeOperands(), + getTypesFromOperandNames(operation.getOperandNames()) + ); + + this.operation = operation; + } + + public Operation getOperation() { + return operation; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + operation.canExecute(pap, userCtx, operands); + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Object o = operation.execute(pap, operands); + + return Value.fromObject(o); + } + + public static Map getTypesFromOperandNames(List operandNames) { + Map types = new HashMap<>(); + for (String operandName : operandNames) { + types.put(operandName, Type.any()); + } + + return types; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLPreparedOperation.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLPreparedOperation.java new file mode 100644 index 000000000..6d47ff035 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLPreparedOperation.java @@ -0,0 +1,20 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PreparedOperation; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Map; + +public class PMLPreparedOperation extends PreparedOperation { + + public PMLPreparedOperation(PMLOperation op, Map operands) { + super(op, operands); + } + + @Override + public Value execute(PAP pap) throws PMException { + return getOp().execute(pap, getOperands()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperation.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperation.java new file mode 100644 index 000000000..4a221d7fc --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperation.java @@ -0,0 +1,93 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PMLStmtsOperation extends PMLOperation implements PMLStatementSerializable { + + private PMLStatementBlock checks; + private PMLStatementBlock statements; + + public PMLStmtsOperation(String name, + Type returnType, + List allOperands, + List nodeOperands, + Map operandTypes, + PMLStatementBlock checks, + PMLStatementBlock statements) { + super(name, returnType, allOperands, nodeOperands, operandTypes); + this.checks = checks; + this.statements = statements; + } + + public PMLStatementBlock getChecks() { + return checks; + } + + public PMLStatementBlock getStatements() { + return statements; + } + + @Override + public PMLExecutableSignature getSignature() { + return new PMLStmtsOperationSignature( + getName(), + getReturnType(), + getOperandNames(), + getNodeOperands(), + getOperandTypes(), + getChecks() + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + ctx.executeOperationStatements(getChecks().getStmts(), operands); + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + ExecutionContext ctx = getCtx(); + + return ctx.executeOperationStatements(statements.getStmts(), operands); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format( + "%s%s", + getSignature().toFormattedString(indentLevel), + getStatements().toFormattedString(indentLevel) + ); + } + + @Override + public String toString() { + return toFormattedString(0); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + PMLStmtsOperation that = (PMLStmtsOperation) o; + return Objects.equals(statements, that.statements); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), statements); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignature.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignature.java new file mode 100644 index 000000000..667b68f34 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignature.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.List; +import java.util.Map; + +public class PMLStmtsOperationSignature extends PMLOperationSignature{ + + private PMLStatementBlock checks; + + public PMLStmtsOperationSignature( + String functionName, + Type returnType, + List allOperands, + List nodeOperands, + Map operandTypes, + PMLStatementBlock checks) { + super(functionName, returnType, allOperands, nodeOperands, operandTypes); + + this.checks = checks; + } + + public PMLStatementBlock getChecks() { + return checks; + } + + @Override + public String toFormattedString(int indentLevel) { + String argsStr = serializeFormalArgs(); + String indent = indent(indentLevel); + return String.format( + "%s%s %s(%s) %s%s", + indent, + "operation", + functionName, + argsStr, + returnType.isVoid() ? "" : returnType.toString() + " ", + checks.getStmts().isEmpty() ? "" : checks.toFormattedString(indentLevel) + " " + ); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Append.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Append.java new file mode 100644 index 000000000..829348225 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Append.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class Append extends PMLOperation { + public Append() { + super( + "append", + Type.array(Type.any()), + List.of("dst", "src"), + Map.of("dst", Type.array(Type.any()), "src", Type.any()) + ); + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + List valueArr = (List) operands.get("dst"); + Value srcValue = (Value) operands.get("src"); + + valueArr.add(srcValue); + + return new ArrayValue(valueArr, Type.array(Type.any())); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/AppendAll.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/AppendAll.java new file mode 100644 index 000000000..f9cdb61b4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/AppendAll.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class AppendAll extends PMLOperation { + public AppendAll() { + super( + "appendAll", + Type.array(Type.any()), + List.of("dst", "src"), + Map.of("dst", Type.array(Type.any()), "src", Type.array(Type.any())) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + List valueArr = (List) operands.get("dst"); + List srcValue = (List) operands.get("src"); + + valueArr.addAll(srcValue); + + return new ArrayValue(valueArr, Type.array(Type.any())); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Concat.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Concat.java new file mode 100644 index 000000000..c5c98be55 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Concat.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class Concat extends PMLOperation { + + private static final String ARR_ARG = "arr"; + + public Concat() { + super( + "concat", + Type.string(), + List.of(ARR_ARG), + Map.of("concat", Type.array(Type.string())) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + List arr = ((Value) operands.get(ARR_ARG)).getArrayValue(); + StringBuilder s = new StringBuilder(); + for (Value v : arr) { + s.append(v.getStringValue()); + } + + return new StringValue(s.toString()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Contains.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Contains.java new file mode 100644 index 000000000..43fbd333e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Contains.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class Contains extends PMLOperation { + + public Contains() { + super( + "contains", + Type.bool(), + List.of("arr", "element"), + Map.of("arr", Type.array(Type.any()), "element", Type.any()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + List valueArr = ((Value) operands.get("arr")).getArrayValue(); + Value element = (Value) operands.get("element"); + boolean contains = valueArr.contains(element); + return new BoolValue(contains); + } +} + diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/ContainsKey.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/ContainsKey.java new file mode 100644 index 000000000..e05c564b7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/ContainsKey.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class ContainsKey extends PMLOperation { + + public ContainsKey() { + super( + "containsKey", + Type.bool(), + List.of("map", "key"), + Map.of("map", Type.map(Type.any(), Type.any()), "key", Type.any()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Map valueMap = ((Value) operands.get("map")).getMapValue(); + Value element = (Value) operands.get("key"); + boolean contains = valueMap.containsKey(element); + return new BoolValue(contains); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Equals.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Equals.java new file mode 100644 index 000000000..0b0571128 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Equals.java @@ -0,0 +1,42 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + + +public class Equals extends PMLOperation { + + private static final String VALUE1 = "value1"; + private static final String VALUE2 = "value2"; + + public Equals() { + super( + "equals", + Type.bool(), + List.of(VALUE1, VALUE2), + Map.of(VALUE1, Type.any(), VALUE2, Type.any()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Value v1 = (Value) operands.get(VALUE1); + Value v2 = (Value) operands.get(VALUE2); + + return new BoolValue(v1.equals(v2)); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentAscendants.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentAscendants.java new file mode 100644 index 000000000..be9337728 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentAscendants.java @@ -0,0 +1,46 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class GetAdjacentAscendants extends PMLOperation { + + private static final Type returnType = Type.array(Type.string()); + + public GetAdjacentAscendants() { + super( + "getAdjacentAscendants", + returnType, + List.of("nodeName"), + Map.of("nodeName", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Value nodeName = (Value) operands.get("nodeName"); + + Collection ascendants = pap.query().graph().getAdjacentAscendants(nodeName.getStringValue()); + List ascValues = new ArrayList<>(ascendants.size()); + + ascendants.forEach(ascendant -> ascValues.add(new StringValue(ascendant))); + + return new ArrayValue(ascValues, returnType); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentDescendants.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentDescendants.java new file mode 100644 index 000000000..194864c58 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAdjacentDescendants.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class GetAdjacentDescendants extends PMLOperation { + + private static final Type returnType = Type.array(Type.string()); + + public GetAdjacentDescendants() { + super( + "getAdjacentDescendants", + Type.array(Type.any()), + List.of("nodeName"), + Map.of("nodeName", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Value nodeName = (Value) operands.get("nodeName"); + + Collection ascendants = pap.query().graph().getAdjacentDescendants(nodeName.getStringValue()); + List ascValues = new ArrayList<>(ascendants.size()); + + ascendants.forEach(ascendant -> ascValues.add(new StringValue(ascendant))); + + return new ArrayValue(ascValues, returnType); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithSource.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithSource.java new file mode 100644 index 000000000..eeecaadb4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithSource.java @@ -0,0 +1,46 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class GetAssociationsWithSource extends PMLOperation { + + private static final Type returnType = Type.array(Type.map(Type.string(), Type.any())); + + public GetAssociationsWithSource() { + super( + "getAssociationsWithSource", + returnType, + List.of("source"), + Map.of("source", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Value source = (Value) operands.get("source"); + Collection associations = pap.query().graph().getAssociationsWithSource(source.getStringValue()); + List associationValues = new ArrayList<>(associations.size()); + for (Association association : associations) { + associationValues.add(Value.fromObject(association)); + } + + return new ArrayValue(associationValues, returnType); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithTarget.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithTarget.java new file mode 100644 index 000000000..5a65c2e46 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetAssociationsWithTarget.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class GetAssociationsWithTarget extends PMLOperation { + + private static final Type returnType = Type.array(Type.map(Type.string(), Type.any())); + + public GetAssociationsWithTarget() { + super( + "getAssociationsWithTarget", + returnType, + List.of("target"), + Map.of("target", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Value source = (Value) operands.get("target"); + Collection associations = pap.query().graph().getAssociationsWithTarget(source.getStringValue()); + List associationValues = new ArrayList<>(associations.size()); + for (Association association : associations) { + associationValues.add(Value.fromObject(association)); + } + + return new ArrayValue(associationValues, returnType); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNode.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNode.java new file mode 100644 index 000000000..acae9b442 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNode.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + + +public class GetNode extends PMLOperation { + + private static final String NODE_ARG = "nodeName"; + + public GetNode() { + super( + "getNode", + Type.map(Type.string(), Type.any()), + List.of(NODE_ARG), + Map.of(NODE_ARG, Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Node node = pap.query().graph().getNode(((Value) operands.get(NODE_ARG)).getStringValue()); + + return Value.fromObject(node); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeProperties.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeProperties.java new file mode 100644 index 000000000..2395f6e9b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeProperties.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.MapValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class GetNodeProperties extends PMLOperation { + + private static final Type returnType = Type.map(Type.string(), Type.string()); + + + public GetNodeProperties() { + super( + "getNodeProperties", + returnType, + List.of("nodeName"), + Map.of("nodeName", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Node node = pap.query().graph().getNode(((Value) operands.get("nodeName")).getStringValue()); + Map properties = node.getProperties(); + Map propertiesValues = new HashMap<>(); + for (Map.Entry prop : properties.entrySet()) { + propertiesValues.put(new StringValue(prop.getKey()), new StringValue(properties.get(prop.getValue()))); + } + + return new MapValue(propertiesValues, Type.string(), Type.string()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeType.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeType.java new file mode 100644 index 000000000..19f1a6a9e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/GetNodeType.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class GetNodeType extends PMLOperation { + + public GetNodeType() { + super( + "getNodeType", + Type.string(), + List.of("nodeName"), + Map.of("nodeName", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Node node = pap.query().graph().getNode(((Value) operands.get("nodeName")).getStringValue()); + return new StringValue(node.getType().toString()); + } +} + diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyKey.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyKey.java new file mode 100644 index 000000000..10854e5b7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyKey.java @@ -0,0 +1,40 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + + +public class HasPropertyKey extends PMLOperation { + + public HasPropertyKey() { + super("hasPropertyKey", + Type.bool(), + List.of("nodeName", "key"), + Map.of("nodeName", Type.string(), "key", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + String nodeName = ((Value) operands.get("nodeName")).getStringValue(); + String key = ((Value) operands.get("key")).getStringValue(); + Node node = pap.query().graph().getNode(nodeName); + boolean hasPropertyKey = node.getProperties().containsKey(key); + return new BoolValue(hasPropertyKey); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyValue.java new file mode 100644 index 000000000..ed4ebc3b2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/HasPropertyValue.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + + +public class HasPropertyValue extends PMLOperation { + + public HasPropertyValue() { + super( + "hasPropertyValue", + Type.bool(), + List.of("nodeName", "key", "value"), + Map.of("nodeName", Type.string(), "key", Type.string(), "value", Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + String nodeName = ((Value) operands.get("nodeName")).getStringValue(); + String key = ((Value) operands.get("key")).getStringValue(); + String value = ((Value) operands.get("value")).getStringValue(); + Node node = pap.query().graph().getNode(nodeName); + boolean has = node.getProperties().containsKey(key); + if (!has) { + return new BoolValue(false); + } + + has = node.getProperties().get(key).equals(value); + return new BoolValue(has); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/NodeExists.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/NodeExists.java new file mode 100644 index 000000000..d4a03a67c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/NodeExists.java @@ -0,0 +1,38 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + + +public class NodeExists extends PMLOperation { + + private static final String NODE_ARG = "nodeName"; + + public NodeExists() { + super( + "nodeExists", + Type.bool(), + List.of(NODE_ARG), + Map.of(NODE_ARG, Type.string()) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + return new BoolValue(pap.query().graph().nodeExists(((Value) operands.get(NODE_ARG)).getStringValue())); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Search.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Search.java new file mode 100644 index 000000000..9a0cbca84 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/operation/builtin/Search.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.pml.executable.operation.builtin; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.*; + +public class Search extends PMLOperation { + public Search() { + super( + "search", + Type.array(Type.string()), + List.of("type", "properties"), + Map.of("type", Type.string(), "properties", Type.map(Type.string(), Type.string())) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + NodeType nodeType = NodeType.toNodeType(((Value) operands.get("type")).getStringValue()); + + Map propertiesValue = ((Value) operands.get("properties")).getMapValue(); + + Map properties = new HashMap<>(); + for (Map.Entry prop : propertiesValue.entrySet()) { + properties.put(prop.getKey().getStringValue(), prop.getValue().getStringValue()); + } + + Collection search = pap.query().graph().search(nodeType, properties); + + List ret = new ArrayList<>(search.size()); + for (String s : search) { + ret.add(new StringValue(s)); + } + + return new ArrayValue(ret, Type.array(Type.string())); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutine.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutine.java new file mode 100644 index 000000000..b5414a982 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutine.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pap.pml.executable.routine; + +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.List; +import java.util.Map; + +public abstract class PMLRoutine extends Routine { + + private Type returnType; + private Map operandTypes; + protected ExecutionContext ctx; + + public PMLRoutine(String name, Type returnType, List operandNames, Map operandTypes) { + super(name, operandNames); + + if (operandTypes.size() != operandNames.size()) { + throw new IllegalArgumentException("expected " + operandNames.size() + + " operand types but got " + operandTypes.size()); + } + + this.returnType = returnType; + this.operandTypes = operandTypes; + } + + public PMLRoutineSignature getSignature() { + return new PMLRoutineSignature( + getName(), + getReturnType(), + getOperandNames(), + getOperandTypes() + ); + } + + public Map getOperandTypes() { + return operandTypes; + } + + public Type getReturnType() { + return returnType; + } + + public ExecutionContext getCtx() { + if (ctx == null) { + throw new IllegalArgumentException("execution context has not been set"); + } + + return ctx; + } + + public void setCtx(ExecutionContext ctx) { + this.ctx = ctx; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineSignature.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineSignature.java new file mode 100644 index 000000000..0c6b19c29 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineSignature.java @@ -0,0 +1,28 @@ +package gov.nist.csd.pm.pap.pml.executable.routine; + +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.List; +import java.util.Map; + +public class PMLRoutineSignature extends PMLExecutableSignature { + public PMLRoutineSignature(String functionName, Type returnType, List operands, Map operandTypes) { + super(functionName, returnType, operands, operandTypes); + } + + @Override + public String toFormattedString(int indentLevel) { + String argsStr = serializeFormalArgs(); + + String indent = indent(indentLevel); + return String.format( + "%s%s %s(%s) %s", + indent, + "routine", + functionName, + argsStr, + returnType.isVoid() ? "" : returnType.toString() + " " + ); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapper.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapper.java new file mode 100644 index 000000000..31ba1f7f9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapper.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.pml.executable.routine; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PMLRoutineWrapper extends PMLRoutine { + + private Routine routine; + + public PMLRoutineWrapper(Routine routine) { + super( + routine.getName(), + Type.any(), + routine.getOperandNames(), + getTypesFromOperandNames(routine.getOperandNames()) + ); + + this.routine = routine; + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + Object o = routine.execute(pap, operands); + + return Value.fromObject(o); + } + + public static Map getTypesFromOperandNames(List operandNames) { + Map types = new HashMap<>(); + for (String operandName : operandNames) { + types.put(operandName, Type.any()); + } + + return types; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLStmtsRoutine.java b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLStmtsRoutine.java new file mode 100644 index 000000000..7f00c5900 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLStmtsRoutine.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.pml.executable.routine; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class PMLStmtsRoutine extends PMLRoutine implements PMLStatementSerializable { + private PMLStatementBlock statements; + + public PMLStmtsRoutine(String name, Type returnType, List operandNames, Map operandTypes, PMLStatementBlock statements) { + super(name, returnType, operandNames, operandTypes); + this.statements = statements; + } + + public PMLStatementBlock getStatements() { + return statements; + } + + public void setStatements(PMLStatementBlock statements) { + this.statements = statements; + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + ExecutionContext ctx = getCtx(); + + return ctx.executeRoutineStatements(statements.getStmts(), operands); + } + + + @Override + public String toFormattedString(int indentLevel) { + return String.format( + "%s%s", + getSignature().toFormattedString(indentLevel), + getStatements().toFormattedString(indentLevel) + ); + } + + @Override + public String toString() { + return toFormattedString(0); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof PMLStmtsRoutine that)) return false; + return Objects.equals(statements, that.statements); + } + + @Override + public int hashCode() { + return Objects.hashCode(statements); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpression.java new file mode 100644 index 000000000..6d13d6927 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpression.java @@ -0,0 +1,69 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class EqualsExpression extends Expression { + + public static Expression compileEqualsExpression(VisitorContext visitorCtx, PMLParser.EqualsExpressionContext equalsExpressionContext) { + Expression left = Expression.compile(visitorCtx, equalsExpressionContext.left, Type.any()); + Expression right = Expression.compile(visitorCtx, equalsExpressionContext.right, Type.any()); + + return new EqualsExpression(left, right, equalsExpressionContext.EQUALS() != null); + } + + private Expression left; + private Expression right; + private boolean isEquals; + + public EqualsExpression(Expression left, Expression right, boolean isEquals) { + this.left = left; + this.right = right; + this.isEquals = isEquals; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return Type.bool(); + } + + @Override + public String toFormattedString(int indentLevel) { + return left.toString() + + (isEquals ? " == " : " != ") + + right.toString(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Value leftValue = left.execute(ctx, pap); + Value rightValue = right.execute(ctx, pap); + + return new BoolValue(isEquals == (leftValue.equals(rightValue))); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + EqualsExpression that = (EqualsExpression) o; + return isEquals == that.isEquals && Objects.equals(left, that.left) && Objects.equals(right, that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right, isEquals); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/Expression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/Expression.java new file mode 100644 index 000000000..ff875eb83 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/Expression.java @@ -0,0 +1,121 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.pml.PMLErrorHandler; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.antlr.PMLLexer; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.literal.Literal; +import gov.nist.csd.pm.pap.pml.expression.reference.VariableReference; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + +public abstract class Expression implements PMLStatement { + + public static Expression fromString(VisitorContext visitorCtx, String input, Type expectedType) { + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + PMLParser.ExpressionContext exprCtx = parser.expression(); + + Expression expression = compile(visitorCtx, exprCtx, expectedType); + + if (!visitorCtx.errorLog().getErrors().isEmpty()) { + throw new PMLCompilationRuntimeException(pmlErrorHandler.getErrors()); + } + + return expression; + } + + public static Expression compile(VisitorContext visitorCtx, + PMLParser.ExpressionContext expressionCtx, + Type ... expectedTypes) { + Expression expression = null; + + if (expressionCtx instanceof PMLParser.VariableReferenceExpressionContext variableReferenceExpressionContext) { + expression = VariableReference.compileVariableReference(visitorCtx, variableReferenceExpressionContext.variableReference()); + + } else if (expressionCtx instanceof PMLParser.FunctionInvokeExpressionContext functionInvokeExpressionContext) { + expression = FunctionInvokeExpression.compileFunctionInvokeExpression(visitorCtx, functionInvokeExpressionContext); + + } else if (expressionCtx instanceof PMLParser.LiteralExpressionContext literalExpressionContext) { + expression = Literal.compileLiteral(visitorCtx, literalExpressionContext); + + } else if (expressionCtx instanceof PMLParser.NegateExpressionContext negatedExprContext) { + expression = NegatedExpression.compileNegatedExpression(visitorCtx, negatedExprContext); + + } else if (expressionCtx instanceof PMLParser.PlusExpressionContext plusExpressionsContext) { + expression = PlusExpression.compilePlusExpression(visitorCtx, plusExpressionsContext); + + } else if (expressionCtx instanceof PMLParser.EqualsExpressionContext equalsExpressionContext) { + expression = EqualsExpression.compileEqualsExpression(visitorCtx, equalsExpressionContext); + + } else if (expressionCtx instanceof PMLParser.LogicalExpressionContext logicalExpressionsContext) { + expression = LogicalExpression.compileLogicalExpression(visitorCtx, logicalExpressionsContext); + + } else if (expressionCtx instanceof PMLParser.ParenExpressionContext parenExpressionContext) { + expression = ParenExpression.compileParenExpression(visitorCtx, parenExpressionContext.expression()); + + } + + if (expression == null) { + throw new PMLCompilationRuntimeException(expressionCtx, "unrecognized expression context"); + } + + Type expressionType; + try { + expressionType = expression.getType(visitorCtx.scope()); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(expressionCtx,e.getMessage()); + } + + // check the expression type is part of the given allowed types + // if no types are given then any type is allowed + boolean ok = expectedTypes.length == 0; + for (Type expectedType : expectedTypes) { + if (expectedType.equals(expressionType)) { + ok = true; + break; + } + } + + if(!ok) { + throw new PMLCompilationRuntimeException(expressionCtx, "expected expression type(s) " + + Arrays.toString(expectedTypes) + ", got " + expressionType); + } + + return expression; + } + + public abstract Type getType(Scope scope) throws PMLScopeException; + + @Override + public final String toString() { + return toFormattedString(0); + } + + @Override + public abstract int hashCode(); + + @Override + public abstract boolean equals(Object obj); +} + diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpression.java new file mode 100644 index 000000000..99a182e14 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpression.java @@ -0,0 +1,206 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLExecutionException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationWrapper; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineWrapper; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.scope.UnknownFunctionInScopeException; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ReturnValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.*; + +public class FunctionInvokeExpression extends Expression { + + public static Expression compileFunctionInvokeExpression(VisitorContext visitorCtx, + PMLParser.FunctionInvokeExpressionContext functionInvokeExpressionContext) { + PMLParser.FunctionInvokeContext functionInvokeContext = functionInvokeExpressionContext.functionInvoke(); + return compileFunctionInvoke(visitorCtx, functionInvokeContext); + } + + public static Expression compileFunctionInvoke(VisitorContext visitorCtx, PMLParser.FunctionInvokeContext functionInvokeContext) { + String funcName = functionInvokeContext.ID().getText(); + + PMLExecutableSignature signature; + try { + signature = visitorCtx.scope().getFunction(funcName); + } catch (UnknownFunctionInScopeException e) { + throw new PMLCompilationRuntimeException(functionInvokeContext, e.getMessage()); + } + + List operandNames = signature.getOperands(); + Map operandTypes = signature.getOperandTypes(); + PMLParser.FunctionInvokeArgsContext funcCallArgsCtx = functionInvokeContext.functionInvokeArgs(); + List argExpressions = new ArrayList<>(); + PMLParser.ExpressionListContext expressionListContext = funcCallArgsCtx.expressionList(); + if (expressionListContext != null) { + argExpressions = expressionListContext.expression(); + } + + if (operandNames.size() != argExpressions.size()) { + throw new PMLCompilationRuntimeException( + functionInvokeContext, + "wrong number of args for signature call " + funcName + ": " + + "expected " + operandNames.size() + ", got " + argExpressions.size() + ); + } + + Map operands = new HashMap<>(); + for (int i = 0; i < operandNames.size(); i++) { + PMLParser.ExpressionContext exprCtx = argExpressions.get(i); + String operand = operandNames.get(i); + Type operandType = operandTypes.get(operand); + + Expression expr = Expression.compile(visitorCtx, exprCtx, operandType); + operands.put(operand, expr); + } + + return new FunctionInvokeExpression(signature, operands); + } + + private PMLExecutableSignature signature; + private List actualArgsList; + private Map operands; + + public FunctionInvokeExpression(PMLExecutableSignature signature, Map actualOperands) { + this.signature = signature; + this.actualArgsList = getActualArgsList(this.signature, actualOperands); + this.operands = new HashMap<>(actualOperands); + } + + public PMLExecutableSignature getSignature() { + return signature; + } + + public List getActualArgsList() { + return actualArgsList; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + String name = signature.getFunctionName(); + ExecutionContext funcInvokeCtx = ctx.copy(); + Map operandValues = prepareOperandExpressions(ctx, pap); + + // set the execution context if exec is a PML exec + AdminExecutable executable = funcInvokeCtx.scope().getFunction(name); + if (executable instanceof PMLRoutine pmlRoutine) { + pmlRoutine.setCtx(funcInvokeCtx); + } else if (executable instanceof PMLOperation pmlOperation) { + pmlOperation.setCtx(funcInvokeCtx); + } + + // PMLWrappers dont need Values, just objects + Map operands; + if ((executable instanceof PMLOperationWrapper) || (executable instanceof PMLRoutineWrapper)) { + operands = valuesMapToObjects(operandValues); + } else { + operands = new HashMap<>(operandValues); + } + + // execute the executable + Object o = pap.executeAdminExecutable(executable, operands); + + // return the value + Value value = Value.fromObject(o); + if (value instanceof ReturnValue returnValue) { + return returnValue.getValue(); + } else { + return value; + } + } + + private Map valuesMapToObjects(Map valuesMap) { + Map objectMap = new HashMap<>(); + for (Map.Entry entry : valuesMap.entrySet()) { + objectMap.put(entry.getKey(), entry.getValue().toObject()); + } + + return objectMap; + } + + private Map prepareOperandExpressions(ExecutionContext ctx, PAP pap) + throws PMException { + String funcName = signature.getFunctionName(); + List operandsNames = signature.getOperands(); + + if (operands.size() != operandsNames.size()) { + throw new PMLExecutionException("expected " + operandsNames.size() + " args for function \"" + + funcName + "\", got " + operands.size()); + } + + Map values = new HashMap<>(); + for (int i = 0; i < operandsNames.size(); i++) { + String operand = operandsNames.get(i); + Type operandType = signature.getOperandTypes().get(operand); + Expression operandExpr = operands.get(operand); + Value argValue = operandExpr.execute(ctx, pap); + + if (!argValue.getType().equals(operandType)) { + throw new PMLExecutionException("expected " + operandType + " for arg " + i + " for function \"" + + funcName + "\", got " + argValue.getType()); + } + + values.put(operand, argValue); + } + + return values; + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format("%s%s(%s)", indent(indentLevel), signature.getFunctionName(), argsToString()); + } + + private String argsToString() { + StringBuilder s = new StringBuilder(); + for (Expression arg : actualArgsList) { + if (s.length() > 0) { + s.append(", "); + } + s.append(arg); + } + + return s.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof FunctionInvokeExpression that)) return false; + return Objects.equals(signature, that.signature) && Objects.equals(actualArgsList, that.actualArgsList) && Objects.equals(operands, that.operands); + } + + @Override + public int hashCode() { + return Objects.hash(signature, actualArgsList, operands); + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return signature.getReturnType(); + } + + private List getActualArgsList(PMLExecutableSignature signature, Map args) { + List pmlOperandDefs = signature.getOperands(); + List actualArgs = new ArrayList<>(); + for (String operandDef : pmlOperandDefs) { + actualArgs.add(args.get(operandDef)); + } + + return actualArgs; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpression.java new file mode 100644 index 000000000..fbada3e59 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpression.java @@ -0,0 +1,81 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class LogicalExpression extends Expression { + + public static Expression compileLogicalExpression(VisitorContext visitorCtx, PMLParser.LogicalExpressionContext logicalExpressionsContext) { + Expression left = Expression.compile(visitorCtx, logicalExpressionsContext.left, Type.any()); + Expression right = Expression.compile(visitorCtx, logicalExpressionsContext.right, Type.any()); + + return new LogicalExpression(left, right, logicalExpressionsContext.LOGICAL_AND() != null); + } + + private Expression left; + private Expression right; + private boolean isAnd; + + public LogicalExpression(Expression left, Expression right, boolean isAnd) { + this.left = left; + this.right = right; + this.isAnd = isAnd; + } + + public Expression getLeft() { + return left; + } + + public Expression getRight() { + return right; + } + + public boolean isAnd() { + return isAnd; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return Type.bool(); + } + + @Override + public String toFormattedString(int indentLevel) { + return left.toString() + + (isAnd ? " && " : " || ") + + right.toString(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + boolean leftValue = left.execute(ctx, pap).getBooleanValue(); + boolean rightValue = right.execute(ctx, pap).getBooleanValue(); + + return new BoolValue(isAnd ? leftValue && rightValue : leftValue || rightValue); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LogicalExpression that = (LogicalExpression) o; + return isAnd == that.isAnd && Objects.equals(left, that.left) && Objects.equals(right, that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right, isAnd); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/NegatedExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/NegatedExpression.java new file mode 100644 index 000000000..733191c56 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/NegatedExpression.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ComplementedValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class NegatedExpression extends Expression { + + public static NegatedExpression compileNegatedExpression(VisitorContext visitorCtx, + PMLParser.NegateExpressionContext negateExpressionContext) { + Expression expression = Expression.compile(visitorCtx, negateExpressionContext.expression(), Type.any()); + + return new NegatedExpression(expression); + } + + private Expression expression; + + public NegatedExpression(Expression expression) { + this.expression = expression; + } + + public Expression getExpression() { + return expression; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return expression.getType(scope); + } + + @Override + public String toFormattedString(int indentLevel) { + return "!" + expression.toString(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return new ComplementedValue(expression.execute(ctx, pap)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + NegatedExpression that = (NegatedExpression) o; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hashCode(expression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/ParenExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/ParenExpression.java new file mode 100644 index 000000000..e1ce6f404 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/ParenExpression.java @@ -0,0 +1,61 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class ParenExpression extends Expression{ + + public static Expression compileParenExpression(VisitorContext visitorCtx, + PMLParser.ExpressionContext expressionCtx) { + return new ParenExpression(Expression.compile(visitorCtx, expressionCtx, Type.any())); + } + + private Expression expression; + + public ParenExpression(Expression expression) { + this.expression = expression; + } + + public Expression getExpression() { + return expression; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return expression.getType(scope); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format("(%s)", expression.toFormattedString(0)); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return expression.execute(ctx, pap); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ParenExpression that = (ParenExpression) o; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hashCode(expression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/PlusExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/PlusExpression.java new file mode 100644 index 000000000..611f2f1dd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/PlusExpression.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class PlusExpression extends Expression{ + + public static Expression compilePlusExpression(VisitorContext visitorCtx, PMLParser.PlusExpressionContext plusExpressionsContext) { + return new PlusExpression( + Expression.compile(visitorCtx, plusExpressionsContext.left, Type.string()), + Expression.compile(visitorCtx, plusExpressionsContext.right, Type.string()) + ); + } + + private Expression left; + private Expression right; + + public PlusExpression(Expression left, Expression right) { + this.left = left; + this.right = right; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return Type.string(); + } + + @Override + public String toFormattedString(int indentLevel) { + return left.toString() + " + " + right.toString(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + String leftValue = left.execute(ctx, pap).getStringValue(); + String rightValue = right.execute(ctx, pap).getStringValue(); + + return new StringValue(leftValue + rightValue); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + PlusExpression that = (PlusExpression) o; + return Objects.equals(left, that.left) && Objects.equals(right, that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteral.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteral.java new file mode 100644 index 000000000..1700727c5 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteral.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.*; + +public class ArrayLiteral extends Literal { + + private final List array; + private final Type type; + + public ArrayLiteral(Expression[] array, Type elementType) { + this.array = Arrays.asList(array); + this.type = Type.array(elementType); + } + + public ArrayLiteral(List array, Type elementType) { + this.array = array; + this.type = Type.array(elementType); + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return type; + } + + public void add(Expression expression) { + this.array.add(expression); + } + + public Expression[] getArray() { + return this.array.toArray(new Expression[]{}); + } + + public List getList() { + return this.array; + } + + public Type getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ArrayLiteral that = (ArrayLiteral) o; + return Objects.equals(array, that.array) + && Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(array, type); + } + + @Override + public String toFormattedString(int indentLevel) { + StringBuilder s = new StringBuilder(); + for (Expression expression : array) { + if (s.length() > 0) { + s.append(", "); + } + + s.append(expression.toString()); + } + return String.format("[%s]", s); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + List values = new ArrayList<>(); + for (Expression expr : array) { + values.add(expr.execute(ctx, pap)); + } + + return new ArrayValue(values, type.getArrayElementType()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteral.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteral.java new file mode 100644 index 000000000..475a709e0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteral.java @@ -0,0 +1,61 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class BoolLiteral extends Literal { + + private boolean value; + + public BoolLiteral(boolean value) { + this.value = value; + } + + public boolean isValue() { + return value; + } + + public void setValue(boolean value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BoolLiteral that = (BoolLiteral) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toFormattedString(int indentLevel) { + return value ? "true" : "false"; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return Type.bool(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return new BoolValue(value); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/Literal.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/Literal.java new file mode 100644 index 000000000..1db6aba2b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/Literal.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; + +public abstract class Literal extends Expression { + + public static Expression compileLiteral(VisitorContext visitorCtx, PMLParser.LiteralExpressionContext literalExpressionContext) { + return new LiteralVisitor(visitorCtx) + .visitLiteralExpression(literalExpressionContext); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitor.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitor.java new file mode 100644 index 000000000..ad460c0f1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitor.java @@ -0,0 +1,134 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.visitor.PMLBaseVisitor; + +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LiteralVisitor extends PMLBaseVisitor { + + public LiteralVisitor(VisitorContext visitorCtx) { + super(visitorCtx); + } + + @Override + public StringLiteral visitStringLiteral(PMLParser.StringLiteralContext ctx) { + return visitStringLit(ctx.stringLit()); + } + + @Override + public StringLiteral visitStringLit(PMLParser.StringLitContext ctx) { + return new StringLiteral(removeQuotes(ctx.DOUBLE_QUOTE_STRING().toString())); + } + + @Override + public BoolLiteral visitBoolLiteral(PMLParser.BoolLiteralContext ctx) { + return new BoolLiteral(ctx.boolLit().TRUE() != null); + } + + @Override + public Expression visitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { + PMLParser.ArrayLitContext arrayCtx = ctx.arrayLit(); + + PMLParser.ExpressionListContext expressionListContext = arrayCtx.expressionList(); + if (expressionListContext == null) { + return new ArrayLiteral(new ArrayList<>(), Type.any()); + } + + // set the element type to any if the list is empty + // element type being null is used in the following for loop to determine type dynamically + Type elementType = null; + if (expressionListContext.isEmpty()) { + elementType = Type.any(); + } + + // determine the type of the array literal elements + // if all the elements are of the same type then that is the element type + // if the elements are of different types then the type is ANY + List exprs = new ArrayList<>(); + for (PMLParser.ExpressionContext expressionCtx : expressionListContext.expression()) { + Expression expr = Expression.compile(visitorCtx, expressionCtx, Type.any()); + Type type; + try { + type = expr.getType(visitorCtx.scope()); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(expressionCtx, e.getMessage()); + } + + if (elementType == null) { + elementType = type; + } else if (!type.equals(elementType)) { + elementType = Type.any(); + } + + exprs.add(expr); + } + + return new ArrayLiteral(new ArrayList<>(exprs), elementType); + } + + @Override + public Expression visitMapLiteral(PMLParser.MapLiteralContext ctx) { + Map map = new HashMap<>(); + + Type keyType = null; + Type valueType = null; + + for(PMLParser.ElementContext elementCtx : ctx.mapLit().element()) { + Expression keyExpr = Expression.compile(visitorCtx, elementCtx.key, Type.any()); + Expression valueExpr = Expression.compile(visitorCtx, elementCtx.value, Type.any()); + + Type keyExprType; + Type valueExprType; + try { + keyExprType = keyExpr.getType(visitorCtx.scope()); + valueExprType = valueExpr.getType(visitorCtx.scope()); + } catch (PMLScopeException e) { + throw new PMLCompilationRuntimeException(elementCtx, e.getMessage()); + } + + // check that all map keys are the same type + if (keyType == null) { + keyType = keyExprType; + } else if (!keyExprType.equals(keyType)) { + keyType = Type.any(); + } + + // if map values are different types then the value type for this map is ANY + if (valueType == null) { + valueType = valueExprType; + } else if (!valueExprType.equals(valueType)) { + valueType = Type.any(); + } + + map.put(keyExpr, valueExpr); + } + + if (keyType == null) { + keyType = Type.any(); + } + + if (valueType == null) { + valueType = Type.any(); + } + + return new MapLiteral(map, keyType, valueType); + } + + public static String removeQuotes(String s) { + if (s.startsWith("\"") && s.endsWith("\"")) { + return s.substring(1, s.length() - 1); + } else { + return s; + } + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteral.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteral.java new file mode 100644 index 000000000..5853198ca --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteral.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.MapValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class MapLiteral extends Literal { + + private final Map map; + private final Type type; + + public MapLiteral(Map map, Type keyType, Type valueType) { + this.map = map; + this.type = Type.map(keyType, valueType); + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return type; + } + + public void put(Expression key, Expression value){ + this.map.put(key, value); + } + + public Map getMap() { + return map; + } + + public Type getType() { + return type; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MapLiteral that = (MapLiteral) o; + return Objects.equals(this.map, that.map) + && Objects.equals(type, that.type); + } + + @Override + public int hashCode() { + return map.hashCode(); + } + + @Override + public String toFormattedString(int indentLevel) { + StringBuilder s = new StringBuilder(); + for (Expression k : map.keySet()) { + if (s.length() > 0) { + s.append(", "); + } + + s.append(k.toString()).append(": ").append(map.get(k)); + } + + return String.format("{%s}", s); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Map values = new HashMap<>(); + + for (Expression keyExpr : map.keySet()) { + Expression valueExpr = map.get(keyExpr); + + Value key = keyExpr.execute(ctx, pap); + Value value = valueExpr.execute(ctx, pap); + + values.put(key, value); + } + + return new MapValue(values, type.getMapKeyType(), type.getMapValueType()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteral.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteral.java new file mode 100644 index 000000000..4d6add857 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteral.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class StringLiteral extends Literal{ + + private String value; + + public StringLiteral(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return Type.string(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return new StringValue(value); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + StringLiteral that = (StringLiteral) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format("\"%s\"", value); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndex.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndex.java new file mode 100644 index 000000000..f5d13edd2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndex.java @@ -0,0 +1,60 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Map; +import java.util.Objects; + +public class ReferenceByBracketIndex extends ReferenceByIndex{ + + private VariableReference varRef; + private Expression index; + + public ReferenceByBracketIndex(VariableReference varRef, Expression index) { + this.varRef = varRef; + this.index = index; + } + + @Override + public String toFormattedString(int indentLevel) { + return varRef + "." + index; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return varRef.getType(scope).getMapValueType(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ReferenceByBracketIndex that)) return false; + return Objects.equals(varRef, that.varRef) && Objects.equals(index, that.index); + } + + @Override + public int hashCode() { + return Objects.hash(varRef, index); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Value indexValue = index.execute(ctx, pap); + Value value = varRef.execute(ctx, pap); + if (!value.getType().isMap()) { + return value; + } + + Map mapValue = value.getMapValue(); + return mapValue.get(indexValue); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndex.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndex.java new file mode 100644 index 000000000..bb6054613 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndex.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Map; +import java.util.Objects; + +public class ReferenceByDotIndex extends ReferenceByIndex{ + + private VariableReference varRef; + private String index; + + public ReferenceByDotIndex(VariableReference varRef, String index) { + this.varRef = varRef; + this.index = index; + } + + @Override + public String toFormattedString(int indentLevel) { + return varRef + "." + index; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return varRef.getType(scope).getMapValueType(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Value value = varRef.execute(ctx, pap); + if (!value.getType().isMap()) { + return value; + } + + Map mapValue = value.getMapValue(); + + StringValue indexValue = new StringValue(index); + if (!mapValue.containsKey(indexValue)) { + throw new NullPointerException("map index " + index + " does not exist"); + } else { + return mapValue.get(indexValue); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ReferenceByDotIndex that)) return false; + return Objects.equals(varRef, that.varRef) && Objects.equals(index, that.index); + } + + @Override + public int hashCode() { + return Objects.hash(varRef, index); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByID.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByID.java new file mode 100644 index 000000000..221d8df73 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByID.java @@ -0,0 +1,60 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.exception.PMLExecutionException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.scope.UnknownVariableInScopeException; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Objects; + +public class ReferenceByID extends VariableReference{ + + private final String id; + + public ReferenceByID(String id) { + this.id = id; + } + + @Override + public Type getType(Scope scope) throws PMLScopeException { + return scope.getVariable(id).type(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReferenceByID that = (ReferenceByID) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + @Override + public String toFormattedString(int indentLevel) { + return id; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + try { + return ctx.scope().getVariable(id); + } catch (UnknownVariableInScopeException e) { + throw new PMLExecutionException(e); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIndex.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIndex.java new file mode 100644 index 000000000..2c9417ffa --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIndex.java @@ -0,0 +1,8 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; + +import java.util.Map; + +public abstract class ReferenceByIndex extends VariableReference{ +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReference.java b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReference.java new file mode 100644 index 000000000..987a799fb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReference.java @@ -0,0 +1,76 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; + +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.UnknownVariableInScopeException; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Map; + +public abstract class VariableReference extends Expression { + + public static VariableReference compileVariableReference(VisitorContext visitorCtx, PMLParser.VariableReferenceContext ctx) { + if (ctx instanceof PMLParser.ReferenceByIDContext referenceByIDContext) { + return visitReferenceByID(visitorCtx, referenceByIDContext); + } else if (ctx instanceof PMLParser.ReferenceByIndexContext referenceByIndexContext) { + return visitReferenceByIndex(visitorCtx, referenceByIndexContext); + } else { + throw new PMLCompilationRuntimeException(ctx, "invalid variable reference"); + } + } + + private static ReferenceByID visitReferenceByID(VisitorContext visitorCtx, PMLParser.ReferenceByIDContext ctx) { + String name = ctx.ID().getText(); + + // check variable name is in scope + try { + visitorCtx.scope().getVariable(name); + } catch (UnknownVariableInScopeException e) { + throw new PMLCompilationRuntimeException(ctx, e.getMessage()); + } + + return new ReferenceByID(name); + } + + private static ReferenceByIndex visitReferenceByIndex(VisitorContext visitorCtx, PMLParser.ReferenceByIndexContext ctx) { + VariableReference mapVarRef = compileVariableReference(visitorCtx, ctx.variableReference()); + + // check that the varref is a map + Type t; + try { + t = mapVarRef.getType(visitorCtx.scope()); + } catch (PMLScopeException ex) { + throw new PMLCompilationRuntimeException(ctx, ex.getMessage()); + } + + if (!t.isMap()) { + throw new PMLCompilationRuntimeException(ctx, "expected type map but got " + t); + } + + Type allowedKeyType = t.getMapKeyType(); + + return visitIndex(visitorCtx, ctx.index(), mapVarRef, allowedKeyType); + } + + private static ReferenceByIndex visitIndex(VisitorContext visitorCtx, PMLParser.IndexContext indexCtx, + VariableReference varRef, Type allowedKeyType) { + if (indexCtx instanceof PMLParser.BracketIndexContext bracketIndexContext) { + return new ReferenceByBracketIndex( + varRef, + Expression.compile(visitorCtx, bracketIndexContext.expression(), allowedKeyType) + ); + + } else if (indexCtx instanceof PMLParser.DotIndexContext dotIndexContext) { + String id = dotIndexContext.key.ID().getText(); + return new ReferenceByDotIndex(varRef, id); + + } + + throw new PMLCompilationRuntimeException(indexCtx, "invalid index"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/OperationPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/OperationPattern.java new file mode 100644 index 000000000..768b411ce --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/OperationPattern.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pap.pml.pattern; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class OperationPattern extends Pattern { + + private final String value; + private final boolean isAny; + + public OperationPattern(String value) { + this.value = value; + this.isAny = false; + } + + public OperationPattern() { + this.isAny = true; + this.value = null; + } + + public String getValue() { + return value; + } + + public boolean isAny() { + return isAny; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return isAny || value.equals(this.value); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(false); + } + + @Override + public String toFormattedString(int indentLevel) { + return isAny ? "any operation" : value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof OperationPattern that)) return false; + return isAny == that.isAny && Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value, isAny); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/Pattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/Pattern.java new file mode 100644 index 000000000..0b5b3a68d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/Pattern.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.store.GraphStore; + +import java.io.Serializable; +import java.util.Collection; + +public abstract class Pattern implements Serializable, PMLStatementSerializable { + + public abstract boolean matches(String value, PAP pap) throws PMException; + public abstract ReferencedNodes getReferencedNodes(); + + @Override + public abstract boolean equals(Object obj); + + @Override + public abstract int hashCode(); + + @Override + public final String toString() { + return toFormattedString(0); + } + + public boolean matches(Collection value, PAP pap) throws PMException { + for (String s : value) { + if (matches(s, pap)) { + return true; + } + } + + return false; + } + + public void checkReferencedNodesExist(GraphStore graph) throws PMException { + ReferencedNodes ref = getReferencedNodes(); + for (String entity : ref.nodes()) { + if (!graph.nodeExists(entity)) { + throw new NodeDoesNotExistException(entity); + } + } + } + + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/ReferencedNodes.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/ReferencedNodes.java new file mode 100644 index 000000000..8462a15a0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/ReferencedNodes.java @@ -0,0 +1,27 @@ +package gov.nist.csd.pm.pap.pml.pattern; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +public record ReferencedNodes(Set nodes, boolean isAny) { + + public ReferencedNodes(boolean isAny) { + this(new HashSet<>(), isAny); + } + + public void addNodes(Collection entity) { + nodes.addAll(entity); + } + + public void addNode(String entity) { + nodes.add(entity); + } + + public ReferencedNodes combine(ReferencedNodes other) { + Set combined = new HashSet<>(this.nodes); + combined.addAll(other.nodes); + + return new ReferencedNodes(combined, other.isAny || this.isAny); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/AnyOperandPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/AnyOperandPattern.java new file mode 100644 index 000000000..b5e087322 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/AnyOperandPattern.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Collection; + +public class AnyOperandPattern extends OperandPatternExpression { + @Override + public boolean matches(String value, PAP pap) throws PMException { + return true; + } + + @Override + public boolean matches(Collection value, PAP pap) throws PMException { + return true; + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(true); + } + + @Override + public String toFormattedString(int indentLevel) { + return "any"; + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof AnyOperandPattern; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/InOperandPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/InOperandPattern.java new file mode 100644 index 000000000..ad6d43625 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/InOperandPattern.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.value.StringValue; + +import java.util.Objects; +import java.util.Set; + +public class InOperandPattern extends OperandPatternExpression { + + private String container; + + public InOperandPattern(StringLiteral container) { + this.container = container.getValue(); + } + + + public InOperandPattern(String container) { + this.container = container; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return pap.query().graph().isAscendant(value, container); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(Set.of(container), false); + } + + @Override + public String toFormattedString(int indentLevel) { + return "in " + new StringValue(container); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof InOperandPattern that)) return false; + return Objects.equals(container, that.container); + } + + @Override + public int hashCode() { + return Objects.hashCode(container); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/LogicalOperandPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/LogicalOperandPatternExpression.java new file mode 100644 index 000000000..41554678d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/LogicalOperandPatternExpression.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class LogicalOperandPatternExpression extends OperandPatternExpression { + + private Pattern left; + private Pattern right; + private boolean isAnd; + + public LogicalOperandPatternExpression(Pattern left, Pattern right, boolean isAnd) { + this.left = left; + this.right = right; + this.isAnd = isAnd; + } + + public Pattern getLeft() { + return left; + } + + public Pattern getRight() { + return right; + } + + public boolean isAnd() { + return isAnd; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return isAnd ? left.matches(value, pap) && right.matches(value, pap) + : left.matches(value, pap) || right.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return left.getReferencedNodes().combine(right.getReferencedNodes()); + } + + @Override + public String toFormattedString(int indentLevel) { + return left.toFormattedString(indentLevel) + + (isAnd ? " && " : " || ") + + right.toFormattedString(indentLevel); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LogicalOperandPatternExpression that)) return false; + return isAnd == that.isAnd && Objects.equals(left, that.left) && Objects.equals(right, that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right, isAnd); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NegateOperandPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NegateOperandPatternExpression.java new file mode 100644 index 000000000..510b327b5 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NegateOperandPatternExpression.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class NegateOperandPatternExpression extends OperandPatternExpression { + + private Pattern operandPatternExpression; + + public NegateOperandPatternExpression(Pattern operandPatternExpression) { + this.operandPatternExpression = operandPatternExpression; + } + + public Pattern getOperandPatternExpression() { + return operandPatternExpression; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return !operandPatternExpression.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return operandPatternExpression.getReferencedNodes(); + } + + @Override + public String toFormattedString(int indentLevel) { + return "!" + operandPatternExpression.toFormattedString(indentLevel); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof NegateOperandPatternExpression that)) return false; + return Objects.equals(operandPatternExpression, that.operandPatternExpression); + } + + @Override + public int hashCode() { + return Objects.hashCode(operandPatternExpression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NodeOperandPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NodeOperandPattern.java new file mode 100644 index 000000000..391d7eb52 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/NodeOperandPattern.java @@ -0,0 +1,50 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.value.StringValue; + +import java.util.Objects; +import java.util.Set; + +public class NodeOperandPattern extends OperandPatternExpression { + + private String node; + + public NodeOperandPattern(StringLiteral node) { + this.node = node.getValue(); + } + + public NodeOperandPattern(String node) { + this.node = node; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return value.equals(node); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(Set.of(node), false); + } + + @Override + public String toFormattedString(int indentLevel) { + return new StringValue(node).toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof NodeOperandPattern that)) return false; + return Objects.equals(node, that.node); + } + + @Override + public int hashCode() { + return Objects.hashCode(node); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternExpression.java new file mode 100644 index 000000000..5c0d7d122 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternExpression.java @@ -0,0 +1,6 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.pml.pattern.Pattern; + +public abstract class OperandPatternExpression extends Pattern { +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/ParenOperandPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/ParenOperandPatternExpression.java new file mode 100644 index 000000000..ca27b18d8 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/operand/ParenOperandPatternExpression.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class ParenOperandPatternExpression extends OperandPatternExpression { + + private Pattern expression; + + public ParenOperandPatternExpression(Pattern expression) { + this.expression = expression; + } + + public Pattern getExpression() { + return expression; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return expression.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return expression.getReferencedNodes(); + } + + @Override + public String toFormattedString(int indentLevel) { + return "(" + expression.toFormattedString(indentLevel) + ")"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ParenOperandPatternExpression that)) return false; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hashCode(expression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/InSubjectPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/InSubjectPattern.java new file mode 100644 index 000000000..4966b2beb --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/InSubjectPattern.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.value.StringValue; + +import java.util.Objects; +import java.util.Set; + +public class InSubjectPattern extends SubjectPatternExpression { + + private String container; + + public InSubjectPattern(StringLiteral container) { + this.container = container.getValue(); + } + + + public InSubjectPattern(String container) { + this.container = container; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return pap.query().graph().isAscendant(value, container); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(Set.of(container), false); + } + + @Override + public String toFormattedString(int indentLevel) { + return "in " + new StringValue(container); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof InSubjectPattern that)) return false; + return Objects.equals(container, that.container); + } + + @Override + public int hashCode() { + return Objects.hashCode(container); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/LogicalSubjectPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/LogicalSubjectPatternExpression.java new file mode 100644 index 000000000..14eac9a78 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/LogicalSubjectPatternExpression.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class LogicalSubjectPatternExpression extends SubjectPatternExpression { + + private Pattern left; + private Pattern right; + private boolean isAnd; + + public LogicalSubjectPatternExpression(Pattern left, Pattern right, boolean isAnd) { + this.left = left; + this.right = right; + this.isAnd = isAnd; + } + + public Pattern getLeft() { + return left; + } + + public Pattern getRight() { + return right; + } + + public boolean isAnd() { + return isAnd; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return isAnd ? left.matches(value, pap) && right.matches(value, pap) + : left.matches(value, pap) || right.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return left.getReferencedNodes().combine(right.getReferencedNodes()); + } + + @Override + public String toFormattedString(int indentLevel) { + return left.toFormattedString(indentLevel) + + (isAnd ? " && " : " || ") + + right.toFormattedString(indentLevel); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LogicalSubjectPatternExpression that)) return false; + return isAnd == that.isAnd && Objects.equals(left, that.left) && Objects.equals(right, that.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, right, isAnd); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/NegateSubjectPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/NegateSubjectPatternExpression.java new file mode 100644 index 000000000..fb42208b6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/NegateSubjectPatternExpression.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class NegateSubjectPatternExpression extends SubjectPatternExpression { + + private Pattern subjectPatternExpression; + + public NegateSubjectPatternExpression(Pattern subjectPatternExpression) { + this.subjectPatternExpression = subjectPatternExpression; + } + + public Pattern getSubjectPatternExpression() { + return subjectPatternExpression; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return !subjectPatternExpression.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return subjectPatternExpression.getReferencedNodes(); + } + + @Override + public String toFormattedString(int indentLevel) { + return "!" + subjectPatternExpression.toFormattedString(indentLevel); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof NegateSubjectPatternExpression that)) return false; + return Objects.equals(subjectPatternExpression, that.subjectPatternExpression); + } + + @Override + public int hashCode() { + return Objects.hashCode(subjectPatternExpression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ParenSubjectPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ParenSubjectPatternExpression.java new file mode 100644 index 000000000..447e90353 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ParenSubjectPatternExpression.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class ParenSubjectPatternExpression extends SubjectPatternExpression { + + private Pattern expression; + + public ParenSubjectPatternExpression(Pattern expression) { + this.expression = expression; + } + + public Pattern getExpression() { + return expression; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return expression.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return expression.getReferencedNodes(); + } + + @Override + public String toFormattedString(int indentLevel) { + return "(" + expression.toFormattedString(indentLevel) + ")"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ParenSubjectPatternExpression that)) return false; + return Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hashCode(expression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ProcessSubjectPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ProcessSubjectPattern.java new file mode 100644 index 000000000..576286287 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/ProcessSubjectPattern.java @@ -0,0 +1,49 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.value.StringValue; + +import java.util.Objects; + +public class ProcessSubjectPattern extends SubjectPatternExpression { + + private String process; + + public ProcessSubjectPattern(StringLiteral process) { + this.process = process.getValue(); + } + + public ProcessSubjectPattern(String process) { + this.process = process; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return value.equals(process); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(false); + } + + @Override + public String toFormattedString(int indentLevel) { + return "process " + new StringValue(process); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ProcessSubjectPattern that)) return false; + return Objects.equals(process, that.process); + } + + @Override + public int hashCode() { + return Objects.hashCode(process); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPattern.java new file mode 100644 index 000000000..8dfd28fee --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPattern.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; + +import java.util.Objects; + +public class SubjectPattern extends Pattern { + + private final boolean isAny; + private final SubjectPatternExpression subjectPatternExpression; + + public SubjectPattern() { + this.isAny = true; + this.subjectPatternExpression = null; + } + + public SubjectPattern(SubjectPatternExpression subjectPatternExpression) { + this.isAny = false; + this.subjectPatternExpression = subjectPatternExpression; + } + + public boolean isAny() { + return isAny; + } + + public SubjectPatternExpression getSubjectPatternExpression() { + return subjectPatternExpression; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return isAny || subjectPatternExpression.matches(value, pap); + } + + @Override + public ReferencedNodes getReferencedNodes() { + if (isAny) { + return new ReferencedNodes(true); + } + + return subjectPatternExpression.getReferencedNodes(); + } + + @Override + public String toFormattedString(int indentLevel) { + return isAny ? "any user" : "user " + subjectPatternExpression.toFormattedString(indentLevel); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SubjectPattern that)) return false; + return isAny == that.isAny && Objects.equals(subjectPatternExpression, that.subjectPatternExpression); + } + + @Override + public int hashCode() { + return Objects.hash(isAny, subjectPatternExpression); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternExpression.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternExpression.java new file mode 100644 index 000000000..a8db1b0fe --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternExpression.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.pml.pattern.Pattern; + +public abstract class SubjectPatternExpression extends Pattern { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/UsernamePattern.java b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/UsernamePattern.java new file mode 100644 index 000000000..7ac3e8535 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/pattern/subject/UsernamePattern.java @@ -0,0 +1,50 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.pattern.ReferencedNodes; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.value.StringValue; + +import java.util.Objects; +import java.util.Set; + +public class UsernamePattern extends SubjectPatternExpression { + + private String user; + + public UsernamePattern(StringLiteral user) { + this.user = user.getValue(); + } + + public UsernamePattern(String user) { + this.user = user; + } + + @Override + public boolean matches(String value, PAP pap) throws PMException { + return value.equals(user); + } + + @Override + public ReferencedNodes getReferencedNodes() { + return new ReferencedNodes(Set.of(user), false); + } + + @Override + public String toFormattedString(int indentLevel) { + return new StringValue(user).toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof UsernamePattern that)) return false; + return Objects.equals(user, that.user); + } + + @Override + public int hashCode() { + return Objects.hashCode(user); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/CompileGlobalScope.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/CompileGlobalScope.java new file mode 100644 index 000000000..bb9738839 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/CompileGlobalScope.java @@ -0,0 +1,41 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.HashMap; +import java.util.Map; + +import static gov.nist.csd.pm.pap.admin.AdminPolicyNode.*; +import static gov.nist.csd.pm.pap.pml.executable.operation.PMLBuiltinOperations.builtinFunctions; + +public class CompileGlobalScope extends GlobalScope { + + public CompileGlobalScope() { + loadBuiltinConstantsAndFunctions(); + } + + public CompileGlobalScope(Map constants, Map functions) { + super(constants, functions); + + loadBuiltinConstantsAndFunctions(); + } + + private void loadBuiltinConstantsAndFunctions() { + Map builtinConstants = new HashMap<>(); + + // admin policy nodes constants + builtinConstants.put(ADMIN_POLICY.constantName(), new Variable(ADMIN_POLICY.constantName(), Type.string(), true)); + builtinConstants.put(ADMIN_POLICY_OBJECT.constantName(), new Variable(ADMIN_POLICY_OBJECT.constantName(), Type.string(), true)); + + // add builtin operations + addConstants(builtinConstants); + + Map funcs = builtinFunctions(); + for (Map.Entry func : funcs.entrySet()) { + addExecutable(func.getKey(), func.getValue().getSignature()); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/ExecuteGlobalScope.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/ExecuteGlobalScope.java new file mode 100644 index 000000000..1092287d0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/ExecuteGlobalScope.java @@ -0,0 +1,74 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLBuiltinOperations; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationWrapper; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineWrapper; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLStmtsRoutine; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import static gov.nist.csd.pm.pap.admin.AdminPolicyNode.*; + +public class ExecuteGlobalScope extends GlobalScope> { + + private ExecuteGlobalScope() { + // buitin variables + Map builtinConstants = new HashMap<>(); + + builtinConstants.put(ADMIN_POLICY.constantName(), new StringValue(ADMIN_POLICY.nodeName())); + builtinConstants.put(ADMIN_POLICY_OBJECT.constantName(), new StringValue(ADMIN_POLICY_OBJECT.nodeName())); + + addConstants(builtinConstants); + + // add builtin operations + Map funcs = PMLBuiltinOperations.builtinFunctions(); + for (Map.Entry entry : funcs.entrySet()) { + addExecutable(entry.getKey(), entry.getValue()); + } + } + + public ExecuteGlobalScope(PAP pap) throws PMException { + this(); + + Map pmlConstants = pap.getPMLConstants(); + addConstants(pmlConstants); + + Map operations = pap.getPMLOperations(); + addExecutables(new HashMap<>(operations)); + + Map routines = pap.getPMLRoutines(); + addExecutables(new HashMap<>(routines)); + + Collection opNames = pap.query().operations().getAdminOperationNames(); + for (String opName : opNames) { + Operation operation = pap.query().operations().getAdminOperation(opName); + if (operation instanceof PMLStmtsOperation pmlStmtsOperation) { + addExecutable(opName, pmlStmtsOperation); + } else { + addExecutable(opName, new PMLOperationWrapper(operation)); + } + } + + Collection routineNames = pap.query().routines().getAdminRoutineNames(); + for (String routineName : routineNames) { + Routine routine = pap.query().routines().getAdminRoutine(routineName); + if (routine instanceof PMLStmtsRoutine pmlStmtsRoutine) { + addExecutable(routineName, pmlStmtsRoutine); + } else { + addExecutable(routineName, new PMLRoutineWrapper(routine)); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/FunctionAlreadyDefinedInScopeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/FunctionAlreadyDefinedInScopeException.java similarity index 83% rename from src/main/java/gov/nist/csd/pm/policy/pml/model/scope/FunctionAlreadyDefinedInScopeException.java rename to src/main/java/gov/nist/csd/pm/pap/pml/scope/FunctionAlreadyDefinedInScopeException.java index 84ec16983..daf82e797 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/FunctionAlreadyDefinedInScopeException.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/FunctionAlreadyDefinedInScopeException.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.pml.model.scope; +package gov.nist.csd.pm.pap.pml.scope; public class FunctionAlreadyDefinedInScopeException extends PMLScopeException { diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/GlobalScope.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/GlobalScope.java new file mode 100644 index 000000000..3aa807599 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/GlobalScope.java @@ -0,0 +1,67 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public abstract class GlobalScope implements Serializable { + + private Map constants; + private Map executables; + + protected GlobalScope() { + constants = new HashMap<>(); + executables = new HashMap<>(); + } + + public GlobalScope(Map constants, Map executables) { + this.constants = constants; + this.executables = executables; + } + + public void addConstant(String key, V value) { + this.constants.put(key, value); + } + + public void addExecutable(String name, F operation) { + this.executables.put(name, operation); + } + + public V getConstant(String varName) { + return constants.get(varName); + } + + public F getExecutable(String funcName) { + return executables.get(funcName); + } + + public Map getExecutables() { + return executables; + } + + public Map getConstants() { + return constants; + } + + public void addExecutables(Map funcs) { + executables.putAll(funcs); + } + + public void addConstants(Map c) { + constants.putAll(c); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GlobalScope that = (GlobalScope) o; + return Objects.equals(constants, that.constants) && Objects.equals(executables, that.executables); + } + + @Override + public int hashCode() { + return Objects.hash(constants, executables); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/LocalScope.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/LocalScope.java new file mode 100644 index 000000000..d322b096e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/LocalScope.java @@ -0,0 +1,101 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class LocalScope implements Serializable { + + private final Map variables; + + private final LocalScope parentScope; + + public LocalScope() { + variables = new HashMap<>(); + parentScope = null; + } + + public LocalScope(LocalScope parentScope) { + variables = new HashMap<>(); + this.parentScope = parentScope; + } + + public LocalScope copy() { + LocalScope copy = new LocalScope<>(this); + copy.variables.putAll(variables); + + return copy; + } + + public void clearVariables() { + variables.clear(); + } + + public LocalScope parentScope() { + return parentScope; + } + + public Map getVariables() { + Map variables = new HashMap<>(); + + if (parentScope != null) { + variables.putAll(this.parentScope.variables); + } + + variables.putAll(this.variables); + + return variables; + } + + public V getVariable(String name) { + if (variables.containsKey(name)) { + return variables.get(name); + } else if (parentScope != null) { + return parentScope.getVariable(name); + } + + return null; + } + + public void addVariable(String name, V v) throws VariableAlreadyDefinedInScopeException { + if ((parentScope != null && parentScope.variables.containsKey(name)) || + variables.containsKey(name)) { + throw new VariableAlreadyDefinedInScopeException(name); + } + + variables.put(name, v); + } + + public void addOrOverwriteVariable(String name, V v) { + variables.put(name, v); + } + + public void overwriteFromLocalScope(LocalScope localScope) { + for (String varName : localScope.variables.keySet()) { + if (!this.variables.containsKey(varName)) { + continue; + } + + this.variables.put(varName, localScope.variables.get(varName)); + } + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + LocalScope that = (LocalScope) o; + return Objects.equals(variables, that.variables) && Objects.equals( + parentScope, that.parentScope); + } + + @Override + public int hashCode() { + return Objects.hash(variables, parentScope); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/PMLScopeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/PMLScopeException.java new file mode 100644 index 000000000..853314418 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/PMLScopeException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class PMLScopeException extends PMException { + public PMLScopeException(String message) { + super(message); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/Scope.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/Scope.java new file mode 100644 index 000000000..2890b5796 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/Scope.java @@ -0,0 +1,103 @@ +package gov.nist.csd.pm.pap.pml.scope; + +import java.io.Serializable; +import java.util.Objects; + +public class Scope implements Serializable { + + private GlobalScope global; + private LocalScope local; + + public Scope(GlobalScope global) { + this.global = global; + this.local = new LocalScope<>(); + } + + public Scope(GlobalScope global, LocalScope localScope) { + this.global = global; + this.local = localScope; + } + + public Scope copy() { + return new Scope<>(global, local.copy()); + } + + public GlobalScope global() { + return global; + } + + public LocalScope local() { + return local; + } + + public F getFunction(String name) throws UnknownFunctionInScopeException { + F function = global.getExecutable(name); + if (function == null) { + throw new UnknownFunctionInScopeException(name); + } + + return function; + } + + public boolean functionExists(String name) { + try { + getFunction(name); + return true; + } catch (UnknownFunctionInScopeException e) { + return false; + } + } + + public void addVariable(String name, V v) throws VariableAlreadyDefinedInScopeException { + if (variableExists(name)) { + throw new VariableAlreadyDefinedInScopeException(name); + } + + this.local.addVariable(name, v); + } + + public void addOrOverwriteVariable(String name, V v) { + this.local.addOrOverwriteVariable(name, v); + } + + public V getVariable(String name) throws UnknownVariableInScopeException { + V variable = global.getConstant(name); + if (variable != null) { + return variable; + } + + variable = local.getVariable(name); + if (variable != null) { + return variable; + } + + throw new UnknownVariableInScopeException(name); + } + + public boolean variableExists(String name) { + try { + getVariable(name); + } catch (UnknownVariableInScopeException e) { + return false; + } + + return true; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Scope scope = (Scope) o; + return Objects.equals(global, scope.global) && Objects.equals(local, scope.local); + } + + @Override + public int hashCode() { + return Objects.hash(global, local); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownFunctionInScopeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownFunctionInScopeException.java similarity index 82% rename from src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownFunctionInScopeException.java rename to src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownFunctionInScopeException.java index 79f42bfa2..6e3d8c145 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownFunctionInScopeException.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownFunctionInScopeException.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.pml.model.scope; +package gov.nist.csd.pm.pap.pml.scope; public class UnknownFunctionInScopeException extends PMLScopeException { diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownVariableInScopeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownVariableInScopeException.java new file mode 100644 index 000000000..368614303 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/UnknownVariableInScopeException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.pml.scope; + +public class UnknownVariableInScopeException extends PMLScopeException { + + public UnknownVariableInScopeException(String name) { + super(String.format("unknown variable '%s' in scope", name)); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/VariableAlreadyDefinedInScopeException.java b/src/main/java/gov/nist/csd/pm/pap/pml/scope/VariableAlreadyDefinedInScopeException.java similarity index 83% rename from src/main/java/gov/nist/csd/pm/policy/pml/model/scope/VariableAlreadyDefinedInScopeException.java rename to src/main/java/gov/nist/csd/pm/pap/pml/scope/VariableAlreadyDefinedInScopeException.java index aea460130..c6421ef4f 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/VariableAlreadyDefinedInScopeException.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/scope/VariableAlreadyDefinedInScopeException.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.pml.model.scope; +package gov.nist.csd.pm.pap.pml.scope; public class VariableAlreadyDefinedInScopeException extends PMLScopeException{ diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/BreakStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/BreakStatement.java new file mode 100644 index 000000000..00b1acd13 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/BreakStatement.java @@ -0,0 +1,31 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.BreakValue; +import gov.nist.csd.pm.pap.pml.value.Value; + + +public class BreakStatement extends ControlStatement { + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + "break"; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return new BreakValue(); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof BreakStatement; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatement.java new file mode 100644 index 000000000..f06fd1d74 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatement.java @@ -0,0 +1,31 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.ContinueValue; +import gov.nist.csd.pm.pap.pml.value.Value; + + +public class ContinueStatement extends ControlStatement { + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + "continue"; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return new ContinueValue(); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ContinueStatement; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/ControlStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ControlStatement.java new file mode 100644 index 000000000..8e7bdcf86 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ControlStatement.java @@ -0,0 +1,15 @@ +package gov.nist.csd.pm.pap.pml.statement; + +public abstract class ControlStatement implements PMLStatement{ + + @Override + public final String toString() { + return toFormattedString(0); + } + + @Override + public abstract int hashCode(); + + @Override + public abstract boolean equals(Object obj); +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatement.java new file mode 100644 index 000000000..188a7a5a4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatement.java @@ -0,0 +1,98 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ForeachStatement extends ControlStatement { + + private final String varName; + private final String valueVarName; + private final Expression iter; + private final List statements; + + public ForeachStatement(String varName, String valueVarName, Expression iter, List statements) { + this.varName = varName; + this.valueVarName = valueVarName; + this.iter = iter; + this.statements = statements; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + if (statements.isEmpty()) { + return new VoidValue(); + } + + Value iterValue = iter.execute(ctx, pap); + if (iterValue instanceof ArrayValue arrayValue) { + return executeArrayIterator(ctx, arrayValue); + } else if (iterValue instanceof MapValue mapValue) { + return executeMapIterator(ctx, mapValue, pap); + } + + return new VoidValue(); + } + + private Value executeArrayIterator(ExecutionContext ctx, ArrayValue iterValue) throws PMException{ + for (Value v : iterValue.getValue()) { + Value value = ctx.executeStatements(statements, Map.of(varName, v)); + + if (value instanceof BreakValue) { + break; + } else if (value instanceof ReturnValue) { + return value; + } + } + return new VoidValue(); + } + + private Value executeMapIterator(ExecutionContext ctx, MapValue iterValue, PAP pap) throws PMException{ + for (Value key : iterValue.getValue().keySet()) { + Value mapValue = iterValue.getMapValue().get(key); + + Map operands = new HashMap<>(Map.of(varName, key)); + if (valueVarName != null) { + operands.put(valueVarName, mapValue); + } + + Value value = ctx.executeStatements(statements, operands); + + if (value instanceof BreakValue) { + break; + } else if (value instanceof ReturnValue) { + return value; + } + } + + return new VoidValue(); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format("%sforeach %s in %s %s", + indent(indentLevel), (valueVarName != null ? String.format("%s, %s", varName, valueVarName) : varName), + iter, + new PMLStatementBlock(statements).toFormattedString(indentLevel) + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ForeachStatement that)) return false; + return Objects.equals(varName, that.varName) && Objects.equals(valueVarName, that.valueVarName) && Objects.equals(iter, that.iter) && Objects.equals(statements, that.statements); + } + + @Override + public int hashCode() { + return Objects.hash(varName, valueVarName, iter, statements); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatement.java new file mode 100644 index 000000000..61d9ec84a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatement.java @@ -0,0 +1,68 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.scope.PMLScopeException; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ReturnValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.Objects; + + +public class FunctionReturnStatement extends ControlStatement { + + private Expression expr; + + public FunctionReturnStatement() { + } + + public FunctionReturnStatement(Expression expr) { + this.expr = expr; + } + + public Expression getExpr() { + return expr; + } + + public boolean matchesReturnType(Type match, Scope scope) throws PMLScopeException { + if (expr == null) { + return match.equals(Type.voidType()); + } + + return expr.getType(scope).equals(match); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + if (expr == null) { + return new ReturnValue(new VoidValue()); + } + + return new ReturnValue(expr.execute(ctx, pap)); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format("%sreturn%s", indent(indentLevel), (expr == null ? "" : String.format(" %s", expr))); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + FunctionReturnStatement that = (FunctionReturnStatement) o; + return Objects.equals(expr, that.expr); + } + + @Override + public int hashCode() { + return Objects.hash(expr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/IfStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/IfStatement.java new file mode 100644 index 000000000..5b40ae061 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/IfStatement.java @@ -0,0 +1,102 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + + +public class IfStatement extends ControlStatement { + + private ConditionalBlock ifBlock; + private List ifElseBlocks; + private PMLStatementBlock elseBlockStatements; + + public IfStatement(ConditionalBlock ifBlock, List ifElseBlocks, PMLStatementBlock elseBlock) { + this.ifBlock = ifBlock; + this.ifElseBlocks = ifElseBlocks; + this.elseBlockStatements = elseBlock; + } + + public ConditionalBlock getIfBlock() { + return ifBlock; + } + + public List getIfElseBlocks() { + return ifElseBlocks; + } + + public PMLStatementBlock getElseBlock() { + return elseBlockStatements; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + boolean condition = ifBlock.condition.execute(ctx, pap).getBooleanValue(); + + if (condition) { + return ifBlock.block.execute(ctx, pap); + } + + // check else ifs + for (ConditionalBlock conditionalBlock : ifElseBlocks) { + condition = conditionalBlock.condition.execute(ctx, pap).getBooleanValue(); + if (condition) { + return conditionalBlock.block.execute(ctx, pap); + } + } + + return elseBlockStatements.execute(ctx, pap); + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format( + "%s%s%s", + ifBlockToString(indentLevel), + elseIfBlockToString(indentLevel), + elseBlockToString(indentLevel) + ); + } + + private String elseBlockToString(int indentLevel) { + if (elseBlockStatements.getStmts().isEmpty()) { + return ""; + } + + return String.format(" else %s", elseBlockStatements.toFormattedString(indentLevel)); + } + + private String elseIfBlockToString(int indentLevel) { + StringBuilder s = new StringBuilder(); + for (ConditionalBlock b : ifElseBlocks) { + s.append(String.format(" else if %s %s", b.condition, b.block.toFormattedString(indentLevel))); + } + + return s.toString(); + } + + private String ifBlockToString(int indentLevel) { + return String.format("%sif %s %s", indent(indentLevel), ifBlock.condition, ifBlock.block.toFormattedString(indentLevel)); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + IfStatement ifStmt = (IfStatement) o; + return Objects.equals(ifBlock, ifStmt.ifBlock) && Objects.equals(ifElseBlocks, ifStmt.ifElseBlocks) && Objects.equals(elseBlockStatements, ifStmt.elseBlockStatements); + } + + @Override + public int hashCode() { + return Objects.hash(ifBlock, ifElseBlocks, elseBlockStatements); + } + + public record ConditionalBlock(Expression condition, PMLStatementBlock block) implements Serializable { } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatement.java new file mode 100644 index 000000000..319f8f5f0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatement.java @@ -0,0 +1,5 @@ +package gov.nist.csd.pm.pap.pml.statement; + +public interface PMLStatement extends PMLStatementExecutable, PMLStatementSerializable { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementBlock.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementBlock.java new file mode 100644 index 000000000..4aaf4a3ea --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementBlock.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +public class PMLStatementBlock extends ControlStatement { + + private List stmts; + + public PMLStatementBlock(List stmts) { + this.stmts = stmts; + } + + public PMLStatementBlock(PMLStatement ... statements) { + stmts = new ArrayList<>(List.of(statements)); + } + + public List getStmts() { + return stmts; + } + + public void setStmts(List stmts) { + this.stmts = stmts; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PMLStatementBlock that = (PMLStatementBlock) o; + return Objects.equals(stmts, that.stmts); + } + + @Override + public int hashCode() { + return Objects.hash(stmts); + } + + @Override + public String toFormattedString(int indentLevel) { + StringBuilder sb = new StringBuilder("{\n"); + for (PMLStatement stmt : stmts) { + sb.append(stmt.toFormattedString(indentLevel+1)).append("\n"); + } + + return sb.append(indent(indentLevel)).append("}").toString(); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + return ctx.executeStatements(stmts, Map.of()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementExecutable.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementExecutable.java new file mode 100644 index 000000000..c8cb0365d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementExecutable.java @@ -0,0 +1,12 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; + +public interface PMLStatementExecutable { + + Value execute(ExecutionContext ctx, PAP pap) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementSerializable.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementSerializable.java new file mode 100644 index 000000000..496ee80fd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/PMLStatementSerializable.java @@ -0,0 +1,19 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import java.io.Serializable; + +public interface PMLStatementSerializable extends Serializable { + + String toFormattedString(int indentLevel); + + default String indent(int indentLevel) { + String INDENT = " "; + return INDENT.repeat(indentLevel); + } + + @Override + boolean equals(Object o); + + @Override + int hashCode(); +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatement.java new file mode 100644 index 000000000..362920e1e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatement.java @@ -0,0 +1,67 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.Objects; + + +public class ShortDeclarationStatement extends ControlStatement { + + private String id; + private Expression expression; + + public ShortDeclarationStatement(String id, Expression expression) { + this.id = id; + this.expression = expression; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + ctx.scope().addVariable(id, expression.execute(ctx, pap)); + + return new VoidValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ShortDeclarationStatement that = (ShortDeclarationStatement) o; + return Objects.equals(id, that.id) && Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(id, expression); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + id + " := " + expression.toFormattedString(indentLevel); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatement.java new file mode 100644 index 000000000..eb6a57a45 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatement.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.Objects; + + +public class VariableAssignmentStatement extends ControlStatement { + + private String id; + private boolean isPlus; + private Expression expression; + + public VariableAssignmentStatement(String id, boolean isPlus, Expression expression) { + this.id = id; + this.isPlus = isPlus; + this.expression = expression; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public boolean isPlus() { + return isPlus; + } + + public void setPlus(boolean plus) { + isPlus = plus; + } + + public Expression getExpression() { + return expression; + } + + public void setExpression(Expression expression) { + this.expression = expression; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Value value = expression.execute(ctx, pap); + + // if statement uses '+=' add the existing value to the new value + if (isPlus) { + String strValue = ctx.scope().getVariable(id).getStringValue(); + String exprValue = expression.execute(ctx, pap).getStringValue(); + + value = new StringValue(strValue + exprValue); + } + + ctx.scope().local().addOrOverwriteVariable(id, value); + + return new VoidValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + VariableAssignmentStatement that = (VariableAssignmentStatement) o; + return isPlus == that.isPlus && Objects.equals(id, that.id) && Objects.equals( + expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(id, isPlus, expression); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + id + (isPlus ? " +": " ") + "= " + expression; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatement.java new file mode 100644 index 000000000..ff71b173a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatement.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.List; +import java.util.Objects; + + +public class VariableDeclarationStatement extends ControlStatement { + + private List declarations; + + public VariableDeclarationStatement(List declarations) { + this.declarations = declarations; + } + + public List getDeclarations() { + return declarations; + } + + public void setDeclarations( + List declarations) { + this.declarations = declarations; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + for (Declaration declaration : declarations) { + Value value = declaration.expression.execute(ctx, pap); + + ctx.scope().local().addOrOverwriteVariable(declaration.id, value); + } + + return new VoidValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + VariableDeclarationStatement that = (VariableDeclarationStatement) o; + return Objects.equals(declarations, that.declarations); + } + + @Override + public int hashCode() { + return Objects.hashCode(declarations); + } + + @Override + public String toFormattedString(int indentLevel) { + String indent = indent(indentLevel); + StringBuilder sb = new StringBuilder(); + sb.append(indent).append("var (\n"); + + for (Declaration declaration : declarations) { + sb.append(indent(indentLevel+1)).append(declaration.id).append(" = ").append(declaration.expression).append("\n"); + } + + sb.append(indent).append(")"); + + return sb.toString(); + } + + public record Declaration(String id, Expression expression) { + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Declaration that = (Declaration) o; + return Objects.equals(id, that.id) && Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(id, expression); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatement.java new file mode 100644 index 000000000..cd7deaa04 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatement.java @@ -0,0 +1,59 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.AssignOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.graph.AssignOp.ASCENDANT_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; + + +public class AssignStatement extends OperationStatement { + + private Expression ascendant; + private Expression descendants; + + public AssignStatement(Expression ascendant, Expression descendants) { + super(new AssignOp()); + + this.ascendant = ascendant; + this.descendants = descendants; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + String asc = ascendant.execute(ctx, pap).getStringValue(); + List assignToValue = descendants.execute(ctx, pap).getArrayValue(); + List descs = new ArrayList<>(); + for (Value value : assignToValue) { + descs.add(value.getStringValue()); + } + + return Map.of(ASCENDANT_OPERAND, asc, DESCENDANTS_OPERAND, descs); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("assign %s to %s", ascendant, descendants); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AssignStatement that)) return false; + return Objects.equals(ascendant, that.ascendant) && Objects.equals(descendants, that.descendants); + } + + @Override + public int hashCode() { + return Objects.hash(ascendant, descendants); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatement.java new file mode 100644 index 000000000..0d0b6134e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatement.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.AssociateOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.graph.AssociateOp.UA_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.AssociateOp.TARGET_OPERAND; +import static gov.nist.csd.pm.pap.op.prohibition.ProhibitionOp.ARSET_OPERAND; + + +public class AssociateStatement extends OperationStatement { + + private Expression ua; + private Expression target; + private Expression accessRights; + + public AssociateStatement(Expression ua, Expression target, Expression accessRights) { + super(new AssociateOp()); + + this.ua = ua; + this.target = target; + this.accessRights = accessRights; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + Value uaValue = ua.execute(ctx, pap); + Value targetValue = target.execute(ctx, pap); + Value accessRightsValue = accessRights.execute(ctx, pap); + + AccessRightSet accessRightSet = new AccessRightSet(); + for (Value v : accessRightsValue.getArrayValue()) { + accessRightSet.add(v.getStringValue()); + } + + return Map.of(UA_OPERAND, uaValue.getStringValue(), TARGET_OPERAND, targetValue.getStringValue(), ARSET_OPERAND, accessRightSet); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("associate %s and %s with %s", + ua, target, accessRights); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof AssociateStatement that)) return false; + return Objects.equals(ua, that.ua) && Objects.equals(target, that.target) && Objects.equals(accessRights, that.accessRights); + } + + @Override + public int hashCode() { + return Objects.hash(ua, target, accessRights); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatement.java new file mode 100644 index 000000000..b8c9434e4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatement.java @@ -0,0 +1,76 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class CheckStatement implements PMLStatement { + + private Expression arsExpr; + private Expression targetExpr; + + public CheckStatement(Expression arsExpr, Expression targetExpr) { + this.arsExpr = arsExpr; + this.targetExpr = targetExpr; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + Value ars = arsExpr.execute(ctx, pap); + Value target = targetExpr.execute(ctx, pap); + + List arsToCheck = new ArrayList<>(); + if (ars.getType().isString()) { + arsToCheck.add(ars.getStringValue()); + } else { + List arrayValue = ars.getArrayValue(); + for (Value v : arrayValue) { + arsToCheck.add(v.getStringValue()); + } + } + + if (target.getType().isString()) { + PrivilegeChecker.check(pap, ctx.author(), target.getStringValue(), arsToCheck); + } else { + List arrayValue = target.getArrayValue(); + for (Value value : arrayValue) { + PrivilegeChecker.check(pap, ctx.author(), value.getStringValue(), arsToCheck); + } + } + + return new VoidValue(); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + + "check " + arsExpr.toFormattedString(0) + + " on " + targetExpr.toFormattedString(0); + } + + @Override + public String toString() { + return toFormattedString(0); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CheckStatement that)) return false; + return Objects.equals(arsExpr, that.arsExpr) && Objects.equals(targetExpr, that.targetExpr); + } + + @Override + public int hashCode() { + return Objects.hash(arsExpr, targetExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateFunctionStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateFunctionStatement.java new file mode 100644 index 000000000..16b6016c7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateFunctionStatement.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; + +public interface CreateFunctionStatement extends PMLStatement { + + PMLExecutableSignature getSignature(); + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatement.java new file mode 100644 index 000000000..4fc533d47 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatement.java @@ -0,0 +1,79 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.graph.CreateObjectAttributeOp; +import gov.nist.csd.pm.pap.op.graph.CreateObjectOp; +import gov.nist.csd.pm.pap.op.graph.CreateUserAttributeOp; +import gov.nist.csd.pm.pap.op.graph.CreateUserOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.graph.CreateNodeOp.*; + + +public class CreateNonPCStatement extends OperationStatement { + private Expression name; + private NodeType type; + private Expression assignTo; + + public CreateNonPCStatement(Expression name, NodeType type, Expression assignTo) { + super(getOpFromType(type)); + this.name = name; + this.type = type; + this.assignTo = assignTo; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + Value nameValue = name.execute(ctx, pap); + Value assignToValue = assignTo.execute(ctx, pap); + + List descendants = new ArrayList<>(); + List arrayValue = assignToValue.getArrayValue(); + for (Value descValue : arrayValue) { + descendants.add(descValue.getStringValue()); + } + + return Map.of( + NAME_OPERAND, nameValue.getStringValue(), + DESCENDANTS_OPERAND, descendants + ); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format( + "create %s %s in %s", + type.toString(), + name, + assignTo + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreateNonPCStatement that)) return false; + return Objects.equals(name, that.name) && type == that.type && Objects.equals(assignTo, that.assignTo); + } + + @Override + public int hashCode() { + return Objects.hash(name, type, assignTo); + } + + private static Operation getOpFromType(NodeType type) { + return switch (type) { + case OA -> new CreateObjectAttributeOp(); + case O -> new CreateObjectOp(); + case UA -> new CreateUserAttributeOp(); + default -> new CreateUserOp(); + }; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatement.java new file mode 100644 index 000000000..69d341b26 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatement.java @@ -0,0 +1,113 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.UnknownPatternException; +import gov.nist.csd.pm.pap.op.obligation.CreateObligationOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.pml.expression.Expression; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.*; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.*; + + +public class CreateObligationStatement extends OperationStatement { + + private Expression name; + private List ruleStmts; + + public CreateObligationStatement(Expression name, List ruleStmts) { + super(new CreateObligationOp()); + this.name = name; + this.ruleStmts = ruleStmts; + } + + public Expression getName() { + return name; + } + + public List getRuleStmts() { + return ruleStmts; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) + throws PMException { + String nameStr = name.execute(ctx, pap).getStringValue(); + + // execute the create rule statements and add to obligation + List rules = new ArrayList<>(); + for (CreateRuleStatement createRuleStmt : ruleStmts) { + Rule rule = createRuleStmt.execute(ctx, pap).getRuleValue(); + rules.add(rule); + } + + return Map.of(AUTHOR_OPERAND, ctx.author().getUser(), NAME_OPERAND, nameStr, RULES_OPERAND, rules); + } + + @Override + public String toFormattedString(int indentLevel) { + StringBuilder sb = new StringBuilder(); + for (CreateRuleStatement createRuleStatement : ruleStmts) { + sb.append(createRuleStatement.toFormattedString(indentLevel+1)).append("\n\n"); + } + + String indent = indent(indentLevel); + return String.format( + """ + %screate obligation %s { + %s%s}""", indent, name, sb, indent); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreateObligationStatement that)) return false; + return Objects.equals(name, that.name) && Objects.equals(ruleStmts, that.ruleStmts); + } + + @Override + public int hashCode() { + return Objects.hash(name, ruleStmts); + } + + public static CreateObligationStatement fromObligation(Obligation obligation) { + try { + return new CreateObligationStatement( + new StringLiteral(obligation.getName()), + createRuleStatementsFromObligation(obligation.getRules()) + ); + } catch (UnknownPatternException e) { + throw new RuntimeException(e); + } + } + + private static List createRuleStatementsFromObligation(List rules) throws UnknownPatternException { + List createRuleStatements = new ArrayList<>(); + + for (Rule rule : rules) { + EventPattern event = rule.getEventPattern(); + + CreateRuleStatement createRuleStatement = new CreateRuleStatement( + new StringLiteral(rule.getName()), + event.getSubjectPattern(), + event.getOperationPattern(), + event.getOperandPatterns(), + new CreateRuleStatement.ResponseBlock( + rule.getResponse().getEventCtxVariable(), + rule.getResponse().getStatements() + ) + ); + + createRuleStatements.add(createRuleStatement); + } + + return createRuleStatements; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatement.java new file mode 100644 index 000000000..f443c2b22 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatement.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PreparedOperation; +import gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp.OPERATION_OPERAND; + +public class CreateOperationStatement extends PreparedOperation implements CreateFunctionStatement { + + protected PMLStmtsOperation op; + + public CreateOperationStatement(PMLStmtsOperation op) { + super(new CreateAdminOperationOp(), Map.of(OPERATION_OPERAND, op)); + + this.op = op; + } + + @Override + public String toFormattedString(int indentLevel) { + return op.toFormattedString(indentLevel); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + super.execute(pap); + + ctx.scope().global().addExecutable(op.getName(), op); + + return new VoidValue(); + } + + @Override + public PMLExecutableSignature getSignature() { + return op.getSignature(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof CreateOperationStatement that)) { + return false; + } + if (!super.equals(o)) { + return false; + } + return Objects.equals(op, that.op); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), op); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatement.java new file mode 100644 index 000000000..afacde950 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatement.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.op.graph.CreatePolicyClassOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.NAME_OPERAND; + +public class CreatePolicyStatement extends OperationStatement { + + private Expression name; + + public CreatePolicyStatement(Expression name) { + super(new CreatePolicyClassOp()); + + this.name = name; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) + throws PMException { + String pcName = name.execute(ctx, pap).getStringValue(); + + return Map.of(NAME_OPERAND, pcName); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("create PC %s", name); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreatePolicyStatement that)) return false; + return Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatement.java new file mode 100644 index 000000000..c12c9aaf6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatement.java @@ -0,0 +1,152 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.prohibition.CreateProhibitionOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.NegatedExpression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ComplementedValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.isAdminAccessRight; +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.ARSET_OPERAND; +import static gov.nist.csd.pm.pap.op.prohibition.ProhibitionOp.*; + +public class CreateProhibitionStatement extends OperationStatement { + + private Expression name; + private Expression subject; + private ProhibitionSubject.Type subjectType; + private Expression accessRights; + private boolean isIntersection; + private Expression containers; + + public CreateProhibitionStatement(Expression name, Expression subject, ProhibitionSubject.Type subjectType, Expression accessRights, + boolean isIntersection, Expression containers) { + super(new CreateProhibitionOp()); + this.name = name; + this.subject = subject; + this.subjectType = subjectType; + this.accessRights = accessRights; + this.isIntersection = isIntersection; + this.containers = containers; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) + throws PMException { + Value idValue = this.name .execute(ctx, pap); + Value subjectValue = this.subject.execute(ctx, pap); + Value permissionsValue = this.accessRights.execute(ctx, pap); + + List arrayValue = permissionsValue.getArrayValue(); + AccessRightSet ops = new AccessRightSet(); + for (Value v : arrayValue) { + ops.add(v.getStringValue()); + } + + List containerConditions = new ArrayList<>(); + for (Value container : containers.execute(ctx, pap).getArrayValue()) { + boolean isComplement = container instanceof ComplementedValue; + String containerName = container.getStringValue(); + + containerConditions.add(new ContainerCondition(containerName, isComplement)); + } + + return Map.of( + NAME_OPERAND, idValue.getStringValue(), + SUBJECT_OPERAND, new ProhibitionSubject(subjectValue.getStringValue(), subjectType), + ARSET_OPERAND, ops, + INTERSECTION_OPERAND, isIntersection, + CONTAINERS_OPERAND, containerConditions + ); + } + + @Override + public String toFormattedString(int indentLevel) { + String subjectStr = getSubjectStr(); + String indent = indent(indentLevel); + return String.format( + """ + %screate prohibition %s + %s deny %s %s + %s access rights %s + %s on %s of %s""", + indent, name, + indent, subjectStr, subject, + indent, accessRights, + indent, (isIntersection ? "intersection" : "union"), containers + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreateProhibitionStatement that)) return false; + return isIntersection == that.isIntersection && Objects.equals(name, that.name) && Objects.equals(subject, that.subject) && subjectType == that.subjectType && Objects.equals(accessRights, that.accessRights) && Objects.equals(containers, that.containers); + } + + @Override + public int hashCode() { + return Objects.hash(name, subject, subjectType, accessRights, isIntersection, containers); + } + + private String getSubjectStr() { + String subjectStr = ""; + switch (subjectType) { + case USER_ATTRIBUTE -> subjectStr = "UA"; + case USER -> subjectStr = "U"; + case PROCESS -> subjectStr = "process"; + } + + return subjectStr; + } + + public static CreateProhibitionStatement fromProhibition(Prohibition prohibition) { + List accessRightsList = new ArrayList<>(); + for (String ar : prohibition.getAccessRightSet()) { + if (isAdminAccessRight(ar)) { + accessRightsList.add(new ReferenceByID(ar)); + } else { + accessRightsList.add(new StringLiteral(ar)); + } + } + ArrayLiteral arList = new ArrayLiteral(accessRightsList, Type.string()); + + List containersList = new ArrayList<>(); + for (ContainerCondition cc : prohibition.getContainers()) { + StringLiteral s = new StringLiteral(cc.getName()); + if (cc.isComplement()) { + containersList.add(new NegatedExpression(s)); + } else { + containersList.add(s); + } + } + + ArrayLiteral containers = new ArrayLiteral(containersList, Type.string()); + + return new CreateProhibitionStatement( + new StringLiteral(prohibition.getName()), + new StringLiteral(prohibition.getSubject().getName()), + prohibition.getSubject().getType(), + arList, + prohibition.isIntersection(), + containers + ); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatement.java new file mode 100644 index 000000000..58e4a33d3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatement.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PreparedOperation; +import gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineSignature; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLStmtsRoutine; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp.ROUTINE_OPERAND; + +public class CreateRoutineStatement extends PreparedOperation implements CreateFunctionStatement { + + private PMLStmtsRoutine routine; + + public CreateRoutineStatement(PMLStmtsRoutine routine) { + super(new CreateAdminRoutineOp(), Map.of(ROUTINE_OPERAND, routine)); + + this.routine = routine; + } + + @Override + public String toFormattedString(int indentLevel) { + return String.format( + "%s%s", + new PMLRoutineSignature(routine.getName(), routine.getReturnType(), routine.getOperandNames(), routine.getOperandTypes()) + .toFormattedString(indentLevel), + routine.getStatements().toFormattedString(indentLevel) + ); + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + super.execute(pap); + + ctx.scope().global().addExecutable(routine.getName(), routine); + + return new VoidValue(); + } + + @Override + public PMLExecutableSignature getSignature() { + return routine.getSignature(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CreateRoutineStatement that)) return false; + if (!super.equals(o)) return false; + return Objects.equals(routine, that.routine); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), routine); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatement.java new file mode 100644 index 000000000..1373a3092 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatement.java @@ -0,0 +1,187 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.value.RuleValue; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.io.Serializable; +import java.util.*; + + +public class CreateRuleStatement implements PMLStatement { + + protected Expression name; + protected SubjectPattern subjectPattern; + protected OperationPattern operationPattern; + protected Map> operandPattern; + protected ResponseBlock responseBlock; + + public CreateRuleStatement(Expression name, + SubjectPattern subjectPattern, + OperationPattern operationPattern, + Map> operandPattern, + ResponseBlock responseBlock) { + this.name = name; + this.subjectPattern = subjectPattern; + this.operationPattern = operationPattern; + this.operandPattern = operandPattern; + this.responseBlock = responseBlock; + } + + public Expression getName() { + return name; + } + + public void setName(Expression name) { + this.name = name; + } + + public SubjectPattern getSubjectPattern() { + return subjectPattern; + } + + public void setSubjectPattern(SubjectPattern subjectPattern) { + this.subjectPattern = subjectPattern; + } + + public OperationPattern getOperationPattern() { + return operationPattern; + } + + public void setOperationPattern(OperationPattern operationPattern) { + this.operationPattern = operationPattern; + } + + public Map> getOperandPattern() { + return operandPattern; + } + + public void setOperandPattern(Map> operandPattern) { + this.operandPattern = operandPattern; + } + + public ResponseBlock getResponseBlock() { + return responseBlock; + } + + public void setResponseBlock(ResponseBlock responseBlock) { + this.responseBlock = responseBlock; + } + + @Override + public Value execute(ExecutionContext ctx, PAP pap) throws PMException { + String nameValue = name.execute(ctx, pap).getStringValue(); + + return new RuleValue(new Rule( + nameValue, + new EventPattern( + subjectPattern, + operationPattern, + new HashMap<>(operandPattern) + ), + new Response(responseBlock.evtVar, responseBlock.getStatements()) + )); + } + + @Override + public String toFormattedString(int indentLevel) { + PMLStatementBlock block = new PMLStatementBlock(responseBlock.statements); + + String indent = indent(indentLevel); + + String operandsStr = ""; + for (Map.Entry> operandExpr : operandPattern.entrySet()) { + if (!operandsStr.isEmpty()) { + operandsStr += ",\n"; + } + + List value = operandExpr.getValue(); + + operandsStr += indent(indentLevel+1) + + operandExpr.getKey() + ": " + (value.size() == 1 ? value.getFirst() : value); + } + operandsStr = operandPattern.isEmpty() ? "" : indent + "on {\n" + operandsStr + "\n" + indent + "}"; + + return String.format( + """ + %screate rule %s + %swhen %s + %sperforms %s + %s + %sdo (%s) %s""", + indent, name, + indent, subjectPattern, + indent, operationPattern.isAny() ? operationPattern.toString() : "\"" + operationPattern.toString() + "\"", + operandsStr, + indent, responseBlock.evtVar, block.toFormattedString(indentLevel) + ); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + CreateRuleStatement that = (CreateRuleStatement) o; + return Objects.equals(name, that.name) && + Objects.equals(subjectPattern, that.subjectPattern) && + Objects.equals(operationPattern, that.operationPattern) && + Objects.equals(operandPattern, that.operandPattern) && + Objects.equals(responseBlock, that.responseBlock); + } + + @Override + public int hashCode() { + return Objects.hash(name, subjectPattern, operationPattern, operandPattern, responseBlock); + } + + public static class ResponseBlock implements Serializable { + protected String evtVar; + protected List statements; + + public ResponseBlock(String evtVar, List statements) { + this.evtVar = evtVar; + this.statements = statements; + } + + public String getEvtVar() { + return evtVar; + } + + public List getStatements() { + return statements; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ResponseBlock that = (ResponseBlock) o; + return Objects.equals(evtVar, that.evtVar) && Objects.equals(statements, that.statements); + } + + @Override + public int hashCode() { + return Objects.hash(evtVar, statements); + } + } + +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatement.java new file mode 100644 index 000000000..39518de37 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatement.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.DeassignOp; +import gov.nist.csd.pm.pap.op.graph.GraphOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + + +public class DeassignStatement extends OperationStatement { + + private Expression ascendant; + private Expression deassignFrom; + + public DeassignStatement(Expression ascendant, Expression deassignFrom) { + super(new DeassignOp()); + this.ascendant = ascendant; + this.deassignFrom = deassignFrom; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) + throws PMException { + String asc = ascendant.execute(ctx, pap).getStringValue(); + List deassignFromValue = deassignFrom.execute(ctx, pap).getArrayValue(); + List descs = new ArrayList<>(); + for (Value value : deassignFromValue) { + descs.add(value.getStringValue()); + } + + return Map.of(GraphOp.ASCENDANT_OPERAND, asc, GraphOp.DESCENDANTS_OPERAND, descs); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("deassign %s from %s", ascendant, deassignFrom); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DeassignStatement that)) return false; + return Objects.equals(ascendant, that.ascendant) && Objects.equals(deassignFrom, that.deassignFrom); + } + + @Override + public int hashCode() { + return Objects.hash(ascendant, deassignFrom); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatement.java new file mode 100644 index 000000000..9196bd2f0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatement.java @@ -0,0 +1,103 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.obligation.CreateObligationOp; +import gov.nist.csd.pm.pap.op.obligation.DeleteObligationOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.AUTHOR_OPERAND; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.RULES_OPERAND; + + +public class DeleteRuleStatement extends OperationStatement { + + private final Expression ruleExpr; + private final Expression oblExpr; + + public DeleteRuleStatement(Expression ruleExpr, Expression oblExpr) { + super(new UpdateObligationOp()); + this.ruleExpr = ruleExpr; + this.oblExpr = oblExpr; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + String ruleName = ruleExpr.execute(ctx, pap).getStringValue(); + String oblName = oblExpr.execute(ctx, pap).getStringValue(); + + Obligation obligation = pap.query().obligations().getObligation(oblName); + List rules = new ArrayList<>(); + for (Rule rule : obligation.getRules()) { + if (rule.getName().equals(ruleName)) { + continue; + } + + rules.add(rule); + } + + return Map.of( + AUTHOR_OPERAND, obligation.getAuthor(), + NAME_OPERAND, obligation.getName(), + RULES_OPERAND, rules + ); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("delete rule %s from obligation %s", ruleExpr, oblExpr); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DeleteRuleStatement that)) return false; + return Objects.equals(ruleExpr, that.ruleExpr) && Objects.equals(oblExpr, that.oblExpr); + } + + @Override + public int hashCode() { + return Objects.hash(ruleExpr, oblExpr); + } + + static class UpdateObligationOp extends Operation { + + public UpdateObligationOp() { + super( + "delete_rule", + List.of(AUTHOR_OPERAND, NAME_OPERAND, RULES_OPERAND) + ); + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + new DeleteObligationOp() + .canExecute(pap, userCtx, operands); + new CreateObligationOp() + .canExecute(pap, userCtx, operands); + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + String author = (String) operands.get(AUTHOR_OPERAND); + String name = (String) operands.get(NAME_OPERAND); + List rules = (List) operands.get(RULES_OPERAND); + + pap.modify().obligations().deleteObligation(name); + pap.modify().obligations().createObligation(author, name, rules); + + return null; + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatement.java new file mode 100644 index 000000000..4eebd0664 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatement.java @@ -0,0 +1,84 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.graph.*; +import gov.nist.csd.pm.pap.op.obligation.DeleteObligationOp; +import gov.nist.csd.pm.pap.op.prohibition.DeleteProhibitionOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; + +public class DeleteStatement extends OperationStatement { + + private Type type; + private Expression expression; + + public DeleteStatement(Type type, Expression expression) { + super(getOpFromType(type)); + this.type = type; + this.expression = expression; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + String name = expression.execute(ctx, pap).getStringValue(); + + return Map.of(NAME_OPERAND, name); + } + + @Override + public String toFormattedString(int indentLevel) { + String typeStr = ""; + switch (type) { + case PROHIBITION -> typeStr = "prohibition"; + case OBLIGATION -> typeStr = "obligation"; + case POLICY_CLASS -> typeStr = "PC"; + case OBJECT_ATTRIBUTE -> typeStr = "OA"; + case USER_ATTRIBUTE -> typeStr = "UA"; + case OBJECT -> typeStr = "O"; + case USER -> typeStr = "U"; + } + + return indent(indentLevel) + String.format("delete %s %s", typeStr, expression); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DeleteStatement that)) return false; + return type == that.type && Objects.equals(expression, that.expression); + } + + @Override + public int hashCode() { + return Objects.hash(type, expression); + } + + public enum Type { + POLICY_CLASS, + OBJECT_ATTRIBUTE, + USER_ATTRIBUTE, + OBJECT, + USER, + PROHIBITION, + OBLIGATION + } + + private static Operation getOpFromType(Type type) { + return switch (type) { + case POLICY_CLASS -> new DeletePolicyClassOp(); + case OBJECT_ATTRIBUTE -> new DeleteObjectAttributeOp(); + case USER_ATTRIBUTE -> new DeleteUserAttributeOp(); + case OBJECT -> new DeleteObjectOp(); + case USER -> new DeleteUserOp(); + case PROHIBITION -> new DeleteProhibitionOp(); + case OBLIGATION -> new DeleteObligationOp(); + }; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatement.java new file mode 100644 index 000000000..e49dc70f7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatement.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.DissociateOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.TARGET_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.UA_OPERAND; + + +public class DissociateStatement extends OperationStatement { + + private Expression uaExpr; + private Expression targetExpr; + + public DissociateStatement(Expression uaExpr, Expression targetExpr) { + super(new DissociateOp()); + this.uaExpr = uaExpr; + this.targetExpr = targetExpr; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + String ua = uaExpr.execute(ctx, pap).getStringValue(); + String target = targetExpr.execute(ctx, pap).getStringValue(); + + return Map.of(UA_OPERAND, ua, TARGET_OPERAND, target); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("dissociate %s and %s", uaExpr, targetExpr); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DissociateStatement that)) return false; + return Objects.equals(uaExpr, that.uaExpr) && Objects.equals(targetExpr, that.targetExpr); + } + + @Override + public int hashCode() { + return Objects.hash(uaExpr, targetExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/OperationStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/OperationStatement.java new file mode 100644 index 000000000..9d472fd54 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/OperationStatement.java @@ -0,0 +1,46 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PreparedOperation; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.VoidValue; + +import java.util.*; + +public abstract class OperationStatement extends PreparedOperation implements PMLStatement { + + public OperationStatement(Operation op) { + super(op, new HashMap<>()); + } + + public abstract Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException; + + @Override + public final VoidValue execute(ExecutionContext ctx, PAP pap) throws PMException { + Map prepareOperands = prepareOperands(ctx, pap); + setOperands(prepareOperands); + + execute(pap); + + return new VoidValue(); + } + + @Override + public final Void execute(PAP pap) throws PMException { + return super.execute(pap); + } + + @Override + public String toString() { + return toFormattedString(0); + } + + @Override + public abstract boolean equals(Object o); + + @Override + public abstract int hashCode(); +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatement.java new file mode 100644 index 000000000..4d83f0af1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatement.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.SetNodePropertiesOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.PROPERTIES_OPERAND; + + +public class SetNodePropertiesStatement extends OperationStatement { + + private Expression nameExpr; + private Expression propertiesExpr; + + public SetNodePropertiesStatement(Expression nameExpr, Expression propertiesExpr) { + super(new SetNodePropertiesOp()); + this.nameExpr = nameExpr; + this.propertiesExpr = propertiesExpr; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) throws PMException { + String name = nameExpr.execute(ctx, pap).getStringValue(); + Map map = propertiesExpr.execute(ctx, pap).getMapValue(); + Map properties = new HashMap<>(); + for (Value key : map.keySet()) { + properties.put(key.getStringValue(), map.get(key).getStringValue()); + } + + return Map.of(NAME_OPERAND, name, PROPERTIES_OPERAND, properties); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("set properties of %s to %s", nameExpr, propertiesExpr); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetNodePropertiesStatement that)) return false; + return Objects.equals(nameExpr, that.nameExpr) && Objects.equals(propertiesExpr, that.propertiesExpr); + } + + @Override + public int hashCode() { + return Objects.hash(nameExpr, propertiesExpr); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatement.java b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatement.java new file mode 100644 index 000000000..8d77972e6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatement.java @@ -0,0 +1,55 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.Value; + +import java.util.Map; +import java.util.Objects; + +import static gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp.OPERATIONS_OPERAND; + + +public class SetResourceOperationsStatement extends OperationStatement { + + private Expression ops; + + public SetResourceOperationsStatement(Expression ops) { + super(new SetResourceOperationsOp()); + + this.ops = ops; + } + + @Override + public Map prepareOperands(ExecutionContext ctx, PAP pap) + throws PMException { + Value arValue = ops.execute(ctx, pap); + AccessRightSet accessRightSet = new AccessRightSet(); + for (Value v : arValue.getArrayValue()) { + accessRightSet.add(v.getStringValue()); + } + + return Map.of(OPERATIONS_OPERAND, accessRightSet); + } + + @Override + public String toFormattedString(int indentLevel) { + return indent(indentLevel) + String.format("set resource operations %s", ops); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SetResourceOperationsStatement that)) return false; + return Objects.equals(ops, that.ops); + } + + @Override + public int hashCode() { + return Objects.hashCode(ops); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Type.java b/src/main/java/gov/nist/csd/pm/pap/pml/type/Type.java similarity index 81% rename from src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Type.java rename to src/main/java/gov/nist/csd/pm/pap/pml/type/Type.java index 2a9f841da..02d989b1f 100644 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Type.java +++ b/src/main/java/gov/nist/csd/pm/pap/pml/type/Type.java @@ -1,21 +1,22 @@ -package gov.nist.csd.pm.policy.pml.model.expression; +package gov.nist.csd.pm.pap.pml.type; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; import java.io.Serializable; +import java.util.Objects; public class Type implements Serializable { private boolean isVoid; private boolean isAny; private boolean isString; - private boolean isNumber; private boolean isBoolean; private boolean isArray; - private Type arrayType; + private Type arrayElementType; private boolean isMap; private Type mapKeyType; private Type mapValueType; + private boolean isPattern; public static Type any() { Type type = new Type(); @@ -29,12 +30,6 @@ public static Type string() { return type; } - public static Type number() { - Type type = new Type(); - type.isNumber = true; - return type; - } - public static Type bool() { Type type = new Type(); type.isBoolean = true; @@ -44,7 +39,7 @@ public static Type bool() { public static Type array(Type arrayElementsType) { Type type = new Type(); type.isArray = true; - type.arrayType = arrayElementsType; + type.arrayElementType = arrayElementsType; return type; } @@ -62,8 +57,14 @@ public static Type voidType() { return type; } + public static Type pattern() { + Type type = new Type(); + type.isPattern = true; + return type; + } + public static Type toType(PMLParser.VariableTypeContext varTypeContext) { - Type type = null; + Type type; if (varTypeContext instanceof PMLParser.StringTypeContext) { type = Type.string(); } else if (varTypeContext instanceof PMLParser.BooleanTypeContext) { @@ -75,7 +76,7 @@ public static Type toType(PMLParser.VariableTypeContext varTypeContext) { toType(mapVarTypeContext.mapType().keyType), toType(mapVarTypeContext.mapType().valueType) ); - } else if (varTypeContext instanceof PMLParser.AnyTypeContext) { + } else { type = Type.any(); } @@ -90,10 +91,6 @@ public boolean isString() { return isString || isAny; } - public boolean isNumber() { - return isNumber || isAny; - } - public boolean isBoolean() { return isBoolean || isAny; } @@ -110,12 +107,16 @@ public boolean isVoid() { return isVoid; } - public Type getArrayType() { + public boolean isPattern() { + return isPattern || isAny; + } + + public Type getArrayElementType() { if (isAny) { return Type.any(); } - return arrayType; + return arrayElementType; } public Type getMapKeyType() { @@ -143,33 +144,38 @@ public boolean equals(Object obj) { return true; } else if (isString && type.isString) { return true; - } else if (isNumber && type.isNumber) { - return true; } else if (isBoolean && type.isBoolean) { return true; } else if (isArray && type.isArray) { - return arrayType.equals(type.arrayType); + return arrayElementType.equals(type.arrayElementType); } else if (isMap && type.isMap) { return this.mapKeyType.equals(type.mapKeyType) && this.mapValueType.equals(type.mapValueType); + } else if (isPattern && type.isPattern) { + return true; } } return false; } + @Override + public int hashCode() { + return Objects.hash(isAny, isString, isBoolean, isArray, arrayElementType, isMap, mapKeyType, mapValueType); + } + @Override public String toString() { if (isVoid) { return "void"; } else if (isString) { return "string"; - } else if (isNumber) { - return "number"; + } else if (isPattern) { + return "pattern"; } else if (isBoolean) { - return "boolean"; + return "bool"; } else if (isArray) { - return "[]" + arrayType.toString(); + return "[]" + arrayElementType.toString(); } else if (isMap) { return "map[" + mapKeyType.toString() + "]" + mapValueType.toString(); } else { diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/ArrayValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/ArrayValue.java new file mode 100644 index 000000000..62055ec92 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/ArrayValue.java @@ -0,0 +1,55 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.List; +import java.util.Objects; + +public class ArrayValue extends Value { + + private List value; + + public ArrayValue(List value, Type elementType) { + super(Type.array(elementType)); + this.value = value; + } + + public List getValue() { + return value; + } + + public void setValue(List value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ArrayValue that = (ArrayValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + for (Value value : value) { + if (!sb.isEmpty()) { + sb.append(", "); + } + + sb.append(value); + } + + return "[" + sb + "]"; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/BoolValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/BoolValue.java new file mode 100644 index 000000000..597c83607 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/BoolValue.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class BoolValue extends Value { + + private boolean value; + + public BoolValue(Boolean value) { + super(Type.bool()); + this.value = value; + } + + public boolean getValue() { + return value; + } + + public void setValue(boolean value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + BoolValue that = (BoolValue) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return value ? "true" : "false"; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/BreakValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/BreakValue.java new file mode 100644 index 000000000..a58af7989 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/BreakValue.java @@ -0,0 +1,24 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +public class BreakValue extends Value { + public BreakValue() { + super(Type.any()); + } + + @Override + public boolean equals(Object o) { + return false; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public String toString() { + return "break"; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/ComplementedValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/ComplementedValue.java new file mode 100644 index 000000000..3e5e33b2b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/ComplementedValue.java @@ -0,0 +1,77 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.obligation.Rule; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ComplementedValue extends Value { + + private Value value; + + public ComplementedValue(Value value) { + super(value.getType()); + this.value = value; + } + + public Value getValue() { + return value; + } + + public void setValue(Value value) { + this.value = value; + } + + @Override + public String getStringValue() { + return value.getStringValue(); + } + + @Override + public Boolean getBooleanValue() { + return !value.getBooleanValue(); + } + + @Override + public List getArrayValue() { + return value.getArrayValue(); + } + + @Override + public Map getMapValue() { + return value.getMapValue(); + } + + @Override + public Value getProhibitionValue() { + return value.getProhibitionValue(); + } + + @Override + public Rule getRuleValue() { + return value.getRuleValue(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ComplementedValue that = (ComplementedValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return "!" + value.toString(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/ContinueValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/ContinueValue.java new file mode 100644 index 000000000..63e6efb2a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/ContinueValue.java @@ -0,0 +1,24 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +public class ContinueValue extends Value { + public ContinueValue() { + super(Type.any()); + } + + @Override + public boolean equals(Object o) { + return false; + } + + @Override + public int hashCode() { + return 0; + } + + @Override + public String toString() { + return null; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/MapValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/MapValue.java new file mode 100644 index 000000000..70b197d38 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/MapValue.java @@ -0,0 +1,55 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Map; +import java.util.Objects; + +public class MapValue extends Value { + + private Map value; + + public MapValue(Map value, Type keyType, Type valueType) { + super(Type.map(keyType, valueType)); + this.value = value; + } + + public Map getValue() { + return value; + } + + public void setValue(Map value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + MapValue mapValue = (MapValue) o; + return Objects.equals(value, mapValue.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + StringBuilder entries = new StringBuilder(); + for (Map.Entry entry : value.entrySet()) { + if (entries.length() > 0) { + entries.append(", "); + } + + entries.append(entry.getKey()).append(": ").append(entry.getValue()); + } + + return String.format("{%s}", entries); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/PatternValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/PatternValue.java new file mode 100644 index 000000000..d2299af73 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/PatternValue.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class PatternValue extends Value{ + + private Pattern value; + + public PatternValue(Pattern value) { + super(Type.any()); + this.value = value; + } + + public Pattern getValue() { + return value; + } + + public void setValue(Pattern value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PatternValue that = (PatternValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } + + @Override + public String toString() { + return "PatternValue{" + + "pattern=" + value + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/ProhibitionValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/ProhibitionValue.java new file mode 100644 index 000000000..52d9a27be --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/ProhibitionValue.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class ProhibitionValue extends Value { + + private Prohibition value; + + public ProhibitionValue(Prohibition value) { + super(Type.any()); + + this.value = value; + } + + public Value getValue() { + return Value.fromObject(value); + } + + public void setValue(Prohibition value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ProhibitionValue that = (ProhibitionValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return value.hashCode(); + } + + @Override + public String toString() { + return value.toString(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/ReturnValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/ReturnValue.java new file mode 100644 index 000000000..ae3f0282d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/ReturnValue.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.value; + +import java.util.Objects; + +public class ReturnValue extends Value{ + + Value value; + + public ReturnValue(Value value) { + super(value.getType()); + + this.value = value; + } + + public Value getValue() { + return value; + } + + @Override + protected Value unwrap() { + return value.unwrap(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReturnValue that = (ReturnValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return "ReturnValue{" + + "value=" + value + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/RuleValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/RuleValue.java new file mode 100644 index 000000000..cf4acc73d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/RuleValue.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class RuleValue extends Value { + + private Rule value; + + public RuleValue(Rule value) { + super(Type.any()); + + this.value = value; + } + + public Rule getValue() { + return value; + } + + public void setValue(Rule value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + RuleValue ruleValue = (RuleValue) o; + return Objects.equals(value, ruleValue.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return value.toString(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/StringValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/StringValue.java new file mode 100644 index 000000000..d6728af5c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/StringValue.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class StringValue extends Value { + + private String value; + + public StringValue(String s) { + super(Type.string()); + this.value = s; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + StringValue that = (StringValue) o; + return Objects.equals(value, that.value); + } + + @Override + public int hashCode() { + return Objects.hash(value); + } + + @Override + public String toString() { + return "\"" + value + "\""; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/Value.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/Value.java new file mode 100644 index 000000000..69a9722c7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/Value.java @@ -0,0 +1,145 @@ +package gov.nist.csd.pm.pap.pml.value; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import gov.nist.csd.pm.pap.exception.PMRuntimeException; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.pml.pattern.Pattern; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public abstract class Value implements Serializable { + + protected Type type; + + public Value(Type type) { + this.type = type; + } + + public Type getType() { + return type; + } + + public String getStringValue() { + return this.unwrap().to(StringValue.class).getValue(); + } + + protected Value unwrap() { + if (this instanceof ReturnValue rv) { + return rv.unwrap(); + } + + return this; + } + + public Boolean getBooleanValue() { + return this.unwrap().to(BoolValue.class).getValue(); + } + + public List getArrayValue() { + return this.unwrap().to(ArrayValue.class).getValue(); + } + + public Map getMapValue() { + return this.unwrap().to(MapValue.class).getValue(); + } + + public Value getProhibitionValue() { + return this.unwrap().to(ProhibitionValue.class).getValue(); + } + + public Rule getRuleValue() { + return this.unwrap().to(RuleValue.class).getValue(); + } + + public Pattern getPatternValue() { + return this.unwrap().to(PatternValue.class).getValue(); + } + + public T to(Class c) { + return c.cast(this); + } + + public Object toObject() { + if (type.isString()) { + return getStringValue(); + } else if (type.isBoolean()) { + return getBooleanValue(); + } else if (type.isArray()) { + List list = new ArrayList<>(); + List arrayValue = getArrayValue(); + for (Value value : arrayValue) { + list.add(value.toObject()); + } + + return list; + } else if (type.isMap()) { + Map map = new HashMap<>(); + Map mapValue = getMapValue(); + for (Map.Entry entry : mapValue.entrySet()) { + map.put(entry.getKey().toObject(), entry.getValue().toObject()); + } + + return map; + } + + throw new PMRuntimeException("cannot convert value of type " + type + " to an object"); + } + + @Override + public abstract boolean equals(Object o); + + @Override + public abstract int hashCode(); + + @Override + public abstract String toString(); + + public static Value fromObject(Object o) { + return switch (o) { + case null -> null; + case Value value -> value; + case String s -> new StringValue(s); + case List list -> toListValue(list); + case Boolean b -> new BoolValue(b); + case Map m -> toMapValue(m); + default -> objToValue(o); + }; + } + + private static ArrayValue toListValue(List list) { + List valueList = new ArrayList<>(); + for (Object arrObj : list) { + valueList.add(fromObject(arrObj)); + } + + return new ArrayValue(valueList, Type.array(Type.any())); + } + + private static MapValue toMapValue(Map m) { + Map map = new HashMap<>(); + for (Object key : m.keySet()) { + map.put(fromObject(key), fromObject(m.get(key))); + } + + return new MapValue(map, Type.string(), Type.any()); + } + + private static MapValue objToValue(Object o) { + Gson gson = new Gson(); + String json = gson.toJson(o); + Map map = gson.fromJson(json, new TypeToken>() {}.getType()); + + Map valueMap = new HashMap<>(); + for (Map.Entry e : map.entrySet()) { + valueMap.put(fromObject(e.getKey()), fromObject(e.getValue())); + } + + return new MapValue(valueMap, Type.string(), Type.any()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/pml/value/VoidValue.java b/src/main/java/gov/nist/csd/pm/pap/pml/value/VoidValue.java new file mode 100644 index 000000000..215a740aa --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/pml/value/VoidValue.java @@ -0,0 +1,26 @@ +package gov.nist.csd.pm.pap.pml.value; + +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.Objects; + +public class VoidValue extends Value { + public VoidValue() { + super(Type.voidType()); + } + + @Override + public boolean equals(Object o) { + return o instanceof VoidValue; + } + + @Override + public int hashCode() { + return Objects.hash(toString()); + } + + @Override + public String toString() { + return "void"; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/prohibition/ContainerCondition.java b/src/main/java/gov/nist/csd/pm/pap/prohibition/ContainerCondition.java new file mode 100644 index 000000000..d9b6f26be --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/prohibition/ContainerCondition.java @@ -0,0 +1,58 @@ +package gov.nist.csd.pm.pap.prohibition; + +import java.io.Serializable; +import java.util.Objects; + +public class ContainerCondition implements Serializable { + + private String name; + private boolean complement; + + public ContainerCondition() { + } + + public ContainerCondition(String name, boolean complement) { + this.name = name; + this.complement = complement; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isComplement() { + return complement; + } + + public void setComplement(boolean complement) { + this.complement = complement; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ContainerCondition that = (ContainerCondition) o; + return complement == that.complement && Objects.equals(name, that.name); + } + + public int hashCode() { + return name.hashCode(); + } + + @Override + public String toString() { + return "ContainerCondition[" + + "name=" + name + ", " + + "complement=" + complement + ']'; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/prohibition/Prohibition.java b/src/main/java/gov/nist/csd/pm/pap/prohibition/Prohibition.java new file mode 100644 index 000000000..b1067c398 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/prohibition/Prohibition.java @@ -0,0 +1,107 @@ +package gov.nist.csd.pm.pap.prohibition; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateProhibitionStatement; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +/** + * Object representing a Prohibition. + */ +public class Prohibition implements Serializable { + + private String name; + private ProhibitionSubject subject; + private Collection containers; + private AccessRightSet accessRightSet; + private boolean intersection; + + public Prohibition(String name, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, + Collection containers) { + if (subject == null) { + throw new IllegalArgumentException("Prohibition subject cannot be null"); + } + + this.name = name; + this.subject = subject; + + this.containers = Objects.requireNonNullElseGet(containers, ArrayList::new); + this.accessRightSet = Objects.requireNonNullElseGet(accessRightSet, AccessRightSet::new); + this.intersection = intersection; + } + + public Prohibition(Prohibition prohibition) { + this.name = prohibition.getName(); + this.subject = new ProhibitionSubject(prohibition.getSubject().getName(), prohibition.getSubject().getType()); + this.containers = new ArrayList<>(prohibition.containers); + this.accessRightSet = new AccessRightSet(prohibition.getAccessRightSet()); + this.intersection = prohibition.isIntersection(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ProhibitionSubject getSubject() { + return subject; + } + + public void setSubject(ProhibitionSubject subject) { + this.subject = subject; + } + + public Collection getContainers() { + return containers; + } + + public void setContainers(List containers) { + this.containers = containers; + } + + public AccessRightSet getAccessRightSet() { + return accessRightSet; + } + + public void setAccessRightSet(AccessRightSet accessRightSet) { + this.accessRightSet = accessRightSet; + } + + public boolean isIntersection() { + return intersection; + } + + public void setIntersection(boolean intersection) { + this.intersection = intersection; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof Prohibition)) { + return false; + } + Prohibition that = (Prohibition) o; + return intersection == that.intersection && Objects.equals(name, that.name) && Objects.equals( + subject, that.subject) && Objects.equals(containers, that.containers) && Objects.equals( + accessRightSet, that.accessRightSet); + } + + public int hashCode() { + return Objects.hash(name); + } + + @Override + public String toString() { + return CreateProhibitionStatement.fromProhibition(this).toString(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/ProhibitionSubject.java b/src/main/java/gov/nist/csd/pm/pap/prohibition/ProhibitionSubject.java similarity index 80% rename from src/main/java/gov/nist/csd/pm/policy/model/prohibition/ProhibitionSubject.java rename to src/main/java/gov/nist/csd/pm/pap/prohibition/ProhibitionSubject.java index 4d9bbcf1c..5db74f32e 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/ProhibitionSubject.java +++ b/src/main/java/gov/nist/csd/pm/pap/prohibition/ProhibitionSubject.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.model.prohibition; +package gov.nist.csd.pm.pap.prohibition; -import gov.nist.csd.pm.policy.exceptions.InvalidProhibitionSubjectException; +import gov.nist.csd.pm.pap.exception.InvalidProhibitionSubjectException; import java.io.Serializable; import java.util.Objects; @@ -74,13 +74,20 @@ private Type typeFromString(String s) throws InvalidProhibitionSubjectException @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ProhibitionSubject that = (ProhibitionSubject) o; - return Objects.equals(name, that.name) && type == that.type; + if (!(o instanceof ProhibitionSubject subject)) return false; + return Objects.equals(name, subject.name) && type == subject.type; } @Override public int hashCode() { return Objects.hash(name, type); } + + @Override + public String toString() { + return "ProhibitionSubject{" + + "name='" + name + '\'' + + ", type=" + type + + '}'; + } } diff --git a/src/main/java/gov/nist/csd/pm/pap/query/AccessQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/AccessQuerier.java new file mode 100644 index 000000000..de4a59e3e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/AccessQuerier.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.store.PolicyStore; + +public abstract class AccessQuerier extends Querier implements AccessQuery{ + + public AccessQuerier(PolicyStore store) { + super(store); + } + + public AccessQuerier(Querier querier) { + super(querier); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/AccessQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/AccessQuery.java new file mode 100644 index 000000000..82e6456ee --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/AccessQuery.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.query.explain.Explain; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public interface AccessQuery { + + AccessRightSet computePrivileges(UserContext userCtx, String target) throws PMException; + AccessRightSet computeDeniedPrivileges(UserContext userCtx, String target) throws PMException; + Map computePolicyClassAccessRights(UserContext userContext, String target) throws PMException; + Map computeCapabilityList(UserContext userCtx) throws PMException; + Map computeACL(String target) throws PMException; + Map computeDestinationAttributes(String user) throws PMException; + Map computeAscendantPrivileges(UserContext userCtx, String root) throws PMException; + Explain explain(UserContext userCtx, String target) throws PMException; + Set computePersonalObjectSystem(UserContext userCtx) throws PMException; + Collection computeAccessibleAscendants(UserContext userCtx, String root) throws PMException; + Collection computeAccessibleDescendants(UserContext userCtx, String root) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/AccessRightResolver.java b/src/main/java/gov/nist/csd/pm/pap/query/AccessRightResolver.java new file mode 100644 index 000000000..8394de47a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/AccessRightResolver.java @@ -0,0 +1,152 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.graph.dag.TargetDagResult; +import gov.nist.csd.pm.pap.graph.dag.UserDagResult; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.ALL_RESOURCE_ACCESS_RIGHTS; + +public class AccessRightResolver { + + private AccessRightResolver() {} + + public static AccessRightSet resolvePrivileges(UserDagResult userCtx, TargetDagResult targetCtx, String target, AccessRightSet resourceOps) { + Map resolvedPcMap = new HashMap<>(); + for (Map.Entry pc : targetCtx.pcSet().entrySet()) { + AccessRightSet pcOps = pc.getValue(); + + // replace instances of *, *a or *r with the literal access rights + resolveWildcardAccessRights(pcOps, resourceOps); + + resolvedPcMap.put(pc.getKey(), pcOps); + } + + AccessRightSet result = resolvePolicyClassAccessRightSets(resolvedPcMap); + + // remove any prohibited access rights + AccessRightSet denied = resolveDeniedAccessRights(userCtx, targetCtx, target); + result.removeAll(denied); + + return result; + } + + public static AccessRightSet resolveDeniedAccessRights(UserDagResult userCtx, TargetDagResult targetCtx, String target) { + AccessRightSet denied = new AccessRightSet(); + Set prohibitions = userCtx.prohibitions(); + Set reachedTargets = targetCtx.reachedTargets(); + + for(Prohibition p : prohibitions) { + if (isProhibitionSatisfied(p, reachedTargets, target)) { + denied.addAll(p.getAccessRightSet()); + } + } + + return denied; + } + + public static List computeSatisfiedProhibitions(UserDagResult userDagResult, TargetDagResult targetDagResult, + String target) { + List satisfied = new ArrayList<>(); + + Set prohibitions = userDagResult.prohibitions(); + Set reachedTargets = targetDagResult.reachedTargets(); + + for(Prohibition p : prohibitions) { + if (isProhibitionSatisfied(p, reachedTargets, target)) { + satisfied.add(p); + } + } + + return satisfied; + } + + private static AccessRightSet resolvePolicyClassAccessRightSets(Map pcMap) { + // retain only the ops that the decider knows about + AccessRightSet allowed = new AccessRightSet(); + boolean first = true; + for (AccessRightSet ops : pcMap.values()) { + if(first) { + allowed.addAll(ops); + first = false; + continue; + } + + // if the ops for the pc are empty then the user has no permissions on the target + if (ops.isEmpty()) { + return new AccessRightSet(); + } else { + allowed.retainAll(ops); + } + } + + return allowed; + } + + private static void resolveWildcardAccessRights(AccessRightSet accessRightSet, AccessRightSet resourceOps) { + // if the permission set includes *, remove the * and add all resource operations + if (accessRightSet.contains(ALL_ACCESS_RIGHTS)) { + accessRightSet.remove(ALL_ACCESS_RIGHTS); + accessRightSet.addAll(allAdminAccessRights()); + accessRightSet.addAll(resourceOps); + } else { + // if the permissions includes *a or *r add all the admin ops/resource ops as necessary + if (accessRightSet.contains(ALL_ADMIN_ACCESS_RIGHTS)) { + accessRightSet.remove(ALL_ADMIN_ACCESS_RIGHTS); + accessRightSet.addAll(allAdminAccessRights()); + } + if (accessRightSet.contains(ALL_RESOURCE_ACCESS_RIGHTS)) { + accessRightSet.remove(ALL_RESOURCE_ACCESS_RIGHTS); + accessRightSet.addAll(resourceOps); + } + } + } + + private static boolean isProhibitionSatisfied(Prohibition prohibition, Set reachedTargets, String target) { + boolean inter = prohibition.isIntersection(); + Collection containers = prohibition.getContainers(); + boolean addOps = false; + + for (ContainerCondition containerCondition : containers) { + String contName = containerCondition.getName(); + boolean isComplement = containerCondition.isComplement(); + + if (target.equals(contName)) { + // if the prohibition is UNION and the target is the container then the prohibition is satisfied + // if the prohibition is INTERSECTION and the target is the container then the prohibition is not satisfied + if (!inter && !isComplement) { + addOps = true; + } + + break; + } + + if (!isComplement && reachedTargets.contains(contName) || isComplement && !reachedTargets.contains(contName)) { + addOps = true; + + // if the prohibition is not intersection, one satisfied container condition means + // the prohibition is satisfied + if (!inter) { + break; + } + } else { + // since the intersection requires the target to satisfy each node condition in the prohibition + // if one is not satisfied then the whole is not satisfied + addOps = false; + + // if the prohibition is the intersection, one unsatisfied container condition means the whole + // prohibition is not satisfied + if (inter) { + break; + } + } + } + + return addOps; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/GraphQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/GraphQuerier.java new file mode 100644 index 000000000..c58e160d6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/GraphQuerier.java @@ -0,0 +1,115 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.Collection; +import java.util.Map; + +public class GraphQuerier extends Querier implements GraphQuery{ + + public GraphQuerier(PolicyStore store) { + super(store); + } + + public GraphQuerier(Querier querier) { + this(querier.store); + } + + @Override + public Node getNode(String name) throws PMException { + checkNodeExists(name); + return store.graph().getNode(name); + } + + @Override + public Collection getAdjacentDescendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getAdjacentDescendants(node); + } + + @Override + public Collection getAdjacentAscendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getAdjacentAscendants(node); + } + + @Override + public Collection getAssociationsWithSource(String ua) throws PMException { + checkNodeExists(ua); + return store.graph().getAssociationsWithSource(ua); + } + + @Override + public Collection getAssociationsWithTarget(String target) throws PMException { + checkNodeExists(target); + return store.graph().getAssociationsWithTarget(target); + } + + @Override + public Collection getAttributeDescendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getAttributeDescendants(node); + } + + @Override + public Collection getPolicyClassDescendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getPolicyClassDescendants(node); + } + + @Override + public boolean isAscendant(String ascendant, String descendant) throws PMException { + checkNodeExists(ascendant); + checkNodeExists(descendant); + return store.graph().isAscendant(ascendant, descendant); + } + + @Override + public boolean isDescendant(String ascendant, String descendant) throws PMException { + checkNodeExists(ascendant); + checkNodeExists(descendant); + return store.graph().isDescendant(ascendant, descendant); + } + + @Override + public boolean nodeExists(String name) throws PMException { + return store.graph().nodeExists(name); + } + + @Override + public Collection search(NodeType type, Map properties) throws PMException { + return store.graph().search(type, properties); + } + + @Override + public Collection getPolicyClasses() throws PMException { + return store.graph().getPolicyClasses(); + } + + @Override + public Collection getAscendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getAscendants(node); + } + + @Override + public Collection getDescendants(String node) throws PMException { + checkNodeExists(node); + return store.graph().getDescendants(node); + } + + /** + * Check that the given nodes exists. + * @param node The node to check. + */ + protected void checkNodeExists(String node) throws PMException { + if (!store.graph().nodeExists(node)) { + throw new NodeDoesNotExistException(node); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/GraphQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/GraphQuery.java new file mode 100644 index 000000000..8c356dd8a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/GraphQuery.java @@ -0,0 +1,140 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; + +import java.util.Collection; +import java.util.Map; + +public interface GraphQuery { + + /** + * Check if a node exists in the graph. + * + * @param name The name of the node to check for. + * @return True if the node exists, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + boolean nodeExists(String name) throws PMException; + + /** + * Get the Node object associated with the given name. + * + * @param name The name of the node to get. + * @return The Node with the given name. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Node getNode(String name) throws PMException; + + /** + * Search for nodes with the given type and/or properties. To return all nodes, use type=NodeType.ANY and properties=new HashMap<>(). + *

+ * Supports wildcard property values i.e. {"prop1": "*"} which will match any nodes with the "prop1" property key. + * + * @param type The type of nodes to search for. Use NodeType.ANY to search for any node type. + * @param properties The properties of nodes to search for. An empty map will match all nodes. + * @return The nodes that match the type and property criteria. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection search(NodeType type, Map properties) throws PMException; + + /** + * Get all policy class names. + * + * @return The names of all policy classes. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getPolicyClasses() throws PMException; + + /** + * Get the adjacent descendants of the given node. + * + * @param node The node to get the descendants of. + * @return The names of the descendants of the given node. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAdjacentDescendants(String node) throws PMException; + + /** + * Get the adjacent ascendants of the given node. + * + * @param node The node to get the ascendants of. + * @return The names of the ascendants of the given node. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAdjacentAscendants(String node) throws PMException; + + /** + * Get the associations in which the given user attribute is the source. + * + * @param ua The user attribute to get the associations for. + * @return The associations in which the source of the relation is the given user attribute. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAssociationsWithSource(String ua) throws PMException; + + /** + * Get the associations in which the given node is the target. + * + * @param target The target attribute to get the associations for. + * @return The associations in which the target of the relation is the given node. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAssociationsWithTarget(String target) throws PMException; + + /** + * Get all ascendants of the node in no particular order. + * @param node The node to get the ascendants for. + * @return The ascendants of the given node. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAscendants(String node) throws PMException; + + /** + * Get all descendants of the node in no particular order. + * @param node The node to get the descendants for. + * @return The descendants of the given node. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getDescendants(String node) throws PMException; + + /** + * Get the descendants of the given node that are attributes. + * + * @param node The node to get the attribute descendants of. + * @return A Collection of attribute names. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getAttributeDescendants(String node) throws PMException; + + /** + * Get the descendants of the given node that are policy classes. + * + * @param node The node to get the policy class descendants of. + * @return A Collection of policy class names. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getPolicyClassDescendants(String node) throws PMException; + + /** + * Return true if the ascendant is an ascendant of the descendant. + * + * @param ascendant The ascendant. + * @param descendant The descendant. + * @return True if the ascendant is an ascendant of the descendant. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + boolean isAscendant(String ascendant, String descendant) throws PMException; + + /** + * Return true if the descendant is a descendant of the ascendant. + * + * @param ascendant The ascendant. + * @param descendant The descendant. + * @return True if the descendant is a descendant of the ascendant. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + boolean isDescendant(String ascendant, String descendant) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuerier.java new file mode 100644 index 000000000..638fd6857 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuerier.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.exception.ObligationDoesNotExistException; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ObligationsQuerier extends Querier implements ObligationsQuery{ + + public ObligationsQuerier(PolicyStore store) { + super(store); + } + + public ObligationsQuerier(Querier querier) { + super(querier); + } + + @Override + public Obligation getObligation(String name) throws PMException { + if (!obligationExists(name)) { + throw new ObligationDoesNotExistException(name); + } + + return store.obligations().getObligation(name); + } + + @Override + public Collection getObligations() throws PMException { + return store.obligations().getObligations(); + } + + @Override + public boolean obligationExists(String name) throws PMException { + return store.obligations().obligationExists(name); + } + + @Override + public Collection getObligationsWithAuthor(String author) throws PMException { + Collection obligations = store.obligations().getObligations(); + List withAuthor = new ArrayList<>(); + for (Obligation obligation : obligations) { + if(obligation.getAuthor().equals(author)) { + withAuthor.add(obligation); + } + } + + return withAuthor; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuery.java new file mode 100644 index 000000000..5b72cc9d5 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/ObligationsQuery.java @@ -0,0 +1,45 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Obligation; + +import java.util.Collection; + +public interface ObligationsQuery { + + /** + * Get all obligations. + * + * @return All obligations. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getObligations() throws PMException; + + /** + * Check if an obligation exists with the given name. + * + * @param name The obligation to check. + * @return True if the obligation exists with the given name, false otherwise. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + boolean obligationExists(String name) throws PMException; + + /** + * Get the obligation associated with the given name. + * + * @param name The name of the obligation to get. + * @return The obligation object associated with the given name. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Obligation getObligation(String name) throws PMException; + + /** + * Get the obligations created by the given author. + * + * @param user The user context representing the author to search for. + * @return A list of Obligation objects. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getObligationsWithAuthor(String user) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuerier.java new file mode 100644 index 000000000..8432e8c09 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuerier.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.OperationDoesNotExistException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.*; + +public class OperationsQuerier extends Querier implements OperationsQuery{ + + public OperationsQuerier(PolicyStore store) { + super(store); + } + + public OperationsQuerier(Querier querier) { + super(querier); + } + + @Override + public AccessRightSet getResourceOperations() throws PMException { + return store.operations().getResourceOperations(); + } + + @Override + public Collection getAdminOperationNames() throws PMException { + return store.operations().getAdminOperationNames(); + } + + @Override + public Operation getAdminOperation(String operationName) throws PMException { + if (!store.operations().getAdminOperationNames().contains(operationName)) { + throw new OperationDoesNotExistException(operationName); + } + + return store.operations().getAdminOperation(operationName); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuery.java new file mode 100644 index 000000000..68e69cc65 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/OperationsQuery.java @@ -0,0 +1,15 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.op.Operation; + +import java.util.Collection; + +public interface OperationsQuery { + + AccessRightSet getResourceOperations() throws PMException; + Collection getAdminOperationNames() throws PMException; + Operation getAdminOperation(String operationName) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuerier.java new file mode 100644 index 000000000..8b0c36fdf --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuerier.java @@ -0,0 +1,54 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.store.PolicyStore; + +public abstract class PolicyQuerier extends Querier implements PolicyQuery { + + private final GraphQuerier graphQuerier; + private final ProhibitionsQuerier prohibitionsQuerier; + private final ObligationsQuerier obligationsQuerier; + private final OperationsQuerier operationsQuerier; + private final RoutinesQuerier routinesQuerier; + + public PolicyQuerier(PolicyStore store) { + super(store); + + this.graphQuerier = new GraphQuerier(store); + this.prohibitionsQuerier = new ProhibitionsQuerier(store, graphQuerier); + this.obligationsQuerier = new ObligationsQuerier(store); + this.operationsQuerier = new OperationsQuerier(store); + this.routinesQuerier = new RoutinesQuerier(store); + } + + public PolicyQuerier(Querier querier) { + this(querier.store); + } + + @Override + public abstract AccessQuerier access(); + + @Override + public GraphQuerier graph() { + return graphQuerier; + } + + @Override + public ProhibitionsQuerier prohibitions() { + return prohibitionsQuerier; + } + + @Override + public ObligationsQuerier obligations() { + return obligationsQuerier; + } + + @Override + public OperationsQuerier operations() { + return operationsQuerier; + } + + @Override + public RoutinesQuerier routines() { + return routinesQuerier; + } +} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuery.java new file mode 100644 index 000000000..75290abb8 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/PolicyQuery.java @@ -0,0 +1,11 @@ +package gov.nist.csd.pm.pap.query; + +public interface PolicyQuery { + + AccessQuery access(); + GraphQuery graph(); + ProhibitionsQuery prohibitions(); + ObligationsQuery obligations(); + OperationsQuery operations(); + RoutinesQuery routines(); +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerier.java new file mode 100644 index 000000000..867239e98 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerier.java @@ -0,0 +1,81 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.DepthFirstGraphWalker; +import gov.nist.csd.pm.pap.graph.dag.Direction; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.exception.ProhibitionDoesNotExistException; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public class ProhibitionsQuerier extends Querier implements ProhibitionsQuery { + + private GraphQuerier graphQuerier; + + public ProhibitionsQuerier(PolicyStore store, GraphQuerier graphQuerier) { + super(store); + + this.graphQuerier = graphQuerier; + } + + public ProhibitionsQuerier(Querier querier) { + super(querier); + } + + @Override + public Map> getProhibitions() throws PMException { + return store.prohibitions().getProhibitions(); + } + + @Override + public Collection getProhibitionsWithSubject(String subject) throws PMException { + return store.prohibitions().getProhibitions().getOrDefault(subject, new ArrayList<>()); + } + + @Override + public Prohibition getProhibition(String name) throws PMException { + if (!store.prohibitions().prohibitionExists(name)) { + throw new ProhibitionDoesNotExistException(name); + } + + return store.prohibitions().getProhibition(name); + } + + @Override + public Collection getInheritedProhibitionsFor(String subject) throws PMException { + List pros = new ArrayList<>(); + + new DepthFirstGraphWalker(graphQuerier) + .withVisitor((n) -> { + pros.addAll(getProhibitionsWithSubject(n)); + }) + .withDirection(Direction.DESCENDANTS) + .walk(subject); + + return pros; + } + + @Override + public Collection getProhibitionsWithContainer(String container) throws PMException { + Collection pros = new ArrayList<>(); + + Map> prohibitions = getProhibitions(); + for (String subject : prohibitions.keySet()) { + Collection subjectProhibitions = prohibitions.get(subject); + for (Prohibition prohibition : subjectProhibitions) { + for (ContainerCondition cc : prohibition.getContainers()) { + if (cc.getName().equals(container)) { + pros.add(prohibition); + } + } + } + } + + return pros; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuery.java new file mode 100644 index 000000000..d4933a702 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/ProhibitionsQuery.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.prohibition.Prohibition; + +import java.util.Collection; +import java.util.Map; + +public interface ProhibitionsQuery { + + /** + * Get all prohibitions. + * + * @return All prohibitions. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Map> getProhibitions() throws PMException; + + /** + * Get prohibitions with the given subject. + * + * @param subject The subject to get the prohibitions for (user, user attribute, process) + * @return The prohibitions with the given subject. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Collection getProhibitionsWithSubject(String subject) throws PMException; + + /** + * Get the prohibition with the given name. + * @param name The public abstract of the prohibition to get. + * @return The prohibition with the given public abstract. + * @throws PMException If any PM related exceptions occur in the implementing class. + */ + Prohibition getProhibition(String name) throws PMException; + + Collection getInheritedProhibitionsFor(String subject) throws PMException; + Collection getProhibitionsWithContainer(String container) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/Querier.java b/src/main/java/gov/nist/csd/pm/pap/query/Querier.java new file mode 100644 index 000000000..0e75c850a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/Querier.java @@ -0,0 +1,16 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.store.PolicyStore; + +public abstract class Querier { + + protected PolicyStore store; + + public Querier(PolicyStore store) { + this.store = store; + } + + public Querier(Querier querier) { + this(querier.store); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuerier.java b/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuerier.java new file mode 100644 index 000000000..0315d616c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuerier.java @@ -0,0 +1,33 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.exception.RoutineDoesNotExistException; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pap.store.PolicyStore; + +import java.util.*; + +public class RoutinesQuerier extends Querier implements RoutinesQuery { + + public RoutinesQuerier(PolicyStore store) { + super(store); + } + + public RoutinesQuerier(Querier querier) { + super(querier); + } + + @Override + public Collection getAdminRoutineNames() throws PMException { + return store.routines().getAdminRoutineNames(); + } + + @Override + public Routine getAdminRoutine(String routineName) throws PMException { + if (!store.routines().getAdminRoutineNames().contains(routineName)) { + throw new RoutineDoesNotExistException(routineName); + } + + return store.routines().getAdminRoutine(routineName); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuery.java b/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuery.java new file mode 100644 index 000000000..7f0bafbfe --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/RoutinesQuery.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.Collection; + +public interface RoutinesQuery { + + Collection getAdminRoutineNames() throws PMException; + Routine getAdminRoutine(String routineName) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/access/UserContext.java b/src/main/java/gov/nist/csd/pm/pap/query/UserContext.java similarity index 96% rename from src/main/java/gov/nist/csd/pm/policy/model/access/UserContext.java rename to src/main/java/gov/nist/csd/pm/pap/query/UserContext.java index d4c8ecb43..1fa972fa2 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/access/UserContext.java +++ b/src/main/java/gov/nist/csd/pm/pap/query/UserContext.java @@ -1,4 +1,4 @@ -package gov.nist.csd.pm.policy.model.access; +package gov.nist.csd.pm.pap.query; import java.io.Serializable; import java.util.Objects; diff --git a/src/main/java/gov/nist/csd/pm/policy/model/audit/EdgePath.java b/src/main/java/gov/nist/csd/pm/pap/query/explain/EdgePath.java similarity index 87% rename from src/main/java/gov/nist/csd/pm/policy/model/audit/EdgePath.java rename to src/main/java/gov/nist/csd/pm/pap/query/explain/EdgePath.java index 0ad5f3505..c2380791d 100644 --- a/src/main/java/gov/nist/csd/pm/policy/model/audit/EdgePath.java +++ b/src/main/java/gov/nist/csd/pm/pap/query/explain/EdgePath.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.model.audit; +package gov.nist.csd.pm.pap.query.explain; -import gov.nist.csd.pm.policy.model.graph.relationships.Relationship; +import gov.nist.csd.pm.pap.graph.relationship.Relationship; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/gov/nist/csd/pm/pap/query/explain/Explain.java b/src/main/java/gov/nist/csd/pm/pap/query/explain/Explain.java new file mode 100644 index 000000000..299072687 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/explain/Explain.java @@ -0,0 +1,115 @@ +package gov.nist.csd.pm.pap.query.explain; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.Prohibition; + +import java.util.*; + +public class Explain { + private AccessRightSet privileges; + private Map policyClasses; + private AccessRightSet deniedPrivileges; + private List prohibitions; + + public Explain() { + privileges = new AccessRightSet(); + policyClasses = new HashMap<>(); + deniedPrivileges = new AccessRightSet(); + prohibitions = new ArrayList<>(); + } + + public Explain(AccessRightSet privileges, Map policyClasses) { + this.privileges = privileges; + this.policyClasses = policyClasses; + } + + public Explain(AccessRightSet privileges, Map policyClasses, AccessRightSet deniedPrivileges, + List prohibitions) { + this.privileges = privileges; + this.policyClasses = policyClasses; + this.deniedPrivileges = deniedPrivileges; + this.prohibitions = prohibitions; + } + + public AccessRightSet getPrivileges() { + return privileges; + } + + public void setPrivileges(AccessRightSet privileges) { + this.privileges = privileges; + } + + public Map getPolicyClasses() { + return policyClasses; + } + + public void setPolicyClasses(Map policyClasses) { + this.policyClasses = policyClasses; + } + + public AccessRightSet getDeniedPrivileges() { + return deniedPrivileges; + } + + public void setDeniedPrivileges(AccessRightSet deniedPrivileges) { + this.deniedPrivileges = deniedPrivileges; + } + + public List getProhibitions() { + return prohibitions; + } + + public void setProhibitions(List prohibitions) { + this.prohibitions = prohibitions; + } + + @Override + public String toString() { + StringBuilder str = new StringBuilder("Privileges: " + privileges.toString()); + str.append("\nDenied: ").append(deniedPrivileges); + + for (String pc : policyClasses.keySet()) { + PolicyClassExplain policyClass = policyClasses.get(pc); + str.append("\n\t\t").append(pc).append(": ").append(policyClass.getArset()); + } + + str.append("\nPaths:"); + for (String pc : policyClasses.keySet()) { + PolicyClassExplain policyClass = policyClasses.get(pc); + str.append("\n\t\t").append(pc).append(": ").append(policyClass.getArset()); + Set paths = policyClass.getPaths(); + for (Path path : paths) { + str.append("\n\t\t\t- ").append(path); + } + } + + if (!deniedPrivileges.isEmpty()) { + str.append("\nProhibitions:"); + for (Prohibition p : prohibitions) { + str.append("\n- ").append(p); + } + } + + return str.toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Explain explain = (Explain) o; + return Objects.equals(privileges, explain.privileges) && Objects.equals( + policyClasses, explain.policyClasses) && Objects.equals( + deniedPrivileges, explain.deniedPrivileges) && Objects.equals( + prohibitions, explain.prohibitions); + } + + @Override + public int hashCode() { + return Objects.hash(privileges, policyClasses, deniedPrivileges, prohibitions); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/explain/Path.java b/src/main/java/gov/nist/csd/pm/pap/query/explain/Path.java new file mode 100644 index 000000000..98b059d70 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/explain/Path.java @@ -0,0 +1,76 @@ +package gov.nist.csd.pm.pap.query.explain; + +import gov.nist.csd.pm.pap.graph.relationship.Association; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class Path { + private List userDagPath; + private List targetDagPath; + private Association association; + + public Path() { + userDagPath = new ArrayList<>(); + targetDagPath = new ArrayList<>(); + association = new Association(); + } + + public Path(List userDagPath, List targetDagPath, Association association) { + this.userDagPath = userDagPath; + this.targetDagPath = targetDagPath; + this.association = association; + } + + public List getUserDagPath() { + return userDagPath; + } + + public void setUserDagPath(List userDagPath) { + this.userDagPath = userDagPath; + } + + public List getTargetDagPath() { + return targetDagPath; + } + + public void setTargetDagPath(List targetDagPath) { + this.targetDagPath = targetDagPath; + } + + public Association getAssociation() { + return association; + } + + public void setAssociation(Association association) { + this.association = association; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Path path = (Path) o; + return Objects.equals(userDagPath, path.userDagPath) && Objects.equals( + targetDagPath, path.targetDagPath) && Objects.equals(association, path.association); + } + + @Override + public int hashCode() { + return Objects.hash(userDagPath, targetDagPath, association); + } + + @Override + public String toString() { + return "{" + + "userPath=" + userDagPath + + ", targetPath=" + targetDagPath + + ", association=" + association + + '}'; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/query/explain/PolicyClassExplain.java b/src/main/java/gov/nist/csd/pm/pap/query/explain/PolicyClassExplain.java new file mode 100644 index 000000000..745f0df26 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/query/explain/PolicyClassExplain.java @@ -0,0 +1,56 @@ +package gov.nist.csd.pm.pap.query.explain; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +public class PolicyClassExplain { + + private AccessRightSet arset; + private Set paths; + + public PolicyClassExplain() { + arset = new AccessRightSet(); + paths = new HashSet<>(); + } + + public PolicyClassExplain(AccessRightSet arset, Set paths) { + this.arset = arset; + this.paths = paths; + } + + public AccessRightSet getArset() { + return arset; + } + + public void setArset(AccessRightSet arset) { + this.arset = arset; + } + + public Set getPaths() { + return paths; + } + + public void setPaths(Set paths) { + this.paths = paths; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PolicyClassExplain that = (PolicyClassExplain) o; + return Objects.equals(arset, that.arset) && Objects.equals(paths, that.paths); + } + + @Override + public int hashCode() { + return Objects.hash(arset, paths); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/routine/Routine.java b/src/main/java/gov/nist/csd/pm/pap/routine/Routine.java new file mode 100644 index 000000000..64f56a078 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/routine/Routine.java @@ -0,0 +1,12 @@ +package gov.nist.csd.pm.pap.routine; + +import gov.nist.csd.pm.pap.executable.AdminExecutable; + +import java.util.List; + +public abstract class Routine extends AdminExecutable { + + public Routine(String name, List operandNames) { + super(name, operandNames); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/PolicyDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/PolicyDeserializer.java new file mode 100644 index 000000000..6e7a33a40 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/PolicyDeserializer.java @@ -0,0 +1,11 @@ +package gov.nist.csd.pm.pap.serialization; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; + +public interface PolicyDeserializer { + + void deserialize(PAP pap, UserContext author, String input) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/PolicySerializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/PolicySerializer.java new file mode 100644 index 000000000..8ef8f5b5f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/PolicySerializer.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.serialization; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.PolicyQuery; + +public interface PolicySerializer { + + String serialize(PolicyQuery policyQuery) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONAssociation.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONAssociation.java new file mode 100644 index 000000000..b6ca8019c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONAssociation.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +public class JSONAssociation { + + private String target; + private AccessRightSet arset; + + public JSONAssociation() { + arset = new AccessRightSet(); + } + + public JSONAssociation(String target, AccessRightSet arset) { + this.target = target; + this.arset = arset; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } + + public AccessRightSet getArset() { + return arset; + } + + public void setArset(AccessRightSet arset) { + this.arset = arset; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONConstant.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONConstant.java new file mode 100644 index 000000000..efc54ce1b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONConstant.java @@ -0,0 +1,5 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import gov.nist.csd.pm.pap.pml.value.Value; + +public record JSONConstant(Class valueClass, String value) { } diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONDeserializer.java new file mode 100644 index 000000000..3dcfe412a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONDeserializer.java @@ -0,0 +1,158 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.serialization.PolicyDeserializer; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.graph.node.NodeType; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; + +public class JSONDeserializer implements PolicyDeserializer { + + @Override + public void deserialize(PAP pap, UserContext author, String input) throws PMException { + Gson gson = new Gson(); + JSONPolicy jsonPolicy = gson.fromJson(input, new TypeToken() {}.getType()); + + pap.modify().operations().setResourceOperations(jsonPolicy.getResourceOperations()); + + createGraph(pap, jsonPolicy.getGraph()); + createRestOfPolicy( + pap, + author, + jsonPolicy.getProhibitions(), + jsonPolicy.getObligations(), + jsonPolicy.getOperations(), + jsonPolicy.getRoutines() + ); + } + + private void createRestOfPolicy(PAP pap, + UserContext author, + List prohibitions, + List obligations, + List operations, + List routines) throws PMException { + StringBuilder sb = new StringBuilder(); + for (String prohibition : prohibitions) { + sb.append(prohibition).append("\n"); + } + + for (String obligation : obligations) { + sb.append(obligation).append("\n"); + } + + for (String operation : operations) { + sb.append(operation).append("\n"); + } + + for (String routine : routines) { + sb.append(routine).append("\n"); + } + + pap.executePML(author, sb.toString()); + } + + private void createGraph(PAP pap, JSONGraph graph) + throws PMException { + createPCs(pap, graph); + + // create uas + createNodes(pap, UA, graph.uas); + + // create oas + createNodes(pap, OA, graph.oas); + + // associate uas and uas/oas + createAssociations(pap, graph.uas); + + // create u and o + createNodes(pap, U, graph.users); + createNodes(pap, O, graph.objects); + } + + private void createPCs(PAP pap, JSONGraph graph) throws PMException { + // create all policy class nodes first + for (Map.Entry policyClass : graph.pcs.entrySet()) { + Map properties = policyClass.getValue().getProperties(); + pap.modify().graph().createPolicyClass(policyClass.getKey()); + + if (properties != null) { + pap.modify().graph().setNodeProperties(policyClass.getKey(), properties); + } + + } + } + + private void createAssociations(PAP pap, Map uas) throws PMException { + for (Map.Entry entry : uas.entrySet()) { + String ua = entry.getKey(); + JSONNode jsonNode = entry.getValue(); + Map associations = jsonNode.getAssociations(); + if (associations == null) { + continue; + } + + for (Map.Entry association : associations.entrySet()) { + pap.modify().graph().associate(ua, association.getKey(), association.getValue()); + } + } + } + + private void createNodes(PAP pap, NodeType type, Map nodes) + throws PMException { + Set> entries = nodes.entrySet(); + for (Map.Entry entry : entries) { + String name = entry.getKey(); + createNode(pap, name, type, nodes); + } + } + + private void createNode(PAP pap, String name, NodeType type, Map nodes) throws PMException { + if (pap.query().graph().nodeExists(name)) { + return; + } + + JSONNode jsonNode = nodes.get(name); + + Collection assignments = jsonNode.getAssignments(); + boolean created = false; + for (String assignment : assignments) { + if (!pap.query().graph().nodeExists(assignment)) { + createNode(pap, assignment, type, nodes); + } + createOrAssign(pap, created, name, type, jsonNode, assignment); + created = true; + } + } + + private void createOrAssign(PAP pap, boolean create, String name, NodeType type, JSONNode node, String assignment) throws PMException { + if (!create) { + // create node + createNode(pap, type, name, node, List.of(assignment)); + + // set properties + if (node.getProperties() != null) { + pap.modify().graph().setNodeProperties(name, node.getProperties()); + } + } else { + pap.modify().graph().assign(name, List.of(assignment)); + } + } + + private void createNode(PAP pap, NodeType type, String key, JSONNode value, List existingAssignmentNodes) + throws PMException { + switch (type) { + case OA -> pap.modify().graph().createObjectAttribute(key, existingAssignmentNodes); + case UA -> pap.modify().graph().createUserAttribute(key, existingAssignmentNodes); + case O -> pap.modify().graph().createObject(key, value.getAssignments()); + case U -> pap.modify().graph().createUser(key, value.getAssignments()); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONGraph.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONGraph.java new file mode 100644 index 000000000..7e6699efd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONGraph.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import java.util.Map; + +public class JSONGraph { + + Map pcs; + Map uas; + Map oas; + Map users; + Map objects; + + public JSONGraph(Map pcs, + Map uas, + Map oas, + Map users, + Map objects) { + this.pcs = pcs; + this.uas = uas; + this.oas = oas; + this.users = users; + this.objects = objects; + } + + public Map getPcs() { + return pcs; + } + + public void setPcs(Map pcs) { + this.pcs = pcs; + } + + public Map getUas() { + return uas; + } + + public void setUas(Map uas) { + this.uas = uas; + } + + public Map getOas() { + return oas; + } + + public void setOas(Map oas) { + this.oas = oas; + } + + public Map getUsers() { + return users; + } + + public void setUsers(Map users) { + this.users = users; + } + + public Map getObjects() { + return objects; + } + + public void setObjects(Map objects) { + this.objects = objects; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONNode.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONNode.java new file mode 100644 index 000000000..00bde7b1b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONNode.java @@ -0,0 +1,75 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +import java.util.Collection; +import java.util.Map; +import java.util.Objects; + +public class JSONNode { + + private Map properties; + private Collection assignments; + private Map associations; + + public JSONNode(Map properties, Collection assignments) { + if (!properties.isEmpty()) { + this.properties = properties; + } + + if (!assignments.isEmpty()) { + this.assignments = assignments; + } + } + + public JSONNode(Map properties, + Collection assignments, + Map associations) { + this(properties, assignments); + this.associations = associations; + } + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public Collection getAssignments() { + return assignments; + } + + public void setAssignments(Collection assignments) { + this.assignments = assignments; + } + + public Map getAssociations() { + return associations; + } + + public void setAssociations(Map associations) { + this.associations = associations; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + JSONNode jsonNode = (JSONNode) o; + return Objects.equals(properties, jsonNode.properties) && Objects.equals( + assignments, + jsonNode.assignments + ); + } + + @Override + public int hashCode() { + return Objects.hash(properties, assignments); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicy.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicy.java new file mode 100644 index 000000000..f475c6a22 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicy.java @@ -0,0 +1,87 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; + +import java.util.List; + +public class JSONPolicy { + + private AccessRightSet resourceOperations; + private JSONGraph graph; + private List prohibitions; + private List obligations; + private List operations; + private List routines; + + public JSONPolicy(AccessRightSet resourceOperations, JSONGraph graph, List prohibitions, List obligations, List operations, List routines) { + this.resourceOperations = resourceOperations; + this.graph = graph; + this.prohibitions = prohibitions; + this.obligations = obligations; + this.operations = operations; + this.routines = routines; + } + + public AccessRightSet getResourceOperations() { + return resourceOperations; + } + + public void setResourceOperations(AccessRightSet resourceOperations) { + this.resourceOperations = resourceOperations; + } + + public JSONGraph getGraph() { + return graph; + } + + public void setGraph(JSONGraph graph) { + this.graph = graph; + } + + public List getProhibitions() { + return prohibitions; + } + + public void setProhibitions(List prohibitions) { + this.prohibitions = prohibitions; + } + + public List getObligations() { + return obligations; + } + + public void setObligations(List obligations) { + this.obligations = obligations; + } + + public List getOperations() { + return operations; + } + + public void setOperations(List operations) { + this.operations = operations; + } + + public List getRoutines() { + return routines; + } + + public void setRoutines(List routines) { + this.routines = routines; + } + + @Override + public String toString() { + return new GsonBuilder() + .setPrettyPrinting() + .disableHtmlEscaping() + .create() + .toJson(this); + } + + public static JSONPolicy fromJSON(String json) { + return new Gson().fromJson(json, JSONPolicy.class); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicyClass.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicyClass.java new file mode 100644 index 000000000..a09e1e552 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONPolicyClass.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import java.util.List; +import java.util.Map; + +public class JSONPolicyClass { + + private Map properties; + + public JSONPolicyClass() { + + } + + public JSONPolicyClass(Map properties) { + this.properties = properties; + } + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONSerializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONSerializer.java new file mode 100644 index 000000000..c43fe8105 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/json/JSONSerializer.java @@ -0,0 +1,185 @@ +package gov.nist.csd.pm.pap.serialization.json; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.admin.AdminPolicy; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementSerializable; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pap.serialization.PolicySerializer; +import gov.nist.csd.pm.pap.query.PolicyQuery; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; + +public class JSONSerializer implements PolicySerializer { + + @Override + public String serialize(PolicyQuery policyQuery) throws PMException { + return buildJSONPolicy(policyQuery) + .toString(); + } + + public JSONPolicy buildJSONPolicy(PolicyQuery policyQuery) throws PMException { + return new JSONPolicy( + policyQuery.operations().getResourceOperations(), + buildGraphJSON(policyQuery), + buildProhibitionsJSON(policyQuery), + buildObligationsJSON(policyQuery), + buildOperationsJSON(policyQuery), + buildRoutinesJSON(policyQuery) + ); + } + + private List buildRoutinesJSON(PolicyQuery policyQuery) throws PMException { + // can only serialize if implements PMLStatementSerializer + List json = new ArrayList<>(); + + Collection adminRoutineNames = policyQuery.routines().getAdminRoutineNames(); + for (String adminOperationName : adminRoutineNames) { + Routine routine = policyQuery.routines().getAdminRoutine(adminOperationName); + if (routine instanceof PMLStatementSerializable pmlStatementSerializable) { + json.add(pmlStatementSerializable.toFormattedString(0)); + } + } + + return json; + } + + private List buildOperationsJSON(PolicyQuery policyQuery) throws PMException { + // can only serialize if implements PMLStatementSerializer + List json = new ArrayList<>(); + + Collection adminOperationNames = policyQuery.operations().getAdminOperationNames(); + for (String adminOperationName : adminOperationNames) { + Operation operation = policyQuery.operations().getAdminOperation(adminOperationName); + if (operation instanceof PMLStatementSerializable pmlStatementSerializable) { + json.add(pmlStatementSerializable.toFormattedString(0)); + } + } + + return json; + } + + private List buildObligationsJSON(PolicyQuery policyQuery) throws PMException { + List jsonObligations = new ArrayList<>(); + Collection all = policyQuery.obligations().getObligations(); + for (Obligation obligation : all) { + jsonObligations.add(obligation.toString()); + } + + return jsonObligations; + } + + private List buildProhibitionsJSON(PolicyQuery policyQuery) throws PMException { + List prohibitions = new ArrayList<>(); + Map> all = policyQuery.prohibitions().getProhibitions(); + for (Collection value : all.values()) { + for (Prohibition prohibition : value) { + prohibitions.add(prohibition.toString()); + } + } + + return prohibitions; + } + + private JSONGraph buildGraphJSON(PolicyQuery policyQuery) throws PMException { + return new JSONGraph( + buildPolicyClasses(policyQuery), + buildUserAttributes(policyQuery), + buildNonUANodes(policyQuery, OA), + buildNonUANodes(policyQuery, U), + buildNonUANodes(policyQuery, O) + ); + } + + private Map buildNonUANodes(PolicyQuery policyQuery, NodeType type) throws PMException { + Map nodes = new HashMap<>(); + + Collection search = policyQuery.graph().search(type, new HashMap<>()); + for (String node : search) { + if (isUnmodifiedAdminNodeOrTarget(policyQuery, node)) { + continue; + } + + Node n = policyQuery.graph().getNode(node); + + String name = n.getName(); + Map properties = n.getProperties(); + Collection descs = new ArrayList<>(policyQuery.graph().getAdjacentDescendants(name)); + + nodes.put(name, new JSONNode(properties, descs)); + } + + return nodes; + } + + private boolean isUnmodifiedAdminNodeOrTarget(PolicyQuery policyQuery, String node) throws PMException { + Collection descendants = policyQuery.graph().getAdjacentDescendants(node); + return descendants.contains(AdminPolicyNode.ADMIN_POLICY.nodeName()) && descendants.size() == 1; + } + + private Map buildUserAttributes(PolicyQuery policyQuery) throws PMException { + Map userAttributes = new HashMap<>(); + + Collection search = policyQuery.graph().search(UA, new HashMap<>()); + for (String node : search) { + Node n = policyQuery.graph().getNode(node); + + String name = n.getName(); + Map properties = n.getProperties(); + Collection descendants = policyQuery.graph().getAdjacentDescendants(name); + Collection assocList = policyQuery.graph().getAssociationsWithSource(name); + Map assocMap = new HashMap<>(); + + for (Association assoc : assocList) { + assocMap.put(assoc.getTarget(), assoc.getAccessRightSet()); + } + + JSONNode jsonNode; + if (assocMap.isEmpty()) { + jsonNode = new JSONNode(properties, descendants); + } else { + jsonNode = new JSONNode(properties, descendants, assocMap); + } + + userAttributes.put(name, jsonNode); + } + + return userAttributes; + } + + private Map buildPolicyClasses(PolicyQuery policyQuery) throws PMException { + Map policyClassesList = new HashMap<>(); + + Collection policyClasses = policyQuery.graph().getPolicyClasses(); + for (String pc : policyClasses) { + if (AdminPolicy.isAdminPolicyNodeName(pc)) { + continue; + } + + JSONPolicyClass jsonPolicyClass = buildJSONPolicyCLass(pc, policyQuery); + + policyClassesList.put(pc, jsonPolicyClass); + } + + return policyClassesList; + } + + private JSONPolicyClass buildJSONPolicyCLass(String pc, PolicyQuery policyQuery) throws PMException { + Node node = policyQuery.graph().getNode(pc); + JSONPolicyClass jsonPolicyClass = new JSONPolicyClass(); + if (!node.getProperties().isEmpty()) { + jsonPolicyClass.setProperties(node.getProperties()); + } + + return jsonPolicyClass; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLDeserializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLDeserializer.java new file mode 100644 index 000000000..244211367 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLDeserializer.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.pap.serialization.pml; + +import gov.nist.csd.pm.pap.serialization.PolicyDeserializer; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; + +public class PMLDeserializer implements PolicyDeserializer { + + @Override + public void deserialize(PAP pap, UserContext author, String input) throws PMException { + pap.executePML(author, input); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLSerializer.java b/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLSerializer.java new file mode 100644 index 000000000..a341df7bd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/serialization/pml/PMLSerializer.java @@ -0,0 +1,280 @@ +package gov.nist.csd.pm.pap.serialization.pml; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.admin.AdminPolicy; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.MapLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.statement.operation.*; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.serialization.PolicySerializer; +import gov.nist.csd.pm.pap.query.PolicyQuery; +import gov.nist.csd.pm.pap.serialization.json.*; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; + +public class PMLSerializer implements PolicySerializer { + + @Override + public String serialize(PolicyQuery policyQuery) throws PMException { + JSONSerializer json = new JSONSerializer(); + JSONPolicy jsonPolicy = json.buildJSONPolicy(policyQuery); + + return serialize(jsonPolicy); + } + + private String serialize(JSONPolicy jsonPolicy) { + StringBuilder sb = new StringBuilder(); + + sb.append("// resource operations\n"); + sb.append(jsonResourceOperations(jsonPolicy.getResourceOperations())); + + sb.append("\n// GRAPH\n"); + sb.append(jsonGraphToPML(jsonPolicy.getGraph())); + + sb.append("\n// PROHIBITIONS\n"); + sb.append(concatStrings(jsonPolicy.getProhibitions())); + + sb.append("\n// OBLIGATIONS\n"); + sb.append(concatStrings(jsonPolicy.getObligations())); + + sb.append("\n// OPERATIONS\n"); + sb.append(concatStrings(jsonPolicy.getOperations())); + + sb.append("\n// ROUTINES\n"); + sb.append(concatStrings(jsonPolicy.getRoutines())); + + return sb.toString(); + } + + private String jsonResourceOperations(AccessRightSet accessRightSet) { + List expressions = new ArrayList<>(); + for (String ar : accessRightSet) { + expressions.add(new StringLiteral(ar)); + } + + ArrayLiteral arrayLiteral = new ArrayLiteral(expressions, Type.string()); + + return new SetResourceOperationsStatement(arrayLiteral).toFormattedString(0) + "\n"; + } + + private String jsonGraphToPML(JSONGraph jsonGraph) { + StringBuilder pml = new StringBuilder(); + + pml.append(buildPolicyClassesPML(jsonGraph)); + pml.append(buildAttributesPML(jsonGraph.getPcs().keySet(), jsonGraph.getUas(), UA)); + pml.append(buildAttributesPML(jsonGraph.getPcs().keySet(), jsonGraph.getOas(), OA)); + pml.append(buildAssociations(jsonGraph.getUas())); + pml.append(buildUsersAndObjectsPML(jsonGraph)); + + return pml.toString(); + } + + private String buildAssociations(Map uas) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry ua : uas.entrySet()) { + String name = ua.getKey(); + JSONNode node = ua.getValue(); + + Map associations = node.getAssociations(); + if (associations == null) { + continue; + } + + for (Map.Entry assoc : associations.entrySet()) { + sb.append( + new AssociateStatement( + buildNameExpression(name), + buildNameExpression(assoc.getKey()), + setToExpression(assoc.getValue()) + ) + ).append("\n"); + } + } + + return sb.toString(); + } + + private String buildAttributesPML(Set pcs, Map attrs, NodeType type) { + StringBuilder pml = new StringBuilder(); + + Set createNodes = new HashSet<>(pcs); + + Set> entries = attrs.entrySet(); + for (Map.Entry entry : entries) { + String name = entry.getKey(); + createNode(pml, createNodes, name, type, attrs); + } + + return pml.toString(); + } + + private void createNode(StringBuilder sb, Set createdNodes, String name, NodeType type, Map nodes) { + if (createdNodes.contains(name)) { + return; + } + + JSONNode jsonNode = nodes.get(name); + + Collection assignments = jsonNode.getAssignments(); + boolean created = false; + for (String assignment : assignments) { + if (!createdNodes.contains(assignment)) { + createNode(sb, createdNodes, assignment, type, nodes); + } + createOrAssign(sb, createdNodes, created, name, type, jsonNode, assignment); + created = true; + } + } + + private void createOrAssign(StringBuilder sb, Set createdNodes, boolean create, String name, NodeType type, JSONNode node, String assignment) { + if (!create) { + sb.append(jsonNodeToPML(createdNodes, name, type, node, List.of(assignment))); + createdNodes.add(name); + } else { + sb.append(new AssignStatement( + buildNameExpression(name), + setToExpression(Set.of(assignment)) + )).append("\n"); + } + } + + private String buildPolicyClassesPML(JSONGraph jsonGraph) { + StringBuilder sb = new StringBuilder(); + + sb.append("// policy classes\n"); + + Map pcs = jsonGraph.getPcs(); + for (Map.Entry e : pcs.entrySet()) { + // do not serialize admin policy node + if (AdminPolicy.isAdminPolicyNodeName(e.getKey())) { + continue; + } + + sb.append(new CreatePolicyStatement( + buildNameExpression(e.getKey()) + )).append("\n"); + + SetNodePropertiesStatement setNodePropertiesStatement = + buildSetNodePropertiesStatement(e.getKey(), e.getValue().getProperties()); + if (setNodePropertiesStatement != null) { + sb.append(setNodePropertiesStatement).append("\n"); + } + } + + return sb.toString(); + } + + private String buildUsersAndObjectsPML(JSONGraph jsonGraph) { + StringBuilder sb = new StringBuilder(); + + sb.append("\n// users\n"); + for (Map.Entry e : jsonGraph.getUsers().entrySet()) { + sb.append(jsonNodeToPML(new HashSet<>(), e.getKey(), U, e.getValue(), e.getValue().getAssignments())); + } + + sb.append("\n// objects\n"); + for (Map.Entry e : jsonGraph.getObjects().entrySet()) { + sb.append(jsonNodeToPML(new HashSet<>(), e.getKey(), O, e.getValue(), e.getValue().getAssignments())); + } + + return sb.toString(); + } + + private String jsonNodeToPML(Set seen, String name, NodeType type, JSONNode jsonNode, Collection assignments) { + StringBuilder sb = new StringBuilder(); + + // if node is an admin node, assign to assignments not create + if (seen.contains(name)) { + sb.append(new AssignStatement( + buildNameExpression(name), + setToExpression(new HashSet<>(assignments)) + )).append("\n"); + } else { + sb.append(new CreateNonPCStatement( + buildNameExpression(name), + type, + setToExpression(new HashSet<>(assignments)) + )).append("\n"); + } + + SetNodePropertiesStatement setNodePropertiesStatement = + buildSetNodePropertiesStatement(name, jsonNode.getProperties()); + if (setNodePropertiesStatement != null) { + sb.append(setNodePropertiesStatement).append("\n"); + } + + return sb.toString(); + + } + + private String concatStrings(List strings) { + StringBuilder pml = new StringBuilder(); + + for (String s : strings) { + pml.append(s).append("\n"); + } + + return pml.toString(); + } + + private Expression buildNameExpression(String name) { + if (AdminPolicy.isAdminPolicyNodeName(name)) { + return new ReferenceByID( + AdminPolicyNode.fromNodeName(name).constantName() + ); + } + + return new StringLiteral(name); + } + + private ArrayLiteral setToExpression(Set set) { + Expression[] expressions = new Expression[set.size()]; + int i = 0; + for (String s : set) { + expressions[i] = buildNameExpression(s); + i++; + } + + return new ArrayLiteral( + expressions, + Type.string() + ); + } + + private SetNodePropertiesStatement buildSetNodePropertiesStatement(String name, Map properties) { + Expression propertiesExpression = propertiesMapToExpression(properties); + if (propertiesExpression == null) { + return null; + } + + return new SetNodePropertiesStatement( + buildNameExpression(name), + propertiesExpression + ); + } + + private Expression propertiesMapToExpression(Map properties) { + if (properties == null || properties.isEmpty()) { + return null; + } + + Map propertiesExpressions = new HashMap<>(); + for (Map.Entry property : properties.entrySet()) { + propertiesExpressions.put( + new StringLiteral(property.getKey()), + new StringLiteral(property.getValue()) + ); + } + + return new MapLiteral(propertiesExpressions, Type.string(), Type.string()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/GraphStore.java b/src/main/java/gov/nist/csd/pm/pap/store/GraphStore.java new file mode 100644 index 000000000..e6eae1a78 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/GraphStore.java @@ -0,0 +1,37 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.tx.Transactional; + +import java.util.Collection; +import java.util.Map; + +public interface GraphStore extends Transactional { + + void createNode(String name, NodeType type) throws PMException; + void deleteNode(String name) throws PMException; + void setNodeProperties(String name, Map properties) throws PMException; + void createAssignment(String start, String end) throws PMException; + void deleteAssignment(String start, String end) throws PMException; + void createAssociation(String ua, String target, AccessRightSet arset) throws PMException; + void deleteAssociation(String ua, String target) throws PMException; + + Node getNode(String name) throws PMException; + boolean nodeExists(String name) throws PMException; + Collection search(NodeType type, Map properties) throws PMException; + Collection getPolicyClasses() throws PMException; + Collection getAdjacentDescendants(String name) throws PMException; + Collection getAdjacentAscendants(String name) throws PMException; + Collection getAssociationsWithSource(String ua) throws PMException; + Collection getAssociationsWithTarget(String target) throws PMException; + Collection getAscendants(String node) throws PMException; + Collection getPolicyClassDescendants(String node) throws PMException; + Collection getAttributeDescendants(String node) throws PMException; + Collection getDescendants(String node) throws PMException; + boolean isAscendant(String asc, String dsc) throws PMException; + boolean isDescendant(String asc, String dsc) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreBFS.java b/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreBFS.java new file mode 100644 index 000000000..af301e977 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreBFS.java @@ -0,0 +1,26 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.BreadthFirstGraphWalker; +import gov.nist.csd.pm.pap.graph.dag.Direction; + +import java.util.Collection; + +public class GraphStoreBFS extends BreadthFirstGraphWalker { + + private GraphStore graphStore; + + public GraphStoreBFS(GraphStore graphStore) { + super(null); + this.graphStore = graphStore; + } + + @Override + protected Collection getNextLevel(String node) throws PMException { + if (getDirection() == Direction.DESCENDANTS) { + return graphStore.getAdjacentDescendants(node); + } else { + return graphStore.getAdjacentAscendants(node); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreDFS.java b/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreDFS.java new file mode 100644 index 000000000..4805d1ff3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/GraphStoreDFS.java @@ -0,0 +1,27 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.DepthFirstGraphWalker; +import gov.nist.csd.pm.pap.graph.dag.Direction; + +import java.util.Collection; + +public class GraphStoreDFS extends DepthFirstGraphWalker { + + private GraphStore graphStore; + + public GraphStoreDFS(GraphStore graphStore) { + super(null); + this.graphStore = graphStore; + } + + @Override + protected Collection getNextLevel(String node) throws PMException { + if (getDirection() == Direction.DESCENDANTS) { + return graphStore.getAdjacentDescendants(node); + } else { + return graphStore.getAdjacentAscendants(node); + } + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/ObligationsStore.java b/src/main/java/gov/nist/csd/pm/pap/store/ObligationsStore.java new file mode 100644 index 000000000..3df6cf2a3 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/ObligationsStore.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.tx.Transactional; +import gov.nist.csd.pm.pap.modification.ObligationsModification; +import gov.nist.csd.pm.pap.query.ObligationsQuery; + +public interface ObligationsStore extends ObligationsModification, ObligationsQuery, Transactional { + + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/OperationsStore.java b/src/main/java/gov/nist/csd/pm/pap/store/OperationsStore.java new file mode 100644 index 000000000..7eb50c2e6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/OperationsStore.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.tx.Transactional; +import gov.nist.csd.pm.pap.modification.OperationsModification; +import gov.nist.csd.pm.pap.query.OperationsQuery; + +public interface OperationsStore extends OperationsModification, OperationsQuery, Transactional { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/PolicyStore.java b/src/main/java/gov/nist/csd/pm/pap/store/PolicyStore.java new file mode 100644 index 000000000..b1b98d5bf --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/PolicyStore.java @@ -0,0 +1,15 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.tx.Transactional; + +public interface PolicyStore extends Transactional { + + GraphStore graph(); + ProhibitionsStore prohibitions(); + ObligationsStore obligations(); + OperationsStore operations(); + RoutinesStore routines(); + + void reset(); + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/ProhibitionsStore.java b/src/main/java/gov/nist/csd/pm/pap/store/ProhibitionsStore.java new file mode 100644 index 000000000..5180df396 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/ProhibitionsStore.java @@ -0,0 +1,25 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.tx.Transactional; + +import java.util.Collection; +import java.util.Map; + +public interface ProhibitionsStore extends Transactional { + + void createProhibition(String name, + ProhibitionSubject subject, + AccessRightSet accessRightSet, + boolean intersection, + Collection containerConditions) throws PMException; + void deleteProhibition(String name) throws PMException; + + Map> getProhibitions() throws PMException; + Prohibition getProhibition(String name) throws PMException; + boolean prohibitionExists(String name) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/pap/store/RoutinesStore.java b/src/main/java/gov/nist/csd/pm/pap/store/RoutinesStore.java new file mode 100644 index 000000000..25c1e5f1e --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/store/RoutinesStore.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.store; + +import gov.nist.csd.pm.pap.tx.Transactional; +import gov.nist.csd.pm.pap.modification.RoutinesModification; +import gov.nist.csd.pm.pap.query.RoutinesQuery; + +public interface RoutinesStore extends Transactional, RoutinesModification, RoutinesQuery { + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/tx/TransactionNotStartedException.java b/src/main/java/gov/nist/csd/pm/pap/tx/TransactionNotStartedException.java new file mode 100644 index 000000000..391c878bd --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/tx/TransactionNotStartedException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.tx; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class TransactionNotStartedException extends PMException { + public TransactionNotStartedException() { + super("a transaction has not been started using beginTx()"); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pap/tx/Transactional.java b/src/main/java/gov/nist/csd/pm/pap/tx/Transactional.java new file mode 100644 index 000000000..85c78a663 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/tx/Transactional.java @@ -0,0 +1,11 @@ +package gov.nist.csd.pm.pap.tx; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface Transactional { + + void beginTx() throws PMException; + void commit() throws PMException; + void rollback() throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pap/tx/TxCommitException.java b/src/main/java/gov/nist/csd/pm/pap/tx/TxCommitException.java new file mode 100644 index 000000000..4bd31a57f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pap/tx/TxCommitException.java @@ -0,0 +1,9 @@ +package gov.nist.csd.pm.pap.tx; + +import gov.nist.csd.pm.pap.exception.PMException; + +public class TxCommitException extends PMException { + public TxCommitException(Class target, Class tx) { + super(target.getName() + " cannot commit from an instance of " + tx.getName()); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/tx/TxRunner.java b/src/main/java/gov/nist/csd/pm/pap/tx/TxRunner.java similarity index 82% rename from src/main/java/gov/nist/csd/pm/policy/tx/TxRunner.java rename to src/main/java/gov/nist/csd/pm/pap/tx/TxRunner.java index a51fa510b..229922794 100644 --- a/src/main/java/gov/nist/csd/pm/policy/tx/TxRunner.java +++ b/src/main/java/gov/nist/csd/pm/pap/tx/TxRunner.java @@ -1,6 +1,6 @@ -package gov.nist.csd.pm.policy.tx; +package gov.nist.csd.pm.pap.tx; -import gov.nist.csd.pm.policy.exceptions.PMException; +import gov.nist.csd.pm.pap.exception.PMException; public class TxRunner { diff --git a/src/main/java/gov/nist/csd/pm/pdp/AccessAdjudication.java b/src/main/java/gov/nist/csd/pm/pdp/AccessAdjudication.java new file mode 100644 index 000000000..e4e7eb1e9 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/AccessAdjudication.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; + +public interface AccessAdjudication { + + ResourceAdjudicationResponse adjudicateResourceOperation(UserContext user, String policyElement, String resourceOperation) throws PMException; + AdminAdjudicationResponse adjudicateAdminOperations(UserContext user, List requests) throws PMException; + AdminAdjudicationResponse adjudicateAdminRoutine(UserContext user, RoutineRequest request) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/AdminAdjudicationResponse.java b/src/main/java/gov/nist/csd/pm/pdp/AdminAdjudicationResponse.java new file mode 100644 index 000000000..f2152626a --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/AdminAdjudicationResponse.java @@ -0,0 +1,44 @@ +package gov.nist.csd.pm.pdp; + +import java.util.Objects; + +public class AdminAdjudicationResponse { + + private Decision decision; + + public AdminAdjudicationResponse(Decision decision) { + this.decision = decision; + } + + public Decision getDecision() { + return decision; + } + + public void setDecision(Decision decision) { + this.decision = decision; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + var that = (AdminAdjudicationResponse) obj; + return Objects.equals(this.decision, that.decision); + } + + @Override + public int hashCode() { + return Objects.hash(decision); + } + + @Override + public String toString() { + return "AdminAdjudicationResponse[" + + "status=" + decision + ']'; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/Decision.java b/src/main/java/gov/nist/csd/pm/pdp/Decision.java new file mode 100644 index 000000000..a16b589d1 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/Decision.java @@ -0,0 +1,6 @@ +package gov.nist.csd.pm.pdp; + +public enum Decision { + GRANT, + DENY +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/EventResponseEvaluation.java b/src/main/java/gov/nist/csd/pm/pdp/EventResponseEvaluation.java new file mode 100644 index 000000000..534ba5435 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/EventResponseEvaluation.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.query.UserContext; + +public interface EventResponseEvaluation { + + public void evaluateResponse(UserContext userCtx, Response response); + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/OperationRequest.java b/src/main/java/gov/nist/csd/pm/pdp/OperationRequest.java new file mode 100644 index 000000000..fd02f64d8 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/OperationRequest.java @@ -0,0 +1,6 @@ +package gov.nist.csd.pm.pdp; + +import java.util.Map; + +public record OperationRequest(String name, Map operands) { +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDP.java b/src/main/java/gov/nist/csd/pm/pdp/PDP.java index 1a30b2e9a..d61c70b4a 100644 --- a/src/main/java/gov/nist/csd/pm/pdp/PDP.java +++ b/src/main/java/gov/nist/csd/pm/pdp/PDP.java @@ -1,148 +1,156 @@ package gov.nist.csd.pm.pdp; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.adjudicator.Adjudicator; -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.events.PolicyEvent; -import gov.nist.csd.pm.policy.events.PolicyEventEmitter; -import gov.nist.csd.pm.policy.events.PolicyEventListener; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.PMLExecutable; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.ArrayList; -import java.util.List; - -public abstract class PDP implements PolicyEventEmitter { +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.epp.EventProcessor; +import gov.nist.csd.pm.pap.*; +import gov.nist.csd.pm.pap.exception.OperationDoesNotExistException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.exception.BootstrapExistingPolicyException; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.tx.TxRunner; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; + +import java.util.*; + +import static gov.nist.csd.pm.pap.admin.AdminPolicy.ALL_NODE_NAMES; +import static gov.nist.csd.pm.pap.graph.node.NodeType.ANY; +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; + +public class PDP implements EventEmitter, AccessAdjudication { protected final PAP pap; - protected final List eventListeners; + protected final List eventProcessors; - protected PDP(PAP pap) { + public PDP(PAP pap) { this.pap = pap; - this.eventListeners = new ArrayList<>(); + this.eventProcessors = new ArrayList<>(); } - public abstract PolicyReviewer reviewer() throws PMException; - - public abstract void runTx(UserContext userCtx, PDPTxRunner txRunner) throws PMException; - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - eventListeners.add(listener); - - if (sync) { - listener.handlePolicyEvent(pap.policySync()); - } + public void runTx(UserContext userCtx, PDPTxRunner txRunner) throws PMException { + TxRunner.runTx(pap, () -> { + PDPTx pdpTx = new PDPTx(userCtx, pap, eventProcessors); + txRunner.run(pdpTx); + }); } - @Override - public void removeEventListener(PolicyEventListener listener) { - eventListeners.remove(listener); + public void executePML(UserContext userCtx, String pml) throws PMException { + runTx(userCtx, tx -> tx.executePML(userCtx, pml)); } - @Override - public void emitEvent(PolicyEvent event) throws PMException { - for (PolicyEventListener listener : eventListeners) { - listener.handlePolicyEvent(event); + public void bootstrap(PolicyBootstrapper bootstrapper) throws PMException { + if(!isPolicyEmpty()) { + throw new BootstrapExistingPolicyException(); } - } - public interface PDPTxRunner { - void run(PDPTx policy) throws PMException; + bootstrapper.bootstrap(pap); } - public static class PDPTx implements PolicyEventEmitter, PolicyEventListener, PMLExecutable, Policy { - - private final UserContext userCtx; - private final Adjudicator adjudicator; - private final PAP pap; - private List epps; + private boolean isPolicyEmpty() throws PMException { + Set nodes = new HashSet<>(pap.query().graph().search(ANY, NO_PROPERTIES)); - private PDPGraph pdpGraph; - private PDPProhibitions pdpProhibitions; - private PDPObligations pdpObligations; - private PDPUserDefinedPML pdpUserDefinedPML; + boolean prohibitionsEmpty = pap.query().prohibitions().getProhibitions().isEmpty(); + boolean obligationsEmpty = pap.query().obligations().getObligations().isEmpty(); - public PDPTx(UserContext userCtx, PAP pap, PolicyReviewer policyReviewer, List epps) throws PMException { - this.userCtx = userCtx; - this.adjudicator = new Adjudicator(userCtx, pap, policyReviewer); - this.pap = pap; - this.epps = epps; + return (nodes.isEmpty() || (nodes.size() == ALL_NODE_NAMES.size() && nodes.containsAll(ALL_NODE_NAMES))) && + prohibitionsEmpty && + obligationsEmpty; + } - this.pdpGraph = new PDPGraph(userCtx, adjudicator.graph(), pap, this); - this.pdpProhibitions = new PDPProhibitions(userCtx, adjudicator.prohibitions(), pap, this); - this.pdpObligations = new PDPObligations(userCtx, adjudicator.obligations(), pap, this); - this.pdpUserDefinedPML = new PDPUserDefinedPML(userCtx, adjudicator.userDefinedPML(), pap, this); - } + @Override + public void addEventListener(EventProcessor processor) { + eventProcessors.add(processor); + } - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - epps.add(listener); - - if (sync) { - listener.handlePolicyEvent(pap.policySync()); - } - } + @Override + public void removeEventListener(EventProcessor processor) { + eventProcessors.remove(processor); + } - @Override - public void removeEventListener(PolicyEventListener listener) { - epps.remove(listener); + @Override + public void emitEvent(EventContext event) throws PMException { + for (EventProcessor listener : eventProcessors) { + listener.processEvent(event); } + } - @Override - public void emitEvent(PolicyEvent event) throws PMException { - for (PolicyEventListener epp : epps) { - epp.handlePolicyEvent(event); - } + @Override + public ResourceAdjudicationResponse adjudicateResourceOperation(UserContext user, String target, String resourceOperation) throws PMException { + if (!pap.query().operations().getResourceOperations().contains(resourceOperation)) { + throw new OperationDoesNotExistException(resourceOperation); } - @Override - public void executePML(UserContext userContext, String input, FunctionDefinitionStatement... functionDefinitionStatements) throws PMException { - PMLExecutor.compileAndExecutePML(this, userContext, input, functionDefinitionStatements); + try { + PrivilegeChecker.check(pap, user, target, resourceOperation); + } catch (UnauthorizedException e) { + return new ResourceAdjudicationResponse(Decision.DENY); } - @Override - public Graph graph() { - return pdpGraph; - } + Node node = pap.query().graph().getNode(target); - @Override - public Prohibitions prohibitions() { - return pdpProhibitions; - } + emitEvent(new EventContext( + user.getUser(), + user.getProcess(), + resourceOperation, + Map.of("target", target), + List.of("target") + )); - @Override - public Obligations obligations() { - return pdpObligations; - } + return new ResourceAdjudicationResponse(Decision.GRANT, node); + } - @Override - public UserDefinedPML userDefinedPML() { - return pdpUserDefinedPML; + @Override + public AdminAdjudicationResponse adjudicateAdminOperations(UserContext user, List requests) throws PMException { + try { + runTx(user, tx -> { + PDPExecutionContext ctx = new PDPExecutionContext(user, tx); + + for (OperationRequest request : requests) { + Operation operation = pap.query() + .operations() + .getAdminOperation(request.name()); + + if (operation instanceof PMLOperation) { + ((PMLOperation)operation).setCtx(ctx); + } + + tx.executeAdminExecutable(operation, request.operands()); + + emitEvent(new EventContext( + user.getUser(), + user.getProcess(), + operation.getName(), + request.operands(), + operation.getNodeOperands() + )); + } + }); + } catch(UnauthorizedException e){ + return new AdminAdjudicationResponse(Decision.DENY); } - @Override - public PolicySerializer serialize() throws PMException { - adjudicator.serialize(); + return new AdminAdjudicationResponse(Decision.GRANT); + } - return pap.serialize(); - } + @Override + public AdminAdjudicationResponse adjudicateAdminRoutine(UserContext user, RoutineRequest request) throws PMException { + Routine adminRoutine = pap.query().routines().getAdminRoutine(request.name()); + runTx(user, tx -> { + PDPExecutionContext ctx = new PDPExecutionContext(user, tx); - @Override - public PolicyDeserializer deserialize() throws PMException { - adjudicator.deserialize(); + if (adminRoutine instanceof PMLRoutine) { + ((PMLRoutine)adminRoutine).setCtx(ctx); + } - return pap.deserialize(); - } + tx.executeAdminExecutable(adminRoutine, request.operands()); + }); - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - for (PolicyEventListener listener : epps) { - listener.handlePolicyEvent(event); - } - } + return new AdminAdjudicationResponse(Decision.GRANT); } } diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPEventEmitter.java b/src/main/java/gov/nist/csd/pm/pdp/PDPEventEmitter.java new file mode 100644 index 000000000..2ad719971 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PDPEventEmitter.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.epp.EventProcessor; + +import java.util.List; + +public class PDPEventEmitter implements EventEmitter { + + private List epps; + + public PDPEventEmitter(List epps) { + this.epps = epps; + } + + @Override + public void addEventListener(EventProcessor processor) { + this.epps.add(processor); + } + + @Override + public void removeEventListener(EventProcessor processor) { + this.epps.remove(processor); + } + + @Override + public void emitEvent(EventContext event) throws PMException { + for (EventProcessor epp : epps) { + epp.processEvent(event); + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPExecutionContext.java b/src/main/java/gov/nist/csd/pm/pdp/PDPExecutionContext.java new file mode 100644 index 000000000..31b4d5bf6 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PDPExecutionContext.java @@ -0,0 +1,70 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.*; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class PDPExecutionContext extends ExecutionContext { + + private PDPTx pdpTx; + + public PDPExecutionContext(UserContext author, PDPTx pdpTx) throws PMException { + super(author, pdpTx.pap); + this.pdpTx = pdpTx; + } + + public PDPExecutionContext(UserContext author, PDPTx pdpTx, Scope> scope) throws PMException { + super(author, pdpTx.pap, scope); + this.pdpTx = pdpTx; + } + + @Override + public ExecutionContext copy() throws PMException { + return new PDPExecutionContext(author, pdpTx, scope); + } + + @Override + public Value executeStatements(List statements, Map operands) throws PMException { + ExecutionContext copy = writeOperandsToScope(operands); + + for (PMLStatement statement : statements) { + Value value = statement.execute(copy, pdpTx); + if (value instanceof ReturnValue || value instanceof BreakValue || value instanceof ContinueValue) { + return value; + } + } + + return new VoidValue(); + } + + @Override + public Value executeOperationStatements(List stmts, Map operands) throws PMException { + ExecutionContext copy = writeOperandsToScope(operands); + + // for operations, we don't want to use the PDPEC, just the normal one + // to avoid having access checks inside for loops when they call + // ctx.executeStatements() + ExecutionContext ctx = new ExecutionContext(copy.author(), pdpTx.pap, copy.scope()); + + for (PMLStatement statement : stmts) { + Value value = statement.execute(ctx, pdpTx.pap); + if (value instanceof ReturnValue || value instanceof BreakValue || value instanceof ContinueValue) { + return value; + } + } + + return new VoidValue(); + } + + @Override + public Value executeRoutineStatements(List stmts, Map operands) throws PMException { + return executeStatements(stmts, operands); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPGraph.java b/src/main/java/gov/nist/csd/pm/pdp/PDPGraph.java deleted file mode 100644 index d72b0c77f..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/PDPGraph.java +++ /dev/null @@ -1,314 +0,0 @@ -package gov.nist.csd.pm.pdp; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.adjudicator.GraphAdjudicator; -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -class PDPGraph implements Graph, PolicyEventEmitter { - - private UserContext userCtx; - private GraphAdjudicator adjudicator; - private PAP pap; - private PolicyEventListener listener; - - public PDPGraph(UserContext userCtx, GraphAdjudicator adjudicator, PAP pap, PolicyEventListener listener) { - this.userCtx = userCtx; - this.adjudicator = adjudicator; - this.pap = pap; - this.listener = listener; - } - - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) throws PMException { - adjudicator.setResourceAccessRights(accessRightSet); - - pap.graph().setResourceAccessRights(accessRightSet); - } - - @Override - public AccessRightSet getResourceAccessRights() throws PMException { - return pap.graph().getResourceAccessRights(); - } - - @Override - public String createPolicyClass(String name, Map properties) throws PMException { - adjudicator.createPolicyClass(name, properties); - - pap.graph().createPolicyClass(name, properties); - - emitEvent(new EventContext(userCtx, name, new CreatePolicyClassEvent(name, new HashMap<>()))); - - return name; - } - - @Override - public String createPolicyClass(String name) throws PMException { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) throws PMException { - adjudicator.createUserAttribute(name, properties, parent, parents); - - pap.graph().createUserAttribute(name, properties, parent, parents); - - CreateUserAttributeEvent event = - new CreateUserAttributeEvent(name, new HashMap<>(), parent, parents); - - emitCreateNodeEvent(event, name, parent, parents); - - return name; - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) throws PMException { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) throws PMException { - adjudicator.createObjectAttribute(name, properties, parent, parents); - - pap.graph().createObjectAttribute(name, properties, parent, parents); - - CreateObjectAttributeEvent event = - new CreateObjectAttributeEvent(name, new HashMap<>(), parent, parents); - - emitCreateNodeEvent(event, name, parent, parents); - - - return name; - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) throws PMException { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) throws PMException { - adjudicator.createObject(name, properties, parent, parents); - - pap.graph().createObject(name, properties, parent, parents); - - CreateObjectEvent event = - new CreateObjectEvent(name, new HashMap<>(), parent, parents); - - emitCreateNodeEvent(event, name, parent, parents); - - return name; - } - - @Override - public String createObject(String name, String parent, String... parents) throws PMException { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) throws PMException { - adjudicator.createUser(name, properties, parent, parents); - - pap.graph().createUser(name, properties, parent, parents); - - CreateUserEvent event = new CreateUserEvent(name, new HashMap<>(), parent, parents); - - emitCreateNodeEvent(event, name, parent, parents); - - return name; - } - - @Override - public String createUser(String name, String parent, String... parents) throws PMException { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - private void emitCreateNodeEvent(PolicyEvent event, String name, String parent, String ... parents) throws PMException { - // emit event for the new node - emitEvent(new EventContext(userCtx, name, event)); - - // emit event for creating a node in a parent - emitEvent(new EventContext(userCtx, parent, event)); - - // do the same for any additional parents - for (String p : parents) { - emitEvent(new EventContext(userCtx, p, event)); - } - } - - @Override - public void setNodeProperties(String name, Map properties) throws PMException { - adjudicator.setNodeProperties(name, properties); - - pap.graph().setNodeProperties(name, properties); - - emitEvent(new EventContext(userCtx, name, - new SetNodePropertiesEvent(name, properties))); - } - - @Override - public void deleteNode(String name) throws PMException { - adjudicator.deleteNode(name); - - // get parents of the deleted node before deleting to process event in the EPP - List parents = getParents(name); - - pap.graph().deleteNode(name); - - emitDeleteNodeEvent(new DeleteNodeEvent(name), name, parents); - } - - private void emitDeleteNodeEvent(PolicyEvent event, String name, List parents) throws PMException { - // emit delete node event on the deleted node - emitEvent(new EventContext(userCtx, name, event)); - - // emit delete node on each parent - for (String parent : parents) { - emitEvent(new EventContext(userCtx, parent, event)); - } - } - - @Override - public boolean nodeExists(String name) throws PMException { - return adjudicator.nodeExists(name); - } - - @Override - public Node getNode(String name) throws PMException { - return adjudicator.getNode(name); - } - - @Override - public List search(NodeType type, Map properties) throws PMException { - return adjudicator.search(type, properties); - } - - @Override - public List getPolicyClasses() throws PMException { - return pap.graph().getPolicyClasses(); - } - - @Override - public void assign(String child, String parent) throws PMException { - adjudicator.assign(child, parent); - - pap.graph().assign(child, parent); - - emitEvent(new EventContext(userCtx, child, - new AssignEvent(child, parent))); - emitEvent(new EventContext(userCtx, parent, - new AssignToEvent(child, parent))); - } - - @Override - public void deassign(String child, String parent) throws PMException { - adjudicator.deassign(child, parent); - - pap.graph().deassign(child, parent); - - emitEvent(new EventContext(userCtx, child, - new DeassignEvent(child, parent))); - emitEvent(new EventContext(userCtx, parent, - new DeassignFromEvent(child, parent))); - } - - @Override - public void assignAll(List children, String target) throws PMException { - adjudicator.assignAll(children, target); - - pap.graph().assignAll(children, target); - - emitEvent(new AssignAllEvent(children, target)); - } - - @Override - public void deassignAll(List children, String target) throws PMException { - adjudicator.assignAll(children, target); - - pap.graph().deassignAll(children, target); - - emitEvent(new DeassignAllEvent(children, target)); - } - - @Override - public void deassignAllFromAndDelete(String target) throws PMException { - adjudicator.deassignAllFromAndDelete(target); - - pap.graph().deassignAllFromAndDelete(target); - - emitEvent(new DeassignAllFromAndDeleteEvent(target)); - } - - @Override - public List getChildren(String node) throws PMException { - return adjudicator.getChildren(node); - } - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { - adjudicator.associate(ua, target, accessRights); - - pap.graph().associate(ua, target, accessRights); - - emitEvent(new EventContext(userCtx, ua, - new AssociateEvent(ua, target, accessRights))); - emitEvent(new EventContext(userCtx, target, - new AssociateEvent(ua, target, accessRights))); - } - - @Override - public void dissociate(String ua, String target) throws PMException { - adjudicator.dissociate(ua, target); - - pap.graph().dissociate(ua, target); - - emitEvent(new EventContext(userCtx, ua, - new DissociateEvent(ua, target))); - emitEvent(new EventContext(userCtx, target, - new DissociateEvent(ua, target))); - } - - @Override - public List getParents(String node) throws PMException { - return adjudicator.getParents(node); - } - - @Override - public List getAssociationsWithSource(String ua) throws PMException { - return adjudicator.getAssociationsWithSource(ua); - } - - @Override - public List getAssociationsWithTarget(String target) throws PMException { - return adjudicator.getAssociationsWithTarget(target); - } - - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - this.listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPObligations.java b/src/main/java/gov/nist/csd/pm/pdp/PDPObligations.java deleted file mode 100644 index 711c76f09..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/PDPObligations.java +++ /dev/null @@ -1,141 +0,0 @@ -package gov.nist.csd.pm.pdp; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.adjudicator.ObligationsAdjudicator; -import gov.nist.csd.pm.policy.Obligations; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; - -import java.util.List; - -import static gov.nist.csd.pm.policy.model.obligation.event.EventSubject.Type.*; -import static gov.nist.csd.pm.policy.model.obligation.event.EventSubject.Type.PROCESS; -import static gov.nist.csd.pm.policy.model.obligation.event.Target.Type.*; -import static gov.nist.csd.pm.policy.model.obligation.event.Target.Type.ANY_OF_SET; - -class PDPObligations implements Obligations, PolicyEventEmitter { - private UserContext userCtx; - private ObligationsAdjudicator adjudicator; - private PAP pap; - private PolicyEventListener listener; - - public PDPObligations(UserContext userCtx, ObligationsAdjudicator adjudicator, PAP pap, PolicyEventListener listener) { - this.userCtx = userCtx; - this.adjudicator = adjudicator; - this.pap = pap; - this.listener = listener; - } - - @Override - public void create(UserContext author, String label, Rule... rules) throws PMException { - adjudicator.create(author, label, rules); - - pap.obligations().create(author, label, rules); - - emitObligationEvent(new CreateObligationEvent(author, label, List.of(rules)), rules); - } - - private void emitObligationEvent(PolicyEvent event, Rule... rules) throws PMException { - // emit events for each rule - for (Rule rule : rules) { - // emit event for the subject - EventSubject subject = rule.getEventPattern().getSubject(); - if (subject.getType() == ANY_USER) { - emitEvent(new EventContext(userCtx, "", event)); - } else if (subject.getType() == ANY_USER_WITH_ATTRIBUTE) { - emitEvent(new EventContext(userCtx, subject.anyUserWithAttribute(), event)); - } else if (subject.getType() == USERS) { - for (String user : subject.users()) { - emitEvent(new EventContext(userCtx, user, event)); - } - } else if (subject.getType() == PROCESS) { - emitEvent(new EventContext(userCtx, subject.process(), event)); - } - - // emit event for each target - Target target = rule.getEventPattern().getTarget(); - if (target.getType() == POLICY_ELEMENT) { - emitEvent(new EventContext(userCtx, target.policyElement(), event)); - } else if (target.getType() == ANY_POLICY_ELEMENT) { - emitEvent(new EventContext(userCtx, "", event)); - } else if (target.getType() == ANY_CONTAINED_IN) { - emitEvent(new EventContext(userCtx, target.anyContainedIn(), event)); - } else if (target.getType() == ANY_OF_SET) { - for (String policyElement : target.anyOfSet()) { - emitEvent(new EventContext(userCtx, policyElement, event)); - } - } - } - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws PMException { - adjudicator.update(author, label, rules); - - pap.obligations().update(author, label, rules); - - emitObligationEvent( - new UpdateObligationEvent(author, label, List.of(rules)), - rules - ); - } - - @Override - public void delete(String label) throws PMException { - if (!exists(label)) { - return; - } - - adjudicator.delete(label); - - // get the obligation to use in the EPP before it is deleted - Obligation obligation = get(label); - - pap.obligations().delete(label); - - emitDeleteObligationEvent(obligation); - } - - private void emitDeleteObligationEvent(Obligation obligation) throws PMException { - emitObligationEvent( - new DeleteObligationEvent(obligation), - obligation.getRules().toArray(Rule[]::new) - ); - } - - @Override - public List getAll() throws PMException { - return adjudicator.getAll(); - } - - @Override - public boolean exists(String label) throws PMException { - return adjudicator.exists(label); - } - - @Override - public Obligation get(String label) throws PMException { - return adjudicator.get(label); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - this.listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPProhibitions.java b/src/main/java/gov/nist/csd/pm/pdp/PDPProhibitions.java deleted file mode 100644 index b3de4c8be..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/PDPProhibitions.java +++ /dev/null @@ -1,133 +0,0 @@ -package gov.nist.csd.pm.pdp; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.adjudicator.ProhibitionsAdjudicator; -import gov.nist.csd.pm.policy.Prohibitions; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; -import java.util.Map; - -class PDPProhibitions implements Prohibitions, PolicyEventEmitter { - private UserContext userCtx; - private ProhibitionsAdjudicator adjudicator; - private PAP pap; - private PolicyEventListener listener; - - public PDPProhibitions(UserContext userCtx, ProhibitionsAdjudicator adjudicator, PAP pap, PolicyEventListener listener) { - this.userCtx = userCtx; - this.adjudicator = adjudicator; - this.pap = pap; - this.listener = listener; - } - - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - adjudicator.create(label, subject, accessRightSet, intersection, containerConditions); - - pap.prohibitions().create(label, subject, accessRightSet, intersection, containerConditions); - - CreateProhibitionEvent createProhibitionEvent = new CreateProhibitionEvent( - label, subject, accessRightSet, intersection, List.of(containerConditions) - ); - - // emit event for subject - emitEvent(new EventContext(userCtx, subject.getName(), createProhibitionEvent)); - - // emit event for each container specified - for (ContainerCondition containerCondition : containerConditions) { - emitEvent(new EventContext(userCtx, containerCondition.name(), createProhibitionEvent)); - } - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - adjudicator.update(label, subject, accessRightSet, intersection, containerConditions); - - pap.prohibitions().update(label, subject, accessRightSet, intersection, containerConditions); - - UpdateProhibitionEvent updateProhibitionEvent = new UpdateProhibitionEvent( - label, subject, accessRightSet, intersection, List.of(containerConditions) - ); - - // emit event for subject - emitEvent(new EventContext(userCtx, subject.getName(), updateProhibitionEvent)); - - // emit event for each container specified - for (ContainerCondition containerCondition : containerConditions) { - emitEvent(new EventContext(userCtx, containerCondition.name(), updateProhibitionEvent)); - } - } - - @Override - public void delete(String label) throws PMException { - if (!exists(label)) { - return; - } - - adjudicator.delete(label); - - Prohibition prohibition = pap.prohibitions().get(label); - - pap.prohibitions().delete(label); - - emitDeleteProhibitionEvent(prohibition); - } - - private void emitDeleteProhibitionEvent(Prohibition prohibition) throws PMException { - ProhibitionSubject subject = prohibition.getSubject(); - List containerConditions = prohibition.getContainers(); - - DeleteProhibitionEvent deleteProhibitionEvent = new DeleteProhibitionEvent(prohibition); - - // emit event for subject - emitEvent(new EventContext(userCtx, subject.getName(), deleteProhibitionEvent)); - - // emit event for each container specified - for (ContainerCondition containerCondition : containerConditions) { - emitEvent(new EventContext(userCtx, containerCondition.name(), deleteProhibitionEvent)); - } - } - - @Override - public Map> getAll() throws PMException { - return adjudicator.getAll(); - } - - @Override - public boolean exists(String label) throws PMException { - return adjudicator.exists(label); - } - - @Override - public List getWithSubject(String subject) throws PMException { - return adjudicator.getWithSubject(subject); - } - - @Override - public Prohibition get(String label) throws PMException { - return adjudicator.get(label); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - this.listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPTx.java b/src/main/java/gov/nist/csd/pm/pdp/PDPTx.java new file mode 100644 index 000000000..1f161983f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PDPTx.java @@ -0,0 +1,160 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.epp.EventProcessor; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.executable.AdminExecutable; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.PMLCompiler; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pap.serialization.PolicyDeserializer; +import gov.nist.csd.pm.pap.serialization.PolicySerializer; +import gov.nist.csd.pm.pdp.modification.PolicyModificationAdjudicator; +import gov.nist.csd.pm.pdp.query.PolicyQueryAdjudicator; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; + +public class PDPTx extends PAP { + + private final UserContext userCtx; + final PAP pap; + private final PDPEventEmitter eventEmitter; + + private final PolicyModificationAdjudicator pdpModifier; + private final PolicyQueryAdjudicator pdpQuerier; + + public PDPTx(UserContext userCtx, PAP pap, List epps) throws PMException { + super(pap); + + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = new PDPEventEmitter(epps); + this.pdpModifier = new PolicyModificationAdjudicator(userCtx, pap, eventEmitter); + this.pdpQuerier = new PolicyQueryAdjudicator(userCtx, pap); + } + + public PolicyModificationAdjudicator modify() { + return pdpModifier; + } + + public PolicyQueryAdjudicator query() { + return pdpQuerier; + } + + @Override + public void setPMLOperations(Map pmlOperations) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_PML_OPS); + + super.setPMLOperations(pmlOperations); + } + + @Override + public void setPMLOperations(PMLOperation... operations) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_PML_OPS); + super.setPMLOperations(operations); + } + + @Override + public void setPMLRoutines(Map pmlRoutines) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_PML_ROUTINES); + super.setPMLRoutines(pmlRoutines); + } + + @Override + public void setPMLRoutines(PMLRoutine... routines) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_PML_ROUTINES); + super.setPMLRoutines(routines); + } + + @Override + public Map getPMLOperations() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), REVIEW_POLICY); + return super.getPMLOperations(); + } + + @Override + public Map getPMLRoutines() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), REVIEW_POLICY); + return super.getPMLRoutines(); + } + + @Override + public void setPMLConstants(Map pmlConstants) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SET_PML_CONSTANTS); + super.setPMLConstants(pmlConstants); + } + + @Override + public Map getPMLConstants() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), REVIEW_POLICY); + return super.getPMLConstants(); + } + + @Override + public Object executeAdminExecutable(AdminExecutable adminExecutable, Map operands) throws PMException { + if (adminExecutable instanceof Routine routine) { + return routine.execute(this, operands); + } else if (adminExecutable instanceof Operation operation) { + operation.canExecute(pap, userCtx, operands); + return operation.execute(pap, operands); + } + + return adminExecutable.execute(pap, operands); + } + + @Override + public void reset() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), RESET); + + pap.reset(); + } + + @Override + public String serialize(PolicySerializer serializer) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), SERIALIZE_POLICY); + + return pap.serialize(serializer); + } + + @Override + public void deserialize(UserContext author, String input, PolicyDeserializer policyDeserializer) + throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), DESERIALIZE_POLICY); + + pap.deserialize(author, input, policyDeserializer); + } + + public void executePML(UserContext author, String input) throws PMException { + PMLCompiler pmlCompiler = new PMLCompiler(pap); + List stmts = pmlCompiler.compilePML(input); + + ExecutionContext ctx = new PDPExecutionContext(author, this); + ctx.executeStatements(stmts, Map.of()); + } + + @Override + public void beginTx() throws PMException { + pap.beginTx(); + } + + @Override + public void commit() throws PMException { + pap.commit(); + } + + @Override + public void rollback() throws PMException { + pap.rollback(); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPTxRunner.java b/src/main/java/gov/nist/csd/pm/pdp/PDPTxRunner.java new file mode 100644 index 000000000..bd2f575e7 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PDPTxRunner.java @@ -0,0 +1,7 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; + +public interface PDPTxRunner { + void run(PDPTx policy) throws PMException; +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PDPUserDefinedPML.java b/src/main/java/gov/nist/csd/pm/pdp/PDPUserDefinedPML.java deleted file mode 100644 index 8c72c9e9f..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/PDPUserDefinedPML.java +++ /dev/null @@ -1,100 +0,0 @@ -package gov.nist.csd.pm.pdp; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.adjudicator.UserDefinedPMLAdjudicator; -import gov.nist.csd.pm.policy.UserDefinedPML; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.Map; - -class PDPUserDefinedPML implements UserDefinedPML, PolicyEventEmitter { - private UserContext userCtx; - private UserDefinedPMLAdjudicator adjudicator; - private PAP pap; - private PolicyEventListener listener; - - public PDPUserDefinedPML(UserContext userCtx, UserDefinedPMLAdjudicator adjudicator, PAP pap, PolicyEventListener listener) { - this.userCtx = userCtx; - this.adjudicator = adjudicator; - this.pap = pap; - this.listener = listener; - } - - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws PMException { - adjudicator.createFunction(functionDefinitionStatement); - - pap.userDefinedPML().createFunction(functionDefinitionStatement); - - emitEvent(new EventContext(userCtx, new AddFunctionEvent(functionDefinitionStatement))); - } - - @Override - public void deleteFunction(String functionName) throws PMException { - adjudicator.deleteFunction(functionName); - - pap.userDefinedPML().deleteFunction(functionName); - - emitEvent(new EventContext(userCtx, new RemoveFunctionEvent(functionName))); - - } - - @Override - public Map getFunctions() throws PMException { - return pap.userDefinedPML().getFunctions(); - } - - @Override - public FunctionDefinitionStatement getFunction(String name) throws PMException { - return pap.userDefinedPML().getFunction(name); - } - - @Override - public void createConstant(String constantName, Value constantValue) throws PMException { - adjudicator.createConstant(constantName, constantValue); - - pap.userDefinedPML().createConstant(constantName, constantValue); - - emitEvent(new EventContext(userCtx, new AddConstantEvent(constantName, constantValue))); - - } - - @Override - public void deleteConstant(String constName) throws PMException { - adjudicator.deleteConstant(constName); - - pap.userDefinedPML().deleteConstant(constName); - - emitEvent(new EventContext(userCtx, new RemoveConstantEvent(constName))); - } - - @Override - public Map getConstants() throws PMException { - return pap.userDefinedPML().getConstants(); - } - - @Override - public Value getConstant(String name) throws PMException { - return pap.userDefinedPML().getConstant(name); - } - - @Override - public void addEventListener(PolicyEventListener listener, boolean sync) throws PMException { - - } - - @Override - public void removeEventListener(PolicyEventListener listener) { - - } - - @Override - public void emitEvent(PolicyEvent event) throws PMException { - this.listener.handlePolicyEvent(event); - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PMLBootstrapper.java b/src/main/java/gov/nist/csd/pm/pdp/PMLBootstrapper.java new file mode 100644 index 000000000..788ce97a2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PMLBootstrapper.java @@ -0,0 +1,36 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutine; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.List; +import java.util.Map; + +public class PMLBootstrapper implements PolicyBootstrapper { + + private UserContext boostrapper; + private String pml; + private List pmlOperations; + private List pmlRoutines; + private Map pmlConstants; + + public PMLBootstrapper(UserContext boostrapper, String pml, List pmlOperations, List pmlRoutines, Map pmlConstants) { + this.boostrapper = boostrapper; + this.pml = pml; + this.pmlOperations = pmlOperations; + this.pmlRoutines = pmlRoutines; + this.pmlConstants = pmlConstants; + } + + @Override + public void bootstrap(PAP pap) throws PMException { + pap.setPMLOperations(pmlOperations.toArray(PMLOperation[]::new)); + pap.setPMLRoutines(pmlRoutines.toArray(PMLRoutine[]::new)); + pap.setPMLConstants(pmlConstants); + pap.executePML(boostrapper, pml); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PolicyBootstrapper.java b/src/main/java/gov/nist/csd/pm/pdp/PolicyBootstrapper.java new file mode 100644 index 000000000..8b97fc45d --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/PolicyBootstrapper.java @@ -0,0 +1,10 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; + +public interface PolicyBootstrapper { + + void bootstrap(PAP pap) throws PMException; + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/PolicyReviewer.java b/src/main/java/gov/nist/csd/pm/pdp/PolicyReviewer.java deleted file mode 100644 index d4eeb4023..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/PolicyReviewer.java +++ /dev/null @@ -1,137 +0,0 @@ -package gov.nist.csd.pm.pdp; - -import gov.nist.csd.pm.policy.model.graph.dag.TargetDagResult; -import gov.nist.csd.pm.policy.model.graph.dag.UserDagResult; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.*; - -import gov.nist.csd.pm.policy.review.PolicyReview; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; - -public abstract class PolicyReviewer implements PolicyReview { - - public AccessRightSet resolvePermissions(UserDagResult userContext, TargetDagResult targetCtx, String target, AccessRightSet resourceOps) { - AccessRightSet allowed = resolveAllowedPermissions(targetCtx.pcSet(), resourceOps); - - // remove any prohibited operations - Set denied = resolveProhibitions(userContext, targetCtx, target); - allowed.removeAll(denied); - - return allowed; - } - - public AccessRightSet resolveAllowedPermissions(Map pcMap, AccessRightSet resourceOps) { - Map resolvedPcMap = new HashMap<>(); - for (Map.Entry pc : pcMap.entrySet()) { - AccessRightSet pcOps = pc.getValue(); - - // replace instances of *, *a or *r with the literal operations - resolveSpecialPermissions(pcOps, resourceOps); - - resolvedPcMap.put(pc.getKey(), pcOps); - } - - return resolvePolicyClassOperationSets(resolvedPcMap); - } - - public AccessRightSet resolvePolicyClassOperationSets(Map pcMap) { - // retain only the ops that the decider knows about - AccessRightSet allowed = new AccessRightSet(); - boolean first = true; - for (AccessRightSet ops : pcMap.values()) { - if(first) { - allowed.addAll(ops); - first = false; - continue; - } - - // if the ops for the pc are empty then the user has no permissions on the target - if (ops.isEmpty()) { - return new AccessRightSet(); - } else { - allowed.retainAll(ops); - } - } - - return allowed; - } - - public void resolveSpecialPermissions(AccessRightSet permissions, AccessRightSet resourceOps) { - // if the permission set includes *, remove the * and add all resource operations - if (permissions.contains(ALL_ACCESS_RIGHTS)) { - permissions.remove(ALL_ACCESS_RIGHTS); - permissions.addAll(allAdminAccessRights()); - permissions.addAll(resourceOps); - } else { - // if the permissions includes *a or *r add all the admin ops/resource ops as necessary - if (permissions.contains(ALL_ADMIN_ACCESS_RIGHTS)) { - permissions.remove(ALL_ADMIN_ACCESS_RIGHTS); - permissions.addAll(allAccessRights()); - } - if (permissions.contains(ALL_RESOURCE_ACCESS_RIGHTS)) { - permissions.remove(ALL_RESOURCE_ACCESS_RIGHTS); - permissions.addAll(resourceOps); - } - } - } - - public AccessRightSet resolveProhibitions(UserDagResult userCtx, TargetDagResult targetCtx, String target) { - AccessRightSet denied = new AccessRightSet(); - Set prohibitions = userCtx.prohibitions(); - Set reachedTargets = targetCtx.reachedTargets(); - - for(Prohibition p : prohibitions) { - if (isProhibitionSatisfied(p, reachedTargets, target)) { - denied.addAll(p.getAccessRightSet()); - } - } - return denied; - } - - private boolean isProhibitionSatisfied(Prohibition prohibition, Set reachedTargets, String target) { - boolean inter = prohibition.isIntersection(); - List containers = prohibition.getContainers(); - boolean addOps = false; - - for (ContainerCondition containerCondition : containers) { - String contName = containerCondition.name(); - boolean isComplement = containerCondition.complement(); - - if (target.equals(contName)) { - // if the prohibition is UNION and the target is the container then the prohibition is satisfied - // if the prohibition is INTERSECTION and the target is the container then the prohibition is not satisfied - if (!inter && !isComplement) { - addOps = true; - } - - break; - } - - if (!isComplement && reachedTargets.contains(contName) || isComplement && !reachedTargets.contains(contName)) { - addOps = true; - - // if the prohibition is not intersection, one satisfied container condition means - // the prohibition is satisfied - if (!inter) { - break; - } - } else { - // since the intersection requires the target to satisfy each node condition in the prohibition - // if one is not satisfied then the whole is not satisfied - addOps = false; - - // if the prohibition is the intersection, one unsatisfied container condition means the whole - // prohibition is not satisfied - if (inter) { - break; - } - } - } - - return addOps; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/ResourceAdjudicationResponse.java b/src/main/java/gov/nist/csd/pm/pdp/ResourceAdjudicationResponse.java new file mode 100644 index 000000000..45de7f67f --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/ResourceAdjudicationResponse.java @@ -0,0 +1,62 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.graph.node.Node; + +import java.util.Objects; + +public class ResourceAdjudicationResponse { + + private Decision decision; + private Node resource; + + public ResourceAdjudicationResponse(Decision decision, Node resource) { + this.decision = decision; + this.resource = resource; + } + + public ResourceAdjudicationResponse(Decision decision) { + this.decision = decision; + } + + public Decision getDecision() { + return decision; + } + + public void setDecision(Decision decision) { + this.decision = decision; + } + + public Node getResource() { + return resource; + } + + public void setResource(Node resource) { + this.resource = resource; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj == null || obj.getClass() != this.getClass()) { + return false; + } + var that = (ResourceAdjudicationResponse) obj; + return Objects.equals(this.decision, that.decision) && + Objects.equals(this.resource, that.resource); + } + + @Override + public int hashCode() { + return Objects.hash(decision, resource); + } + + @Override + public String toString() { + return "ResourceAdjudicationResponse[" + + "status=" + decision + ", " + + "node=" + resource + ']'; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/RoutineRequest.java b/src/main/java/gov/nist/csd/pm/pdp/RoutineRequest.java new file mode 100644 index 000000000..b1fa2b8e0 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/RoutineRequest.java @@ -0,0 +1,6 @@ +package gov.nist.csd.pm.pdp; + +import java.util.Map; + +public record RoutineRequest(String name, Map operands) { +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/AccessRightChecker.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/AccessRightChecker.java deleted file mode 100644 index 22f1ebdc0..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/AccessRightChecker.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.SuperPolicy; -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.RepObjectNotSetException; -import gov.nist.csd.pm.policy.exceptions.UnauthorizedException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -import java.util.Arrays; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.PC; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.REP_PROPERTY; - -public class AccessRightChecker { - - private final PAP pap; - private final PolicyReviewer policyReviewer; - - public AccessRightChecker(PAP pap, PolicyReviewer policyReviewer) { - this.pap = pap; - this.policyReviewer = policyReviewer; - } - - public void check(UserContext userCtx, String target, String... toCheck) throws PMException { - // if checking the permissions on a PC, check the permissions on the rep node for the PC - Node targetNode = pap.graph().getNode(target); - - if (targetNode.getType().equals(PC)) { - target = SuperPolicy.pcRepObjectAttribute(target); - } - - AccessRightSet accessRights = policyReviewer.getAccessRights(userCtx, target); - if(accessRights.isEmpty()) { - throw new UnauthorizedException(userCtx, target, toCheck); - } else { - if (!accessRights.containsAll(Arrays.asList(toCheck))) { - throw new UnauthorizedException(userCtx, target, toCheck); - } - } - } - -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/Adjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/Adjudicator.java deleted file mode 100644 index 74d0b58f9..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/Adjudicator.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.PolicyDeserializer; -import gov.nist.csd.pm.policy.PolicySerializer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_PC_REP; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.FROM_STRING; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.TO_STRING; - -public class Adjudicator implements Policy { - - private final UserContext userCtx; - private final PAP pap; - private final AccessRightChecker accessRightChecker; - - private final GraphAdjudicator graphAdjudicator; - private final ProhibitionsAdjudicator prohibitionsAdjudicator; - private final ObligationsAdjudicator obligationsAdjudicator; - private final UserDefinedPMLAdjudicator userDefinedPMLAdjudicator; - - public Adjudicator(UserContext userCtx, PAP pap, PolicyReviewer policyReviewer) { - this.userCtx = userCtx; - this.pap = pap; - this.accessRightChecker = new AccessRightChecker(pap, policyReviewer); - - graphAdjudicator = new GraphAdjudicator(userCtx, pap, accessRightChecker); - prohibitionsAdjudicator = new ProhibitionsAdjudicator(userCtx, pap, accessRightChecker); - obligationsAdjudicator = new ObligationsAdjudicator(userCtx, pap, accessRightChecker); - userDefinedPMLAdjudicator = new UserDefinedPMLAdjudicator(userCtx, pap, accessRightChecker); - } - - @Override - public GraphAdjudicator graph() { - return graphAdjudicator; - } - - @Override - public ProhibitionsAdjudicator prohibitions() { - return prohibitionsAdjudicator; - } - - @Override - public ObligationsAdjudicator obligations() { - return obligationsAdjudicator; - } - - @Override - public UserDefinedPMLAdjudicator userDefinedPML() { - return userDefinedPMLAdjudicator; - } - - @Override - public PolicySerializer serialize() throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, TO_STRING); - - return null; - } - - @Override - public PolicyDeserializer deserialize() throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, FROM_STRING); - - return null; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/GraphAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/GraphAdjudicator.java deleted file mode 100644 index 5bc54ed5b..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/GraphAdjudicator.java +++ /dev/null @@ -1,450 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.SuperPolicy; -import gov.nist.csd.pm.policy.Graph; -import gov.nist.csd.pm.policy.exceptions.NodeDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.UnauthorizedException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.graph.relationships.InvalidAssignmentException; -import gov.nist.csd.pm.policy.model.graph.relationships.InvalidAssociationException; - -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_PC_REP; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.PC; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -public class GraphAdjudicator implements Graph { - - private final UserContext userCtx; - private final PAP pap; - private final AccessRightChecker accessRightChecker; - - public GraphAdjudicator(UserContext userCtx, PAP pap, AccessRightChecker accessRightChecker) { - this.userCtx = userCtx; - this.pap = pap; - this.accessRightChecker = accessRightChecker; - } - - @Override - public void setResourceAccessRights(AccessRightSet accessRightSet) throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, SET_RESOURCE_ACCESS_RIGHTS); - } - - @Override - public AccessRightSet getResourceAccessRights() throws PMException { - return null; - } - - @Override - public String createPolicyClass(String name, Map properties) throws PMException { - // check that the user has the CREATE_POLICY_CLASS right on the super policy object - accessRightChecker.check(userCtx, SUPER_PC_REP, CREATE_POLICY_CLASS); - - return null; - } - - @Override - public String createPolicyClass(String name) throws PMException { - return createPolicyClass(name, NO_PROPERTIES); - } - - @Override - public String createUserAttribute(String name, Map properties, String parent, String... parents) throws PMException { - checkParents(CREATE_USER_ATTRIBUTE, parent); - checkParents(CREATE_USER_ATTRIBUTE, parents); - - return null; - } - - @Override - public String createUserAttribute(String name, String parent, String... parents) throws PMException { - return createUserAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObjectAttribute(String name, Map properties, String parent, String... parents) throws PMException { - checkParents(CREATE_OBJECT_ATTRIBUTE, parent); - checkParents(CREATE_OBJECT_ATTRIBUTE, parents); - - return null; - } - - @Override - public String createObjectAttribute(String name, String parent, String... parents) throws PMException { - return createObjectAttribute(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createObject(String name, Map properties, String parent, String... parents) throws PMException { - checkParents(CREATE_OBJECT, parent); - checkParents(CREATE_OBJECT, parents); - - return null; - } - - @Override - public String createObject(String name, String parent, String... parents) throws PMException { - return createObject(name, NO_PROPERTIES, parent, parents); - } - - @Override - public String createUser(String name, Map properties, String parent, String... parents) throws PMException { - checkParents(CREATE_USER, parent); - checkParents(CREATE_USER, parents); - - return null; - } - - @Override - public String createUser(String name, String parent, String... parents) throws PMException { - return createUser(name, NO_PROPERTIES, parent, parents); - } - - private void checkParents(String accessRight, String ... parents) throws PMException { - for (String parent : parents) { - accessRightChecker.check(userCtx, parent, accessRight); - } - } - - @Override - public void setNodeProperties(String name, Map properties) throws PMException { - accessRightChecker.check(userCtx, name, SET_NODE_PROPERTIES); - } - - @Override - public boolean nodeExists(String name) throws PMException { - boolean exists = pap.graph().nodeExists(name); - if (!exists) { - return false; - } - - try { - accessRightChecker.check(userCtx, name); - return true; - } catch (UnauthorizedException e) { - return false; - } - } - - @Override - public Node getNode(String name) throws PMException { - // get node - Node node = pap.graph().getNode(name); - - // check user has permissions on the node - try { - accessRightChecker.check(userCtx, name); - } catch (UnauthorizedException e) { - // if no permissions, the user shouldn't know it exists - throw new NodeDoesNotExistException(name); - } - - return node; - } - - @Override - public List search(NodeType type, Map properties) throws PMException { - List search = pap.graph().search(type, properties); - search.removeIf(node -> { - try { - accessRightChecker.check(userCtx, node); - return false; - } catch (PMException e) { - return true; - } - }); - - return search; - } - - @Override - public List getPolicyClasses() throws PMException { - List policyClasses = pap.graph().getPolicyClasses(); - policyClasses.removeIf(pc -> { - try { - accessRightChecker.check(userCtx, SuperPolicy.pcRepObjectAttribute(pc)); - return false; - } catch (PMException e) { - return true; - } - }); - - return policyClasses; - } - - @Override - public void deleteNode(String name) throws PMException { - NodeType nodeType = pap.graph().getNode(name).getType(); - - if (nodeType == PC) { - accessRightChecker.check(userCtx, SuperPolicy.pcRepObjectAttribute(name), DELETE_POLICY_CLASS); - return; - } - - String op = switch (nodeType) { - case OA -> DELETE_OBJECT_ATTRIBUTE; - case UA -> DELETE_USER_ATTRIBUTE; - case O -> DELETE_OBJECT; - case U -> DELETE_USER; - default -> DELETE_POLICY_CLASS; - }; - - // check the user can delete the node - accessRightChecker.check(userCtx, name, op); - - // check that the user can delete the node from the node's parents - List parents = pap.graph().getParents(name); - - for(String parent : parents) { - accessRightChecker.check(userCtx, parent, op); - } - } - - @Override - public void assign(String child, String parent) throws PMException { - Node childNode = pap.graph().getNode(child); - Node parentNode = pap.graph().getNode(parent); - - String childAR = switch (childNode.getType()) { - case OA -> ASSIGN_OBJECT_ATTRIBUTE; - case UA -> ASSIGN_USER_ATTRIBUTE; - case O -> ASSIGN_OBJECT; - case U -> ASSIGN_USER; - default -> throw new IllegalArgumentException("cannot assign node of type " + childNode.getType()); - }; - - String parentAR = switch (parentNode.getType()) { - case OA -> ASSIGN_TO_OBJECT_ATTRIBUTE; - case UA -> ASSIGN_TO_USER_ATTRIBUTE; - case PC -> ASSIGN_TO_POLICY_CLASS; - default -> throw new IllegalArgumentException("cannot assign to a node of type " + parentNode.getType()); - }; - - //check the user can assign the child - accessRightChecker.check(userCtx, child, childAR); - - // check that the user can assign to the parent node - accessRightChecker.check(userCtx, parent, parentAR); - } - - @Override - public void deassign(String child, String parent) throws PMException { - Node childNode = pap.graph().getNode(child); - Node parentNode = pap.graph().getNode(parent); - - String childAR = switch (childNode.getType()) { - case OA -> DEASSIGN_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_USER_ATTRIBUTE; - case O -> DEASSIGN_OBJECT; - case U -> DEASSIGN_USER; - default -> throw new InvalidAssignmentException("cannot deassign node of type " + childNode.getType()); - }; - - String parentAR = switch (parentNode.getType()) { - case OA -> DEASSIGN_FROM_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_FROM_USER_ATTRIBUTE; - case PC -> DEASSIGN_FROM_POLICY_CLASS; - default -> throw new InvalidAssignmentException("cannot deassign from a node of type " + parentNode.getType()); - }; - - //check the user can deassign the child - accessRightChecker.check(userCtx, child, childAR); - - // check that the user can deassign from the parent node - accessRightChecker.check(userCtx, parent, parentAR); - } - - @Override - public void assignAll(List children, String target) throws PMException { - Node parentNode = pap.graph().getNode(target); - - String parentAR = switch (parentNode.getType()) { - case OA -> ASSIGN_TO_OBJECT_ATTRIBUTE; - case UA -> ASSIGN_TO_USER_ATTRIBUTE; - case PC -> ASSIGN_TO_POLICY_CLASS; - default -> throw new IllegalArgumentException("cannot assign to a node of type " + parentNode.getType()); - }; - - // check user can assign to parent - accessRightChecker.check(userCtx, target, parentAR); - - // check the user can assign each child - for (String child : children) { - Node childNode = pap.graph().getNode(child); - - String childAR = switch (childNode.getType()) { - case OA -> ASSIGN_OBJECT_ATTRIBUTE; - case UA -> ASSIGN_USER_ATTRIBUTE; - case O -> ASSIGN_OBJECT; - case U -> ASSIGN_USER; - default -> throw new IllegalArgumentException("cannot assign node of type " + childNode.getType()); - }; - - accessRightChecker.check(userCtx, child, childAR); - } - } - - @Override - public void deassignAll(List children, String target) throws PMException { - Node parentNode = pap.graph().getNode(target); - - String parentAR = switch (parentNode.getType()) { - case OA -> DEASSIGN_FROM_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_FROM_USER_ATTRIBUTE; - case PC -> DEASSIGN_FROM_POLICY_CLASS; - default -> throw new InvalidAssignmentException("cannot deassign from a node of type " + parentNode.getType()); - }; - - // check user can deassign from parent - accessRightChecker.check(userCtx, target, parentAR); - - // check the user can deassign each child - for (String child : children) { - Node childNode = pap.graph().getNode(child); - - String childAR = switch (childNode.getType()) { - case OA -> DEASSIGN_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_USER_ATTRIBUTE; - case O -> DEASSIGN_OBJECT; - case U -> DEASSIGN_USER; - default -> throw new InvalidAssignmentException("cannot deassign node of type " + childNode.getType()); - }; - - accessRightChecker.check(userCtx, child, childAR); - } - } - - @Override - public void deassignAllFromAndDelete(String target) throws PMException { - Node parentNode = pap.graph().getNode(target); - - String parentAR = switch (parentNode.getType()) { - case OA -> DEASSIGN_FROM_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_FROM_USER_ATTRIBUTE; - case PC -> DEASSIGN_FROM_POLICY_CLASS; - default -> throw new InvalidAssignmentException("cannot deassign from a node of type " + parentNode.getType()); - }; - - // check user can deassign from parent - accessRightChecker.check(userCtx, target, parentAR); - - parentAR = switch (parentNode.getType()) { - case OA -> DELETE_OBJECT_ATTRIBUTE; - case UA -> DELETE_USER_ATTRIBUTE; - case O -> DELETE_OBJECT; - case U -> DELETE_USER; - default -> DELETE_POLICY_CLASS; - }; - - // check the user can delete the target - accessRightChecker.check(userCtx, target, parentAR); - - // check the user can deassign each child - for (String child : pap.graph().getChildren(target)) { - Node childNode = pap.graph().getNode(child); - - String childAR = switch (childNode.getType()) { - case OA -> DEASSIGN_OBJECT_ATTRIBUTE; - case UA -> DEASSIGN_USER_ATTRIBUTE; - case O -> DEASSIGN_OBJECT; - case U -> DEASSIGN_USER; - default -> throw new InvalidAssignmentException("cannot deassign node of type " + childNode.getType()); - }; - - accessRightChecker.check(userCtx, child, childAR); - } - } - - @Override - public List getParents(String node) throws PMException { - List parents = pap.graph().getParents(node); - parents.removeIf(parent -> { - try { - accessRightChecker.check(userCtx, parent); - return false; - } catch (PMException e) { - return true; - } - }); - - return parents; - } - - @Override - public List getChildren(String node) throws PMException { - List children = pap.graph().getChildren(node); - children.removeIf(child -> { - try { - accessRightChecker.check(userCtx, child); - return false; - } catch (PMException e) { - return true; - } - }); - - return children; - } - - @Override - public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { - Node targetNode = pap.graph().getNode(target); - - String targetAR = switch (targetNode.getType()) { - case OA -> DISSOCIATE_OBJECT_ATTRIBUTE; - case UA -> DISSOCIATE_USER_ATTRIBUTE; - default -> throw new InvalidAssociationException("cannot associate a target node of type " + targetNode.getType()); - }; - - //check the user can associate the source and target nodes - accessRightChecker.check(userCtx, ua, ASSOCIATE_USER_ATTRIBUTE); - accessRightChecker.check(userCtx, target, targetAR); - } - - @Override - public void dissociate(String ua, String target) throws PMException { - Node targetNode = pap.graph().getNode(target); - - String targetAR = switch (targetNode.getType()) { - case OA -> DISSOCIATE_OBJECT_ATTRIBUTE; - case UA -> DISSOCIATE_USER_ATTRIBUTE; - default -> throw new InvalidAssociationException("cannot dissociate a target node of type " + targetNode.getType()); - }; - - //check the user can dissociate the source and target nodes - accessRightChecker.check(userCtx, ua, DISSOCIATE_USER_ATTRIBUTE); - accessRightChecker.check(userCtx, target, targetAR); - } - - @Override - public List getAssociationsWithSource(String ua) throws PMException { - return getAssociations(pap.graph().getAssociationsWithSource(ua)); - } - - @Override - public List getAssociationsWithTarget(String target) throws PMException { - return getAssociations(pap.graph().getAssociationsWithTarget(target)); - } - - private List getAssociations(List associations) { - associations.removeIf(association -> { - try { - accessRightChecker.check(userCtx, association.getSource(), GET_ASSOCIATIONS); - accessRightChecker.check(userCtx, association.getTarget(), GET_ASSOCIATIONS); - return false; - } catch (PMException e) { - return true; - } - }); - - return associations; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ObligationsAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ObligationsAdjudicator.java deleted file mode 100644 index b3253d475..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ObligationsAdjudicator.java +++ /dev/null @@ -1,137 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.policy.Obligations; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.UnauthorizedException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; - -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_PC_REP; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.DELETE_OBLIGATION; - -public class ObligationsAdjudicator implements Obligations { - private final UserContext userCtx; - private final PAP pap; - private final AccessRightChecker accessRightChecker; - - public ObligationsAdjudicator(UserContext userCtx, PAP pap, AccessRightChecker accessRightChecker) { - this.userCtx = userCtx; - this.pap = pap; - this.accessRightChecker = accessRightChecker; - } - - @Override - public void create(UserContext author, String label, Rule... rules) throws PMException { - for (Rule rule : rules) { - EventSubject subject = rule.getEventPattern().getSubject(); - checkSubject(subject, CREATE_OBLIGATION); - - Target target = rule.getEventPattern().getTarget(); - checkTarget(target, CREATE_OBLIGATION); - } - } - - private void checkTarget(Target target, String accessRight) throws PMException { - if (target.getType() == Target.Type.POLICY_ELEMENT) { - accessRightChecker.check(userCtx, target.policyElement(), accessRight); - } else if (target.getType() == Target.Type.ANY_POLICY_ELEMENT) { - accessRightChecker.check(userCtx, SUPER_PC_REP, accessRight); - } else if (target.getType() == Target.Type.ANY_CONTAINED_IN) { - accessRightChecker.check(userCtx, target.anyContainedIn(), accessRight); - } else if (target.getType() == Target.Type.ANY_OF_SET) { - for (String policyElement : target.anyOfSet()) { - accessRightChecker.check(userCtx, policyElement, accessRight); - } - } - } - - private void checkSubject(EventSubject subject, String accessRight) throws PMException { - if (subject.getType() == EventSubject.Type.ANY_USER) { - accessRightChecker.check(userCtx, SUPER_PC_REP, accessRight); - } else if (subject.getType() == EventSubject.Type.ANY_USER_WITH_ATTRIBUTE) { - accessRightChecker.check(userCtx, subject.anyUserWithAttribute(), accessRight); - } else if (subject.getType() == EventSubject.Type.PROCESS) { - // need permissions on super object create a process obligation - accessRightChecker.check(userCtx, SUPER_PC_REP, accessRight); - } else if (subject.getType() == EventSubject.Type.USERS) { - for (String user : subject.users()) { - accessRightChecker.check(userCtx, user, accessRight); - } - } - } - - @Override - public void update(UserContext author, String label, Rule... rules) throws PMException { - create(author, label, rules); - } - - @Override - public void delete(String label) throws PMException { - Obligation obligation = pap.obligations().get(label); - for (Rule rule : obligation.getRules()) { - EventSubject subject = rule.getEventPattern().getSubject(); - checkSubject(subject, DELETE_OBLIGATION); - - Target target = rule.getEventPattern().getTarget(); - checkTarget(target, DELETE_OBLIGATION); - } - } - - @Override - public List getAll() throws PMException { - List obligations = pap.obligations().getAll(); - obligations.removeIf(obligation -> { - try { - for (Rule rule : obligation.getRules()) { - EventSubject subject = rule.getEventPattern().getSubject(); - checkSubject(subject, GET_OBLIGATION); - - Target target = rule.getEventPattern().getTarget(); - checkTarget(target, GET_OBLIGATION); - } - return false; - } catch (PMException e) { - return true; - } - }); - - return obligations; - } - - @Override - public boolean exists(String label) throws PMException { - boolean exists = pap.obligations().exists(label); - if (!exists) { - return false; - } - - try { - get(label); - } catch (UnauthorizedException e) { - return false; - } - - return true; - } - - @Override - public Obligation get(String label) throws PMException { - Obligation obligation = pap.obligations().get(label); - for (Rule rule : obligation.getRules()) { - EventSubject subject = rule.getEventPattern().getSubject(); - checkSubject(subject, GET_OBLIGATION); - - Target target = rule.getEventPattern().getTarget(); - checkTarget(target, GET_OBLIGATION); - } - - return obligation; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ProhibitionsAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ProhibitionsAdjudicator.java deleted file mode 100644 index edcb590f4..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/ProhibitionsAdjudicator.java +++ /dev/null @@ -1,155 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.policy.Prohibitions; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.UnauthorizedException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_PC_REP; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.ADD_CONTAINER_COMPLEMENT_TO_PROHIBITION; - -public class ProhibitionsAdjudicator implements Prohibitions { - private final UserContext userCtx; - private final PAP pap; - private final AccessRightChecker accessRightChecker; - - public ProhibitionsAdjudicator(UserContext userCtx, PAP pap, AccessRightChecker accessRightChecker) { - this.userCtx = userCtx; - this.pap = pap; - this.accessRightChecker = accessRightChecker; - } - - @Override - public void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - if (subject.getType() == ProhibitionSubject.Type.PROCESS) { - accessRightChecker.check(userCtx, SUPER_PC_REP, CREATE_PROCESS_PROHIBITION); - } else { - accessRightChecker.check(userCtx, subject.getName(), CREATE_PROHIBITION); - } - - - // check that the user can create a prohibition for each container in the condition - for (ContainerCondition contCond : containerConditions) { - accessRightChecker.check(userCtx, contCond.name(), ADD_CONTAINER_TO_PROHIBITION); - - // there is another access right needed if the condition is a complement - if (contCond.complement()) { - accessRightChecker.check(userCtx, SUPER_PC_REP, ADD_CONTAINER_COMPLEMENT_TO_PROHIBITION); - } - } - } - - @Override - public void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, ContainerCondition... containerConditions) throws PMException { - create(label, subject, accessRightSet, intersection, containerConditions); - } - - @Override - public void delete(String label) throws PMException { - Prohibition prohibition = pap.prohibitions().get(label); - - // check that the user can create a prohibition for the subject - if (prohibition.getSubject().getType() == ProhibitionSubject.Type.PROCESS) { - accessRightChecker.check(userCtx, SUPER_PC_REP, DELETE_PROCESS_PROHIBITION); - } else { - accessRightChecker.check(userCtx, prohibition.getSubject().getName(), DELETE_PROHIBITION); - } - - // check that the user can create a prohibition for each container in the condition - for (ContainerCondition contCond : prohibition.getContainers()) { - accessRightChecker.check(userCtx, contCond.name(), REMOVE_CONTAINER_FROM_PROHIBITION); - - // there is another access right needed if the condition is a complement - if (contCond.complement()) { - accessRightChecker.check(userCtx, SUPER_PC_REP, REMOVE_CONTAINER_COMPLEMENT_FROM_PROHIBITION); - } - } - } - - @Override - public Map> getAll() throws PMException { - Map> prohibitions = pap.prohibitions().getAll(); - Map> retProhibitions = new HashMap<>(); - for (String subject : prohibitions.keySet()) { - List subjectPros = filterProhibitions(prohibitions.get(subject)); - retProhibitions.put(subject, subjectPros); - } - - return retProhibitions; - } - - @Override - public boolean exists(String label) throws PMException { - boolean exists = pap.prohibitions().exists(label); - if (!exists) { - return false; - } - - try { - get(label); - } catch (UnauthorizedException e) { - return false; - } - - - return true; - } - - @Override - public List getWithSubject(String subject) throws PMException { - return filterProhibitions(pap.prohibitions().getWithSubject(subject)); - } - - @Override - public Prohibition get(String label) throws PMException { - Prohibition prohibition = pap.prohibitions().get(label); - - // check user has access to subject prohibitions - if (prohibition.getSubject().getType() == ProhibitionSubject.Type.PROCESS) { - accessRightChecker.check(userCtx, SUPER_PC_REP, GET_PROCESS_PROHIBITIONS); - } else { - accessRightChecker.check(userCtx, prohibition.getSubject().getName(), GET_PROHIBITIONS); - } - - // check user has access to each target prohibitions - for (ContainerCondition containerCondition : prohibition.getContainers()) { - accessRightChecker.check(userCtx, containerCondition.name(), GET_PROHIBITIONS); - } - - return prohibition; - } - - private List filterProhibitions(List prohibitions) { - prohibitions.removeIf(prohibition -> { - try { - // check user has access to subject prohibitions - if (prohibition.getSubject().getType() == ProhibitionSubject.Type.PROCESS) { - accessRightChecker.check(userCtx, SUPER_PC_REP, GET_PROCESS_PROHIBITIONS); - } else { - accessRightChecker.check(userCtx, prohibition.getSubject().getName(), GET_PROHIBITIONS); - } - - // check user has access to each target prohibitions - for (ContainerCondition containerCondition : prohibition.getContainers()) { - accessRightChecker.check(userCtx, containerCondition.name(), GET_PROHIBITIONS); - } - - return false; - } catch (PMException e) { - return true; - } - }); - - return prohibitions; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/UserDefinedPMLAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/adjudicator/UserDefinedPMLAdjudicator.java deleted file mode 100644 index 7d34b2b42..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/adjudicator/UserDefinedPMLAdjudicator.java +++ /dev/null @@ -1,69 +0,0 @@ -package gov.nist.csd.pm.pdp.adjudicator; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.policy.UserDefinedPML; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_PC_REP; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; - -public class UserDefinedPMLAdjudicator implements UserDefinedPML { - private final UserContext userCtx; - private final PAP pap; - private final AccessRightChecker accessRightChecker; - - public UserDefinedPMLAdjudicator(UserContext userCtx, PAP pap, AccessRightChecker accessRightChecker) { - this.userCtx = userCtx; - this.pap = pap; - this.accessRightChecker = accessRightChecker; - } - - @Override - public void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, ADD_FUNCTION); - } - - @Override - public void deleteFunction(String functionName) throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, REMOVE_FUNCTION); - } - - @Override - public Map getFunctions() throws PMException { - // accessRightChecker.check(userCtx, SUPER_PC_REP, GET_FUNCTIONS); - - return null; - } - - @Override - public FunctionDefinitionStatement getFunction(String name) throws PMException { - return null; - } - - @Override - public void createConstant(String constantName, Value constantValue) throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, ADD_CONSTANT); - } - - @Override - public void deleteConstant(String constName) throws PMException { - accessRightChecker.check(userCtx, SUPER_PC_REP, REMOVE_CONSTANT); - } - - @Override - public Map getConstants() throws PMException { - // accessRightChecker.check(userCtx, SUPER_PC_REP, GET_CONSTANTS); - - return null; - } - - @Override - public Value getConstant(String name) throws PMException { - return null; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/exception/UnauthorizedException.java b/src/main/java/gov/nist/csd/pm/pdp/exception/UnauthorizedException.java new file mode 100644 index 000000000..6b57ff5c2 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/exception/UnauthorizedException.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.pdp.exception; + +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.exception.PMException; + +import java.util.Arrays; + +public class UnauthorizedException extends PMException { + + public UnauthorizedException(UserContext user, String target, String ... missingAccessRights) { + super("[" + user + "] does not have access right " + Arrays.toString(missingAccessRights) + " on [" + target + "]"); + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/memory/BulkPolicyReviewer.java b/src/main/java/gov/nist/csd/pm/pdp/memory/BulkPolicyReviewer.java deleted file mode 100644 index 747c10744..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/memory/BulkPolicyReviewer.java +++ /dev/null @@ -1,126 +0,0 @@ -package gov.nist.csd.pm.pdp.memory; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.dag.DepthFirstGraphWalker; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.events.PolicyEvent; -import gov.nist.csd.pm.policy.events.PolicyEventListener; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.dag.TargetDagResult; -import gov.nist.csd.pm.policy.model.graph.dag.UserDagResult; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.Propagator; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.Visitor; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; - -import java.util.*; - -public class BulkPolicyReviewer extends MemoryPolicyReviewer { - - private final UserDagEventListener userDagEventListener; - private final PAP pap; - private Map> visitedNodes = new HashMap<>(); - - public BulkPolicyReviewer(UserContext userCtx, PAP pap) throws PMException { - super(pap); - this.pap = pap; - - this.userDagEventListener = new UserDagEventListener(userCtx, pap); - pap.addEventListener(userDagEventListener, true); - } - - @Override - public AccessRightSet getAccessRights(UserContext userCtx, String target) throws PMException { - AccessRightSet accessRights = new AccessRightSet(); - - UserDagResult userDagResult = userDagEventListener.userDagResult; - - if (userDagResult.borderTargets().isEmpty()) { - return accessRights; - } - - TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); - - return resolvePermissions(userDagResult, targetDagResult, target, pap.graph().getResourceAccessRights()); - } - - @Override - protected TargetDagResult processTargetDAG(String target, UserDagResult userCtx) throws PMException { - Map borderTargets = userCtx.borderTargets(); - Set reachedTargets = new HashSet<>(); - - Visitor visitor = node -> { - // mark the node as reached, to be used for resolving prohibitions - if (userCtx.prohibitionTargets().contains(node)) { - reachedTargets.add(node); - } - - Map nodeCtx = visitedNodes.getOrDefault(node, new HashMap<>()); - if (nodeCtx.isEmpty()) { - visitedNodes.put(node, nodeCtx); - } - - if (userDagEventListener.policyClasses.contains(node)) { - nodeCtx.put(node, new AccessRightSet()); - } else if (borderTargets.containsKey(node)) { - Set uaOps = borderTargets.get(node); - for (Map.Entry pc : nodeCtx.entrySet()) { - AccessRightSet pcOps = pc.getValue(); - pcOps.addAll(uaOps); - nodeCtx.put(pc.getKey(), pcOps); - } - } - }; - - Propagator propagator = (parent, child) -> { - Map parentCtx = visitedNodes.get(parent); - Map nodeCtx = visitedNodes.getOrDefault(child, new HashMap<>()); - - for (Map.Entry entry : parentCtx.entrySet()) { - AccessRightSet ops = nodeCtx.getOrDefault(entry.getKey(), new AccessRightSet()); - ops.addAll(entry.getValue()); - nodeCtx.put(entry.getKey(), ops); - } - - visitedNodes.put(child, nodeCtx); - }; - - new DepthFirstGraphWalker(pap.graph()) - .withDirection(Direction.PARENTS) - .withVisitor(visitor) - .withPropagator(propagator) - .withSinglePathShortCircuit(node -> visitedNodes.containsKey(node)) - .walk(target); - - Map pcMap = visitedNodes.get(target); - - // remove the target to avoid cluttering the visited nodes cache - visitedNodes.remove(target); - - return new TargetDagResult(pcMap, reachedTargets); - } - - class UserDagEventListener implements PolicyEventListener { - - private UserContext userCtx; - private MemoryPolicyReviewer memoryPolicyReviewer; - private Policy policy; - UserDagResult userDagResult; - List policyClasses; - UserDagEventListener(UserContext userContext, Policy policy) throws PMException { - this.userCtx = userContext; - this.policy = policy; - - this.memoryPolicyReviewer = new MemoryPolicyReviewer(policy); - this.userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - this.policyClasses = policy.graph().getPolicyClasses(); - } - - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - this.userDagResult = memoryPolicyReviewer.processUserDAG(userCtx.getUser(), userCtx.getProcess()); - this.policyClasses = policy.graph().getPolicyClasses(); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPDP.java b/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPDP.java deleted file mode 100644 index b991f959f..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPDP.java +++ /dev/null @@ -1,76 +0,0 @@ -package gov.nist.csd.pm.pdp.memory; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStoreEventHandler; -import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.events.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.tx.TxRunner; - -public class MemoryPDP extends PDP { - - private final BasePolicyEventHandler policyEventHandler; - - public MemoryPDP(PAP pap, boolean loadPolicyIntoMemory) throws PMException { - super(pap); - - if (loadPolicyIntoMemory) { - // load the policy into memory - this.policyEventHandler = new ReviewerPolicyListener(new MemoryPolicyStore()); - this.pap.addEventListener(this.policyEventHandler, true); - } else { - this.policyEventHandler = new EmbeddedPolicyListener(pap); - } - } - - @Override - public PolicyReviewer reviewer() throws PMException { - return new MemoryPolicyReviewer(policyEventHandler); - } - - public void runTx(UserContext userCtx, PDPTxRunner txRunner) throws PMException { - TxRunner.runTx(pap, () -> { - PDPTx pdpTx = new PDPTx(userCtx, pap, new BulkPolicyReviewer(userCtx, pap), eventListeners); - txRunner.run(pdpTx); - }); - } - - private static class ReviewerPolicyListener extends MemoryPolicyStoreEventHandler { - - public ReviewerPolicyListener(MemoryPolicyStore store) { - super(store); - } - - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - // ignore begin and commit events - // reviewer will operate as all events are added to the policy - // in the event of rollback it will call policySync to rollback - - if (event instanceof RollbackTxEvent rollbackTxEvent) { - handlePolicySync(rollbackTxEvent.policySync()); - } else { - super.handlePolicyEvent(event); - } - } - - private void handlePolicySync(PolicySynchronizationEvent event) { - this.policy = event.getPolicyStore(); - } - } - - private static class EmbeddedPolicyListener extends BasePolicyEventHandler { - - public EmbeddedPolicyListener(PAP pap) { - super(pap); - } - - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - // don't need to handle events as the pap will be updated in real time - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewer.java b/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewer.java deleted file mode 100644 index c074c375c..000000000 --- a/src/main/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewer.java +++ /dev/null @@ -1,930 +0,0 @@ -package gov.nist.csd.pm.pdp.memory; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.memory.dag.BreadthFirstGraphWalker; -import gov.nist.csd.pm.pap.memory.dag.DepthFirstGraphWalker; -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.exceptions.NodeDoesNotExistException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.audit.EdgePath; -import gov.nist.csd.pm.policy.model.audit.Explain; -import gov.nist.csd.pm.policy.model.audit.Path; -import gov.nist.csd.pm.policy.model.audit.PolicyClass; -import gov.nist.csd.pm.policy.model.graph.dag.TargetDagResult; -import gov.nist.csd.pm.policy.model.graph.dag.UserDagResult; -import gov.nist.csd.pm.policy.model.graph.dag.propagator.Propagator; -import gov.nist.csd.pm.policy.model.graph.dag.visitor.Visitor; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.graph.relationships.Relationship; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.*; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static gov.nist.csd.pm.policy.model.access.UserContext.NO_PROCESS; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -public class MemoryPolicyReviewer extends PolicyReviewer { - - final Policy policy; - - public MemoryPolicyReviewer(Policy policy) throws PMException { - this.policy = policy; - } - - @Override - public AccessRightSet getAccessRights(UserContext userCtx, String target) throws PMException { - AccessRightSet accessRights = new AccessRightSet(); - - // traverse the user side of the graph to get the associations - UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - if (userDagResult.borderTargets().isEmpty()) { - return accessRights; - } - - // traverse the target side of the graph to get permissions per policy class - TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); - - // resolve the permissions - return resolvePermissions(userDagResult, targetDagResult, target, policy.graph().getResourceAccessRights()); - } - - @Override - public AccessRightSet getDeniedAccessRights(UserContext userCtx, String target) throws PMException { - AccessRightSet accessRights = new AccessRightSet(); - - // traverse the user side of the graph to get the associations - UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - if (userDagResult.borderTargets().isEmpty()) { - return accessRights; - } - - // traverse the target side of the graph to get permissions per policy class - TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); - - // resolve the permissions - return resolveProhibitions(userDagResult, targetDagResult, target); - } - - @Override - public Map getPolicyClassAccessRights(UserContext userCtx, String target) throws PMException { - // traverse the user side of the graph to get the associations - UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - if (userDagResult.borderTargets().isEmpty()) { - return new HashMap<>(); - } - - // traverse the target side of the graph to get permissions per policy class - TargetDagResult targetDagResult = processTargetDAG(target, userDagResult); - - return targetDagResult.pcSet(); - } - - /** - * Perform a depth first search on the object side of the graph. Start at the target node and recursively visit nodes - * until a policy class is reached. On each node visited, collect any operation the user has on the target. At the - * end of each dfs iteration the visitedNodes map will contain the operations the user is permitted on the target under - * each policy class. - */ - protected TargetDagResult processTargetDAG(String target, UserDagResult userCtx) throws PMException { - if (!policy.graph().nodeExists(target)) { - throw new NodeDoesNotExistException(target); - } - - List policyClasses = policy.graph().getPolicyClasses(); - Map borderTargets = userCtx.borderTargets(); - Map> visitedNodes = new HashMap<>(); - Set reachedTargets = new HashSet<>(); - - Visitor visitor = node -> { - // mark the node as reached, to be used for resolving prohibitions - if (userCtx.prohibitionTargets().contains(node)) { - reachedTargets.add(node); - } - - Map nodeCtx = visitedNodes.getOrDefault(node, new HashMap<>()); - if (nodeCtx.isEmpty()) { - visitedNodes.put(node, nodeCtx); - } - - if (policyClasses.contains(node)) { - nodeCtx.put(node, new AccessRightSet()); - } else { - if (borderTargets.containsKey(node)) { - Set uaOps = borderTargets.get(node); - for (String pc : nodeCtx.keySet()) { - AccessRightSet pcOps = nodeCtx.getOrDefault(pc, new AccessRightSet()); - pcOps.addAll(uaOps); - nodeCtx.put(pc, pcOps); - } - } - } - }; - - Propagator propagator = (parent, child) -> { - Map parentCtx = visitedNodes.get(parent); - Map nodeCtx = visitedNodes.getOrDefault(child, new HashMap<>()); - for (String name : parentCtx.keySet()) { - AccessRightSet ops = nodeCtx.getOrDefault(name, new AccessRightSet()); - ops.addAll(parentCtx.get(name)); - nodeCtx.put(name, ops); - } - visitedNodes.put(child, nodeCtx); - }; - - new DepthFirstGraphWalker(policy.graph()) - .withDirection(Direction.PARENTS) - .withVisitor(visitor) - .withPropagator(propagator) - .walk(target); - - return new TargetDagResult(visitedNodes.get(target), reachedTargets); - } - - /** - * Find the target nodes that are reachable by the subject via an association. This is done by a breadth first search - * starting at the subject node and walking up the user side of the graph until all user attributes the subject is assigned - * to have been visited. For each user attribute visited, get the associations it is the source of and store the - * target of that association as well as the operations in a map. If a target node is reached multiple times, add any - * new operations to the already existing ones. - * - * @return a Map of target nodes that the subject can reach via associations and the operations the user has on each. - */ - protected UserDagResult processUserDAG(String subject, String process) throws PMException { - if (!policy.graph().nodeExists(subject)) { - throw new NodeDoesNotExistException(subject); - } - - final Map borderTargets = new HashMap<>(); - final Set prohibitionTargets = new HashSet<>(); - // initialize with the prohibitions or the provided process - final Set reachedProhibitions = new HashSet<>(policy.prohibitions().getWithSubject(process)); - - // get the associations for the subject, it the subject is a user, nothing will be returned - // this is only when a UA is the subject - List subjectAssociations = policy.graph().getAssociationsWithSource(subject); - collectAssociations(subjectAssociations, borderTargets); - - Visitor visitor = node -> { - List subjectProhibitions = policy.prohibitions().getWithSubject(node); - reachedProhibitions.addAll(subjectProhibitions); - for (Prohibition prohibition : subjectProhibitions) { - List containers = prohibition.getContainers(); - for (ContainerCondition cont : containers) { - prohibitionTargets.add(cont.name()); - } - } - - List nodeAssociations = policy.graph().getAssociationsWithSource(node); - collectAssociations(nodeAssociations, borderTargets); - - /*//get the parents of the subject to start bfs on user side - List parents = policyReader.graph().getParents(node); - while (!parents.isEmpty()) { - String parent = parents.iterator().next(); - Node parentNode = policyReader.graph().getNode(parent); - if (parentNode.getType() == UA) { - //get the associations the current parent node is the source of - List nodeAssociations = policyReader.graph().getAssociationsWithSource(parent); - - //collect the target and operation information for each association - collectAssociations(nodeAssociations, borderTargets); - } - - //add all of the current parent node's parents to the queue - parents.addAll(policyReader.graph().getParents(parent)); - - //remove the current parent from the queue - parents.remove(parent); - }*/ - }; - - // start the bfs - new BreadthFirstGraphWalker(policy.graph()) - .withDirection(Direction.PARENTS) - .withVisitor(visitor) - .walk(subject); - - return new UserDagResult(borderTargets, reachedProhibitions, prohibitionTargets); - } - - private void collectAssociations(List assocs, Map borderTargets) { - for (Association association : assocs) { - AccessRightSet ops = association.getAccessRightSet(); - Set exOps = borderTargets.get(association.getTarget()); - //if the target is not in the map already, put it - //else add the found operations to the existing ones. - if (exOps == null) { - borderTargets.put(association.getTarget(), ops); - } else { - ops.addAll(exOps); - borderTargets.put(association.getTarget(), ops); - } - } - } - - private Set getDescendants(String vNode) throws PMException { - Set ascendants = new HashSet<>(); - - List children = policy.graph().getChildren(vNode); - if (children.isEmpty()) { - return ascendants; - } - - ascendants.addAll(children); - for (String child : children) { - ascendants.add(child); - ascendants.addAll(getDescendants(child)); - } - - return ascendants; - } - - @Override - public Map buildCapabilityList(UserContext userCtx) throws PMException { - Map results = new HashMap<>(); - - //get border nodes. Can be OA or UA. Return empty set if no OAs are reachable - UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - if (userDagResult.borderTargets().isEmpty()) { - return results; - } - - for(String borderTarget : userDagResult.borderTargets().keySet()) { - // compute permissions on the border attr - putPermissions(results, userDagResult, borderTarget); - - // compute decisions for the subgraph of the border attr - Set descendants = getDescendants(borderTarget); - for (String descendant : descendants) { - if (results.containsKey(descendant)) { - continue; - } - - putPermissions(results, userDagResult, descendant); - } - } - - return results; - } - - private void putPermissions(Map permissionsMap, UserDagResult userDagResult, String target) throws PMException { - TargetDagResult targetCtx = processTargetDAG(target, userDagResult); - AccessRightSet permissions = resolvePermissions(userDagResult, targetCtx, target, policy.graph().getResourceAccessRights()); - permissionsMap.put(target, permissions); - } - - @Override - public Map buildACL(String target) throws PMException { - Map acl = new HashMap<>(); - List search = policy.graph().search(U, NO_PROPERTIES); - for (String user : search) { - AccessRightSet list = this.getAccessRights(new UserContext(user), target); - acl.put(user, list); - } - - return acl; - } - - @Override - public Map getBorderAttributes(String user) throws PMException { - return processUserDAG(user, NO_PROCESS) - .borderTargets(); - } - - @Override - public Map getSubgraphAccessRights(UserContext userCtx, String root) throws PMException { - Map results = new HashMap<>(); - - UserDagResult userDagResult = processUserDAG(userCtx.getUser(), userCtx.getProcess()); - if (userDagResult.borderTargets().isEmpty()) { - return results; - } - - // compute decisions for the subgraph of the border attr - Set descendants = getDescendants(root); - for (String descendant : descendants) { - if (results.containsKey(descendant)) { - continue; - } - - putPermissions(results, userDagResult, descendant); - } - - return results; - } - - @Override - public Explain explain(UserContext userCtx, String target) throws PMException { - Node userNode = policy.graph().getNode(userCtx.getUser()); - Node targetNode = policy.graph().getNode(target); - - List userPaths = dfs(userNode.getName()); - List targetPaths = dfs(targetNode.getName()); - - Map resolvedPaths = resolvePaths(userPaths, targetPaths, target); - Set perms = resolvePermissions(resolvedPaths); - - return new Explain(perms, resolvedPaths); - } - - @Override - public Set buildPOS(UserContext userCtx) throws PMException { - // Prepare the hashset to return. - HashSet hsOa = new HashSet<>(); - - // Call find_border_oa_priv(u). The result is a Hashtable - // htoa = {oa -> {op -> pcset}}: - Hashtable>> htOa = findBorderOaPrivRestrictedInternal(userCtx); - - // For each returned oa (key in htOa) - for (Enumeration oas = htOa.keys(); oas.hasMoreElements(); ) { - String oa = oas.nextElement(); - - // Compute oa's required PCs by calling find_pc_set(oa). - HashSet hsReqPcs = inMemFindPcSet(oa); - // Extract oa's label. - Hashtable> htOaLabel = htOa.get(oa); - - // Walk through the op -> pcset of the oa's label. - // For each operation/access right - for (Enumeration ops = htOaLabel.keys(); ops.hasMoreElements(); ) { - String sOp = (String)ops.nextElement(); - // Extract the pcset corresponding to this operation/access right. - Set hsActualPcs = htOaLabel.get(sOp); - // if the set of required PCs is a subset of the actual pcset, - // then user u has some privileges on the current oa node. - if (hsActualPcs.containsAll(hsReqPcs)) { - hsOa.add(oa); - break; - } - } - } - - return new HashSet<>(hsOa); - } - - @Override - public List getAccessibleChildren(UserContext userCtx, String root) throws PMException { - List children = policy.graph().getChildren(root); - children.removeIf(child -> { - try { - return getAccessRights(userCtx, child).isEmpty(); - } catch (PMException e) { - e.printStackTrace(); - return true; - } - }); - - return children; - } - - @Override - public List getAccessibleParents(UserContext userCtx, String root) throws PMException { - List parents = policy.graph().getParents(root); - parents.removeIf(parent -> { - try { - return getAccessRights(userCtx, parent).isEmpty(); - } catch (PMException e) { - e.printStackTrace(); - return true; - } - }); - - return parents; - } - - private Hashtable>> findBorderOaPrivRestrictedInternal(UserContext userCtx) throws PMException { - // Uses a hashtable htReachableOas of reachable oas (see find_border_oa_priv(u)) - // An oa is a key in this hashtable. The value is another hashtable that - // represents a label of the oa. A label is a set of pairs {(op -> pcset)}, with - // the op being the key and pcset being the value. - // {oa -> {op -> pcset}}. - Hashtable>> htReachableOas = new Hashtable<>(); - - // BFS from u (the base node). Prepare a queue. - Set visited = new HashSet<>(); - String crtNode; - - // Get u's directly assigned attributes and put them into the queue. - List hsAttrs = policy.graph().getParents(userCtx.getUser()); - List queue = new ArrayList<>(hsAttrs); - - // While the queue has elements, extract an element from the queue - // and visit it. - while (!queue.isEmpty()) { - // Extract an ua from queue. - crtNode = queue.remove(0); - if (!visited.contains(crtNode)) { - // If the ua has ua -> oa edges - if (inMemUattrHasOpsets(crtNode)) { - // Find the set of PCs reachable from ua. - HashSet hsUaPcs = inMemFindPcSet(crtNode); - - // From each discovered ua traverse the edges ua -> oa. - - // Find the opsets of this user attribute. Note that the set of containers for this - // node (user attribute) may contain not only opsets. - List assocs = policy.graph().getAssociationsWithSource(crtNode); - - // Go through the containers and only for opsets do the following. - // For each opset ops of ua: - for (Association assoc : assocs) { - String target = assoc.getTarget(); - // If oa is in htReachableOas - if (htReachableOas.containsKey(target)) { - // Then oa has a label op1 -> hsPcs1, op2 -> hsPcs2,... - // Extract its label: - Hashtable> htOaLabel = htReachableOas.get(target); - - // Get the operations from the opset: - AccessRightSet arSet = assoc.getAccessRightSet(); - // For each operation in the opset - for (String sOp : arSet) { - // If the oa's label already contains the operation sOp - if (htOaLabel.containsKey(sOp)) { - // The label contains op -> some pcset. - // Do the union of the old pc with ua's pcset - Set hsPcs = htOaLabel.get(sOp); - hsPcs.addAll(hsUaPcs); - } else { - // The op is not in the oa's label. - // Create new op -> ua's pcs mappiing in the label. - Set hsNewPcs = new HashSet<>(hsUaPcs); - htOaLabel.put(sOp, hsNewPcs); - } - } - } else { - // oa is not in htReachableOas. - // Prepare a new label - Hashtable> htOaLabel = new Hashtable<>(); - - // Get the operations from the opset: - AccessRightSet arSet = assoc.getAccessRightSet(); - // For each operation in the opset - for (String sOp : arSet) { - // Add op -> pcs to the label. - Set hsNewPcs = new HashSet<>(hsUaPcs); - htOaLabel.put(sOp, hsNewPcs); - } - - // Add oa -> {op -> pcs} - htReachableOas.put(target, htOaLabel); - } - } - } - visited.add(crtNode); - - List hsDescs = policy.graph().getParents(crtNode); - queue.addAll(hsDescs); - } - } - - - // For each reachable oa in htReachableOas.keys - for (Enumeration keys = htReachableOas.keys(); keys.hasMoreElements() ;) { - String oa = keys.nextElement(); - // Compute {pc | oa ->+ pc} - Set hsOaPcs = inMemFindPcSet(oa); - // Extract oa's label. - Hashtable> htOaLabel = htReachableOas.get(oa); - // The label contains op1 -> pcs1, op2 -> pcs2,... - // For each operation in the label - for (Enumeration lbl = htOaLabel.keys(); lbl.hasMoreElements();) { - String sOp = lbl.nextElement(); - // Intersect the pcset corresponding to this operation, - // which comes from the uas, with the oa's pcset. - Set oaPcs = htOaLabel.get(sOp); - oaPcs.retainAll(hsOaPcs); - if (oaPcs.isEmpty()) htOaLabel.remove(sOp); - } - } - - return htReachableOas; - } - - private HashSet inMemFindPcSet(String node) throws PMException { - HashSet reachable = new HashSet<>(); - - // Init the queue, visited - ArrayList queue = new ArrayList<>(); - HashSet visited = new HashSet<>(); - - // The current element - String crtNode; - - // Insert the start node into the queue - queue.add(node); - - List policyClasses = policy.graph().getPolicyClasses(); - - // While queue is not empty - while (!queue.isEmpty()) { - // Extract current element from queue - crtNode = queue.remove(0); - // If not visited - if (!visited.contains(crtNode)) { - // Mark it as visited - visited.add(crtNode); - // Extract its direct descendants. If a descendant is an attribute, - // insert it into the queue. If it is a pc, add it to reachable, - // if not already there - List hsContainers = policy.graph().getParents(crtNode); - for (String n : hsContainers) { - if (policyClasses.contains(n)) { - reachable.add(n); - } else { - queue.add(n); - } - } - } - } - return reachable; - } - - private boolean inMemUattrHasOpsets(String uaNode) throws PMException { - return !policy.graph().getAssociationsWithSource(uaNode).isEmpty(); - } - - private Set resolvePermissions(Map paths) throws PMException { - Map pcPerms = new HashMap<>(); - for (String pc : paths.keySet()) { - PolicyClass pcPaths = paths.get(pc); - for(Path p : pcPaths.getPaths()) { - AccessRightSet ops = p.getAssociation().getAccessRightSet(); - AccessRightSet existingOps = pcPerms.getOrDefault(pc, new AccessRightSet()); - existingOps.addAll(ops); - pcPerms.put(pc, existingOps); - } - } - - return resolveAllowedPermissions(pcPerms, policy.graph().getResourceAccessRights()); - } - - /** - * Given a set of paths starting at a user, and a set of paths starting at an object, return the paths from - * the user to the target node (through an association) that belong to each policy class. A path is added to a policy - * class' entry in the returned map if the user path ends in an association in which the target of the association - * exists in a target path. That same target path must also end in a policy class. If the path does not end in a policy - * class the target path is ignored. - * - * @param userPaths the set of paths starting with a user. - * @param targetPaths the set of paths starting with a target node. - * @param target the name of the target node. - * @return the set of paths from a user to a target node (through an association) for each policy class in the system. - * @throws PMException if there is an exception traversing the graph - */ - private Map resolvePaths(List userPaths, List targetPaths, String target) throws PMException { - Map results = new HashMap<>(); - - for (EdgePath targetPath : targetPaths) { - Relationship pcEdge = targetPath.getEdges().get(targetPath.getEdges().size()-1); - - // if the last element in the target path is a pc, the target belongs to that pc, add the pc to the results - // skip to the next target path if it is not a policy class - if (!isPolicyClass(pcEdge.getTarget())) { - continue; - } - - PolicyClass policyClass = results.getOrDefault(pcEdge.getTarget(), new PolicyClass()); - - // compute the paths for this target path - Set paths = computePaths(userPaths, targetPath, target); - - // add all paths - Set existingPaths = policyClass.getPaths(); - existingPaths.addAll(paths); - - // collect all ops - for (Path p : paths) { - policyClass.getOperations().addAll(p.getAssociation().getAccessRightSet()); - } - - // update results - results.put(pcEdge.getTarget(), policyClass); - } - - return results; - } - - private boolean isPolicyClass(String node) throws PMException { - return policy.graph().getPolicyClasses().contains(node); - } - - private Set computePaths(List userEdgePaths, EdgePath targetEdgePath, String target) { - Set computedPaths = new HashSet<>(); - - for(EdgePath userEdgePath : userEdgePaths) { - Relationship lastUserEdge = userEdgePath.getEdges().get(userEdgePath.getEdges().size()-1); - - // if the last edge does not have any ops, it is not an association, so ignore it - if (!lastUserEdge.isAssociation()) { - continue; - } - - for(int i = 0; i < targetEdgePath.getEdges().size(); i++) { - Relationship curEdge = targetEdgePath.getEdges().get(i); - // if the target of the last edge in a user resolvedPath does not match the target of the current edge in the target - // resolvedPath, continue to the next target edge - String lastUserEdgeTarget = lastUserEdge.getTarget(); - String curEdgeSource = curEdge.getSource(); - String curEdgeTarget = curEdge.getTarget(); - - // if the target of the last edge in a user path does not match the target of the current edge in the target path - // AND if the target of the last edge in a user path does not match the source of the current edge in the target path - // OR if the target of the last edge in a user path does not match the target of the explain - // continue to the next target edge - if((!lastUserEdgeTarget.equals(curEdgeTarget)) && - (!lastUserEdgeTarget.equals(curEdgeSource) || lastUserEdgeTarget.equals(target))) { - continue; - } - - List userPathToAssociation = userEdgePath.toPath(); - List targetPathToPolicyClass = targetEdgePath.toPath(); - - - Path path = new Path(userPathToAssociation, targetPathToPolicyClass, - new Association(lastUserEdge.getSource(), lastUserEdgeTarget, lastUserEdge.getAccessRightSet())); - - computedPaths.add(path); - } - } - - return computedPaths; - } - - private List dfs(String start) throws PMException { - final List paths = new ArrayList<>(); - final Map> propPaths = new HashMap<>(); - - Visitor visitor = nodeName -> { - Node node = policy.graph().getNode(nodeName); - List nodePaths = new ArrayList<>(); - - for(String parent : policy.graph().getParents(nodeName)) { - Relationship edge = new Relationship(node.getName(), parent); - List parentPaths = propPaths.get(parent); - if(parentPaths.isEmpty()) { - EdgePath path = new EdgePath(); - path.addEdge(edge); - nodePaths.add(0, path); - } else { - for(EdgePath p : parentPaths) { - EdgePath parentPath = new EdgePath(); - for(Relationship e : p.getEdges()) { - parentPath.addEdge(new Relationship(e.getSource(), e.getTarget(), e.getAccessRightSet())); - } - - parentPath.getEdges().add(0, edge); - nodePaths.add(parentPath); - } - } - } - - List assocs = policy.graph().getAssociationsWithSource(node.getName()); - for(Association association : assocs) { - Node targetNode = policy.graph().getNode(association.getTarget()); - EdgePath path = new EdgePath(); - path.addEdge(new Relationship(node.getName(), targetNode.getName(), association.getAccessRightSet())); - nodePaths.add(path); - } - - // if the node being visited is the start node, add all the found nodePaths - // TODO there might be a more efficient way of doing this - // we don't need the if for users, only when the target is an OA, so it might have something to do with - // leafs vs non leafs - if (node.getName().equals(start)) { - paths.clear(); - paths.addAll(nodePaths); - } else { - propPaths.put(node.getName(), nodePaths); - } - }; - - Propagator propagator = (parentNodeName, childNodeName) -> { - Node parentNode = policy.graph().getNode(parentNodeName); - Node childNode = policy.graph().getNode(childNodeName); - List childPaths = propPaths.computeIfAbsent(childNode.getName(), k -> new ArrayList<>()); - List parentPaths = propPaths.get(parentNode.getName()); - - for(EdgePath p : parentPaths) { - EdgePath path = new EdgePath(); - for(Relationship edge : p.getEdges()) { - path.addEdge(new Relationship(edge.getSource(), edge.getTarget(), edge.getAccessRightSet())); - } - - EdgePath newPath = new EdgePath(); - newPath.getEdges().addAll(path.getEdges()); - Relationship edge = new Relationship(childNode.getName(), parentNode.getName(), null); - newPath.getEdges().add(0, edge); - childPaths.add(newPath); - propPaths.put(childNode.getName(), childPaths); - } - - if (childNode.getName().equals(start)) { - paths.clear(); - paths.addAll(propPaths.get(childNode.getName())); - } - }; - - new DepthFirstGraphWalker(policy.graph()) - .withVisitor(visitor) - .withPropagator(propagator) - .withDirection(Direction.PARENTS) - .walk(start); - - return paths; - } - - @Override - public List getAttributeContainers(String node) throws PMException { - List attrs = new ArrayList<>(); - - new DepthFirstGraphWalker(policy.graph()) - .withDirection(Direction.PARENTS) - .withVisitor((n) -> { - Node visitedNode; - visitedNode = policy.graph().getNode(n); - if (visitedNode.getType().equals(UA) || - visitedNode.getType().equals(OA)) { - attrs.add(n); - } - }) - .walk(node); - - return attrs; - } - - @Override - public List getPolicyClassContainers(String node) throws PMException { - List attrs = new ArrayList<>(); - - new DepthFirstGraphWalker(policy.graph()) - .withDirection(Direction.PARENTS) - .withVisitor((n) -> { - Node visitedNode; - visitedNode = policy.graph().getNode(n); - if (visitedNode.getType().equals(PC)) { - attrs.add(n); - } - }) - .walk(node); - - return attrs; - } - - @Override - public boolean isContained(String subject, String container) throws PMException { - if (!policy.graph().nodeExists(subject)) { - throw new NodeDoesNotExistException(subject); - } else if (!policy.graph().nodeExists(container)){ - throw new NodeDoesNotExistException(container); - } - - AtomicBoolean found = new AtomicBoolean(false); - - new DepthFirstGraphWalker(policy.graph()) - .withDirection(Direction.PARENTS) - .withVisitor((n) -> { - if (n.equals(container)) { - found.set(true); - } - }) - .walk(subject); - - return found.get(); - } - - @Override - public List getInheritedProhibitionsFor(String subject) throws PMException { - List pros = new ArrayList<>(); - - new DepthFirstGraphWalker(policy.graph()) - .withVisitor((n) -> { - pros.addAll(policy.prohibitions().getWithSubject(n)); - }) - .withDirection(Direction.PARENTS) - .walk(subject); - - return pros; - } - - @Override - public List getProhibitionsWithContainer(String container) throws PMException { - List pros = new ArrayList<>(); - - Map> prohibitions = policy.prohibitions().getAll(); - for (String subject : prohibitions.keySet()) { - List subjectProhibitions = prohibitions.get(subject); - for (Prohibition prohibition : subjectProhibitions) { - if (prohibition.getContainers().contains(new ContainerCondition(container, false))) { - pros.add(prohibition); - } - } - } - - return pros; - } - - @Override - public List getObligationsWithAuthor(UserContext userCtx) throws PMException { - List obls = new ArrayList<>(); - for (Obligation obligation : policy.obligations().getAll()) { - if (obligation.getAuthor().equals(userCtx)) { - obls.add(obligation); - } - } - - return obls; - } - - @Override - public List getObligationsWithAttributeInEvent(String attribute) throws PMException { - List obls = new ArrayList<>(); - for (Obligation obligation : policy.obligations().getAll()) { - List rules = obligation.getRules(); - for (Rule rule : rules) { - Target target = rule.getEventPattern().getTarget(); - if (target.getType() == Target.Type.POLICY_ELEMENT) { - if (target.policyElement().equals(attribute)) { - obls.add(obligation); - } - } else if (target.getType() == Target.Type.ANY_POLICY_ELEMENT) { - obls.add(obligation); - } else if (target.getType() == Target.Type.ANY_CONTAINED_IN) { - if (getAttributeContainers(attribute).contains(target.anyContainedIn())) { - obls.add(obligation); - } - } else if (target.getType() == Target.Type.ANY_OF_SET) { - if (target.anyOfSet().contains(attribute)) { - obls.add(obligation); - } - } - } - } - - return obls; - } - - @Override - public List getObligationsWithAttributeInResponse(String attribute) throws PMException { - List obls = new ArrayList<>(); - for (Obligation obligation : policy.obligations().getAll()) { - List rules = obligation.getRules(); - for (Rule rule : rules) { - Response response = rule.getResponse(); - for (PMLStatement statement : response.getStatements()) { - Pattern p = Pattern.compile("\\b(" + attribute + ")\\b"); - Matcher m = p.matcher(statement.toString()); - if (m.find()) { - obls.add(obligation); - } - } - } - } - - return obls; - } - - @Override - public List getObligationsWithEvent(String event) throws PMException { - List obls = new ArrayList<>(); - for (Obligation obligation : policy.obligations().getAll()) { - List rules = obligation.getRules(); - for (Rule rule : rules) { - if (rule.getEventPattern().getOperations().contains(event)) { - obls.add(obligation); - } - } - } - - return obls; - } - @Override - public List getMatchingEventResponses(EventContext evt) throws PMException { - List responses = new ArrayList<>(); - for (Obligation obligation : policy.obligations().getAll()) { - for (Rule rule : obligation.getRules()) { - if (evt.matchesPattern(rule.getEventPattern(), this)) { - responses.add(rule.getResponse()); - } - } - } - - return responses; - } -} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicator.java new file mode 100644 index 000000000..a4996fa89 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicator.java @@ -0,0 +1,154 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.modification.GraphModifier; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.graph.*; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.graph.node.NodeType; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.*; + +public class GraphModificationAdjudicator extends GraphModifier { + + private final UserContext userCtx; + private final PAP pap; + private final EventEmitter eventEmitter; + + public GraphModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) { + super(pap.modify()); + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = eventEmitter; + } + + @Override + public String createPolicyClass(String name) throws PMException { + EventContext event = new CreatePolicyClassOp() + .withOperands(Map.of(NAME_OPERAND, name)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + return name; + } + + @Override + public String createUserAttribute(String name, Collection descendants) throws PMException { + EventContext event = new CreateUserAttributeOp() + .withOperands(Map.of(NAME_OPERAND, name, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + return name; + } + + @Override + public String createObjectAttribute(String name, Collection descendants) throws PMException { + EventContext event = new CreateObjectAttributeOp() + .withOperands(Map.of(NAME_OPERAND, name, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + return name; + } + + @Override + public String createObject(String name, Collection descendants) throws PMException { + EventContext event = new CreateObjectOp() + .withOperands(Map.of(NAME_OPERAND, name, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + return name; + } + + @Override + public String createUser(String name, Collection descendants) throws PMException { + EventContext event = new CreateUserOp() + .withOperands(Map.of(NAME_OPERAND, name, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + return name; + } + + @Override + public void setNodeProperties(String name, Map properties) throws PMException { + EventContext event = new SetNodePropertiesOp() + .withOperands(Map.of(NAME_OPERAND, name, PROPERTIES_OPERAND, properties)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deleteNode(String name) throws PMException { + NodeType nodeType = pap.query().graph().getNode(name).getType(); + Collection descendants = pap.query().graph().getAdjacentDescendants(name); + + Operation op = new DeletePolicyClassOp(); + + switch (nodeType) { + case OA -> op = new DeleteObjectAttributeOp(); + case UA -> op = new DeleteUserAttributeOp(); + case O -> op = new DeleteObjectOp(); + case U -> op = new DeleteUserOp(); + } + + EventContext event = op. + withOperands(Map.of(NAME_OPERAND, name, TYPE_OPERAND, nodeType, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void assign(String ascendant, Collection descendants) throws PMException { + EventContext event = new AssignOp() + .withOperands(Map.of(ASCENDANT_OPERAND, ascendant, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deassign(String ascendant, Collection descendants) throws PMException { + EventContext event = new DeassignOp() + .withOperands(Map.of(ASCENDANT_OPERAND, ascendant, DESCENDANTS_OPERAND, descendants)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void associate(String ua, String target, AccessRightSet accessRights) throws PMException { + EventContext event = new AssociateOp() + .withOperands(Map.of(UA_OPERAND, ua, TARGET_OPERAND, target, ARSET_OPERAND, accessRights)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void dissociate(String ua, String target) throws PMException { + EventContext event = new DissociateOp() + .withOperands(Map.of(UA_OPERAND, ua, TARGET_OPERAND, target)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicator.java new file mode 100644 index 000000000..e485b2f6c --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicator.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.modification.ObligationsModifier; +import gov.nist.csd.pm.pap.op.obligation.CreateObligationOp; +import gov.nist.csd.pm.pap.op.obligation.DeleteObligationOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.obligation.Rule; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.AUTHOR_OPERAND; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.RULES_OPERAND; + +public class ObligationsModificationAdjudicator extends ObligationsModifier { + + private final UserContext userCtx; + private final PAP pap; + private final EventEmitter eventEmitter; + + public ObligationsModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) { + super(pap.modify()); + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = eventEmitter; + } + + @Override + public void createObligation(String author, String name, List rules) throws PMException { + EventContext event = new CreateObligationOp() + .withOperands(Map.of(AUTHOR_OPERAND, author, NAME_OPERAND, name, RULES_OPERAND, rules)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deleteObligation(String name) throws PMException { + Obligation obligation = pap.query().obligations().getObligation(name); + + EventContext event = new DeleteObligationOp() + .withOperands(Map.of( + AUTHOR_OPERAND, obligation.getAuthor(), + NAME_OPERAND, obligation.getName(), + RULES_OPERAND, obligation.getRules() + )) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicator.java new file mode 100644 index 000000000..db5d4e8ac --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicator.java @@ -0,0 +1,60 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.OperationsModifier; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.DeleteAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp.OPERATION_OPERAND; +import static gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp.OPERATIONS_OPERAND; + +public class OperationsModificationAdjudicator extends OperationsModifier { + + private final UserContext userCtx; + private final PAP pap; + private final EventEmitter eventEmitter; + + public OperationsModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) throws PMException { + super(pap.modify()); + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = eventEmitter; + } + + @Override + public void setResourceOperations(AccessRightSet accessRightSet) throws PMException { + EventContext event = new SetResourceOperationsOp() + .withOperands(Map.of(OPERATIONS_OPERAND, accessRightSet)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void createAdminOperation(Operation operation) throws PMException { + EventContext event = new CreateAdminOperationOp() + .withOperands(Map.of(OPERATION_OPERAND, operation)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deleteAdminOperation(String operation) throws PMException { + EventContext event = new DeleteAdminOperationOp() + .withOperands(Map.of(NAME_OPERAND, operation)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/PolicyModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/PolicyModificationAdjudicator.java new file mode 100644 index 000000000..3b7b11f2b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/PolicyModificationAdjudicator.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.*; +import gov.nist.csd.pm.pap.query.UserContext; + +public class PolicyModificationAdjudicator extends PolicyModifier { + + private final GraphModificationAdjudicator graph; + private final ProhibitionsModificationAdjudicator prohibitions; + private final ObligationsModificationAdjudicator obligations; + private final OperationsModificationAdjudicator operations; + private final RoutinesModificationAdjudicator routines; + + public PolicyModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) throws PMException { + super(pap.modify()); + this.graph = new GraphModificationAdjudicator(userCtx, pap, eventEmitter); + this.prohibitions = new ProhibitionsModificationAdjudicator(userCtx, pap, eventEmitter); + this.obligations = new ObligationsModificationAdjudicator(userCtx, pap, eventEmitter); + this.operations = new OperationsModificationAdjudicator(userCtx, pap, eventEmitter); + this.routines = new RoutinesModificationAdjudicator(userCtx, pap, eventEmitter); + } + + @Override + public GraphModifier graph() { + return graph; + } + + @Override + public ProhibitionsModifier prohibitions() { + return prohibitions; + } + + @Override + public ObligationsModifier obligations() { + return obligations; + } + + @Override + public OperationsModifier operations() { + return operations; + } + + @Override + public RoutinesModifier routines() { + return routines; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicator.java new file mode 100644 index 000000000..1e104ed5b --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicator.java @@ -0,0 +1,65 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.modification.ProhibitionsModifier; +import gov.nist.csd.pm.pap.op.prohibition.CreateProhibitionOp; +import gov.nist.csd.pm.pap.op.prohibition.DeleteProhibitionOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; + +import java.util.Collection; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.prohibition.ProhibitionOp.*; + +public class ProhibitionsModificationAdjudicator extends ProhibitionsModifier { + private final UserContext userCtx; + private final PAP pap; + private final EventEmitter eventEmitter; + + public ProhibitionsModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) { + super(pap.modify()); + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = eventEmitter; + } + + @Override + public void createProhibition(String name, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, Collection containerConditions) throws PMException { + EventContext event = new CreateProhibitionOp() + .withOperands(Map.of( + NAME_OPERAND, name, + SUBJECT_OPERAND, subject, + ARSET_OPERAND, accessRightSet, + INTERSECTION_OPERAND, intersection, + CONTAINERS_OPERAND, containerConditions + )) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deleteProhibition(String name) throws PMException { + Prohibition prohibition = pap.query().prohibitions().getProhibition(name); + + EventContext event = new DeleteProhibitionOp() + .withOperands(Map.of( + NAME_OPERAND, prohibition.getName(), + SUBJECT_OPERAND, prohibition.getSubject(), + ARSET_OPERAND, prohibition.getAccessRightSet(), + INTERSECTION_OPERAND, prohibition.isIntersection(), + CONTAINERS_OPERAND, prohibition.getContainers() + )) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicator.java new file mode 100644 index 000000000..6addbe734 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicator.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventEmitter; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.RoutinesModifier; +import gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp; +import gov.nist.csd.pm.pap.op.routine.DeleteAdminRoutineOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp.ROUTINE_OPERAND; + +public class RoutinesModificationAdjudicator extends RoutinesModifier { + + private final UserContext userCtx; + private final PAP pap; + private final EventEmitter eventEmitter; + + public RoutinesModificationAdjudicator(UserContext userCtx, PAP pap, EventEmitter eventEmitter) { + super(pap.modify()); + this.userCtx = userCtx; + this.pap = pap; + this.eventEmitter = eventEmitter; + } + + @Override + public void createAdminRoutine(Routine routine) throws PMException { + EventContext event = new CreateAdminRoutineOp() + .withOperands(Map.of(ROUTINE_OPERAND, routine)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } + + @Override + public void deleteAdminRoutine(String name) throws PMException { + EventContext event = new DeleteAdminRoutineOp() + .withOperands(Map.of(NAME_OPERAND, name)) + .execute(pap, userCtx); + + eventEmitter.emitEvent(event); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/AccessQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/AccessQueryAdjudicator.java new file mode 100644 index 000000000..1b476f5ea --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/AccessQueryAdjudicator.java @@ -0,0 +1,110 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.AccessQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.query.explain.Explain; + +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public class AccessQueryAdjudicator extends AccessQuerier { + + private final UserContext userCtx; + private final PAP pap; + + public AccessQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + this.userCtx = userCtx; + this.pap = pap; + } + + @Override + public AccessRightSet computePrivileges(UserContext userCtx, String target) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, target, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computePrivileges(userCtx, target); + } + + @Override + public AccessRightSet computeDeniedPrivileges(UserContext userCtx, String target) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, target, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeDeniedPrivileges(userCtx, target); + } + + @Override + public Map computePolicyClassAccessRights(UserContext userCtx, String target) + throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, target, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computePolicyClassAccessRights(userCtx, target); + } + + @Override + public Map computeCapabilityList(UserContext userCtx) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeCapabilityList(userCtx); + } + + @Override + public Map computeACL(String target) throws PMException { + PrivilegeChecker.check(pap, userCtx, target, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeACL(target); + } + + @Override + public Map computeDestinationAttributes(String user) throws PMException { + PrivilegeChecker.check(pap, userCtx, user, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeDestinationAttributes(user); + } + + @Override + public Map computeAscendantPrivileges(UserContext userCtx, String root) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeAscendantPrivileges(userCtx, root); + } + + @Override + public Explain explain(UserContext userCtx, String target) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, target, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().explain(userCtx, target); + } + + @Override + public Set computePersonalObjectSystem(UserContext userCtx) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computePersonalObjectSystem(userCtx); + } + + @Override + public Collection computeAccessibleAscendants(UserContext userCtx, String root) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, root, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeAccessibleAscendants(userCtx, root); + } + + @Override + public Collection computeAccessibleDescendants(UserContext userCtx, String root) throws PMException { + PrivilegeChecker.check(pap, userCtx, userCtx.getUser(), AdminAccessRights.REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, root, AdminAccessRights.REVIEW_POLICY); + + return pap.query().access().computeAccessibleDescendants(userCtx, root); + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/GraphQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/GraphQueryAdjudicator.java new file mode 100644 index 000000000..1821010f4 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/GraphQueryAdjudicator.java @@ -0,0 +1,184 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.GraphQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.REVIEW_POLICY; + +public class GraphQueryAdjudicator extends GraphQuerier { + + private final UserContext userCtx; + private final PAP pap; + + public GraphQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + this.userCtx = userCtx; + this.pap = pap; + } + + @Override + public boolean nodeExists(String name) throws PMException { + boolean exists = pap.query().graph().nodeExists(name); + + // check user has permissions on the node + PrivilegeChecker.check(pap, userCtx, name); + + return exists; + } + + @Override + public Node getNode(String name) throws PMException { + // get node + Node node = pap.query().graph().getNode(name); + + // check user has permissions on the node + PrivilegeChecker.check(pap, userCtx, name); + + return node; + } + + @Override + public Collection search(NodeType type, Map properties) throws PMException { + Collection search = pap.query().graph().search(type, properties); + search.removeIf(node -> { + try { + PrivilegeChecker.check(pap, userCtx, node); + return false; + } catch (PMException e) { + return true; + } + }); + + return search; + } + + @Override + public Collection getPolicyClasses() throws PMException { + List policyClasses = new ArrayList<>(); + for (String pc : pap.query().graph().getPolicyClasses()) { + try { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName()); + } catch (UnauthorizedException e) { + continue; + } + + policyClasses.add(pc); + } + + return policyClasses; + } + + @Override + public Collection getAdjacentDescendants(String node) throws PMException { + List descendants = new ArrayList<>(); + for (String descendant : pap.query().graph().getAdjacentDescendants(node)) { + try { + PrivilegeChecker.check(pap, userCtx, descendant); + } catch (UnauthorizedException e) { + continue; + } + + descendants.add(descendant); + } + + return descendants; + } + + @Override + public Collection getAdjacentAscendants(String node) throws PMException { + List ascendants = new ArrayList<>(); + for (String ascendant : pap.query().graph().getAdjacentAscendants(node)) { + try { + PrivilegeChecker.check(pap, userCtx, ascendant); + } catch (UnauthorizedException e) { + continue; + } + + ascendants.add(ascendant); + } + + return ascendants; + } + + @Override + public Collection getAssociationsWithSource(String ua) throws PMException { + return getAssociations(pap.query().graph().getAssociationsWithSource(ua)); + } + + @Override + public Collection getAssociationsWithTarget(String target) throws PMException { + return getAssociations(pap.query().graph().getAssociationsWithTarget(target)); + } + + @Override + public Collection getAttributeDescendants(String node) throws PMException { + PrivilegeChecker.check(pap, userCtx, node, REVIEW_POLICY); + + return pap.query().graph().getAttributeDescendants(node); + } + + @Override + public Collection getPolicyClassDescendants(String node) throws PMException { + PrivilegeChecker.check(pap, userCtx, node, REVIEW_POLICY); + + return pap.query().graph().getPolicyClassDescendants(node); + } + + @Override + public boolean isAscendant(String ascendant, String descendant) throws PMException { + PrivilegeChecker.check(pap, userCtx, ascendant, REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, descendant, REVIEW_POLICY); + + return pap.query().graph().isAscendant(ascendant, descendant); + } + + @Override + public boolean isDescendant(String ascendant, String descendant) throws PMException { + PrivilegeChecker.check(pap, userCtx, ascendant, REVIEW_POLICY); + + return pap.query().graph().isDescendant(ascendant, descendant); + } + + @Override + public Collection getAscendants(String node) throws PMException { + PrivilegeChecker.check(pap, userCtx, node, REVIEW_POLICY); + + return pap.query().graph().getAscendants(node); + } + + @Override + public Collection getDescendants(String node) throws PMException { + PrivilegeChecker.check(pap, userCtx, node, REVIEW_POLICY); + + return pap.query().graph().getDescendants(node); + } + + private List getAssociations(Collection associations) { + List ret = new ArrayList<>(); + for (Association association : associations) { + try { + PrivilegeChecker.check(pap, userCtx, association.getSource(), REVIEW_POLICY); + PrivilegeChecker.check(pap, userCtx, association.getTarget(), REVIEW_POLICY); + } catch (PMException e) { + continue; + } + + ret.add(association); + } + + return ret; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/ObligationsQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/ObligationsQueryAdjudicator.java new file mode 100644 index 000000000..496cd7b54 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/ObligationsQueryAdjudicator.java @@ -0,0 +1,97 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.pattern.operand.OperandPatternExpression; +import gov.nist.csd.pm.pap.query.ObligationsQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.GET_OBLIGATION; + +public class ObligationsQueryAdjudicator extends ObligationsQuerier { + + private final UserContext userCtx; + private final PAP pap; + + public ObligationsQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + this.userCtx = userCtx; + this.pap = pap; + } + + @Override + public Collection getObligations() throws PMException { + Collection obligations = pap.query().obligations().getObligations(); + obligations.removeIf(obligation -> { + try { + for (Rule rule : obligation.getRules()) { + checkRule(rule); + } + return false; + } catch (PMException e) { + return true; + } + }); + + return obligations; + } + + @Override + public boolean obligationExists(String name) throws PMException { + boolean exists = pap.query().obligations().obligationExists(name); + if (!exists) { + return false; + } + + try { + getObligation(name); + } catch (UnauthorizedException e) { + return false; + } + + return true; + } + + @Override + public Obligation getObligation(String name) throws PMException { + Obligation obligation = pap.query().obligations().getObligation(name); + for (Rule rule : obligation.getRules()) { + checkRule(rule); + } + + return obligation; + } + + @Override + public Collection getObligationsWithAuthor(String user) throws PMException { + PrivilegeChecker.check(pap, userCtx, user, AdminAccessRights.REVIEW_POLICY); + + return pap.query().obligations().getObligationsWithAuthor(user); + } + + private void checkRule(Rule rule) throws PMException { + EventPattern eventPattern = rule.getEventPattern(); + + // check subject + PrivilegeChecker.checkPattern(pap, userCtx, eventPattern.getSubjectPattern(), GET_OBLIGATION); + + // cannot check operation as it is not a node + + // check operands + for (Map.Entry> operandPattern : eventPattern.getOperandPatterns().entrySet()) { + for (OperandPatternExpression operandPatternExpression : operandPattern.getValue()) { + PrivilegeChecker.checkPattern(pap, userCtx, operandPatternExpression, GET_OBLIGATION); + } + } + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/OperationsQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/OperationsQueryAdjudicator.java new file mode 100644 index 000000000..f4dd56f04 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/OperationsQueryAdjudicator.java @@ -0,0 +1,49 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.OperationsQuerier; +import gov.nist.csd.pm.pap.query.UserContext; + +import java.util.Collection; + +public class OperationsQueryAdjudicator extends OperationsQuerier { + + private UserContext userCtx; + private PAP pap; + + public OperationsQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + + this.pap = pap; + this.userCtx = userCtx; + } + + @Override + public AccessRightSet getResourceOperations() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().operations().getResourceOperations(); + } + + @Override + public Collection getAdminOperationNames() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().operations().getAdminOperationNames(); + } + + @Override + public Operation getAdminOperation(String operationName) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().operations().getAdminOperation(operationName); + } + + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/PolicyQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/PolicyQueryAdjudicator.java new file mode 100644 index 000000000..174c1c013 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/PolicyQueryAdjudicator.java @@ -0,0 +1,55 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.*; + +public class PolicyQueryAdjudicator extends PolicyQuerier { + + private final AccessQueryAdjudicator access; + private final GraphQueryAdjudicator graph; + private final ProhibitionsQueryAdjudicator prohibitions; + private final ObligationsQueryAdjudicator obligations; + private final OperationsQueryAdjudicator operations; + private final RoutinesQueryAdjudicator routines; + + public PolicyQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + this.access = new AccessQueryAdjudicator(userCtx, pap); + this.graph = new GraphQueryAdjudicator(userCtx, pap); + this.prohibitions = new ProhibitionsQueryAdjudicator(userCtx, pap); + this.obligations = new ObligationsQueryAdjudicator(userCtx, pap); + this.operations = new OperationsQueryAdjudicator(userCtx, pap); + this.routines = new RoutinesQueryAdjudicator(userCtx, pap); + } + + @Override + public AccessQueryAdjudicator access() { + return access; + } + + @Override + public GraphQueryAdjudicator graph() { + return graph; + } + + @Override + public ProhibitionsQueryAdjudicator prohibitions() { + return prohibitions; + } + + @Override + public ObligationsQueryAdjudicator obligations() { + return obligations; + } + + @Override + public OperationsQueryAdjudicator operations() { + return operations; + } + + @Override + public RoutinesQuerier routines() { + return routines; + } + +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/ProhibitionsQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/ProhibitionsQueryAdjudicator.java new file mode 100644 index 000000000..490b06e26 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/ProhibitionsQueryAdjudicator.java @@ -0,0 +1,108 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.ProhibitionsQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.prohibition.Prohibition; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.GET_PROCESS_PROHIBITIONS; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.GET_PROHIBITIONS; + +public class ProhibitionsQueryAdjudicator extends ProhibitionsQuerier { + + private final UserContext userCtx; + private final PAP pap; + + public ProhibitionsQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + this.userCtx = userCtx; + this.pap = pap; + } + + @Override + public Map> getProhibitions() throws PMException { + Map> prohibitions = pap.query().prohibitions().getProhibitions(); + Map> retProhibitions = new HashMap<>(); + for (String subject : prohibitions.keySet()) { + Collection subjectPros = filterProhibitions(prohibitions.get(subject)); + retProhibitions.put(subject, subjectPros); + } + + return retProhibitions; + } + + @Override + public Collection getProhibitionsWithSubject(String subject) throws PMException { + return filterProhibitions(pap.query().prohibitions().getProhibitionsWithSubject(subject)); + } + + @Override + public Prohibition getProhibition(String name) throws PMException { + Prohibition prohibition = pap.query().prohibitions().getProhibition(name); + + // check user has access to subject + if (prohibition.getSubject().getType() == ProhibitionSubject.Type.PROCESS) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), GET_PROCESS_PROHIBITIONS); + } else { + PrivilegeChecker.check(pap, userCtx, prohibition.getSubject().getName(), GET_PROHIBITIONS); + } + + // check user has access to each container condition + for (ContainerCondition containerCondition : prohibition.getContainers()) { + PrivilegeChecker.check(pap, userCtx, containerCondition.getName(), GET_PROHIBITIONS); + } + + return prohibition; + } + + @Override + public Collection getInheritedProhibitionsFor(String subject) throws PMException { + PrivilegeChecker.check(pap, this.userCtx, subject, AdminAccessRights.REVIEW_POLICY); + + return pap.query().prohibitions().getInheritedProhibitionsFor(subject); + } + + @Override + public Collection getProhibitionsWithContainer(String container) throws PMException { + PrivilegeChecker.check(pap, this.userCtx, container, AdminAccessRights.REVIEW_POLICY); + + return pap.query().prohibitions().getProhibitionsWithContainer(container); + } + + + + private Collection filterProhibitions(Collection prohibitions) { + prohibitions.removeIf(prohibition -> { + try { + // check user has access to subject prohibitions + if (prohibition.getSubject().getType() == ProhibitionSubject.Type.PROCESS) { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), + GET_PROCESS_PROHIBITIONS); + } else { + PrivilegeChecker.check(pap, userCtx, prohibition.getSubject().getName(), GET_PROHIBITIONS); + } + + // check user has access to each target prohibitions + for (ContainerCondition containerCondition : prohibition.getContainers()) { + PrivilegeChecker.check(pap, userCtx, containerCondition.getName(), GET_PROHIBITIONS); + } + + return false; + } catch (PMException e) { + return true; + } + }); + + return prohibitions; + } +} diff --git a/src/main/java/gov/nist/csd/pm/pdp/query/RoutinesQueryAdjudicator.java b/src/main/java/gov/nist/csd/pm/pdp/query/RoutinesQueryAdjudicator.java new file mode 100644 index 000000000..900cff610 --- /dev/null +++ b/src/main/java/gov/nist/csd/pm/pdp/query/RoutinesQueryAdjudicator.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pdp.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.RoutinesQuerier; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; + +import java.util.Collection; + +public class RoutinesQueryAdjudicator extends RoutinesQuerier { + + private PAP pap; + private UserContext userCtx; + + public RoutinesQueryAdjudicator(UserContext userCtx, PAP pap) { + super(pap.query()); + + this.pap = pap; + this.userCtx = userCtx; + } + + @Override + public Collection getAdminRoutineNames() throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().routines().getAdminRoutineNames(); + } + + @Override + public Routine getAdminRoutine(String routineName) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), AdminAccessRights.REVIEW_POLICY); + + return pap.query().routines().getAdminRoutine(routineName); + } +} diff --git a/src/main/java/gov/nist/csd/pm/policy/Graph.java b/src/main/java/gov/nist/csd/pm/policy/Graph.java deleted file mode 100644 index ab5e7f0f2..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/Graph.java +++ /dev/null @@ -1,241 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.List; -import java.util.Map; - -public interface Graph { - - /** - * Set the resource access rights recognized in this policy. - * @param accessRightSet the operations to set as the resource access rights - */ - void setResourceAccessRights(AccessRightSet accessRightSet) throws PMException; - - /** - * Get the resource access rights recognized by this policy. - * @return The resource access rights recognized by this policy. - * @throws PMException - */ - AccessRightSet getResourceAccessRights() throws PMException; - - /** - * Create a policy class in the graph. - * - * @param name the name of the policy class. - * @return the node representing the new policy class. - * @throws PMException - */ - String createPolicyClass(String name, Map properties) throws PMException; - String createPolicyClass(String name) throws PMException; - - /** - * Create a new user attribute. User attributes do not have to be connected to the graph, therefore - * the parents argument is optional. - * @param name the name of the suer attribute - * @param parent is the parent to initially assign the new node to. A user attribute needs to be connected - * to the graph when created. - * @param parents is a list of 0 or more additional parents to assign the new node to. - * @return the user attribute node - * @throws PMException - */ - String createUserAttribute(String name, Map properties, String parent, String ... parents) throws PMException; - String createUserAttribute(String name, String parent, String ... parents) throws PMException; - - /** - * Create a new object attribute with the given name, and assign it to the given parents. - * Note: Node names must be unique. - * - * @param name the unique name of the node. - * @param parent is the parent to initially assign the new node to. An object attribute needs to be connected - * to the graph when created. - * @param parents is a list of 0 or more additional parents to assign the new node to. - * @return the object attribute node - * @throws PMException - */ - String createObjectAttribute(String name, Map properties, String parent, String ... parents) throws PMException; - String createObjectAttribute(String name, String parent, String ... parents) throws PMException; - - /** - * Create a new object with the given name, and assign it to the given parents. - * Note: Node names must be unique. - * - * @param name the unique name of the node. - * @param parent is the parent to initially assign the new node to. An object needs to be connected to the - * graph when created. - * @param parents is a list of 0 or more additional parents to assign the new node to. - * @return the object node - * @throws PMException - */ - String createObject(String name, Map properties, String parent, String ... parents) throws PMException; - String createObject(String name, String parent, String ... parents) throws PMException; - - /** - * Create a new user with the given name, and assign it to the given parents. - * Note: Node names must be unique. - * - * @param name the unique name of the node. - * @param parent is the parent to initially assign the new node to. A user needs to be connected to the - * graph when created. - * @param parents is a list of 0 or more additional parents to assign the new node to. - * @return the user node - * @throws PMException - */ - String createUser(String name, Map properties, String parent, String ... parents) throws PMException; - String createUser(String name, String parent, String ... parents) throws PMException; - - /** - * Update the properties of the node with the given name. The given properties overwrite any existing properties. - * - * @param name the name of the node to update. - * @param properties the properties to give the node. - * @throws PMException - */ - void setNodeProperties(String name, Map properties) throws PMException; - - /** - * Check if a node exists in the graph. - * @param name The name of the node to check for. - * @return True if the node exists, false otherwise. - * @throws PMException - */ - boolean nodeExists(String name) throws PMException; - - /** - * Get the Node object associated with the given name. - * @param name The name of the node to get. - * @return A Node object associated with the given name. - * @throws PMException - */ - Node getNode(String name) throws PMException; - - /** - * Search for nodes with the given type and/or properties. - * Supports wildcard property values i.e. {"prop1": "*"} which will match any nodes with the "prop1" property key. - * @param type The type of nodes to search for. Use NodeType.ANY to search for any node type. - * @param properties The properties of nodes to search for. - * @return The nodes that match the type and property criteria. - * @throws PMException - */ - List search(NodeType type, Map properties) throws PMException; - - /** - * Get the policy classes in the policy. - * @return The policy class nodes. - * @throws PMException - */ - List getPolicyClasses() throws PMException; - - /** - * Delete the node with the given name from the graph. The node must not have any other nodes assigned to it. - * If the node does not exist, no exception will be thrown as this is the desired state. - * - * @param name the name of the node to delete. - * @throws PMException - */ - void deleteNode(String name) throws PMException; - - /** - * Assign the child node to the parent node. The child and parent nodes must both already exist in the graph, - * and the types must make a valid assignment. An example of a valid assignment is assigning o1, an object, to oa1, - * an object attribute. o1 is the child (objects can never be the parent in an assignment), and oa1 is the parent. - * If the child is already assigned to the parent, no exception will be thrown as this is the desired state. - * - * @param child the name of the child node. - * @param parent the name of the parent node. - * @throws PMException - */ - void assign(String child, String parent) throws PMException; - - /** - * Remove the assignment between the child and parent nodes. An exception will be thrown if either node - * does not exist. If the assignment doesn't exist, no exception will be thrown as this is the desired state. - * - * @param child the name of the child node. - * @param parent the name of the parent node. - * @throws PMException - */ - void deassign(String child, String parent) throws PMException; - - /** - * Assign the children of the given attribute to the target attribute of the same type. - * @param children The children to assign to the target. - * @param target The target attribute to assign the children to. - * @throws PMException - */ - void assignAll(List children, String target) throws PMException; - - /** - * Deassign the children of the given attribute from the target attribute of the same type. - * @param children The children to deassign from the given target. - * @param target The target attribute to deassign the children from. - * @throws PMException - */ - void deassignAll(List children, String target) throws PMException; - - /** - * Deassign all nodes assigned to the given node and delete the given node. - * from the rest of the graph. - * @param target The node to deassign all children from. - * @throws PMException - */ - void deassignAllFromAndDelete(String target) throws PMException; - - /** - * Get the parents of the given node. - * @param node The node to get the parents of. - * @return The names of the parents of the given node. - * @throws PMException - */ - List getParents(String node) throws PMException; - - /** - * Get the children of the given node. - * @param node The node to get the children of. - * @return The names of the children of the given node. - * @throws PMException - */ - List getChildren(String node) throws PMException; - - /** - * Create an Association between the user attribute and the Target node with the provided access rights. If an association - * already exists between these two nodes, overwrite the existing access rights with the ones provided. Associations - * can only begin at a user attribute but can point to either an object or user attribute - * - * @param ua the name of the user attribute. - * @param target the name of the target attribute. - * @param accessRights a set of access rights to add to the association. - * @throws PMException - */ - void associate(String ua, String target, AccessRightSet accessRights) throws PMException; - - /** - * Delete the Association between the user attribute and Target node. - * - * @param ua the name of the user attribute. - * @param target the name of the target attribute. - * @throws PMException - */ - void dissociate(String ua, String target) throws PMException; - - /** - * Get the associations in which the source of the relation is the given user attribute (ua). - * @param ua The user attribute to get the associations for. - * @return The associations in which the source of the relation is the given user attribute (ua). - * @throws PMException - */ - List getAssociationsWithSource(String ua) throws PMException; - - /** - * Get the associations in which the target of the relation is the given node. - * @param target The target attribute to get the associations for. - * @return The associations in which the target of the relation is the given node. - * @throws PMException - */ - List getAssociationsWithTarget(String target) throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/Obligations.java b/src/main/java/gov/nist/csd/pm/policy/Obligations.java deleted file mode 100644 index 8ee0274c9..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/Obligations.java +++ /dev/null @@ -1,62 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.util.List; - -public interface Obligations { - - /** - * Create a new obligation. - * - * @param author the user/process that is creating the obligation. - * @param label the label of the obligation. - * @param rules the rules of the obligation. - * @throws PMException - */ - void create(UserContext author, String label, Rule... rules) throws PMException; - - /** - * Update the obligation with the given label. If the label in the provided object is not null and different from - * the label parameter, the label will also be updated. - * @param author the user/process that created the obligation - * @param label the label of the obligation to update - * @param rules the updated obligation rules - * @throws PMException - */ - void update(UserContext author, String label, Rule... rules) throws PMException; - - /** - * Delete the obligation with the given label. - * @param label the label of the obligation to delete - * @throws PMException - */ - void delete(String label) throws PMException; - - /** - * Get all obligations. - * @return All obligations. - * @throws PMException - */ - List getAll() throws PMException; - - /** - * Check if an obligation exists with the given label. - * @param label The obligation to check. - * @return True if the obligation exists with the given label, false otherwise. - * @throws PMException - */ - boolean exists(String label) throws PMException; - - /** - * Get the Obligation object associated with the given label. - * @param label The label of the obligation to get. - * @return The Obligation object associated with the given label. - * @throws PMException - */ - Obligation get(String label) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/Policy.java b/src/main/java/gov/nist/csd/pm/policy/Policy.java deleted file mode 100644 index be1be70a8..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/Policy.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface Policy { - Graph graph(); - Prohibitions prohibitions(); - Obligations obligations(); - UserDefinedPML userDefinedPML(); - PolicySerializer serialize() throws PMException; - PolicyDeserializer deserialize() throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/PolicyDeserializer.java b/src/main/java/gov/nist/csd/pm/policy/PolicyDeserializer.java deleted file mode 100644 index 228bbf99c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/PolicyDeserializer.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -public interface PolicyDeserializer { - - void fromJSON(String json) throws PMException; - - void fromPML(UserContext author, String pml, FunctionDefinitionStatement ... customFunctions) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/PolicySerializer.java b/src/main/java/gov/nist/csd/pm/policy/PolicySerializer.java deleted file mode 100644 index 70858b338..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/PolicySerializer.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface PolicySerializer { - - String toJSON() throws PMException; - - String toPML() throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/Prohibitions.java b/src/main/java/gov/nist/csd/pm/policy/Prohibitions.java deleted file mode 100644 index c1f992e9f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/Prohibitions.java +++ /dev/null @@ -1,79 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; -import java.util.Map; - -public interface Prohibitions { - - /** - * Create a new prohibition. - * - * @param label the identifier of this prohibition. - * @param subject ths subject of the prohibition (user, user attribute, or process). - * @param accessRightSet the access rights to be denied - * @param intersection a boolean flag that determines if the intersection of the containers should be denied or not. - * @param containerConditions the containers to deny the subject access to. - * @throws PMException - */ - void create(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, - boolean intersection, ContainerCondition... containerConditions) throws PMException; - - /** - * Update an existing prohibition. - * - * @param label the identifier of this prohibition. - * @param subject ths subject of the prohibition (user, user attribute, or process). - * @param accessRightSet the access rights to be denied - * @param intersection a boolean flag that determines if the intersection of the containers should be denied or not. - * @param containerConditions the containers to deny the subject access to. - * @throws PMException - */ - void update(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, - boolean intersection, ContainerCondition ... containerConditions) throws PMException; - - /** - * Delete the prohibition, and remove it from the data structure. - * - * @param label The name of the prohibition to delete. - * @throws PMException - */ - void delete(String label) throws PMException; - - /** - * Get all prohibitions. - * @return All prohibitions. - * @throws PMException - */ - Map> getAll() throws PMException; - - /** - * Check if a prohibition exists with the given label. - * @param label The label of the prohibition to check. - * @return True if a prohibition exists with the given label, false otherwise. - * @throws PMException - */ - boolean exists(String label) throws PMException; - - /** - * Get prohibitions with the given subject. - * @param subject The subject to get the prohibitions for (user, user attribute, process) - * @return The prohibitions with the given subject. - * @throws PMException - */ - List getWithSubject(String subject) throws PMException; - - /** - * Get the prohibition with the given label. - * @param label The label of the prohibition to get. - * @return The prohibition with the given label. - * @throws PMException - */ - Prohibition get(String label) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/UserDefinedPML.java b/src/main/java/gov/nist/csd/pm/policy/UserDefinedPML.java deleted file mode 100644 index 78018dd32..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/UserDefinedPML.java +++ /dev/null @@ -1,69 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Map; - -public interface UserDefinedPML { - - /** - * Add a new user defined PML function. The function will be available to any subsequent PML statements. - * @param functionDefinitionStatement The function definition to add. - * @throws PMException - */ - void createFunction(FunctionDefinitionStatement functionDefinitionStatement) throws PMException; - - /** - * Remove a user defined PML function. - * @param functionName The name of the function to be removed. - * @throws PMException - */ - void deleteFunction(String functionName) throws PMException; - - /** - * Get all user defined PML functions. - * @return A map of function names to function definitions for all functions. - * @throws PMException - */ - Map getFunctions() throws PMException; - - /** - * Get the function definition with the given name. - * @param name The name of the function to get. - * @return The function definition of the function with the given name. - * @throws PMException - */ - FunctionDefinitionStatement getFunction(String name) throws PMException; - - /** - * Add a new user defined PML constant. The constant will be available to any subsequent PML statements. - * @param constantName The name of the constant. - * @param constantValue The value of the constant. - * @throws PMException - */ - void createConstant(String constantName, Value constantValue) throws PMException; - - /** - * Remove a PML constant. - * @param constName The name of the constant to remove. - * @throws PMException - */ - void deleteConstant(String constName) throws PMException; - - /** - * Get all user defined contants. - * @return A map of constant names to constant values for all constants. - * @throws PMException - */ - Map getConstants() throws PMException; - - /** - * Get the constant value with the given name. - * @param name The name of the constant to get. - * @return The value of the constant with the given name. - * @throws PMException - */ - Value getConstant(String name) throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AddConstantEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AddConstantEvent.java deleted file mode 100644 index 21f44ec52..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AddConstantEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; - -public class AddConstantEvent implements PolicyEvent { - - private final String name; - private final Value value; - - public AddConstantEvent(String name, Value value) { - this.name = name; - this.value = value; - } - - public String getName() { - return name; - } - - public Value getValue() { - return value; - } - - @Override - public String getEventName() { - return "add_constant"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AddFunctionEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AddFunctionEvent.java deleted file mode 100644 index 51949e5bb..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AddFunctionEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -public class AddFunctionEvent implements PolicyEvent { - - private final FunctionDefinitionStatement functionDefinitionStatement; - - public AddFunctionEvent(FunctionDefinitionStatement functionDefinitionStatement) { - this.functionDefinitionStatement = functionDefinitionStatement; - } - - public FunctionDefinitionStatement getFunctionDefinitionStatement() { - return functionDefinitionStatement; - } - - @Override - public String getEventName() { - return "add_function"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AssignAllEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AssignAllEvent.java deleted file mode 100644 index f06c090f3..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AssignAllEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import java.util.List; - -public class AssignAllEvent implements PolicyEvent{ - - private final List children; - private final String target; - - public AssignAllEvent(List children, String target) { - this.children = children; - this.target = target; - } - - public List getChildren() { - return children; - } - - public String getTarget() { - return target; - } - - @Override - public String getEventName() { - return "assign_all"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AssignEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AssignEvent.java deleted file mode 100644 index 57eb6e5bb..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AssignEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class AssignEvent implements PolicyEvent { - - private final String child; - private final String parent; - - public AssignEvent(String child, String parent) { - this.child = child; - this.parent = parent; - } - - public String getChild() { - return child; - } - - public String getParent() { - return parent; - } - - @Override - public String getEventName() { - return "assign"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AssignToEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AssignToEvent.java deleted file mode 100644 index 6a9bcc788..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AssignToEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class AssignToEvent implements PolicyEvent { - - private final String child; - private final String parent; - - public AssignToEvent(String child, String parent) { - this.child = child; - this.parent = parent; - } - - public String getChild() { - return child; - } - - public String getParent() { - return parent; - } - - @Override - public String getEventName() { - return "assign_to"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/AssociateEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/AssociateEvent.java deleted file mode 100644 index cdf1222ad..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/AssociateEvent.java +++ /dev/null @@ -1,33 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -public class AssociateEvent implements PolicyEvent { - - private final String ua; - private final String target; - private final AccessRightSet accessRightSet; - - public AssociateEvent(String ua, String target, AccessRightSet accessRightSet) { - this.ua = ua; - this.target = target; - this.accessRightSet = accessRightSet; - } - - public String getUa() { - return ua; - } - - public String getTarget() { - return target; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - @Override - public String getEventName() { - return "associate"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/BasePolicyEventHandler.java b/src/main/java/gov/nist/csd/pm/policy/events/BasePolicyEventHandler.java deleted file mode 100644 index a3fd34f98..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/BasePolicyEventHandler.java +++ /dev/null @@ -1,185 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; - -/** - * Implements the PolicyEventListener interface to apply policy events to the passed PolicyAuthor. - */ -public abstract class BasePolicyEventHandler implements PolicyEventListener, Policy { - - protected Policy policy; - - protected BasePolicyEventHandler(Policy policy) { - this.policy = policy; - } - - @Override - public void handlePolicyEvent(PolicyEvent event) throws PMException { - if (event instanceof CreateNodeEvent createNodeEvent) { - handleCreateNodeEvent(createNodeEvent); - } else if (event instanceof AssignEvent assignEvent) { - handleAssignEvent(assignEvent); - } else if (event instanceof AssociateEvent associateEvent) { - handleAssociateEvent(associateEvent); - } else if (event instanceof CreateObligationEvent createObligationEvent) { - handleCreateObligationEvent(createObligationEvent); - } else if (event instanceof CreateProhibitionEvent createProhibitionEvent) { - handleCreateProhibitionEvent(createProhibitionEvent); - } else if (event instanceof DeassignEvent deassignEvent) { - handleDeassignEvent(deassignEvent); - } else if (event instanceof DeleteNodeEvent deleteNodeEvent) { - handleDeleteNodeEvent(deleteNodeEvent); - } else if (event instanceof DeleteObligationEvent deleteObligationEvent) { - handleDeleteObligationEvent(deleteObligationEvent); - } else if (event instanceof DeleteProhibitionEvent deleteProhibitionEvent) { - handleDeleteProhibitionEvent(deleteProhibitionEvent); - } else if (event instanceof DissociateEvent dissociateEvent) { - handleDissociateEvent(dissociateEvent); - } else if (event instanceof SetNodePropertiesEvent setNodePropertiesEvent) { - handleSetNodePropertiesEvent(setNodePropertiesEvent); - } else if (event instanceof SetResourceAccessRightsEvent setResourceAccessRightsEvent) { - handleSetResourceAccessRights(setResourceAccessRightsEvent); - } else if (event instanceof UpdateObligationEvent updateObligationEvent) { - handleUpdateObligationEvent(updateObligationEvent); - } else if (event instanceof UpdateProhibitionEvent updateProhibitionEvent) { - handleUpdateProhibitionEvent(updateProhibitionEvent); - } - } - - protected void handleUpdateProhibitionEvent(UpdateProhibitionEvent updateProhibitionEvent) throws PMException { - policy.prohibitions().update( - updateProhibitionEvent.getName(), - updateProhibitionEvent.getSubject(), - updateProhibitionEvent.getAccessRightSet(), - updateProhibitionEvent.isIntersection(), - updateProhibitionEvent.getContainers().toArray(ContainerCondition[]::new) - ); - } - - protected void handleUpdateObligationEvent(UpdateObligationEvent updateObligationEvent) throws PMException { - policy.obligations().update( - updateObligationEvent.getAuthor(), - updateObligationEvent.getLabel(), - updateObligationEvent.getRules().toArray(Rule[]::new) - ); - } - - protected void handleSetResourceAccessRights(SetResourceAccessRightsEvent setResourceAccessRightsEvent) throws PMException { - policy.graph().setResourceAccessRights(setResourceAccessRightsEvent.getAccessRightSet()); - } - - protected void handleSetNodePropertiesEvent(SetNodePropertiesEvent setNodePropertiesEvent) throws PMException { - policy.graph().setNodeProperties(setNodePropertiesEvent.getName(), setNodePropertiesEvent.getProperties()); - } - - protected void handleDissociateEvent(DissociateEvent dissociateEvent) throws PMException { - policy.graph().dissociate(dissociateEvent.getUa(), dissociateEvent.getTarget()); - } - - protected void handleDeleteProhibitionEvent(DeleteProhibitionEvent deleteProhibitionEvent) throws PMException { - policy.prohibitions().delete(deleteProhibitionEvent.getProhibition().getLabel()); - } - - protected void handleDeleteObligationEvent(DeleteObligationEvent deleteObligationEvent) throws PMException { - policy.obligations().delete(deleteObligationEvent.getObligation().getLabel()); - } - - protected void handleDeleteNodeEvent(DeleteNodeEvent deleteNodeEvent) throws PMException { - policy.graph().deleteNode(deleteNodeEvent.getName()); - } - - protected void handleDeassignEvent(DeassignEvent deassignEvent) throws PMException { - policy.graph().deassign(deassignEvent.getChild(), deassignEvent.getParent()); - } - - protected void handleCreateProhibitionEvent(CreateProhibitionEvent createProhibitionEvent) throws PMException { - policy.prohibitions().create( - createProhibitionEvent.getLabel(), - createProhibitionEvent.getSubject(), - createProhibitionEvent.getAccessRightSet(), - createProhibitionEvent.isIntersection(), - createProhibitionEvent.getContainers().toArray(ContainerCondition[]::new) - ); - } - - protected void handleCreateObligationEvent(CreateObligationEvent createObligationEvent) throws PMException { - policy.obligations().create(createObligationEvent.getAuthor(), - createObligationEvent.getLabel(), - createObligationEvent.getRules().toArray(Rule[]::new)); - } - - protected void handleAssociateEvent(AssociateEvent associateEvent) throws PMException { - policy.graph().associate(associateEvent.getUa(), associateEvent.getTarget(), associateEvent.getAccessRightSet()); - } - - protected void handleAssignEvent(AssignEvent assignEvent) throws PMException { - policy.graph().assign(assignEvent.getChild(), assignEvent.getParent()); - } - - protected void handleCreateNodeEvent(CreateNodeEvent createNodeEvent) throws PMException { - switch (createNodeEvent.getType()) { - case PC -> this.policy.graph().createPolicyClass( - createNodeEvent.getName(), - createNodeEvent.getProperties() - ); - case OA -> this.policy.graph().createObjectAttribute( - createNodeEvent.getName(), - createNodeEvent.getProperties(), - createNodeEvent.getInitialParent(), - createNodeEvent.getAdditionalParents() - ); - case UA -> this.policy.graph().createUserAttribute( - createNodeEvent.getName(), - createNodeEvent.getProperties(), - createNodeEvent.getInitialParent(), - createNodeEvent.getAdditionalParents() - ); - case O -> this.policy.graph().createObject( - createNodeEvent.getName(), - createNodeEvent.getProperties(), - createNodeEvent.getInitialParent(), - createNodeEvent.getAdditionalParents() - ); - case U -> this.policy.graph().createUser( - createNodeEvent.getName(), - createNodeEvent.getProperties(), - createNodeEvent.getInitialParent(), - createNodeEvent.getAdditionalParents() - ); - default -> { /* ANY will never be passed as a node type */ } - } - } - - @Override - public Graph graph() { - return policy.graph(); - } - - @Override - public Prohibitions prohibitions() { - return policy.prohibitions(); - } - - @Override - public Obligations obligations() { - return policy.obligations(); - } - - @Override - public UserDefinedPML userDefinedPML() { - return policy.userDefinedPML(); - } - - @Override - public PolicySerializer serialize() throws PMException { - return policy.serialize(); - } - - @Override - public PolicyDeserializer deserialize() throws PMException { - return policy.deserialize(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/BeginTxEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/BeginTxEvent.java deleted file mode 100644 index 642f872ef..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/BeginTxEvent.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class BeginTxEvent implements PolicyEvent { - @Override - public String getEventName() { - return "begin_tx"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CommitTxEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CommitTxEvent.java deleted file mode 100644 index b5158b509..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CommitTxEvent.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class CommitTxEvent implements PolicyEvent { - - public CommitTxEvent() { /* This object is used to notify a listener that a commit event happened */ } - - @Override - public String getEventName() { - return "commit_tx"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateNodeEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateNodeEvent.java deleted file mode 100644 index d9f4802f7..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateNodeEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public abstract class CreateNodeEvent implements PolicyEvent { - - private final String name; - private final NodeType type; - private final Map properties; - private String initialParent; - private String[] additionalParents; - - protected CreateNodeEvent(String name, NodeType type, Map properties, String initialParent, String ... parents) { - this.name = name; - this.type = type; - this.properties = properties; - this.initialParent = initialParent; - this.additionalParents = parents; - } - - protected CreateNodeEvent(String name, NodeType type, Map properties) { - this.name = name; - this.type = type; - this.properties = properties; - } - - public String getName() { - return name; - } - - public NodeType getType() { - return type; - } - - public Map getProperties() { - return properties; - } - - public String getInitialParent() { - return initialParent; - } - - public String[] getAdditionalParents() { - return additionalParents; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectAttributeEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectAttributeEvent.java deleted file mode 100644 index adb019433..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectAttributeEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public class CreateObjectAttributeEvent extends CreateNodeEvent{ - public CreateObjectAttributeEvent(String name, Map properties, String initialParent, String... parents) { - super(name, NodeType.OA, properties, initialParent, parents); - } - - @Override - public String getEventName() { - return "create_object_attribute"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectEvent.java deleted file mode 100644 index dcff5b318..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateObjectEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public class CreateObjectEvent extends CreateNodeEvent{ - public CreateObjectEvent(String name, Map properties, String initialParent, String... parents) { - super(name, NodeType.O, properties, initialParent, parents); - } - - @Override - public String getEventName() { - return "create_object"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateObligationEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateObligationEvent.java deleted file mode 100644 index 7133abc04..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateObligationEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.util.List; - -public class CreateObligationEvent implements PolicyEvent { - - private final UserContext author; - private final String label; - private final List rules; - - public CreateObligationEvent(UserContext author, String label, List rules) { - this.author = author; - this.label = label; - this.rules = rules; - } - - public UserContext getAuthor() { - return author; - } - - public String getLabel() { - return label; - } - - public List getRules() { - return rules; - } - - @Override - public String getEventName() { - return "create_obligation"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreatePolicyClassEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreatePolicyClassEvent.java deleted file mode 100644 index 9bcc0bf23..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreatePolicyClassEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public class CreatePolicyClassEvent extends CreateNodeEvent{ - public CreatePolicyClassEvent(String name, Map properties) { - super(name, NodeType.PC, properties); - } - - @Override - public String getEventName() { - return "create_policy_class"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateProhibitionEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateProhibitionEvent.java deleted file mode 100644 index f4024aa56..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateProhibitionEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; - -public class CreateProhibitionEvent implements PolicyEvent { - - private final String label; - private final ProhibitionSubject subject; - private final List containers; - private final AccessRightSet accessRightSet; - private final boolean intersection; - - public CreateProhibitionEvent(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, List containers) { - this.label = label; - this.subject = subject; - this.accessRightSet = accessRightSet; - this.intersection = intersection; - this.containers = containers; - } - - public String getLabel() { - return label; - } - - public ProhibitionSubject getSubject() { - return subject; - } - - public List getContainers() { - return containers; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - public boolean isIntersection() { - return intersection; - } - - @Override - public String getEventName() { - return "create_prohibition"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateUserAttributeEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateUserAttributeEvent.java deleted file mode 100644 index 2800be0fe..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateUserAttributeEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public class CreateUserAttributeEvent extends CreateNodeEvent{ - public CreateUserAttributeEvent(String name, Map properties, String initialParent, String... parents) { - super(name, NodeType.UA, properties, initialParent, parents); - } - - @Override - public String getEventName() { - return "create_user_attribute"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/CreateUserEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/CreateUserEvent.java deleted file mode 100644 index 10096ae69..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/CreateUserEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.Map; - -public class CreateUserEvent extends CreateNodeEvent{ - public CreateUserEvent(String name, Map properties, String initialParent, String... parents) { - super(name, NodeType.U, properties, initialParent, parents); - } - - @Override - public String getEventName() { - return "create_user"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllEvent.java deleted file mode 100644 index 83f6de370..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import java.util.List; - -public class DeassignAllEvent implements PolicyEvent{ - - private final List children; - private final String target; - - public DeassignAllEvent(List children, String target) { - this.children = children; - this.target = target; - } - - public List getChildren() { - return children; - } - - public String getTarget() { - return target; - } - - @Override - public String getEventName() { - return "deassign_all"; - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllFromAndDeleteEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllFromAndDeleteEvent.java deleted file mode 100644 index d66cdf96b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeassignAllFromAndDeleteEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class DeassignAllFromAndDeleteEvent implements PolicyEvent{ - - private final String node; - - public DeassignAllFromAndDeleteEvent(String node) { - this.node = node; - } - - public String getNode() { - return node; - } - - @Override - public String getEventName() { - return "deassign_all_from_and_delete"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeassignEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeassignEvent.java deleted file mode 100644 index ac6d8ad2f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeassignEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class DeassignEvent implements PolicyEvent { - - private final String child; - private final String parent; - - public DeassignEvent(String child, String parent) { - this.child = child; - this.parent = parent; - } - - public String getChild() { - return child; - } - - public String getParent() { - return parent; - } - - @Override - public String getEventName() { - return "deassign"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeassignFromEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeassignFromEvent.java deleted file mode 100644 index 8fc138a01..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeassignFromEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class DeassignFromEvent implements PolicyEvent { - - private final String child; - private final String parent; - - public DeassignFromEvent(String child, String parent) { - this.child = child; - this.parent = parent; - } - - public String getChild() { - return child; - } - - public String getParent() { - return parent; - } - - @Override - public String getEventName() { - return "deassign_from"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeleteNodeEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeleteNodeEvent.java deleted file mode 100644 index 2c6bf4024..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeleteNodeEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class DeleteNodeEvent implements PolicyEvent { - - private final String name; - - public DeleteNodeEvent(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String getEventName() { - return "delete_node"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeleteObligationEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeleteObligationEvent.java deleted file mode 100644 index cf5564bf1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeleteObligationEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.obligation.Obligation; - -public class DeleteObligationEvent implements PolicyEvent { - - private final Obligation obligation; - - public DeleteObligationEvent(Obligation obligation) { - this.obligation = obligation; - } - - public Obligation getObligation() { - return obligation; - } - - @Override - public String getEventName() { - return "delete_obligation"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DeleteProhibitionEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DeleteProhibitionEvent.java deleted file mode 100644 index 8e3c76bd4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DeleteProhibitionEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -public class DeleteProhibitionEvent implements PolicyEvent { - - private final Prohibition prohibition; - - public DeleteProhibitionEvent(Prohibition prohibition) { - this.prohibition = prohibition; - } - - public Prohibition getProhibition() { - return prohibition; - } - - @Override - public String getEventName() { - return "delete_prohibition"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/DissociateEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/DissociateEvent.java deleted file mode 100644 index 7178e729d..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/DissociateEvent.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class DissociateEvent implements PolicyEvent { - - private final String ua; - private final String target; - - public DissociateEvent(String ua, String target) { - this.ua = ua; - this.target = target; - } - - public String getUa() { - return ua; - } - - public String getTarget() { - return target; - } - - @Override - public String getEventName() { - return "dissociate"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicyEvent.java deleted file mode 100644 index 6b6eb86c6..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public interface PolicyEvent { - - String getEventName(); - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventEmitter.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventEmitter.java deleted file mode 100644 index 5ba27489c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventEmitter.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface PolicyEventEmitter { - void addEventListener(PolicyEventListener listener, boolean sync) throws PMException; - void removeEventListener(PolicyEventListener listener); - void emitEvent(PolicyEvent event) throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventHandler.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventHandler.java deleted file mode 100644 index 7b877b8f8..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventHandler.java +++ /dev/null @@ -1,109 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class PolicyEventHandler { - - public PolicyEventHandler() {} - - public void handle(PolicyEvent event) throws PMException { - if (event instanceof AddConstantEvent e) { - handleAddConstantEvent(e); - } else if (event instanceof AddFunctionEvent e) { - handleAddFunctionEvent(e); - } else if (event instanceof AssignEvent e) { - handleAssignEvent(e); - } else if (event instanceof AssignToEvent e) { - handleAssignToEvent(e); - } else if (event instanceof AssociateEvent e) { - handleAssociateEvent(e); - } else if (event instanceof BeginTxEvent e) { - handleBeginTxEvent(e); - } else if (event instanceof CommitTxEvent e) { - handleCommitTxEvent(e); - }else if (event instanceof CreateObjectAttributeEvent e) { - handleCreateObjectAttributeEvent(e); - } else if (event instanceof CreateObjectEvent e) { - handleCreateObjectEvent(e); - } else if (event instanceof CreateObligationEvent e) { - handleCreateObligationEvent(e); - } else if (event instanceof CreatePolicyClassEvent e) { - handleCreatePolicyClassEvent(e); - } else if (event instanceof CreateProhibitionEvent e) { - handleCreateProhibitionEvent(e); - } else if (event instanceof CreateUserAttributeEvent e) { - handleCreateUserAttributeEvent(e); - } else if (event instanceof CreateUserEvent e) { - handleCreateUserEvent(e); - } else if (event instanceof CreateNodeEvent e) { - handleCreateNodeEvent(e); - } else if (event instanceof DeassignEvent e) { - handleDeassignEvent(e); - } else if (event instanceof DeassignFromEvent e) { - handleDeassignFromEvent(e); - } else if (event instanceof DeleteNodeEvent e) { - handleDeleteNodeEvent(e); - } else if (event instanceof DeleteObligationEvent e) { - handleDeleteObligationEvent(e); - } else if (event instanceof DeleteProhibitionEvent e) { - handleDeleteProhibitionEvent(e); - } else if (event instanceof DissociateEvent e) { - handleDissociateEvent(e); - } else if (event instanceof PolicySynchronizationEvent e) { - handlePolicySyncEvent(e); - } else if (event instanceof RemoveConstantEvent e) { - handleRemoveConstantEvent(e); - } else if (event instanceof RemoveFunctionEvent e) { - handleRemoveFunctionEvent(e); - } else if (event instanceof RollbackTxEvent e) { - handleRollbackTxEvent(e); - } else if (event instanceof SetNodePropertiesEvent e) { - handleSetNodePropertiesEvent(e); - } else if (event instanceof SetResourceAccessRightsEvent e) { - handleSetResourceAccessRightsEvent(e); - } else if (event instanceof UpdateObligationEvent e) { - handleUpdateObligationEvent(e); - } else if (event instanceof UpdateProhibitionEvent e) { - handleUpdateProhibitionEvent(e); - } else if (event instanceof AssignAllEvent e) { - handleAssignAllEvent(e); - } else if (event instanceof DeassignAllEvent e) { - handleDeassignAllEvent(e); - } else if (event instanceof DeassignAllFromAndDeleteEvent e) { - handleDeassignAllFromAndDeleteEvent(e); - } - } - - public void handleDeassignAllFromAndDeleteEvent(DeassignAllFromAndDeleteEvent e) throws PMException {} - public void handleDeassignAllEvent(DeassignAllEvent e) throws PMException {} - public void handleAssignAllEvent(AssignAllEvent e) throws PMException {} - public void handleAddConstantEvent(AddConstantEvent e) throws PMException {} - public void handleAddFunctionEvent(AddFunctionEvent e) throws PMException {} - public void handleAssignEvent(AssignEvent e) throws PMException {} - public void handleAssignToEvent(AssignToEvent e) throws PMException {} - public void handleAssociateEvent(AssociateEvent e) throws PMException {} - public void handleBeginTxEvent(BeginTxEvent e) throws PMException {} - public void handleCommitTxEvent(CommitTxEvent e) throws PMException {} - public void handleCreateNodeEvent(CreateNodeEvent e) throws PMException {} - public void handleCreateObjectAttributeEvent(CreateObjectAttributeEvent e) throws PMException {} - public void handleCreateObjectEvent(CreateObjectEvent e) throws PMException {} - public void handleCreateObligationEvent(CreateObligationEvent e) throws PMException {} - public void handleCreatePolicyClassEvent(CreatePolicyClassEvent e) throws PMException {} - public void handleCreateProhibitionEvent(CreateProhibitionEvent e) throws PMException {} - public void handleCreateUserAttributeEvent(CreateUserAttributeEvent e) throws PMException {} - public void handleCreateUserEvent(CreateUserEvent e) throws PMException {} - public void handleDeassignEvent(DeassignEvent e) throws PMException {} - public void handleDeassignFromEvent(DeassignFromEvent e) throws PMException {} - public void handleDeleteNodeEvent(DeleteNodeEvent e) throws PMException {} - public void handleDeleteObligationEvent(DeleteObligationEvent e) throws PMException {} - public void handleDeleteProhibitionEvent(DeleteProhibitionEvent e) throws PMException {} - public void handleDissociateEvent(DissociateEvent e) throws PMException {} - public void handlePolicySyncEvent(PolicySynchronizationEvent e) throws PMException {} - public void handleRemoveConstantEvent(RemoveConstantEvent e) throws PMException {} - public void handleRemoveFunctionEvent(RemoveFunctionEvent e) throws PMException {} - public void handleRollbackTxEvent(RollbackTxEvent e) throws PMException {} - public void handleSetNodePropertiesEvent(SetNodePropertiesEvent e) throws PMException {} - public void handleSetResourceAccessRightsEvent(SetResourceAccessRightsEvent e) throws PMException {} - public void handleUpdateObligationEvent(UpdateObligationEvent e) throws PMException {} - public void handleUpdateProhibitionEvent(UpdateProhibitionEvent e) throws PMException {} -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventListener.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventListener.java deleted file mode 100644 index 03064d944..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicyEventListener.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface PolicyEventListener { - - void handlePolicyEvent(PolicyEvent event) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicySync.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicySync.java deleted file mode 100644 index 741058ab1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicySync.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface PolicySync { - - PolicySynchronizationEvent policySync() throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/PolicySynchronizationEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/PolicySynchronizationEvent.java deleted file mode 100644 index 250b41974..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/PolicySynchronizationEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; - -public class PolicySynchronizationEvent implements PolicyEvent { - - private final MemoryPolicyStore policyStore; - - public PolicySynchronizationEvent(MemoryPolicyStore policyStore) { - this.policyStore = policyStore; - } - - public MemoryPolicyStore getPolicyStore() { - return policyStore; - } - - @Override - public String getEventName() { - return "policy_sync"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/RemoveConstantEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/RemoveConstantEvent.java deleted file mode 100644 index 9d836a7df..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/RemoveConstantEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class RemoveConstantEvent implements PolicyEvent { - - private final String name; - - public RemoveConstantEvent(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String getEventName() { - return "remove_constant"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/RemoveFunctionEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/RemoveFunctionEvent.java deleted file mode 100644 index d67996555..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/RemoveFunctionEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -public class RemoveFunctionEvent implements PolicyEvent { - - private String functionName; - - public RemoveFunctionEvent(String functionName) { - this.functionName = functionName; - } - - public String getFunctionName() { - return functionName; - } - - @Override - public String getEventName() { - return "remove_function"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/RollbackTxEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/RollbackTxEvent.java deleted file mode 100644 index e7e6d0def..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/RollbackTxEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class RollbackTxEvent implements PolicySync, PolicyEvent { - - private final PolicySync policySync; - - public RollbackTxEvent(PolicySync policySync) { - this.policySync = policySync; - } - - @Override - public PolicySynchronizationEvent policySync() throws PMException { - return policySync.policySync(); - } - - @Override - public String getEventName() { - return "rollback_tx"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/SetNodePropertiesEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/SetNodePropertiesEvent.java deleted file mode 100644 index 094ef83ac..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/SetNodePropertiesEvent.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import java.util.Map; - -public class SetNodePropertiesEvent implements PolicyEvent { - - private final String name; - private final Map properties; - - public SetNodePropertiesEvent(String name, Map properties) { - this.name = name; - this.properties = properties; - } - - public String getName() { - return name; - } - - public Map getProperties() { - return properties; - } - - @Override - public String getEventName() { - return "set_node_properties"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/SetResourceAccessRightsEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/SetResourceAccessRightsEvent.java deleted file mode 100644 index ad698e17c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/SetResourceAccessRightsEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -public class SetResourceAccessRightsEvent implements PolicyEvent { - - private final AccessRightSet accessRightSet; - - public SetResourceAccessRightsEvent(AccessRightSet accessRightSet) { - this.accessRightSet = accessRightSet; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - @Override - public String getEventName() { - return "set_resource_access_rights"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/UpdateObligationEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/UpdateObligationEvent.java deleted file mode 100644 index 87917af03..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/UpdateObligationEvent.java +++ /dev/null @@ -1,36 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.util.List; - -public class UpdateObligationEvent implements PolicyEvent { - - private UserContext author; - private String label; - private List rules; - - public UpdateObligationEvent(UserContext author, String label, List rules) { - this.author = author; - this.label = label; - this.rules = rules; - } - - public UserContext getAuthor() { - return author; - } - - public String getLabel() { - return label; - } - - public List getRules() { - return rules; - } - - @Override - public String getEventName() { - return "update_obligation"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/events/UpdateProhibitionEvent.java b/src/main/java/gov/nist/csd/pm/policy/events/UpdateProhibitionEvent.java deleted file mode 100644 index c76f39cf4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/events/UpdateProhibitionEvent.java +++ /dev/null @@ -1,49 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; - -import java.util.List; - -public class UpdateProhibitionEvent implements PolicyEvent { - - private final String name; - private final ProhibitionSubject subject; - private final List containers; - private final AccessRightSet accessRightSet; - private final boolean intersection; - - public UpdateProhibitionEvent(String name, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, List containers) { - this.name = name; - this.subject = subject; - this.accessRightSet = accessRightSet; - this.intersection = intersection; - this.containers = containers; - } - - public String getName() { - return name; - } - - public ProhibitionSubject getSubject() { - return subject; - } - - public List getContainers() { - return containers; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - public boolean isIntersection() { - return intersection; - } - - @Override - public String getEventName() { - return "update_prohibition"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ConstantAlreadyDefinedException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/ConstantAlreadyDefinedException.java deleted file mode 100644 index 5e8974c3c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ConstantAlreadyDefinedException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class ConstantAlreadyDefinedException extends PMException { - public ConstantAlreadyDefinedException(String name) { - super("constant \"" + name + "\" is already defined"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/DisconnectedNodeException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/DisconnectedNodeException.java deleted file mode 100644 index c1b37c97e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/DisconnectedNodeException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class DisconnectedNodeException extends PMException{ - public DisconnectedNodeException(String child, String parent) { - super("deleting " + child + " from " + parent + " would make " + child + " a disconnected node"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/EventProcessorException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/EventProcessorException.java deleted file mode 100644 index b0a0f228b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/EventProcessorException.java +++ /dev/null @@ -1,18 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class EventProcessorException extends PMException { - private String source; - - public EventProcessorException(String msg) { - super(msg); - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/FunctionAlreadyDefinedException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/FunctionAlreadyDefinedException.java deleted file mode 100644 index f5f26e7e9..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/FunctionAlreadyDefinedException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class FunctionAlreadyDefinedException extends PMException { - public FunctionAlreadyDefinedException(String functionName) { - super("a function with the name \"" + functionName + "\" is already defined"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NoParentException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/NoParentException.java deleted file mode 100644 index 0b24ae94b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NoParentException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class NoParentException extends PMException{ - public NoParentException() { - super("a null or empty parent value was provided"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeDoesNotExistException.java deleted file mode 100644 index 273686480..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeDoesNotExistException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class NodeDoesNotExistException extends PMException{ - public NodeDoesNotExistException(String name) { - super("a node with the name \"" + name + "\" does not exist"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeHasChildrenException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeHasChildrenException.java deleted file mode 100644 index acc434357..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeHasChildrenException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class NodeHasChildrenException extends PMException{ - public NodeHasChildrenException(String node) { - super("cannot delete " + node + ", it has nodes assigned to it"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInObligationException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInObligationException.java deleted file mode 100644 index d16ce3ae0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInObligationException.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class NodeReferencedInObligationException extends PMException{ - - public NodeReferencedInObligationException(String nodeToDelete, String obligationLabel) { - super("cannot delete \"" + nodeToDelete + "\" because it is referenced in obligation \"" + obligationLabel + "\""); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInProhibitionException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInProhibitionException.java deleted file mode 100644 index 152a02827..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/NodeReferencedInProhibitionException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class NodeReferencedInProhibitionException extends PMException{ - public NodeReferencedInProhibitionException(String nodeToDelete, String prohibitionLabel) { - super("cannot delete \"" + nodeToDelete + "\" because it is referenced in prohibition \"" + prohibitionLabel + "\""); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationDoesNotExistException.java deleted file mode 100644 index c7432105e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationDoesNotExistException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class ObligationDoesNotExistException extends PMException{ - public ObligationDoesNotExistException(String label) { - super("obligation with label " + label + " does not exist"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationExistsException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationExistsException.java deleted file mode 100644 index 15409c533..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ObligationExistsException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class ObligationExistsException extends PMException{ - public ObligationExistsException(String label) { - super("obligation with label " + label + " already exists"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/PMException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/PMException.java deleted file mode 100644 index ce28b898e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/PMException.java +++ /dev/null @@ -1,36 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -import java.security.spec.ECField; -import java.sql.SQLException; -import java.util.Stack; - -/** - * Root exception to cover any possible error in the Policy Machine interfaces. This is to support multiple implementations - * of the same interfaces that may have different and unplanned exceptions. These exceptions can be wrapped in a PMException. - */ -public class PMException extends Exception { - private static final long serialVersionUID = 1L; - - private String message; - - private StackTraceElement[] stackTrace; - - public PMException(String msg, StackTraceElement ... stackTraceElements) { - this.message = msg; - this.stackTrace = stackTraceElements; - } - - public PMException(Exception e) { - this.message = e.getMessage(); - this.stackTrace = e.getStackTrace(); - } - - public String getMessage() { - return message; - } - - @Override - public StackTraceElement[] getStackTrace() { - return stackTrace; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/PMRuntimeException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/PMRuntimeException.java deleted file mode 100644 index af1e469c4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/PMRuntimeException.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class PMRuntimeException extends RuntimeException { - - public PMRuntimeException(String message) { - super(message); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionDoesNotExistException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionDoesNotExistException.java deleted file mode 100644 index ed27e3224..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionDoesNotExistException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class ProhibitionDoesNotExistException extends PMException{ - public ProhibitionDoesNotExistException(String label) { - super("prohibition with the label " + label + " does not exist"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionExistsException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionExistsException.java deleted file mode 100644 index 55d460a55..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/ProhibitionExistsException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class ProhibitionExistsException extends PMException{ - public ProhibitionExistsException(String label) { - super("a prohibition with the label " + label + " already exists"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/RepObjectNotSetException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/RepObjectNotSetException.java deleted file mode 100644 index 518c87c33..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/RepObjectNotSetException.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class RepObjectNotSetException extends PMException{ - - public RepObjectNotSetException(String node) { - super("the rep object has not been set for " + node); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/TransactionNotStartedException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/TransactionNotStartedException.java deleted file mode 100644 index b21c71e16..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/TransactionNotStartedException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class TransactionNotStartedException extends PMException{ - public TransactionNotStartedException() { - super("a transaction has not been started using beginTx()"); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnauthorizedException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/UnauthorizedException.java deleted file mode 100644 index e6b29218c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnauthorizedException.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -import gov.nist.csd.pm.policy.model.access.UserContext; - -import java.util.Arrays; - -public class UnauthorizedException extends PMException { - - public UnauthorizedException(UserContext user, String target, String ... missingAccessRights) { - super("[" + user + "] does not have access right " + Arrays.toString(missingAccessRights) + " on [" + target + "]"); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownAccessRightException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownAccessRightException.java deleted file mode 100644 index e635cc01f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownAccessRightException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class UnknownAccessRightException extends PMException{ - public UnknownAccessRightException(String ar) { - super("unknown access right \"" + ar + "\""); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownTypeException.java b/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownTypeException.java deleted file mode 100644 index 0b702eb88..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/exceptions/UnknownTypeException.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.exceptions; - -public class UnknownTypeException extends PMException{ - public UnknownTypeException(String type) { - super("unknown node type " + type); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/json/JSONGraph.java b/src/main/java/gov/nist/csd/pm/policy/json/JSONGraph.java deleted file mode 100644 index e487190ea..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/json/JSONGraph.java +++ /dev/null @@ -1,56 +0,0 @@ -package gov.nist.csd.pm.policy.json; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -import java.util.List; -import java.util.Map; - -public class JSONGraph { - AccessRightSet resourceAccessRights; - List nodes; - List assignments; - Map> associations; - - public JSONGraph() { - } - - public JSONGraph(AccessRightSet resourceAccessRights, List nodes, List assignments, Map> associations) { - this.resourceAccessRights = resourceAccessRights; - this.nodes = nodes; - this.assignments = assignments; - this.associations = associations; - } - - public AccessRightSet getResourceAccessRights() { - return resourceAccessRights; - } - - public void setResourceAccessRights(AccessRightSet resourceAccessRights) { - this.resourceAccessRights = resourceAccessRights; - } - - public List getNodes() { - return nodes; - } - - public void setNodes(List nodes) { - this.nodes = nodes; - } - - public List getAssignments() { - return assignments; - } - - public void setAssignments(List assignments) { - this.assignments = assignments; - } - - public Map> getAssociations() { - return associations; - } - - public void setAssociations(Map> associations) { - this.associations = associations; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/json/JSONPolicy.java b/src/main/java/gov/nist/csd/pm/policy/json/JSONPolicy.java deleted file mode 100644 index 4255801e7..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/json/JSONPolicy.java +++ /dev/null @@ -1,57 +0,0 @@ -package gov.nist.csd.pm.policy.json; - -import com.google.gson.Gson; - -public class JSONPolicy { - private String graph; - private String prohibitions; - private String obligations; - private String userDefinedPML; - - public JSONPolicy() { - } - - public JSONPolicy(String graph, String prohibitions, String obligations, String userDefinedPML) { - this.graph = graph; - this.prohibitions = prohibitions; - this.obligations = obligations; - this.userDefinedPML = userDefinedPML; - } - - public String getGraph() { - return graph; - } - - public void setGraph(String graph) { - this.graph = graph; - } - - public String getProhibitions() { - return prohibitions; - } - - public void setProhibitions(String prohibitions) { - this.prohibitions = prohibitions; - } - - public String getObligations() { - return obligations; - } - - public void setObligations(String obligations) { - this.obligations = obligations; - } - - public String getUserDefinedPML() { - return userDefinedPML; - } - - public void setUserDefinedPML(String userDefinedPML) { - this.userDefinedPML = userDefinedPML; - } - - public static JSONPolicy fromJson(String json) { - JSONPolicy jsonPolicy = new Gson().fromJson(json, JSONPolicy.class); - return jsonPolicy; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/json/JSONUserDefinedPML.java b/src/main/java/gov/nist/csd/pm/policy/json/JSONUserDefinedPML.java deleted file mode 100644 index 038a7c769..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/json/JSONUserDefinedPML.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.nist.csd.pm.policy.json; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.Map; - -public class JSONUserDefinedPML { - Map functions; - Map constants; - - public JSONUserDefinedPML() { - } - - public JSONUserDefinedPML(Map functions, Map constants) { - this.functions = functions; - this.constants = constants; - } - - public Map getFunctions() { - return functions; - } - - public void setFunctions(Map functions) { - this.functions = functions; - } - - public Map getConstants() { - return constants; - } - - public void setConstants(Map constants) { - this.constants = constants; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/access/AccessRightSet.java b/src/main/java/gov/nist/csd/pm/policy/model/access/AccessRightSet.java deleted file mode 100644 index 74a162289..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/access/AccessRightSet.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.model.access; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; - -public class AccessRightSet extends HashSet { - - public AccessRightSet(){ - } - - public AccessRightSet(String ... ops) { - this.addAll(Arrays.asList(ops)); - } - - public AccessRightSet(Collection ops) { - this.addAll(ops); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/access/AdminAccessRights.java b/src/main/java/gov/nist/csd/pm/policy/model/access/AdminAccessRights.java deleted file mode 100644 index f5e3f2567..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/access/AdminAccessRights.java +++ /dev/null @@ -1,170 +0,0 @@ -package gov.nist.csd.pm.policy.model.access; - -public class AdminAccessRights { - - public static final String CREATE_POLICY_CLASS = "create_policy_class"; - public static final String CREATE_OBJECT = "create_object"; - public static final String CREATE_OBJECT_ATTRIBUTE = "create_object_attribute"; - public static final String CREATE_USER_ATTRIBUTE = "create_user_attribute"; - public static final String CREATE_USER = "create_user"; - public static final String SET_NODE_PROPERTIES = "set_node_properties"; - public static final String DELETE_POLICY_CLASS = "delete_policy_class"; - public static final String DELETE_OBJECT = "delete_object"; - public static final String DELETE_OBJECT_ATTRIBUTE = "delete_object_attribute"; - public static final String DELETE_USER_ATTRIBUTE = "delete_user_attribute"; - public static final String DELETE_USER = "delete_user"; - public static final String ASSIGN_OBJECT_ATTRIBUTE = "assign_object_attribute"; - public static final String ASSIGN_TO_OBJECT_ATTRIBUTE = "assign_to_object_attribute"; - public static final String ASSIGN_OBJECT = "assign_object"; - public static final String ASSIGN_USER_ATTRIBUTE = "assign_user_attribute"; - public static final String ASSIGN_TO_USER_ATTRIBUTE = "assign_to_user_attribute"; - public static final String ASSIGN_TO_POLICY_CLASS = "assign_to_policy_class"; - public static final String ASSIGN_USER = "assign_user"; - - public static final String DEASSIGN_USER_ATTRIBUTE = "deassign_user_attribute"; - public static final String DEASSIGN_OBJECT_ATTRIBUTE = "deassign_object_attribute"; - public static final String DEASSIGN_USER = "deassign_user"; - public static final String DEASSIGN_OBJECT = "deassign_object"; - public static final String DEASSIGN_FROM_USER_ATTRIBUTE = "deassign_from_user_attribute"; - public static final String DEASSIGN_FROM_OBJECT_ATTRIBUTE = "deassign_from_object_attribute"; - public static final String DEASSIGN_FROM_POLICY_CLASS = "deassign_from_policy_class"; - - public static final String ASSOCIATE_USER_ATTRIBUTE = "associate_user_attribute"; - public static final String ASSOCIATE_OBJECT_ATTRIBUTE = "associate_object_attribute"; - public static final String DISSOCIATE_USER_ATTRIBUTE = "associate_user_attribute"; - public static final String DISSOCIATE_OBJECT_ATTRIBUTE = "associate_object_attribute"; - public static final String GET_ASSOCIATIONS = "get_associations"; - public static final String GET_PROHIBITIONS = "get_prohibitions"; - public static final String GET_ACCESS_RIGHTS = "get_access_rights"; - - // prohibitions - public static final String CREATE_PROHIBITION = "create_prohibition"; - public static final String CREATE_PROCESS_PROHIBITION = "create_process_prohibition"; - public static final String DELETE_PROCESS_PROHIBITION = "delete_process_prohibition"; - public static final String GET_PROCESS_PROHIBITIONS = "get_process_prohibitions"; - public static final String ADD_CONTAINER_TO_PROHIBITION = "add_container_to_prohibition"; - public static final String ADD_CONTAINER_COMPLEMENT_TO_PROHIBITION = "add_container_complement_to_prohibition"; - public static final String REMOVE_CONTAINER_FROM_PROHIBITION = "remove_container_to_prohibition"; - public static final String REMOVE_CONTAINER_COMPLEMENT_FROM_PROHIBITION = "remove_container_complement_to_prohibition"; - public static final String DELETE_PROHIBITION = "delete_prohibition"; - - // obligations - public static final String CREATE_OBLIGATION = "create_obligation"; - public static final String DELETE_OBLIGATION = "delete_obligation"; - public static final String GET_OBLIGATION = "get_obligation"; - public static final String DELETE_RULE = "delete_rule"; - public static final String SET_RESOURCE_ACCESS_RIGHTS = "set_resource_access_rights"; - public static final String GET_RESOURCE_ACCESS_RIGHTS = "get_resource_access_rights"; - - // pml - public static final String ADD_FUNCTION = "add_function"; - public static final String REMOVE_FUNCTION = "remove_function"; - public static final String GET_FUNCTIONS = "get_functions"; - public static final String ADD_CONSTANT = "add_constant"; - public static final String REMOVE_CONSTANT = "remove_constant"; - public static final String GET_CONSTANTS = "get_constants"; - public static final String GET_CONTEXT = "get_context"; - public static final String TO_STRING = "to_string"; - public static final String FROM_STRING = "from_string"; - public static final String ALL_ACCESS_RIGHTS = "*"; - public static final String ALL_ADMIN_ACCESS_RIGHTS = "*a"; - public static final String ALL_RESOURCE_ACCESS_RIGHTS = "*r"; - - private static final AccessRightSet ALL_ADMIN_ACCESS_RIGHTS_SET = new AccessRightSet( - CREATE_POLICY_CLASS, - CREATE_OBJECT, - CREATE_OBJECT_ATTRIBUTE, - CREATE_USER_ATTRIBUTE, - CREATE_USER, - SET_NODE_PROPERTIES, - DELETE_POLICY_CLASS, - DELETE_OBJECT, - DELETE_OBJECT_ATTRIBUTE, - DELETE_USER_ATTRIBUTE, - DELETE_USER, - ASSIGN_OBJECT_ATTRIBUTE, - ASSIGN_TO_OBJECT_ATTRIBUTE, - ASSIGN_OBJECT, - ASSIGN_USER_ATTRIBUTE, - ASSIGN_TO_USER_ATTRIBUTE, - ASSIGN_USER, - ASSIGN_TO_POLICY_CLASS, - - DEASSIGN_USER_ATTRIBUTE, - DEASSIGN_OBJECT_ATTRIBUTE, - DEASSIGN_USER, - DEASSIGN_OBJECT, - DEASSIGN_FROM_USER_ATTRIBUTE, - DEASSIGN_FROM_OBJECT_ATTRIBUTE, - DEASSIGN_FROM_POLICY_CLASS, - - ASSOCIATE_USER_ATTRIBUTE, - ASSOCIATE_OBJECT_ATTRIBUTE, - DISSOCIATE_USER_ATTRIBUTE, - DISSOCIATE_OBJECT_ATTRIBUTE, - GET_ASSOCIATIONS, - GET_PROHIBITIONS, - GET_ACCESS_RIGHTS, - - // prohibitions - CREATE_PROHIBITION, - CREATE_PROCESS_PROHIBITION, - DELETE_PROCESS_PROHIBITION, - GET_PROCESS_PROHIBITIONS, - ADD_CONTAINER_TO_PROHIBITION, - ADD_CONTAINER_COMPLEMENT_TO_PROHIBITION, - REMOVE_CONTAINER_FROM_PROHIBITION, - REMOVE_CONTAINER_COMPLEMENT_FROM_PROHIBITION, - DELETE_PROHIBITION, - - // obligations - CREATE_OBLIGATION, - DELETE_OBLIGATION, - GET_OBLIGATION, - DELETE_RULE, - SET_RESOURCE_ACCESS_RIGHTS, - GET_RESOURCE_ACCESS_RIGHTS, - - // pml - ADD_FUNCTION, - REMOVE_FUNCTION, - GET_FUNCTIONS, - ADD_CONSTANT, - REMOVE_CONSTANT, - GET_CONSTANTS, - GET_CONTEXT, - TO_STRING, - FROM_STRING - ); - - private static final AccessRightSet WILDCARD_ACCESS_RIGHTS_SET = new AccessRightSet( - ALL_ACCESS_RIGHTS, - ALL_ADMIN_ACCESS_RIGHTS, - ALL_RESOURCE_ACCESS_RIGHTS - ); - - private static final AccessRightSet ALL_ACCESS_RIGHTS_SET = new AccessRightSet(ALL_ACCESS_RIGHTS); - - private AdminAccessRights() {} - - public static AccessRightSet allAdminAccessRights() { - return new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS_SET); - } - - public static AccessRightSet allAccessRights() { - return new AccessRightSet(ALL_ACCESS_RIGHTS_SET); - } - - public static AccessRightSet wildcardAccessRights() { - return new AccessRightSet(WILDCARD_ACCESS_RIGHTS_SET); - } - - public static boolean isAdminAccessRight(String ar) { - return ALL_ADMIN_ACCESS_RIGHTS_SET.contains(ar); - } - - public static boolean isWildcardAccessRight(String ar) { - return WILDCARD_ACCESS_RIGHTS_SET.contains(ar); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/audit/Explain.java b/src/main/java/gov/nist/csd/pm/policy/model/audit/Explain.java deleted file mode 100644 index 2790f5a42..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/audit/Explain.java +++ /dev/null @@ -1,57 +0,0 @@ -package gov.nist.csd.pm.policy.model.audit; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class Explain { - private Set permissions; - private Map policyClasses; - - public Explain() { - permissions = new HashSet<>(); - policyClasses = new HashMap<>(); - } - - public Explain(Set permissions, Map policyClasses) { - this.permissions = permissions; - this.policyClasses = policyClasses; - } - - public Set getPermissions() { - return permissions; - } - - public void setPermissions(Set permissions) { - this.permissions = permissions; - } - - public Map getPolicyClasses() { - return policyClasses; - } - - public void setPolicyClasses(Map policyClasses) { - this.policyClasses = policyClasses; - } - - public String toString() { - StringBuilder str = new StringBuilder("Permissions: " + permissions.toString()); - for (String pc : policyClasses.keySet()) { - PolicyClass policyClass = policyClasses.get(pc); - str.append("\n\t\t").append(pc).append(": ").append(policyClass.getOperations()); - } - - str.append("\nPaths:"); - for (String pc : policyClasses.keySet()) { - PolicyClass policyClass = policyClasses.get(pc); - str.append("\n\t\t").append(pc).append(": ").append(policyClass.getOperations()); - Set paths = policyClass.getPaths(); - for (Path path : paths) { - str.append("\n\t\t\t- ").append(path); - } - } - - return str.toString(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/audit/Path.java b/src/main/java/gov/nist/csd/pm/policy/model/audit/Path.java deleted file mode 100644 index 23055a16a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/audit/Path.java +++ /dev/null @@ -1,65 +0,0 @@ -package gov.nist.csd.pm.policy.model.audit; - -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class Path { - private List userDagPath; - private List targetDagPath; - private Association association; - - public Path() { - userDagPath = new ArrayList<>(); - targetDagPath = new ArrayList<>(); - association = new Association(); - } - - public Path(List userDagPath, List targetDagPath, Association association) { - this.userDagPath = userDagPath; - this.targetDagPath = targetDagPath; - this.association = association; - } - - public List getUserDagPath() { - return userDagPath; - } - - public void setUserDagPath(List userDagPath) { - this.userDagPath = userDagPath; - } - - public List getTargetDagPath() { - return targetDagPath; - } - - public void setTargetDagPath(List targetDagPath) { - this.targetDagPath = targetDagPath; - } - - public Association getAssociation() { - return association; - } - - public void setAssociation(Association association) { - this.association = association; - } - - @Override - public int hashCode() { - return Objects.hash(userDagPath, targetDagPath, association); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Path)) { - return false; - } - - Path p = (Path)o; - return this.userDagPath.equals(p.userDagPath) && this.targetDagPath.equals(p.targetDagPath) - && this.association.equals(p.association); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/audit/PolicyClass.java b/src/main/java/gov/nist/csd/pm/policy/model/audit/PolicyClass.java deleted file mode 100644 index 19c644df3..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/audit/PolicyClass.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.nist.csd.pm.policy.model.audit; - -import java.util.HashSet; -import java.util.Set; - -public class PolicyClass { - private Set operations; - private Set paths; - - public PolicyClass() { - operations = new HashSet<>(); - paths = new HashSet<>(); - } - - public PolicyClass(Set operations, Set paths) { - this.operations = operations; - this.paths = paths; - } - - public Set getOperations() { - return operations; - } - - public void setOperations(Set operations) { - this.operations = operations; - } - - public Set getPaths() { - return paths; - } - - public void setPaths(Set paths) { - this.paths = paths; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/audit/ResolvedPath.java b/src/main/java/gov/nist/csd/pm/policy/model/audit/ResolvedPath.java deleted file mode 100644 index 5cbc3e935..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/audit/ResolvedPath.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.model.audit; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.util.Set; - -public class ResolvedPath { - private String pc; - private EdgePath path; - private AccessRightSet ops; - - public ResolvedPath() { - - } - - public ResolvedPath(String pc, EdgePath path, AccessRightSet ops) { - this.pc = pc; - this.path = path; - this.ops = ops; - } - - public String getPc() { - return pc; - } - - public EdgePath getPath() { - return path; - } - - public Set getOps() { - return ops; - } -} - diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/NoopShortCircuit.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/NoopShortCircuit.java deleted file mode 100644 index 8cecb932e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/NoopShortCircuit.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag; - -public class NoopShortCircuit implements ShortCircuit{ - @Override - public boolean evaluate(String node) { - return false; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/ShortCircuit.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/ShortCircuit.java deleted file mode 100644 index dae409581..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/ShortCircuit.java +++ /dev/null @@ -1,7 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag; - -public interface ShortCircuit { - - boolean evaluate(String node); - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/TargetDagResult.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/TargetDagResult.java deleted file mode 100644 index ecee141d4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/TargetDagResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.util.Map; -import java.util.Set; - -public record TargetDagResult(Map pcSet, Set reachedTargets) { - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/UserDagResult.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/UserDagResult.java deleted file mode 100644 index cd679ab1e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/UserDagResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.Map; -import java.util.Set; - -public record UserDagResult(Map borderTargets, - Set prohibitions, - Set prohibitionTargets) { -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/NoopPropagator.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/NoopPropagator.java deleted file mode 100644 index d074e1656..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/NoopPropagator.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.propagator; - -public class NoopPropagator implements Propagator { - - @Override - public void propagate(String node, String target) { - - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/Propagator.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/Propagator.java deleted file mode 100644 index 741799f83..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/propagator/Propagator.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.propagator; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface Propagator { - - /** - * Propagate information from the node to the target node. This can be from a parent to a child if direction is - * - * @param src the node that holds the information already. - * @param dst the node to propagate the information to. - */ - void propagate(String src, String dst) throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/NoopVisitor.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/NoopVisitor.java deleted file mode 100644 index cd3b8a89e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/NoopVisitor.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.visitor; - -public class NoopVisitor implements Visitor{ - - @Override - public void visit(String node) { - - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/Visitor.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/Visitor.java deleted file mode 100644 index cde956ba6..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/visitor/Visitor.java +++ /dev/null @@ -1,8 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.visitor; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface Visitor { - - void visit(String node) throws PMException; -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/Direction.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/Direction.java deleted file mode 100644 index aca5ec1d6..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/Direction.java +++ /dev/null @@ -1,6 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.walker; - -public enum Direction { - CHILDREN, - PARENTS -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/GraphWalker.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/GraphWalker.java deleted file mode 100644 index 4b23c3752..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/dag/walker/GraphWalker.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.dag.walker; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.dag.ShortCircuit; - -public interface GraphWalker { - - /** - * Traverse a graph starting at the start node. - */ - void walk(String start) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Assignment.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Assignment.java deleted file mode 100644 index eeec68756..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Assignment.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.relationships; - -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.io.Serializable; -import java.util.EnumMap; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; - -/** - * This object represents an Assignment in a NGAC graph - */ -public class Assignment extends Relationship implements Serializable { - - public Assignment(String source, String target) { - super(source, target); - } - - private static final Map validAssignments = new EnumMap<>(NodeType.class); - static { - validAssignments.put(PC, new NodeType[]{}); - validAssignments.put(OA, new NodeType[]{PC, OA}); - validAssignments.put(O, new NodeType[]{OA}); - validAssignments.put(UA, new NodeType[]{UA, PC}); - validAssignments.put(U, new NodeType[]{UA}); - } - - /** - * Check if the assignment provided, is valid under NGAC. - * - * @param childType The type of the child. - * @param parentType The type of the parent. - * @throws InvalidAssignmentException if the child type is not allowed to be assigned to the parent type. - */ - public static void checkAssignment(NodeType childType, NodeType parentType) throws InvalidAssignmentException { - NodeType[] check = validAssignments.get(childType); - for (NodeType nt : check) { - if (nt.equals(parentType)) { - return; - } - } - - throw new InvalidAssignmentException(String.format("cannot assign a node of type %s to a node of type %s", childType, parentType)); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssignmentException.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssignmentException.java deleted file mode 100644 index f31b64392..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssignmentException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.relationships; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class InvalidAssignmentException extends PMException { - public InvalidAssignmentException(String msg) { - super(msg); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssociationException.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssociationException.java deleted file mode 100644 index 8762c2775..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/InvalidAssociationException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.relationships; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class InvalidAssociationException extends PMException { - public InvalidAssociationException(String msg) { - super(msg); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Relationship.java b/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Relationship.java deleted file mode 100644 index 9778f5cf8..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/graph/relationships/Relationship.java +++ /dev/null @@ -1,82 +0,0 @@ -package gov.nist.csd.pm.policy.model.graph.relationships; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.io.Serializable; -import java.util.Objects; - -/** - * This class will serve as a parent class for Assignments and Associations. Both types of relations have a source node - * and a target node. - */ -public class Relationship implements Serializable { - private String source; - private String target; - private AccessRightSet accessRightSet; - - public Relationship() { - - } - - public Relationship(String source, String target) { - this.source = source; - this.target = target; - this.accessRightSet = null; - } - - public Relationship(String source, String target, AccessRightSet accessRightSet) { - this.source = source; - this.target = target; - this.accessRightSet = accessRightSet; - } - - public Relationship(AccessRightSet accessRightSet) { - this.accessRightSet = accessRightSet; - } - - public String getSource() { - return source; - } - - public void setSource(String source) { - this.source = source; - } - - public String getTarget() { - return target; - } - - public void setTarget(String target) { - this.target = target; - } - - public boolean isAssociation() { - return this.accessRightSet != null; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - public void setAccessRightSet(AccessRightSet accessRightSet) { - this.accessRightSet = accessRightSet; - } - - public String toString() { - return source + "->" + target + (isAssociation() ? accessRightSet : ""); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Relationship ge)) { - return false; - } - - return this.source.equals(ge.source) && this.target.equals(ge.target); - } - - @Override - public int hashCode() { - return Objects.hash(source, target); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Obligation.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/Obligation.java deleted file mode 100644 index 866f0c9cf..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Obligation.java +++ /dev/null @@ -1,118 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation; - -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.access.UserContext; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class Obligation implements Cloneable, Serializable { - - private UserContext author; - private String label; - private List rules; - - public Obligation() { - } - - public Obligation(UserContext author, String label) { - this.author = author; - this.label = label; - this.rules = new ArrayList<>(); - } - - public Obligation(UserContext author, String label, List rules) { - this.author = author; - this.label = label; - this.rules = new ArrayList<>(); - for (Rule rule : rules) { - this.rules.add(new Rule(rule)); - } - } - - public Obligation(Obligation obligation) { - this.label = obligation.label; - this.rules = new ArrayList<>(); - for (Rule rule : obligation.getRules()) { - this.rules.add(new Rule(rule)); - } - this.author = obligation.author; - } - - @Override - public Obligation clone() { - Obligation o; - try { - o = (Obligation) super.clone(); - } catch (CloneNotSupportedException e) { - return new Obligation(this.author, this.label); - } - - o.author = this.author; - o.label = this.label; - return o; - } - - public Obligation addRule(String label, EventPattern eventPattern, Response response) { - rules.add(new Rule(label, eventPattern, response)); - return this; - } - - public void deleteRule(String label) { - rules.removeIf(rule -> rule.getLabel().equals(label)); - } - - public UserContext getAuthor() { - return author; - } - - public void setAuthor(UserContext userCtx) { - this.author = userCtx; - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public List getRules() { - return rules; - } - - public Rule getRule(String ruleLabel) { - for (Rule rule : rules) { - if (rule.getLabel().equals(ruleLabel)) { - return rule; - } - } - - return null; - } - - public void setRules(List rules) { - this.rules = rules; - } - - public Obligation addRule(Rule rule) { - this.rules.add(rule); - return this; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Obligation that = (Obligation) o; - return Objects.equals(author, that.author) && Objects.equals(label, that.label) && Objects.equals(rules, that.rules); - } - - @Override - public int hashCode() { - return Objects.hash(author, label, rules); - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Response.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/Response.java deleted file mode 100644 index 78984001b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Response.java +++ /dev/null @@ -1,85 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.epp.EventContext; - -import java.io.Serializable; -import java.util.List; -import java.util.Objects; - -public class Response implements Serializable { - - private final ExecutionContext executionCtx; - private final List stmts; - private final String eventCtxVariable; - - public Response(String eventCtxVariable, ExecutionContext executionCtx, List stmts) { - this.eventCtxVariable = eventCtxVariable; - this.executionCtx = executionCtx; - this.stmts = stmts; - } - - public Response(String eventCtxVariable, ExecutionContext executionCtx, PMLStatement... stmts) { - this.eventCtxVariable = eventCtxVariable; - this.executionCtx = executionCtx; - this.stmts = List.of(stmts); - } - - public Response(UserContext author, PMLStatement... stmts) { - this.eventCtxVariable = ""; - this.executionCtx = new ExecutionContext(author); - this.stmts = List.of(stmts); - } - - public Response(UserContext author, String eventCtxVariable, PMLStatement... stmts) { - this.eventCtxVariable = eventCtxVariable; - this.executionCtx = new ExecutionContext(author); - this.stmts = List.of(stmts); - } - - public Response(Response response) { - this.eventCtxVariable = response.eventCtxVariable; - this.executionCtx = response.executionCtx; - this.stmts = response.stmts; - } - - public String getEventCtxVariable() { - return eventCtxVariable; - } - - public List getStatements() { - return stmts; - } - - public ExecutionContext getExecutionCtx() { - return executionCtx; - } - - public Value execute(Policy policyAuthor, EventContext eventCtx) throws PMException { - executionCtx.scope().putValue(eventCtxVariable, Value.objectToValue(eventCtx)); - - for (PMLStatement stmt : stmts) { - stmt.execute(executionCtx, policyAuthor); - } - - return new Value(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Response response = (Response) o; - return Objects.equals(executionCtx, response.executionCtx) && Objects.equals(stmts, response.stmts); - } - - @Override - public int hashCode() { - return Objects.hash(executionCtx, stmts); - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Rule.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/Rule.java deleted file mode 100644 index 6184838c4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/Rule.java +++ /dev/null @@ -1,80 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation; - -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; - -import java.io.Serializable; -import java.util.Objects; - -public class Rule implements Serializable { - - private String label; - private EventPattern eventPattern; - private Response response; - - public Rule() { - } - - public Rule(String label, EventPattern eventPattern, Response response) { - this.label = label; - this.eventPattern = eventPattern; - this.response = response; - } - - public Rule(String label, EventSubject subject, Performs performs, Target target, Response response) { - this.label = label; - this.eventPattern = new EventPattern(subject, performs, target); - this.response = response; - } - - public Rule(String label, EventSubject subject, Performs performs, Response response) { - this.label = label; - this.eventPattern = new EventPattern(subject, performs); - this.response = response; - } - - public Rule(Rule rule) { - this.label = rule.label; - this.eventPattern = new EventPattern(rule.eventPattern); - this.response = new Response(rule.response); - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public EventPattern getEventPattern() { - return eventPattern; - } - - public void setEventPattern(EventPattern eventPattern) { - this.eventPattern = eventPattern; - } - - public Response getResponse() { - return response; - } - - public void setResponse(Response response) { - this.response = response; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Rule rule = (Rule) o; - return label.equals(rule.label) && eventPattern.equals(rule.eventPattern) && response.equals(rule.response); - } - - @Override - public int hashCode() { - return Objects.hash(label, eventPattern, response); - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventPattern.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventPattern.java deleted file mode 100644 index c76057c48..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventPattern.java +++ /dev/null @@ -1,72 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation.event; - - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class EventPattern implements Serializable { - - private EventSubject subject; - private List operations; - private Target target; - - public EventPattern() { - } - - public EventPattern(EventSubject subject, Performs performs) { - this.subject = subject; - this.operations = Arrays.asList(performs.events()); - this.target = Target.anyPolicyElement(); - } - public EventPattern(EventSubject subject, Performs performs, Target target) { - this.subject = subject; - this.operations = Arrays.asList(performs.events()); - this.target = target; - } - - public EventPattern(EventPattern eventPattern) { - this.subject = eventPattern.subject; - this.operations = new ArrayList<>(eventPattern.operations); - this.target = eventPattern.target; - } - - public void setSubject(EventSubject subject) { - this.subject = subject; - } - - public void setOperations(List operations) { - this.operations = operations; - } - - public void setTarget(Target target) { - this.target = target; - } - - public EventSubject getSubject() { - return subject; - } - - public List getOperations() { - return operations; - } - - public Target getTarget() { - return target; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EventPattern that = (EventPattern) o; - return Objects.equals(subject, that.subject) && Objects.equals(operations, that.operations) && Objects.equals(target, that.target); - } - - @Override - public int hashCode() { - return Objects.hash(subject, operations, target); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventSubject.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventSubject.java deleted file mode 100644 index 094826f9f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/EventSubject.java +++ /dev/null @@ -1,110 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation.event; - -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class EventSubject implements Serializable { - - public static EventSubject anyUser() { - return new EventSubject(Type.ANY_USER, new ArrayList<>()); - } - - public static EventSubject anyUserWithAttribute(String attr) { - return new EventSubject(Type.ANY_USER_WITH_ATTRIBUTE, Arrays.asList(attr)); - } - - public static EventSubject process(String process) { - return new EventSubject(Type.PROCESS, Arrays.asList(process)); - } - - public static EventSubject users(String ... users) { - return new EventSubject(Type.USERS, Arrays.asList(users)); - } - - private Type type; - private List subjects; - - public EventSubject() { - } - - private EventSubject(Type type, List subjects) { - this.type = type; - this.subjects = subjects; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public List getSubjects() { - return subjects; - } - - public void setSubjects(List subjects) { - this.subjects = subjects; - } - - public String anyUserWithAttribute() { - return subjects.get(0); - } - - public String process() { - return subjects.get(0); - } - - public List users() { - return subjects; - } - - public boolean matches(UserContext userCtx, PolicyReviewer policyReviewer) throws PMException { - switch (type) { - case ANY_USER -> { - return true; - } - case ANY_USER_WITH_ATTRIBUTE -> { - String user = userCtx.getUser(); - return policyReviewer.isContained(user, anyUserWithAttribute()); - } - case PROCESS -> { - return userCtx.getProcess().equals(process()); - } - case USERS -> { - return users().contains(userCtx.getUser()); - } - default -> { - return false; - } - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EventSubject subject = (EventSubject) o; - return type == subject.type && Objects.equals(subjects, subject.subjects); - } - - @Override - public int hashCode() { - return Objects.hash(type, subjects); - } - - public enum Type { - ANY_USER, - ANY_USER_WITH_ATTRIBUTE, - PROCESS, - USERS - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Performs.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Performs.java deleted file mode 100644 index 68977f00a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Performs.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation.event; - -import java.util.Arrays; - -public record Performs (String ... events) { - - public static Performs events(String ... events) { - return new Performs(events); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Performs performs = (Performs) o; - return Arrays.equals(events, performs.events); - } - - @Override - public int hashCode() { - return Arrays.hashCode(events); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Target.java b/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Target.java deleted file mode 100644 index 94e0d1c5a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/obligation/event/Target.java +++ /dev/null @@ -1,106 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation.event; - -import gov.nist.csd.pm.pdp.PolicyReviewer; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.io.Serializable; -import java.util.*; - -public class Target implements Serializable { - - public static Target anyContainedIn(String anyContainedIn) { - return new Target(Type.ANY_CONTAINED_IN, Collections.singletonList(anyContainedIn)); - } - - public static Target anyOfSet(String ... set) { - return new Target(Type.ANY_OF_SET, Arrays.asList(set)); - } - - public static Target anyPolicyElement() { - return new Target(Type.ANY_POLICY_ELEMENT, new ArrayList<>()); - } - - public static Target policyElement(String policyElement) { - return new Target(Type.POLICY_ELEMENT, Arrays.asList(policyElement)); - } - - private Type type; - private List policyElements; - - public Target() { - } - - public Target(Type type, List policyElements) { - this.type = type; - this.policyElements = policyElements; - } - - public Type getType() { - return type; - } - - public void setType(Type type) { - this.type = type; - } - - public List getPolicyElements() { - return policyElements; - } - - public void setPolicyElements(List policyElements) { - this.policyElements = policyElements; - } - - public String anyContainedIn() { - return policyElements.get(0); - } - - public List anyOfSet() { - return policyElements; - } - - public String policyElement() { - return policyElements.get(0); - } - - public boolean matches(String target, PolicyReviewer policyReviewer) throws PMException { - switch (type) { - case ANY_CONTAINED_IN -> { - return policyReviewer.isContained(target, anyContainedIn()); - } - case POLICY_ELEMENT -> { - return policyElement().equals(target); - } - case ANY_POLICY_ELEMENT -> { - return true; - } - case ANY_OF_SET -> { - return anyOfSet().contains(target); - } - default -> { - return false; - } - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Target target = (Target) o; - return type == target.type && Objects.equals(policyElements, target.policyElements); - } - - @Override - public int hashCode() { - return Objects.hash(type, policyElements); - } - - public enum Type { - ANY_CONTAINED_IN, - ANY_OF_SET, - ANY_POLICY_ELEMENT, - POLICY_ELEMENT - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/ContainerCondition.java b/src/main/java/gov/nist/csd/pm/policy/model/prohibition/ContainerCondition.java deleted file mode 100644 index 26a4e99ff..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/ContainerCondition.java +++ /dev/null @@ -1,18 +0,0 @@ -package gov.nist.csd.pm.policy.model.prohibition; - -import java.io.Serializable; - -public record ContainerCondition(String name, boolean complement) implements Serializable { - - public boolean equals(Object o) { - if (!(o instanceof ContainerCondition cc)) { - return false; - } - - return this.name.equals(cc.name) && this.complement == cc.complement; - } - - public int hashCode() { - return name.hashCode(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/Prohibition.java b/src/main/java/gov/nist/csd/pm/policy/model/prohibition/Prohibition.java deleted file mode 100644 index 2d0148006..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/model/prohibition/Prohibition.java +++ /dev/null @@ -1,105 +0,0 @@ -package gov.nist.csd.pm.policy.model.prohibition; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.io.Serializable; -import java.util.*; - -/** - * Object representing a Prohibition. - */ -public class Prohibition implements Serializable { - - private String label; - private ProhibitionSubject subject; - private List containers; - private AccessRightSet accessRightSet; - private boolean intersection; - - public Prohibition() { - - } - - public Prohibition(String label, ProhibitionSubject subject, AccessRightSet accessRightSet, boolean intersection, List containers) { - if (subject == null) { - throw new IllegalArgumentException("Prohibition subject cannot be null"); - } - - this.label = label; - this.subject = subject; - - if (containers == null) { - this.containers = new ArrayList<>(); - } else { - this.containers = containers; - } - - if (accessRightSet == null) { - this.accessRightSet = new AccessRightSet(); - } else { - this.accessRightSet = accessRightSet; - } - - this.intersection = intersection; - } - - public Prohibition(Prohibition prohibition) { - this.label = prohibition.getLabel(); - this.subject = new ProhibitionSubject(prohibition.getSubject().getName(), prohibition.getSubject().getType()); - this.containers = new ArrayList<>(prohibition.containers); - this.accessRightSet = new AccessRightSet(prohibition.getAccessRightSet()); - this.intersection = prohibition.isIntersection(); - } - - public String getLabel() { - return label; - } - - public void setLabel(String label) { - this.label = label; - } - - public ProhibitionSubject getSubject() { - return subject; - } - - public void setSubject(ProhibitionSubject subject) { - this.subject = subject; - } - - public List getContainers() { - return containers; - } - - public void setContainers(List containers) { - this.containers = containers; - } - - public AccessRightSet getAccessRightSet() { - return accessRightSet; - } - - public void setAccessRightSet(AccessRightSet accessRightSet) { - this.accessRightSet = accessRightSet; - } - - public boolean isIntersection() { - return intersection; - } - - public void setIntersection(boolean intersection) { - this.intersection = intersection; - } - - public boolean equals(Object o) { - if (!(o instanceof Prohibition p)) { - return false; - } - - return this.getLabel().equals(p.getLabel()); - } - - public int hashCode() { - return Objects.hash(label); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinConstants.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinConstants.java deleted file mode 100644 index ea4a15b43..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinConstants.java +++ /dev/null @@ -1,56 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.pml.compiler.Variable; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.model.access.AdminAccessRights; - -import java.util.HashMap; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.ALL_ADMIN_ACCESS_RIGHTS; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.ALL_RESOURCE_ACCESS_RIGHTS; - -public class PMLBuiltinConstants { - - private PMLBuiltinConstants() { } - - private static final Map BUILTIN_VALUES = new HashMap<>(); - static { - BUILTIN_VALUES.put(SUPER_USER, new Value(SUPER_USER)); - BUILTIN_VALUES.put(SUPER_PC, new Value(SUPER_PC)); - BUILTIN_VALUES.put(SUPER_UA, new Value(SUPER_UA)); - BUILTIN_VALUES.put(SUPER_PC_REP, new Value(SUPER_PC_REP)); - - for (String adminAccessRight : AdminAccessRights.allAdminAccessRights()) { - BUILTIN_VALUES.put(adminAccessRight, new Value(adminAccessRight)); - } - - BUILTIN_VALUES.put(ALL_ADMIN_ACCESS_RIGHTS, new Value(ALL_ADMIN_ACCESS_RIGHTS)); - BUILTIN_VALUES.put(ALL_RESOURCE_ACCESS_RIGHTS, new Value(ALL_RESOURCE_ACCESS_RIGHTS)); - } - - private static final Map BUILTIN_VARIABLES = new HashMap<>(); - static { - BUILTIN_VARIABLES.put(SUPER_USER, new Variable(SUPER_USER, Type.string(), true)); - BUILTIN_VARIABLES.put(SUPER_PC, new Variable(SUPER_PC, Type.string(), true)); - BUILTIN_VARIABLES.put(SUPER_UA, new Variable(SUPER_UA, Type.string(), true)); - BUILTIN_VARIABLES.put(SUPER_PC_REP, new Variable(SUPER_PC_REP, Type.string(), true)); - - for (String adminAccessRight : AdminAccessRights.allAdminAccessRights()) { - BUILTIN_VARIABLES.put(adminAccessRight, new Variable(adminAccessRight, Type.string(), true)); - } - - BUILTIN_VARIABLES.put(ALL_ADMIN_ACCESS_RIGHTS, new Variable(ALL_ADMIN_ACCESS_RIGHTS, Type.string(), true)); - BUILTIN_VARIABLES.put(ALL_RESOURCE_ACCESS_RIGHTS, new Variable(ALL_RESOURCE_ACCESS_RIGHTS, Type.string(), true)); - } - - public static Map builtinValues() { - return new HashMap<>(BUILTIN_VALUES); - } - - public static Map builtinVariables() { - return new HashMap<>(BUILTIN_VARIABLES); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinFunctions.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinFunctions.java deleted file mode 100644 index b14887227..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLBuiltinFunctions.java +++ /dev/null @@ -1,77 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.pml.functions.*; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.HashMap; -import java.util.Map; - -public class PMLBuiltinFunctions { - - // util functions - private static final FunctionDefinitionStatement concat = new Concat(); - private static final FunctionDefinitionStatement equals = new Equals(); - private static final FunctionDefinitionStatement contains = new Contains(); - private static final FunctionDefinitionStatement containsKey = new ContainsKey(); - private static final FunctionDefinitionStatement numToStr = new NumToStr(); - - // policy functions - private static final FunctionDefinitionStatement getAssociationsWithSource = new GetAssociationsWithSource(); - private static final FunctionDefinitionStatement getAssociationsWithTarget = new GetAssociationsWithTarget(); - private static final FunctionDefinitionStatement getChildren = new GetChildren(); - private static final FunctionDefinitionStatement getParents = new GetParents(); - private static final FunctionDefinitionStatement getNodeProperties = new GetNodeProperties(); - private static final FunctionDefinitionStatement getNodeType = new GetNodeType(); - private static final FunctionDefinitionStatement getProhibitionsFor = new GetProhibitionsFor(); - private static final FunctionDefinitionStatement hasPropertyKey = new HasPropertyKey(); - private static final FunctionDefinitionStatement hasPropertyValue = new HasPropertyValue(); - private static final FunctionDefinitionStatement nodeExists = new NodeExists(); - private static final FunctionDefinitionStatement getNode = new GetNode(); - private static final FunctionDefinitionStatement search = new Search(); - private static final FunctionDefinitionStatement assignAll = new AssignAll(); - private static final FunctionDefinitionStatement deassignAll = new DeassignAll(); - private static final FunctionDefinitionStatement deassignAllFromAndDelete = new DeassignAllFromAndDelete(); - private static final FunctionDefinitionStatement append = new Append(); - private static final FunctionDefinitionStatement appendAll = new AppendAll(); - private static final FunctionDefinitionStatement length = new Length(); - - - private static final Map BUILTIN_FUNCTIONS = new HashMap<>(); - - static { - BUILTIN_FUNCTIONS.put(concat.getFunctionName(), concat); - BUILTIN_FUNCTIONS.put(equals.getFunctionName(), equals); - BUILTIN_FUNCTIONS.put(contains.getFunctionName(), contains); - BUILTIN_FUNCTIONS.put(containsKey.getFunctionName(), containsKey); - BUILTIN_FUNCTIONS.put(numToStr.getFunctionName(), numToStr); - - BUILTIN_FUNCTIONS.put(getAssociationsWithSource.getFunctionName(), getAssociationsWithSource); - BUILTIN_FUNCTIONS.put(getAssociationsWithTarget.getFunctionName(), getAssociationsWithTarget); - BUILTIN_FUNCTIONS.put(getChildren.getFunctionName(), getChildren); - BUILTIN_FUNCTIONS.put(getParents.getFunctionName(), getParents); - BUILTIN_FUNCTIONS.put(getNodeProperties.getFunctionName(), getNodeProperties); - BUILTIN_FUNCTIONS.put(getNodeType.getFunctionName(), getNodeType); - BUILTIN_FUNCTIONS.put(getProhibitionsFor.getFunctionName(), getProhibitionsFor); - BUILTIN_FUNCTIONS.put(hasPropertyKey.getFunctionName(), hasPropertyKey); - BUILTIN_FUNCTIONS.put(hasPropertyValue.getFunctionName(), hasPropertyValue); - BUILTIN_FUNCTIONS.put(nodeExists.getFunctionName(), nodeExists); - BUILTIN_FUNCTIONS.put(getNode.getFunctionName(), getNode); - BUILTIN_FUNCTIONS.put(search.getFunctionName(), search); - BUILTIN_FUNCTIONS.put(assignAll.getFunctionName(), assignAll); - BUILTIN_FUNCTIONS.put(deassignAll.getFunctionName(), deassignAll); - BUILTIN_FUNCTIONS.put(deassignAllFromAndDelete.getFunctionName(), deassignAllFromAndDelete); - BUILTIN_FUNCTIONS.put(append.getFunctionName(), append); - BUILTIN_FUNCTIONS.put(appendAll.getFunctionName(), appendAll); - BUILTIN_FUNCTIONS.put(length.getFunctionName(), length); - } - - public static Map builtinFunctions() { - return new HashMap<>(BUILTIN_FUNCTIONS); - } - - public static boolean isBuiltinFunction(String functionName) { - return BUILTIN_FUNCTIONS.containsKey(functionName); - } - - private PMLBuiltinFunctions() {} -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLCompiler.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLCompiler.java deleted file mode 100644 index 628a8f399..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLCompiler.java +++ /dev/null @@ -1,62 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.antlr.PMLLexer; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.compiler.error.ErrorLog; -import gov.nist.csd.pm.policy.pml.compiler.visitor.PolicyVisitor; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.exception.PMLCompilationException; -import gov.nist.csd.pm.policy.pml.model.scope.FunctionAlreadyDefinedInScopeException; -import gov.nist.csd.pm.policy.pml.model.scope.Scope; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.antlr.v4.runtime.*; - -import java.util.ArrayList; -import java.util.List; - -public class PMLCompiler { - - public static List compilePML(Policy policy, String input, FunctionDefinitionStatement... customBuiltinFunctions) throws PMException { - ErrorLog errorLog = new ErrorLog(); - Scope scope = new Scope(Scope.Mode.COMPILE); - scope.loadFromPMLContext(PMLContext.fromPolicy(policy)); - - // add custom builtin functions to scope - for (FunctionDefinitionStatement func : customBuiltinFunctions) { - try { - scope.addFunction(func); - } catch (FunctionAlreadyDefinedInScopeException e) { - errorLog.addError(0, 0, 0, e.getMessage()); - } - } - - PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); - CommonTokenStream tokens = new CommonTokenStream(lexer); - PMLParser parser = new PMLParser(tokens); - parser.addErrorListener(new BaseErrorListener() { - @Override - public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) { - errorLog.addError(line, charPositionInLine, offendingSymbol.toString().length(), msg); - } - }); - - PolicyVisitor policyVisitor = new PolicyVisitor(new VisitorContext(scope, errorLog)); - List stmts = new ArrayList<>(); - try { - stmts = policyVisitor.visitPml(parser.pml()); - } catch (Exception e) { - errorLog.addError(parser.pml(), e.getMessage()); - } - - // throw an exception if there are any errors from parsing - if (!errorLog.getErrors().isEmpty()) { - throw new PMLCompilationException(errorLog); - } - - return stmts; - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLContext.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLContext.java deleted file mode 100644 index 62c3a661c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLContext.java +++ /dev/null @@ -1,62 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; - -import java.util.HashMap; -import java.util.Map; - -public class PMLContext { - - public static PMLContext fromPolicy(Policy policy) throws PMException { - Map functions = policy.userDefinedPML().getFunctions(); - Map constants = policy.userDefinedPML().getConstants(); - - return new PMLContext(functions, constants); - } - - private final Map functions; - - private final Map constants; - - public PMLContext() { - functions = new HashMap<>(); - constants = new HashMap<>(); - } - - public PMLContext(Map functions, Map constants) { - this.functions = functions; - this.constants = constants; - } - - public void addFunction(FunctionDefinitionStatement functionDefinitionStatement) { - this.functions.put(functionDefinitionStatement.getFunctionName(), functionDefinitionStatement); - } - - public void removeFunction(String functionName) { - this.functions.remove(functionName); - } - - public Map getFunctions() { - return functions; - } - - public void addConstant(String constantName, Value constantValue) { - this.constants.put(constantName, constantValue); - } - - public void removeConstant(String constName) { - this.constants.remove(constName); - } - - public Map getConstants() { - return constants; - } - - public PMLContext getContext() { - return this; - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutable.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutable.java deleted file mode 100644 index ae4ae027c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutable.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; - -public interface PMLExecutable { - - void executePML(UserContext userContext, String input, - FunctionDefinitionStatement... functionDefinitionStatements) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutor.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutor.java deleted file mode 100644 index 78ad08563..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLExecutor.java +++ /dev/null @@ -1,88 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.exception.PMLExecutionException; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; - -import java.util.*; - -public class PMLExecutor { - - public static void compileAndExecutePML(Policy policy, UserContext author, String input, - FunctionDefinitionStatement ... customFunctions) throws PMException { - // compile the PML into statements - List compiledStatements = PMLCompiler.compilePML(policy, input, customFunctions); - - // initialize the execution context - ExecutionContext ctx = new ExecutionContext(author); - ctx.scope().loadFromPMLContext(PMLContext.fromPolicy(policy)); - - ExecutionContext predefined; - try { - // add custom builtin functions to scope - for (FunctionDefinitionStatement func : customFunctions) { - ctx.scope().addFunction(func); - } - - // store the predefined ctx to avoid adding again at the end of execution - predefined = ctx.copy(); - } catch (PMLScopeException e) { - throw new PMLExecutionException(e.getMessage()); - } - - // execute each statement - for (PMLStatement stmt : compiledStatements) { - try { - stmt.execute(ctx, policy); - } catch (PMException e) { - System.err.println(e.getMessage() + ": " + stmt); - throw e; - } - } - - // save any top level functions and constants to be used later - saveTopLevelFunctionsAndConstants(policy, predefined, ctx); - } - - private static void saveTopLevelFunctionsAndConstants(Policy policy, ExecutionContext predefinedCtx, ExecutionContext ctx) throws PMException { - Map predefinedFunctions = predefinedCtx.scope().functions(); - Map predefinedConstants = predefinedCtx.scope().values(); - - Map topLevelFunctions = ctx.scope().functions(); - for (String funcName : topLevelFunctions.keySet()) { - if (predefinedFunctions.containsKey(funcName)) { - continue; - } - - FunctionDefinitionStatement funcDef = topLevelFunctions.get(funcName); - policy.userDefinedPML().createFunction(funcDef); - } - - Map topLevelConstants = ctx.scope().values(); - for (String name : topLevelConstants.keySet()) { - if (predefinedConstants.containsKey(name)) { - continue; - } - - Value value = topLevelConstants.get(name); - policy.userDefinedPML().createConstant(name, value); - } - } - - public static Value executeStatementBlock(ExecutionContext executionCtx, Policy policyAuthor, List statements) throws PMException { - for (PMLStatement statement : statements) { - Value value = statement.execute(executionCtx, policyAuthor); - if (value.isReturn() || value.isBreak() || value.isContinue()) { - return value; - } - } - - return new Value(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLFormatter.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLFormatter.java deleted file mode 100644 index 531103484..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLFormatter.java +++ /dev/null @@ -1,409 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLLexer; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.misc.Interval; - -import java.util.List; -import java.util.Scanner; - -public class PMLFormatter extends PMLBaseVisitor { - - private static final String SPACES = " "; - public static final String NEW_LINE = "\n"; - - private int indentLevel; - - private PMLFormatter() { - indentLevel = 0; - } - - private String indent() { - return SPACES.repeat(indentLevel); - } - - public static String format(String pml) { - PMLLexer lexer = new PMLLexer(CharStreams.fromString(pml)); - CommonTokenStream tokens = new CommonTokenStream(lexer); - PMLParser parser = new PMLParser(tokens); - - String formatted = new PMLFormatter().visitPml(parser.pml()); - - return removeEmptyLines(formatted); - } - - private static String removeEmptyLines(String formatted) { - StringBuilder ret = new StringBuilder(); - Scanner sc = new Scanner(formatted); - while (sc.hasNextLine()) { - String line = sc.nextLine(); - if (line.isEmpty()) { - continue; - } - - ret.append(line).append(NEW_LINE); - } - - return ret.toString(); - } - - public static String getText(ParserRuleContext ctx) { - int startIndex = ctx.start.getStartIndex(); - int stopIndex = ctx.stop.getStopIndex(); - Interval interval = new Interval(startIndex, stopIndex); - return ctx.start.getInputStream().getText(interval); - } - - public static String statementsToString(List stmts) { - StringBuilder s = new StringBuilder(); - - for (PMLStatement stmt : stmts) { - s.append(stmt); - } - - return s.toString(); - } - - @Override - public String visitPml(PMLParser.PmlContext ctx) { - StringBuilder s = new StringBuilder(); - for (PMLParser.StatementContext stmtCtx : ctx.statement()) { - s.append(visitStatement(stmtCtx)); - } - return s.toString(); - } - - @Override - public String visitStatement(PMLParser.StatementContext ctx) { - if (ctx.variableDeclarationStatement() != null) { - return visitVarStmt(ctx.variableDeclarationStatement()); - } else if (ctx.functionDefinitionStatement() != null) { - return visitFuncDefStmt(ctx.functionDefinitionStatement()); - } else if (ctx.foreachStatement() != null) { - return visitForeachStmt(ctx.foreachStatement()); - } else if (ctx.functionInvokeStatement() != null) { - return visitFuncCallStmt(ctx.functionInvokeStatement()); - } else if (ctx.ifStatement() != null) { - return visitIfStmt(ctx.ifStatement()); - } else if (ctx.createAttributeStatement() != null) { - return visitCreateAttributeStatement(ctx.createAttributeStatement()); - } else if (ctx.createPolicyStatement() != null) { - return visitCreatePolicyStatement(ctx.createPolicyStatement()); - } else if (ctx.createUserOrObjectStatement() != null) { - return visitCreateUserOrObjectStatement(ctx.createUserOrObjectStatement()); - } else if (ctx.createProhibitionStatement() != null) { - return visitCreateProhibitionStatement(ctx.createProhibitionStatement()); - } else if (ctx.createObligationStatement() != null) { - return visitCreateObligationStatement(ctx.createObligationStatement()); - } else if (ctx.setNodePropertiesStatement() != null) { - return visitSetNodePropertiesStatement(ctx.setNodePropertiesStatement()); - } else if (ctx.assignStatement() != null) { - return visitAssignStatement(ctx.assignStatement()); - } else if (ctx.deassignStatement() != null) { - return visitDeassignStatement(ctx.deassignStatement()); - } else if (ctx.deleteStatement() != null) { - return visitDeleteStatement(ctx.deleteStatement()); - } else if (ctx.associateStatement() != null) { - return visitAssociateStatement(ctx.associateStatement()); - } else if (ctx.dissociateStatement() != null) { - return visitDissociateStatement(ctx.dissociateStatement()); - } else if (ctx.functionReturnStatement() != null) { - return visitFuncReturnStmt(ctx.functionReturnStatement()); - } else if (ctx.breakStatement() != null) { - return visitBreakStmt(ctx.breakStatement()); - } else if (ctx.continueStatement() != null) { - return visitContinueStmt(ctx.continueStatement()); - } else if (ctx.setResourceAccessRightsStatement() != null) { - return visitSetResourceAccessRightsStatement(ctx.setResourceAccessRightsStatement()); - } else if (ctx.deleteRuleStatement() != null) { - return visitDeleteRuleStatement(ctx.deleteRuleStatement()); - } - - return getText(ctx); - } - - private String formatStmt(ParserRuleContext ctx) { - String text = getText(ctx); - return indent() + text + NEW_LINE; - } - - public String visitVarStmt(PMLParser.VariableDeclarationStatementContext ctx) { - return formatStmt(ctx); - } - - public String visitFuncDefStmt(PMLParser.FunctionDefinitionStatementContext ctx) { - String text = getText(ctx); - int stmtStartIndex = ctx.start.getStartIndex(); - PMLParser.FuncBodyContext funcBodyCtx = ctx.funcBody(); - int openCurlyIndex = funcBodyCtx.OPEN_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - int closeCurlyIndex = funcBodyCtx.CLOSE_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - String signature = indent() + (text.substring(0, openCurlyIndex + 1).trim()) + NEW_LINE; - - String body = visitStatements(funcBodyCtx.statement()); - - String close = "\n" + indent() + text.substring(closeCurlyIndex).trim() + NEW_LINE; - - return signature + body + close; - } - - private String visitStatements(List stmts) { - indentLevel++; - StringBuilder body = new StringBuilder(); - for (PMLParser.StatementContext stmtCtx : stmts) { - body.append(visitStatement(stmtCtx)); - } - indentLevel--; - - return body.toString(); - } - - public String visitFuncReturnStmt(PMLParser.FunctionReturnStatementContext ctx) { - return formatStmt(ctx); - } - - public String visitForeachStmt(PMLParser.ForeachStatementContext ctx) { - String text = getText(ctx); - int stmtStartIndex = ctx.start.getStartIndex(); - PMLParser.StatementBlockContext forStmtsCtx = ctx.statementBlock(); - int openCurlyIndex = forStmtsCtx.OPEN_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - int closeCurlyIndex = forStmtsCtx.CLOSE_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - String forloop = indent() + (text.substring(0, openCurlyIndex + 1).trim()) + NEW_LINE; - - String body = visitStatements(ctx.statementBlock().statement()); - - String close = "\n" + indent() + text.substring(closeCurlyIndex).trim() + NEW_LINE; - - return forloop + body + close; - } - - public String visitBreakStmt(PMLParser.BreakStatementContext ctx) { - return formatStmt(ctx); - } - - public String visitContinueStmt(PMLParser.ContinueStatementContext ctx) { - return formatStmt(ctx); - } - - public String visitFuncCallStmt(PMLParser.FunctionInvokeStatementContext ctx) { - return formatStmt(ctx); - } - - public String visitIfStmt(PMLParser.IfStatementContext ctx) { - String text = getText(ctx); - int startIndex = ctx.start.getStartIndex(); - int openCurlyIndex = (ctx.statementBlock().OPEN_CURLY().getSymbol().getStartIndex()) - startIndex; - String ifStr = indent() + text.substring(0, openCurlyIndex).trim() + " "; - - String ifStmtBlock = visitStatementBlock(ctx.statementBlock()); - - StringBuilder elseIfStmtBlock = new StringBuilder(); - for (PMLParser.ElseIfStatementContext elseIfStmtCtx : ctx.elseIfStatement()) { - elseIfStmtBlock.append(visitElseIfStatement(elseIfStmtCtx)); - } - - String elseStmtBlock = visitElseStatement(ctx.elseStatement()); - - return ifStr + ifStmtBlock + elseIfStmtBlock + elseStmtBlock; - } - - @Override - public String visitElseIfStatement(PMLParser.ElseIfStatementContext ctx) { - if (ctx == null) { - return ""; - } - - String text = getText(ctx); - int startIndex = ctx.start.getStartIndex(); - int openCurlyIndex = (ctx.statementBlock().OPEN_CURLY().getSymbol().getStartIndex()) - startIndex; - String ifStr = " " + text.substring(0, openCurlyIndex).trim() + " "; - - String stmtBlock = visitStatementBlock(ctx.statementBlock()); - - return ifStr + stmtBlock; - } - - @Override - public String visitElseStatement(PMLParser.ElseStatementContext ctx) { - if (ctx == null) { - return ""; - } - - String text = getText(ctx); - int startIndex = ctx.start.getStartIndex(); - int openCurlyIndex = (ctx.statementBlock().OPEN_CURLY().getSymbol().getStartIndex()) - startIndex; - String elseStr = " " + text.substring(0, openCurlyIndex).trim(); - - String stmtBlock = visitStatementBlock(ctx.statementBlock()); - - return elseStr + stmtBlock + NEW_LINE; - } - - @Override - public String visitStatementBlock(PMLParser.StatementBlockContext ctx) { - StringBuilder block = new StringBuilder(); - - indentLevel++; - for (PMLParser.StatementContext stmtCtx : ctx.statement()) { - block.append(visitStatement(stmtCtx)); - } - indentLevel--; - - return "{" + NEW_LINE + block + indent() + "}"; - } - - @Override - public String visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitAssignStatement(PMLParser.AssignStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { - String text = getText(ctx); - int stmtStartIndex = ctx.start.getStartIndex(); - int openCurlyIndex = ctx.OPEN_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - int closeCurlyIndex = ctx.CLOSE_CURLY().getSymbol().getStartIndex() - stmtStartIndex; - String create = indent() + (text.substring(0, openCurlyIndex + 1).trim()) + NEW_LINE; - - StringBuilder body = new StringBuilder(); - List createRuleStmts = ctx.createRuleStatement(); - indentLevel++; - for (PMLParser.CreateRuleStatementContext createRuleStmtCtx : createRuleStmts) { - body.append(visitCreateRuleStatement(createRuleStmtCtx)); - } - indentLevel--; - - String close = "\n" + indent() + text.substring(closeCurlyIndex).trim() + NEW_LINE; - - return create + body + close; - } - - @Override - public String visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { - String text = getText(ctx); - int stmtStartIndex = ctx.start.getStartIndex(); - int whenIndex = ctx.WHEN().getSymbol().getStartIndex() - stmtStartIndex; - String create = indent() + (text.substring(0, whenIndex).trim()) + NEW_LINE; - - int performsIndex = ctx.PERFORMS().getSymbol().getStartIndex() - stmtStartIndex; - String when = indent() + (text.substring(whenIndex, performsIndex).trim()) + NEW_LINE; - - int doIndex = ctx.response().DO().getSymbol().getStartIndex() - stmtStartIndex; - String performs = ""; - String on = ""; - int performsEndIndex = 0; - if (ctx.ON() != null) { - int onIndex = ctx.ON().getSymbol().getStartIndex() - stmtStartIndex; - performsEndIndex = onIndex; - on = indent() + (text.substring(onIndex, doIndex).trim()) + NEW_LINE; - } else { - performsEndIndex = doIndex; - } - - performs = indent() + (text.substring(performsIndex, performsEndIndex).trim()) + NEW_LINE; - - String response = visitResponse(ctx.response()); - - return create + when + performs + on + response; - } - - @Override - public String visitResponse(PMLParser.ResponseContext ctx) { - String text = getText(ctx); - - int start = ctx.start.getStartIndex(); - int closeParenIndex = (ctx.CLOSE_PAREN().getSymbol().getStopIndex() + 1) - start; - String doStr = indent() + text.substring(0, closeParenIndex).trim() + " "; - - String response = visitResponseBlock(ctx.responseBlock()); - - return doStr + response; - } - - @Override - public String visitResponseBlock(PMLParser.ResponseBlockContext ctx) { - indentLevel++; - String responseBlock = visitResponseStatements(ctx.responseStatement()); - indentLevel--; - - return "{" + NEW_LINE + responseBlock + indent() + "}" + NEW_LINE; - } - - public String visitResponseStatements(List ctx) { - StringBuilder stmts = new StringBuilder(); - for (PMLParser.ResponseStatementContext stmtCtx : ctx) { - stmts.append(visitResponseStatement(stmtCtx)).append(NEW_LINE); - } - return stmts.toString(); - } - - @Override - public String visitResponseStatement(PMLParser.ResponseStatementContext ctx) { - if (ctx.statement() != null) { - return visitStatement(ctx.statement()); - } else if (ctx.createRuleStatement() != null){ - return visitCreateRuleStatement(ctx.createRuleStatement()); - } else { - return visitDeleteRuleStatement(ctx.deleteRuleStatement()); - } - } - - @Override - public String visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { - return formatStmt(ctx); - } - - @Override - public String visitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx) { - return formatStmt(ctx); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializable.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializable.java deleted file mode 100644 index 6db23f4b1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializable.java +++ /dev/null @@ -1,12 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; - -public interface PMLSerializable { - - void fromPML(UserContext author, String input, FunctionDefinitionStatement... customFunctions) throws PMException; - String toPML(boolean format) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializer.java b/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializer.java deleted file mode 100644 index 334d300f1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/PMLSerializer.java +++ /dev/null @@ -1,273 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.memory.dag.BreadthFirstGraphWalker; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.model.expression.*; -import gov.nist.csd.pm.policy.pml.statement.*; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; - -import java.util.*; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.isAdminAccessRight; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.OA; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.UA; - -public class PMLSerializer implements PMLSerializable { - - private final Policy policy; - - public PMLSerializer(Policy policy) { - this.policy = policy; - } - - @Override - public void fromPML(UserContext author, String input, FunctionDefinitionStatement... customFunctions) throws PMException { - PMLExecutor.compileAndExecutePML(policy, author, input, customFunctions); - } - - @Override - public String toPML(boolean format) throws PMException { - String pml = toPML(policy); - if (format) { - pml = PMLFormatter.format(pml); - } - - return pml; - } - - private String toPML(Policy policy) throws PMException { - String pml = ""; - String constants = serializeConstants(policy); - if (!constants.isEmpty()) { - pml += constants + "\n"; - } - - String functions = serializeFunctions(policy); - if (!functions.isEmpty()) { - pml += functions + "\n"; - } - - String graph = serializeGraph(policy); - if (!graph.isEmpty()) { - pml += graph + "\n"; - } - - String prohibitions = serializeProhibitions(policy); - if (!prohibitions.isEmpty()) { - pml += prohibitions + "\n"; - } - - String obligations = serializeObligations(policy); - if (!obligations.isEmpty()) { - pml += obligations; - } - - return pml.trim(); - } - - private String serializeObligations(Policy policy) throws PMException { - StringBuilder pml = new StringBuilder(); - - List obligations = policy.obligations().getAll(); - for (Obligation o : obligations) { - if (!pml.isEmpty()) { - pml.append("\n"); - } - pml.append(CreateObligationStatement.fromObligation(o)); - } - - return pml.toString(); - } - - private String serializeProhibitions(Policy policy) throws PMException { - StringBuilder pml = new StringBuilder(); - - Map> prohibitions = policy.prohibitions().getAll(); - for (List subjectPros : prohibitions.values()) { - for (Prohibition p : subjectPros) { - if (!pml.isEmpty()) { - pml.append("\n"); - } - - pml.append(CreateProhibitionStatement.fromProhibition(p)); - } - } - - return pml.toString(); - } - - private String serializeGraph(Policy policy) throws PMException { - StringBuilder pml = new StringBuilder(); - - // resource access rights - ArrayLiteral arrayLiteral = new ArrayLiteral(Type.string()); - for (String ar : policy.graph().getResourceAccessRights()) { - arrayLiteral.add(new Expression(new Literal(ar))); - } - pml.append(new SetResourceAccessRightsStatement(new Expression(new Literal(arrayLiteral)))).append("\n"); - - List policyClasses = policy.graph().getPolicyClasses(); - Set attributes = new HashSet<>(); - Set usersAndObjects = new HashSet<>(); - Map> delayedAssociations = new HashMap<>(); - - for (String policyClass : policyClasses) { - pml.append(new CreatePolicyStatement(new Expression(new Literal(policyClass)))).append("\n"); - - Node pcNode = policy.graph().getNode(policyClass); - if (!pcNode.getProperties().isEmpty()) { - PMLStatement stmt = buildSetNodePropertiesStatement(pcNode.getName(), pcNode.getProperties()); - pml.append(stmt).append("\n"); - } - - new BreadthFirstGraphWalker(policy.graph()) - .withPropagator((child, parent) -> { - Node childNode = policy.graph().getNode(child); - - if (childNode.getType() == OA || childNode.getType() == UA) { - if (!attributes.contains(child)) { - attributes.add(child); - PMLStatement stmt = buildCreateNodeStatement(child, childNode.getType(), parent); - pml.append(stmt).append("\n"); - if (!childNode.getProperties().isEmpty()) { - stmt = buildSetNodePropertiesStatement(child, childNode.getProperties()); - pml.append(stmt).append("\n"); - } - } else { - pml.append(new AssignStatement( - new Expression(new Literal(child)), - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new Literal(parent))}, Type.string()))) - )).append("\n"); - } - - if (delayedAssociations.containsKey(child)) { - List associateStatements = delayedAssociations.get(child); - for (AssociateStatement stmt : associateStatements) { - pml.append(stmt).append("\n"); - } - - delayedAssociations.remove(child); - } - - if (childNode.getType() == UA) { - List sourceAssociations = policy.graph().getAssociationsWithSource(child); - for (Association association : sourceAssociations) { - - ArrayLiteral arLiteral = new ArrayLiteral(Type.string()); - for (String ar : association.getAccessRightSet()) { - if (isAdminAccessRight(ar)) { - arLiteral.add(new Expression(new VariableReference(ar, Type.string()))); - } else { - arLiteral.add(new Expression(new Literal(ar))); - } - } - - String target = association.getTarget(); - AssociateStatement stmt = new AssociateStatement( - new Expression(new Literal(child)), - new Expression(new Literal(association.getTarget())), - new Expression(new Literal(arLiteral)) - ); - - if (!attributes.contains(target)) { - List associateStmts = delayedAssociations.getOrDefault(target, new ArrayList<>()); - associateStmts.add(stmt); - delayedAssociations.put(target, associateStmts); - } else { - pml.append(stmt).append("\n"); - } - } - } - } else { - if (!usersAndObjects.contains(child)) { - usersAndObjects.add(child); - PMLStatement stmt = buildCreateNodeStatement(child, childNode.getType(), parent); - pml.append(stmt).append("\n"); - } else { - pml.append(new AssignStatement( - new Expression(new Literal(child)), - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new Literal(parent))}, Type.string()))) - )).append("\n"); - } - } - }) - .withDirection(Direction.CHILDREN) - .walk(policyClass); - } - - return pml.toString().trim(); - } - - private PMLStatement buildSetNodePropertiesStatement(String name, Map properties) { - Map propertiesExpressions = new HashMap<>(); - for (Map.Entry property : properties.entrySet()) { - propertiesExpressions.put( - new Expression(new Literal(property.getKey())), - new Expression(new Literal(property.getValue())) - ); - } - - return new SetNodePropertiesStatement( - new Expression(new Literal(name)), - new Expression(new Literal(new MapLiteral(propertiesExpressions, Type.string(), Type.string()))) - ); - } - - private PMLStatement buildCreateNodeStatement(String name, NodeType type, String parent) { - if (type == UA || type == OA) { - return new CreateAttrStatement( - new Expression(new Literal(name)), - type, - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new Literal(parent))}, Type.string()))) - ); - } else { - return new CreateUserOrObjectStatement( - new Expression(new Literal(name)), - type, - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new Literal(parent))}, Type.string()))) - ); - } - } - - private String serializeFunctions(Policy policy) throws PMException { - StringBuilder pml = new StringBuilder(); - Map functions = policy.userDefinedPML().getFunctions(); - for (FunctionDefinitionStatement func : functions.values()) { - if (func.isFunctionExecutor()) { - continue; - } - - if (!pml.isEmpty()) { - pml.append("\n"); - } - - pml.append(func); - } - - return pml.toString(); - } - - private String serializeConstants(Policy policy) throws PMException { - StringBuilder pml = new StringBuilder(); - Map constants = policy.userDefinedPML().getConstants(); - for (Map.Entry c : constants.entrySet()) { - if (!pml.isEmpty()) { - pml.append("\n"); - } - - pml.append(serializeConstant(c.getKey(), c.getValue())); - } - return pml.toString(); - } - - private String serializeConstant(String name, Value value) { - return String.format("const %s = %s", name, value.toString()); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.g4 b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.g4 deleted file mode 100644 index 325f7c7f9..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.g4 +++ /dev/null @@ -1,281 +0,0 @@ -grammar PML; - -pml: (statement)* EOF ; -statement: ( - createPolicyStatement - | createAttributeStatement - | createUserOrObjectStatement - | createObligationStatement - | createProhibitionStatement - | setNodePropertiesStatement - | assignStatement - | deassignStatement - | associateStatement - | dissociateStatement - | setResourceAccessRightsStatement - | deleteStatement - | deleteRuleStatement - | variableDeclarationStatement - | functionDefinitionStatement - | functionReturnStatement - | foreachStatement - | forRangeStatement - | breakStatement - | continueStatement - | functionInvokeStatement - | ifStatement -) ; - -createPolicyStatement: - CREATE POLICY_CLASS expression ; - -createAttributeStatement: - CREATE (OBJECT_ATTRIBUTE | USER_ATTRIBUTE) name=expression IN parents=expression ; - -createUserOrObjectStatement: - CREATE (USER | OBJECT) name=expression IN parents=expression ; - -createObligationStatement: - CREATE OBLIGATION expression OPEN_CURLY createRuleStatement* CLOSE_CURLY; -createRuleStatement: - CREATE RULE ruleName=expression - WHEN subjectClause - PERFORMS performsClause=expression - (ON onClause)? - response ; -subjectClause: - ANY_USER #AnyUserSubject - | USER user=expression #UserSubject - | USERS users=expression #UsersListSubject - | ANY_USER_WITH_ATTRIBUTE attribute=expression #UserAttrSubject - | PROCESS process=expression #ProcessSubject ; -onClause: - expression #PolicyElement - | anyPe #AnyPolicyElement - | anyPe IN expression #AnyContainedIn - | anyPe OF expression #AnyOfSet ; -anyPe: ANY POLICY_ELEMENT; -response: - DO OPEN_PAREN ID CLOSE_PAREN responseBlock; -responseBlock: - OPEN_CURLY responseStatement* CLOSE_CURLY ; -responseStatement: - statement - | createRuleStatement - | deleteRuleStatement ; - -createProhibitionStatement: - CREATE PROHIBITION name=expression DENY (USER | USER_ATTRIBUTE | PROCESS) subject=expression - ACCESS_RIGHTS accessRights=expression - ON (INTERSECTION|UNION) OF containers=prohibitionContainerList ; -prohibitionContainerList: - OPEN_BRACKET (prohibitionContainerExpression (COMMA prohibitionContainerExpression)*)? CLOSE_BRACKET ; -prohibitionContainerExpression: - IS_COMPLEMENT? container=expression ; - -setNodePropertiesStatement: - SET_PROPERTIES OF name=expression TO properties=expression ; - -assignStatement: - ASSIGN childNode=expression TO parentNodes=expression ; - -deassignStatement: - DEASSIGN childNode=expression FROM parentNodes=expression ; - -associateStatement: - ASSOCIATE ua=expression AND target=expression WITH accessRights=expression ; - -dissociateStatement: - DISSOCIATE ua=expression AND target=expression ; - -setResourceAccessRightsStatement: - SET_RESOURCE_ACCESS_RIGHTS accessRights=expression; - -deleteStatement: - DELETE deleteType expression ; -deleteType: - nodeType #DeleteNode - | OBLIGATION #DeleteObligation - | PROHIBITION #DeleteProhibition ; -nodeType: - (POLICY_CLASS | OBJECT_ATTRIBUTE | USER_ATTRIBUTE | OBJECT | USER) ; - -deleteRuleStatement: - DELETE RULE ruleName=expression FROM OBLIGATION obligationName=expression ; - -variableDeclarationStatement: - (LET | CONST)? ID EQUALS expression ; - -functionDefinitionStatement: - FUNCTION ID OPEN_PAREN formalArgList CLOSE_PAREN funcReturnType? funcBody ; -formalArgList: - (formalArg (COMMA formalArg)*)? ; -formalArg: - formalArgType ID ; -formalArgType: - variableType ; -functionReturnStatement: - (RETURN expression | RETURN) ; -funcReturnType: - variableType #VariableReturnType - | VOID_TYPE #VoidReturnType; -funcBody: - OPEN_CURLY statement* CLOSE_CURLY; - -foreachStatement: - FOREACH key=ID (COMMA mapValue=ID)? IN expression statementBlock ; - -forRangeStatement: - FOR ID IN_RANGE - lowerBound=(OPEN_BRACKET|OPEN_PAREN) lower=expression COMMA upper=expression upperBound=(CLOSE_BRACKET|CLOSE_PAREN) - statementBlock ; - -breakStatement: - BREAK ; - -continueStatement: - CONTINUE ; - -functionInvokeStatement: - functionInvoke; - -ifStatement: - IF (IS_COMPLEMENT)? condition=expression statementBlock - elseIfStatement* - elseStatement? ; -elseIfStatement: - ELSE IF (IS_COMPLEMENT)? condition=expression statementBlock ; -elseStatement: - ELSE statementBlock ; - -variableType: - STRING_TYPE #StringType - | BOOLEAN_TYPE #BooleanType - | arrayType #ArrayVarType - | mapType #MapVarType - | ANY #AnyType ; -mapType: MAP_TYPE OPEN_BRACKET keyType=variableType CLOSE_BRACKET valueType=variableType ; -arrayType: OPEN_BRACKET CLOSE_BRACKET variableType ; - -statementBlock: OPEN_CURLY statement* CLOSE_CURLY ; - -expression: - variableReference - | functionInvoke - | literal - | left=expression (EQUALS_OP | NOT_EQUALS_OP) right=expression - | left=expression (AND_OP | OR_OP) right=expression; - -array: - OPEN_BRACKET (expression (COMMA expression)*)? CLOSE_BRACKET ; - -map: - OPEN_CURLY (mapEntry (COMMA mapEntry)*)? CLOSE_CURLY ; -mapEntry: - key=expression COLON value=expression ; -entryReference: - ID (OPEN_BRACKET key=expression CLOSE_BRACKET)+ ; - -literal: - STRING #StringLiteral - | BOOLEAN #BooleanLiteral - | NUMBER #NumberLiteral - | array #ArrayLiteral - | map #MapLiteral ; - -variableReference: - ID #ReferenceByID - | entryReference #ReferenceByEntry ; - -functionInvoke: - ID functionInvokeArgs ; -functionInvokeArgs: - OPEN_PAREN (expression (COMMA expression)*)? CLOSE_PAREN ; - -// LEXER RULEs -CREATE: [c][r][e][a][t][e] ; -DELETE: [d][e][l][e][t][e] ; -BREAK: [b][r][e][a][k] ; -CONTINUE: [c][o][n][t][i][n][u][e] ; - -// obligation keywords -POLICY_ELEMENT: [p][o][l][i][c][y][ ][e][l][e][m][e][n][t] ; -RULE: [r][u][l][e] ; -WHEN: [w][h][e][n] ; -PERFORMS: [p][e][r][f][o][r][m][s] ; -AS: [a][s] ; -ON: [o][n] ; -DO: [d][o] ; -ANY_USER: ANY [ ] USER ; -USERS: USER [s] ; -ANY_USER_WITH_ATTRIBUTE: ANY_USER [ ][w][i][t][h][ ] ATTR ; -PROCESS: [p][r][o][c][e][s][s] ; -INTERSECTION: [i][n][t][e][r][s][e][c][t][i][o][n] ; -UNION: [u][n][i][o][n] ; - -SET_RESOURCE_ACCESS_RIGHTS: [s][e][t][ ][r][e][s][o][u][r][c][e][ ] ACCESS_RIGHTS; -ASSIGN: [a][s][s][i][g][n] ; -DEASSIGN: [d][e][a][s][s][i][g][n] ; -FROM: [f][r][o][m] ; -SET_PROPERTIES: [s][e][t][ ][p][r][o][p][e][r][t][i][e][s] ; -OF: [o][f] ; -TO: [t][o] ; -ASSOCIATE: [a][s][s][o][c][i][a][t][e] ; -AND: [a][n][d] ; -WITH: [w][i][t][h] ; -DISSOCIATE: [d][i][s][s][o][c][i][a][t][e] ; -DENY: [d][e][n][y]; -PROHIBITION: [p][r][o][h][i][b][i][t][i][o][n]; -OBLIGATION: [o][b][l][i][g][a][t][i][o][n]; -ACCESS_RIGHTS: [a][c][c][e][s][s][ ][r][i][g][h][t][s] ; - -POLICY_CLASS: ([p][o][l][i][c][y][ ][c][l][a][s][s] | [p][c]) ; -OBJECT_ATTRIBUTE: (OBJECT [ ] ATTR | [o][a]) ; -USER_ATTRIBUTE: (USER [ ] ATTR | [u][a]); -OBJECT: ([o][b][j][e][c][t] | [o]); -USER: ([u][s][e][r] | [u]) ; -ATTR: [a][t][t][r][i][b][u][t][e] ; - -ANY: [a][n][y] ; -LET: [l][e][t] ; -CONST: [c][o][n][s][t] ; -FUNCTION: [f][u][n][c][t][i][o][n] ; -RETURN: [r][e][t][u][r][n] ; -BOOLEAN: (TRUE|FALSE) ; -TRUE: [t][r][u][e] ; -FALSE: [f][a][l][s][e] ; -STRING_TYPE: [s][t][r][i][n][g] ; -BOOLEAN_TYPE: [b][o][o][l][e][a][n] ; -VOID_TYPE: [v][o][i][d] ; -ARRAY_TYPE: [a][r][r][a][y] ; -MAP_TYPE: [m][a][p] ; -FOREACH: [f][o][r][e][a][c][h] ; -FOR: [f][o][r] ; -IN: [i][n] ; -IF: [i][f] ; -ELSE: [e][l][s][e] ; -IN_RANGE: [i][n][ ][r][a][n][g][e] ; - -NUMBER: [0-9]+ ; -ID: [a-zA-Z0-9_]+ ; -STRING: DOUBLE_QUOTE_STRING | SINGLE_QUOTE_STRING ; -DOUBLE_QUOTE_STRING : '"' ( '\\"' | ~('\n'|'\r') )*? '"' ; -SINGLE_QUOTE_STRING : '\'' ( '\\\'' | ~('\n'|'\r') )*? '\'' ; -LINE_COMMENT : '#' ~'\n'* '\n' -> channel(HIDDEN) ; -WS : [ \t\n\r]+ -> skip ; -COMMA: ',' ; -COLON: ':' ; -OPEN_CURLY: '{' ; -CLOSE_CURLY: '}' ; -OPEN_BRACKET: '[' ; -CLOSE_BRACKET: ']' ; -OPEN_ANGLE_BRACKET: '<' ; -CLOSE_ANGLE_BRACKET: '>' ; -OPEN_PAREN: '(' ; -CLOSE_PAREN: ')' ; -IS_COMPLEMENT: '!' ; -EQUALS: '=' ; -AND_OP: '&&' ; -OR_OP: '||' ; -EQUALS_OP: '==' ; -NOT_EQUALS_OP: '!=' ; \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.interp b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.interp deleted file mode 100644 index 2bfc62450..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.interp +++ /dev/null @@ -1,226 +0,0 @@ -token literal names: -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -',' -':' -'{' -'}' -'[' -']' -'<' -'>' -'(' -')' -'!' -'=' -'&&' -'||' -'==' -'!=' - -token symbolic names: -null -CREATE -DELETE -BREAK -CONTINUE -POLICY_ELEMENT -RULE -WHEN -PERFORMS -AS -ON -DO -ANY_USER -USERS -ANY_USER_WITH_ATTRIBUTE -PROCESS -INTERSECTION -UNION -SET_RESOURCE_ACCESS_RIGHTS -ASSIGN -DEASSIGN -FROM -SET_PROPERTIES -OF -TO -ASSOCIATE -AND -WITH -DISSOCIATE -DENY -PROHIBITION -OBLIGATION -ACCESS_RIGHTS -POLICY_CLASS -OBJECT_ATTRIBUTE -USER_ATTRIBUTE -OBJECT -USER -ATTR -ANY -LET -CONST -FUNCTION -RETURN -BOOLEAN -TRUE -FALSE -STRING_TYPE -BOOLEAN_TYPE -VOID_TYPE -ARRAY_TYPE -MAP_TYPE -FOREACH -FOR -IN -IF -ELSE -IN_RANGE -NUMBER -ID -STRING -DOUBLE_QUOTE_STRING -SINGLE_QUOTE_STRING -LINE_COMMENT -WS -COMMA -COLON -OPEN_CURLY -CLOSE_CURLY -OPEN_BRACKET -CLOSE_BRACKET -OPEN_ANGLE_BRACKET -CLOSE_ANGLE_BRACKET -OPEN_PAREN -CLOSE_PAREN -IS_COMPLEMENT -EQUALS -AND_OP -OR_OP -EQUALS_OP -NOT_EQUALS_OP - -rule names: -pml -statement -createPolicyStatement -createAttributeStatement -createUserOrObjectStatement -createObligationStatement -createRuleStatement -subjectClause -onClause -anyPe -response -responseBlock -responseStatement -createProhibitionStatement -prohibitionContainerList -prohibitionContainerExpression -setNodePropertiesStatement -assignStatement -deassignStatement -associateStatement -dissociateStatement -setResourceAccessRightsStatement -deleteStatement -deleteType -nodeType -deleteRuleStatement -variableDeclarationStatement -functionDefinitionStatement -formalArgList -formalArg -formalArgType -functionReturnStatement -funcReturnType -funcBody -foreachStatement -forRangeStatement -breakStatement -continueStatement -functionInvokeStatement -ifStatement -elseIfStatement -elseStatement -variableType -mapType -arrayType -statementBlock -expression -array -map -mapEntry -entryReference -literal -variableReference -functionInvoke -functionInvokeArgs - - -atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 82, 523, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 3, 2, 7, 2, 114, 10, 2, 12, 2, 14, 2, 117, 11, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 143, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 7, 7, 166, 10, 7, 12, 7, 14, 7, 169, 11, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 5, 8, 182, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 195, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 207, 10, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 7, 13, 220, 10, 13, 12, 13, 14, 13, 223, 11, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 5, 14, 230, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 249, 10, 16, 12, 16, 14, 16, 252, 11, 16, 5, 16, 254, 10, 16, 3, 16, 3, 16, 3, 17, 5, 17, 259, 10, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 5, 25, 301, 10, 25, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 5, 28, 313, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 325, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 7, 30, 332, 10, 30, 12, 30, 14, 30, 335, 11, 30, 5, 30, 337, 10, 30, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 5, 33, 347, 10, 33, 3, 34, 3, 34, 5, 34, 351, 10, 34, 3, 35, 3, 35, 7, 35, 355, 10, 35, 12, 35, 14, 35, 358, 11, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 366, 10, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 5, 41, 390, 10, 41, 3, 41, 3, 41, 3, 41, 7, 41, 395, 10, 41, 12, 41, 14, 41, 398, 11, 41, 3, 41, 5, 41, 401, 10, 41, 3, 42, 3, 42, 3, 42, 5, 42, 406, 10, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 5, 44, 419, 10, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 7, 47, 433, 10, 47, 12, 47, 14, 47, 436, 11, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 444, 10, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 7, 48, 452, 10, 48, 12, 48, 14, 48, 455, 11, 48, 3, 49, 3, 49, 3, 49, 3, 49, 7, 49, 461, 10, 49, 12, 49, 14, 49, 464, 11, 49, 5, 49, 466, 10, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 7, 50, 474, 10, 50, 12, 50, 14, 50, 477, 11, 50, 5, 50, 479, 10, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 6, 52, 492, 10, 52, 13, 52, 14, 52, 493, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 501, 10, 53, 3, 54, 3, 54, 5, 54, 505, 10, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 7, 56, 514, 10, 56, 12, 56, 14, 56, 517, 11, 56, 5, 56, 519, 10, 56, 3, 56, 3, 56, 3, 56, 2, 3, 94, 57, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 2, 12, 3, 2, 36, 37, 3, 2, 38, 39, 5, 2, 17, 17, 37, 37, 39, 39, 3, 2, 18, 19, 3, 2, 35, 39, 3, 2, 42, 43, 4, 2, 71, 71, 75, 75, 4, 2, 72, 72, 76, 76, 3, 2, 81, 82, 3, 2, 79, 80, 2, 539, 2, 115, 3, 2, 2, 2, 4, 142, 3, 2, 2, 2, 6, 144, 3, 2, 2, 2, 8, 148, 3, 2, 2, 2, 10, 154, 3, 2, 2, 2, 12, 160, 3, 2, 2, 2, 14, 172, 3, 2, 2, 2, 16, 194, 3, 2, 2, 2, 18, 206, 3, 2, 2, 2, 20, 208, 3, 2, 2, 2, 22, 211, 3, 2, 2, 2, 24, 217, 3, 2, 2, 2, 26, 229, 3, 2, 2, 2, 28, 231, 3, 2, 2, 2, 30, 244, 3, 2, 2, 2, 32, 258, 3, 2, 2, 2, 34, 262, 3, 2, 2, 2, 36, 268, 3, 2, 2, 2, 38, 273, 3, 2, 2, 2, 40, 278, 3, 2, 2, 2, 42, 285, 3, 2, 2, 2, 44, 290, 3, 2, 2, 2, 46, 293, 3, 2, 2, 2, 48, 300, 3, 2, 2, 2, 50, 302, 3, 2, 2, 2, 52, 304, 3, 2, 2, 2, 54, 312, 3, 2, 2, 2, 56, 318, 3, 2, 2, 2, 58, 336, 3, 2, 2, 2, 60, 338, 3, 2, 2, 2, 62, 341, 3, 2, 2, 2, 64, 346, 3, 2, 2, 2, 66, 350, 3, 2, 2, 2, 68, 352, 3, 2, 2, 2, 70, 361, 3, 2, 2, 2, 72, 371, 3, 2, 2, 2, 74, 381, 3, 2, 2, 2, 76, 383, 3, 2, 2, 2, 78, 385, 3, 2, 2, 2, 80, 387, 3, 2, 2, 2, 82, 402, 3, 2, 2, 2, 84, 410, 3, 2, 2, 2, 86, 418, 3, 2, 2, 2, 88, 420, 3, 2, 2, 2, 90, 426, 3, 2, 2, 2, 92, 430, 3, 2, 2, 2, 94, 443, 3, 2, 2, 2, 96, 456, 3, 2, 2, 2, 98, 469, 3, 2, 2, 2, 100, 482, 3, 2, 2, 2, 102, 486, 3, 2, 2, 2, 104, 500, 3, 2, 2, 2, 106, 504, 3, 2, 2, 2, 108, 506, 3, 2, 2, 2, 110, 509, 3, 2, 2, 2, 112, 114, 5, 4, 3, 2, 113, 112, 3, 2, 2, 2, 114, 117, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 118, 119, 7, 2, 2, 3, 119, 3, 3, 2, 2, 2, 120, 143, 5, 6, 4, 2, 121, 143, 5, 8, 5, 2, 122, 143, 5, 10, 6, 2, 123, 143, 5, 12, 7, 2, 124, 143, 5, 28, 15, 2, 125, 143, 5, 34, 18, 2, 126, 143, 5, 36, 19, 2, 127, 143, 5, 38, 20, 2, 128, 143, 5, 40, 21, 2, 129, 143, 5, 42, 22, 2, 130, 143, 5, 44, 23, 2, 131, 143, 5, 46, 24, 2, 132, 143, 5, 52, 27, 2, 133, 143, 5, 54, 28, 2, 134, 143, 5, 56, 29, 2, 135, 143, 5, 64, 33, 2, 136, 143, 5, 70, 36, 2, 137, 143, 5, 72, 37, 2, 138, 143, 5, 74, 38, 2, 139, 143, 5, 76, 39, 2, 140, 143, 5, 78, 40, 2, 141, 143, 5, 80, 41, 2, 142, 120, 3, 2, 2, 2, 142, 121, 3, 2, 2, 2, 142, 122, 3, 2, 2, 2, 142, 123, 3, 2, 2, 2, 142, 124, 3, 2, 2, 2, 142, 125, 3, 2, 2, 2, 142, 126, 3, 2, 2, 2, 142, 127, 3, 2, 2, 2, 142, 128, 3, 2, 2, 2, 142, 129, 3, 2, 2, 2, 142, 130, 3, 2, 2, 2, 142, 131, 3, 2, 2, 2, 142, 132, 3, 2, 2, 2, 142, 133, 3, 2, 2, 2, 142, 134, 3, 2, 2, 2, 142, 135, 3, 2, 2, 2, 142, 136, 3, 2, 2, 2, 142, 137, 3, 2, 2, 2, 142, 138, 3, 2, 2, 2, 142, 139, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 141, 3, 2, 2, 2, 143, 5, 3, 2, 2, 2, 144, 145, 7, 3, 2, 2, 145, 146, 7, 35, 2, 2, 146, 147, 5, 94, 48, 2, 147, 7, 3, 2, 2, 2, 148, 149, 7, 3, 2, 2, 149, 150, 9, 2, 2, 2, 150, 151, 5, 94, 48, 2, 151, 152, 7, 56, 2, 2, 152, 153, 5, 94, 48, 2, 153, 9, 3, 2, 2, 2, 154, 155, 7, 3, 2, 2, 155, 156, 9, 3, 2, 2, 156, 157, 5, 94, 48, 2, 157, 158, 7, 56, 2, 2, 158, 159, 5, 94, 48, 2, 159, 11, 3, 2, 2, 2, 160, 161, 7, 3, 2, 2, 161, 162, 7, 33, 2, 2, 162, 163, 5, 94, 48, 2, 163, 167, 7, 69, 2, 2, 164, 166, 5, 14, 8, 2, 165, 164, 3, 2, 2, 2, 166, 169, 3, 2, 2, 2, 167, 165, 3, 2, 2, 2, 167, 168, 3, 2, 2, 2, 168, 170, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 170, 171, 7, 70, 2, 2, 171, 13, 3, 2, 2, 2, 172, 173, 7, 3, 2, 2, 173, 174, 7, 8, 2, 2, 174, 175, 5, 94, 48, 2, 175, 176, 7, 9, 2, 2, 176, 177, 5, 16, 9, 2, 177, 178, 7, 10, 2, 2, 178, 181, 5, 94, 48, 2, 179, 180, 7, 12, 2, 2, 180, 182, 5, 18, 10, 2, 181, 179, 3, 2, 2, 2, 181, 182, 3, 2, 2, 2, 182, 183, 3, 2, 2, 2, 183, 184, 5, 22, 12, 2, 184, 15, 3, 2, 2, 2, 185, 195, 7, 14, 2, 2, 186, 187, 7, 39, 2, 2, 187, 195, 5, 94, 48, 2, 188, 189, 7, 15, 2, 2, 189, 195, 5, 94, 48, 2, 190, 191, 7, 16, 2, 2, 191, 195, 5, 94, 48, 2, 192, 193, 7, 17, 2, 2, 193, 195, 5, 94, 48, 2, 194, 185, 3, 2, 2, 2, 194, 186, 3, 2, 2, 2, 194, 188, 3, 2, 2, 2, 194, 190, 3, 2, 2, 2, 194, 192, 3, 2, 2, 2, 195, 17, 3, 2, 2, 2, 196, 207, 5, 94, 48, 2, 197, 207, 5, 20, 11, 2, 198, 199, 5, 20, 11, 2, 199, 200, 7, 56, 2, 2, 200, 201, 5, 94, 48, 2, 201, 207, 3, 2, 2, 2, 202, 203, 5, 20, 11, 2, 203, 204, 7, 25, 2, 2, 204, 205, 5, 94, 48, 2, 205, 207, 3, 2, 2, 2, 206, 196, 3, 2, 2, 2, 206, 197, 3, 2, 2, 2, 206, 198, 3, 2, 2, 2, 206, 202, 3, 2, 2, 2, 207, 19, 3, 2, 2, 2, 208, 209, 7, 41, 2, 2, 209, 210, 7, 7, 2, 2, 210, 21, 3, 2, 2, 2, 211, 212, 7, 13, 2, 2, 212, 213, 7, 75, 2, 2, 213, 214, 7, 61, 2, 2, 214, 215, 7, 76, 2, 2, 215, 216, 5, 24, 13, 2, 216, 23, 3, 2, 2, 2, 217, 221, 7, 69, 2, 2, 218, 220, 5, 26, 14, 2, 219, 218, 3, 2, 2, 2, 220, 223, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 221, 222, 3, 2, 2, 2, 222, 224, 3, 2, 2, 2, 223, 221, 3, 2, 2, 2, 224, 225, 7, 70, 2, 2, 225, 25, 3, 2, 2, 2, 226, 230, 5, 4, 3, 2, 227, 230, 5, 14, 8, 2, 228, 230, 5, 52, 27, 2, 229, 226, 3, 2, 2, 2, 229, 227, 3, 2, 2, 2, 229, 228, 3, 2, 2, 2, 230, 27, 3, 2, 2, 2, 231, 232, 7, 3, 2, 2, 232, 233, 7, 32, 2, 2, 233, 234, 5, 94, 48, 2, 234, 235, 7, 31, 2, 2, 235, 236, 9, 4, 2, 2, 236, 237, 5, 94, 48, 2, 237, 238, 7, 34, 2, 2, 238, 239, 5, 94, 48, 2, 239, 240, 7, 12, 2, 2, 240, 241, 9, 5, 2, 2, 241, 242, 7, 25, 2, 2, 242, 243, 5, 30, 16, 2, 243, 29, 3, 2, 2, 2, 244, 253, 7, 71, 2, 2, 245, 250, 5, 32, 17, 2, 246, 247, 7, 67, 2, 2, 247, 249, 5, 32, 17, 2, 248, 246, 3, 2, 2, 2, 249, 252, 3, 2, 2, 2, 250, 248, 3, 2, 2, 2, 250, 251, 3, 2, 2, 2, 251, 254, 3, 2, 2, 2, 252, 250, 3, 2, 2, 2, 253, 245, 3, 2, 2, 2, 253, 254, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 7, 72, 2, 2, 256, 31, 3, 2, 2, 2, 257, 259, 7, 77, 2, 2, 258, 257, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 5, 94, 48, 2, 261, 33, 3, 2, 2, 2, 262, 263, 7, 24, 2, 2, 263, 264, 7, 25, 2, 2, 264, 265, 5, 94, 48, 2, 265, 266, 7, 26, 2, 2, 266, 267, 5, 94, 48, 2, 267, 35, 3, 2, 2, 2, 268, 269, 7, 21, 2, 2, 269, 270, 5, 94, 48, 2, 270, 271, 7, 26, 2, 2, 271, 272, 5, 94, 48, 2, 272, 37, 3, 2, 2, 2, 273, 274, 7, 22, 2, 2, 274, 275, 5, 94, 48, 2, 275, 276, 7, 23, 2, 2, 276, 277, 5, 94, 48, 2, 277, 39, 3, 2, 2, 2, 278, 279, 7, 27, 2, 2, 279, 280, 5, 94, 48, 2, 280, 281, 7, 28, 2, 2, 281, 282, 5, 94, 48, 2, 282, 283, 7, 29, 2, 2, 283, 284, 5, 94, 48, 2, 284, 41, 3, 2, 2, 2, 285, 286, 7, 30, 2, 2, 286, 287, 5, 94, 48, 2, 287, 288, 7, 28, 2, 2, 288, 289, 5, 94, 48, 2, 289, 43, 3, 2, 2, 2, 290, 291, 7, 20, 2, 2, 291, 292, 5, 94, 48, 2, 292, 45, 3, 2, 2, 2, 293, 294, 7, 4, 2, 2, 294, 295, 5, 48, 25, 2, 295, 296, 5, 94, 48, 2, 296, 47, 3, 2, 2, 2, 297, 301, 5, 50, 26, 2, 298, 301, 7, 33, 2, 2, 299, 301, 7, 32, 2, 2, 300, 297, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 300, 299, 3, 2, 2, 2, 301, 49, 3, 2, 2, 2, 302, 303, 9, 6, 2, 2, 303, 51, 3, 2, 2, 2, 304, 305, 7, 4, 2, 2, 305, 306, 7, 8, 2, 2, 306, 307, 5, 94, 48, 2, 307, 308, 7, 23, 2, 2, 308, 309, 7, 33, 2, 2, 309, 310, 5, 94, 48, 2, 310, 53, 3, 2, 2, 2, 311, 313, 9, 7, 2, 2, 312, 311, 3, 2, 2, 2, 312, 313, 3, 2, 2, 2, 313, 314, 3, 2, 2, 2, 314, 315, 7, 61, 2, 2, 315, 316, 7, 78, 2, 2, 316, 317, 5, 94, 48, 2, 317, 55, 3, 2, 2, 2, 318, 319, 7, 44, 2, 2, 319, 320, 7, 61, 2, 2, 320, 321, 7, 75, 2, 2, 321, 322, 5, 58, 30, 2, 322, 324, 7, 76, 2, 2, 323, 325, 5, 66, 34, 2, 324, 323, 3, 2, 2, 2, 324, 325, 3, 2, 2, 2, 325, 326, 3, 2, 2, 2, 326, 327, 5, 68, 35, 2, 327, 57, 3, 2, 2, 2, 328, 333, 5, 60, 31, 2, 329, 330, 7, 67, 2, 2, 330, 332, 5, 60, 31, 2, 331, 329, 3, 2, 2, 2, 332, 335, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 337, 3, 2, 2, 2, 335, 333, 3, 2, 2, 2, 336, 328, 3, 2, 2, 2, 336, 337, 3, 2, 2, 2, 337, 59, 3, 2, 2, 2, 338, 339, 5, 62, 32, 2, 339, 340, 7, 61, 2, 2, 340, 61, 3, 2, 2, 2, 341, 342, 5, 86, 44, 2, 342, 63, 3, 2, 2, 2, 343, 344, 7, 45, 2, 2, 344, 347, 5, 94, 48, 2, 345, 347, 7, 45, 2, 2, 346, 343, 3, 2, 2, 2, 346, 345, 3, 2, 2, 2, 347, 65, 3, 2, 2, 2, 348, 351, 5, 86, 44, 2, 349, 351, 7, 51, 2, 2, 350, 348, 3, 2, 2, 2, 350, 349, 3, 2, 2, 2, 351, 67, 3, 2, 2, 2, 352, 356, 7, 69, 2, 2, 353, 355, 5, 4, 3, 2, 354, 353, 3, 2, 2, 2, 355, 358, 3, 2, 2, 2, 356, 354, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 359, 3, 2, 2, 2, 358, 356, 3, 2, 2, 2, 359, 360, 7, 70, 2, 2, 360, 69, 3, 2, 2, 2, 361, 362, 7, 54, 2, 2, 362, 365, 7, 61, 2, 2, 363, 364, 7, 67, 2, 2, 364, 366, 7, 61, 2, 2, 365, 363, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 7, 56, 2, 2, 368, 369, 5, 94, 48, 2, 369, 370, 5, 92, 47, 2, 370, 71, 3, 2, 2, 2, 371, 372, 7, 55, 2, 2, 372, 373, 7, 61, 2, 2, 373, 374, 7, 59, 2, 2, 374, 375, 9, 8, 2, 2, 375, 376, 5, 94, 48, 2, 376, 377, 7, 67, 2, 2, 377, 378, 5, 94, 48, 2, 378, 379, 9, 9, 2, 2, 379, 380, 5, 92, 47, 2, 380, 73, 3, 2, 2, 2, 381, 382, 7, 5, 2, 2, 382, 75, 3, 2, 2, 2, 383, 384, 7, 6, 2, 2, 384, 77, 3, 2, 2, 2, 385, 386, 5, 108, 55, 2, 386, 79, 3, 2, 2, 2, 387, 389, 7, 57, 2, 2, 388, 390, 7, 77, 2, 2, 389, 388, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 3, 2, 2, 2, 391, 392, 5, 94, 48, 2, 392, 396, 5, 92, 47, 2, 393, 395, 5, 82, 42, 2, 394, 393, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 400, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 401, 5, 84, 43, 2, 400, 399, 3, 2, 2, 2, 400, 401, 3, 2, 2, 2, 401, 81, 3, 2, 2, 2, 402, 403, 7, 58, 2, 2, 403, 405, 7, 57, 2, 2, 404, 406, 7, 77, 2, 2, 405, 404, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 408, 5, 94, 48, 2, 408, 409, 5, 92, 47, 2, 409, 83, 3, 2, 2, 2, 410, 411, 7, 58, 2, 2, 411, 412, 5, 92, 47, 2, 412, 85, 3, 2, 2, 2, 413, 419, 7, 49, 2, 2, 414, 419, 7, 50, 2, 2, 415, 419, 5, 90, 46, 2, 416, 419, 5, 88, 45, 2, 417, 419, 7, 41, 2, 2, 418, 413, 3, 2, 2, 2, 418, 414, 3, 2, 2, 2, 418, 415, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 417, 3, 2, 2, 2, 419, 87, 3, 2, 2, 2, 420, 421, 7, 53, 2, 2, 421, 422, 7, 71, 2, 2, 422, 423, 5, 86, 44, 2, 423, 424, 7, 72, 2, 2, 424, 425, 5, 86, 44, 2, 425, 89, 3, 2, 2, 2, 426, 427, 7, 71, 2, 2, 427, 428, 7, 72, 2, 2, 428, 429, 5, 86, 44, 2, 429, 91, 3, 2, 2, 2, 430, 434, 7, 69, 2, 2, 431, 433, 5, 4, 3, 2, 432, 431, 3, 2, 2, 2, 433, 436, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 437, 3, 2, 2, 2, 436, 434, 3, 2, 2, 2, 437, 438, 7, 70, 2, 2, 438, 93, 3, 2, 2, 2, 439, 440, 8, 48, 1, 2, 440, 444, 5, 106, 54, 2, 441, 444, 5, 108, 55, 2, 442, 444, 5, 104, 53, 2, 443, 439, 3, 2, 2, 2, 443, 441, 3, 2, 2, 2, 443, 442, 3, 2, 2, 2, 444, 453, 3, 2, 2, 2, 445, 446, 12, 4, 2, 2, 446, 447, 9, 10, 2, 2, 447, 452, 5, 94, 48, 5, 448, 449, 12, 3, 2, 2, 449, 450, 9, 11, 2, 2, 450, 452, 5, 94, 48, 4, 451, 445, 3, 2, 2, 2, 451, 448, 3, 2, 2, 2, 452, 455, 3, 2, 2, 2, 453, 451, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 95, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 456, 465, 7, 71, 2, 2, 457, 462, 5, 94, 48, 2, 458, 459, 7, 67, 2, 2, 459, 461, 5, 94, 48, 2, 460, 458, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 466, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 457, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 72, 2, 2, 468, 97, 3, 2, 2, 2, 469, 478, 7, 69, 2, 2, 470, 475, 5, 100, 51, 2, 471, 472, 7, 67, 2, 2, 472, 474, 5, 100, 51, 2, 473, 471, 3, 2, 2, 2, 474, 477, 3, 2, 2, 2, 475, 473, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 479, 3, 2, 2, 2, 477, 475, 3, 2, 2, 2, 478, 470, 3, 2, 2, 2, 478, 479, 3, 2, 2, 2, 479, 480, 3, 2, 2, 2, 480, 481, 7, 70, 2, 2, 481, 99, 3, 2, 2, 2, 482, 483, 5, 94, 48, 2, 483, 484, 7, 68, 2, 2, 484, 485, 5, 94, 48, 2, 485, 101, 3, 2, 2, 2, 486, 491, 7, 61, 2, 2, 487, 488, 7, 71, 2, 2, 488, 489, 5, 94, 48, 2, 489, 490, 7, 72, 2, 2, 490, 492, 3, 2, 2, 2, 491, 487, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 491, 3, 2, 2, 2, 493, 494, 3, 2, 2, 2, 494, 103, 3, 2, 2, 2, 495, 501, 7, 62, 2, 2, 496, 501, 7, 46, 2, 2, 497, 501, 7, 60, 2, 2, 498, 501, 5, 96, 49, 2, 499, 501, 5, 98, 50, 2, 500, 495, 3, 2, 2, 2, 500, 496, 3, 2, 2, 2, 500, 497, 3, 2, 2, 2, 500, 498, 3, 2, 2, 2, 500, 499, 3, 2, 2, 2, 501, 105, 3, 2, 2, 2, 502, 505, 7, 61, 2, 2, 503, 505, 5, 102, 52, 2, 504, 502, 3, 2, 2, 2, 504, 503, 3, 2, 2, 2, 505, 107, 3, 2, 2, 2, 506, 507, 7, 61, 2, 2, 507, 508, 5, 110, 56, 2, 508, 109, 3, 2, 2, 2, 509, 518, 7, 75, 2, 2, 510, 515, 5, 94, 48, 2, 511, 512, 7, 67, 2, 2, 512, 514, 5, 94, 48, 2, 513, 511, 3, 2, 2, 2, 514, 517, 3, 2, 2, 2, 515, 513, 3, 2, 2, 2, 515, 516, 3, 2, 2, 2, 516, 519, 3, 2, 2, 2, 517, 515, 3, 2, 2, 2, 518, 510, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 520, 3, 2, 2, 2, 520, 521, 7, 76, 2, 2, 521, 111, 3, 2, 2, 2, 40, 115, 142, 167, 181, 194, 206, 221, 229, 250, 253, 258, 300, 312, 324, 333, 336, 346, 350, 356, 365, 389, 396, 400, 405, 418, 434, 443, 451, 453, 462, 465, 475, 478, 493, 500, 504, 515, 518] \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.tokens b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.tokens deleted file mode 100644 index 5d93e50e8..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PML.tokens +++ /dev/null @@ -1,96 +0,0 @@ -CREATE=1 -DELETE=2 -BREAK=3 -CONTINUE=4 -POLICY_ELEMENT=5 -RULE=6 -WHEN=7 -PERFORMS=8 -AS=9 -ON=10 -DO=11 -ANY_USER=12 -USERS=13 -ANY_USER_WITH_ATTRIBUTE=14 -PROCESS=15 -INTERSECTION=16 -UNION=17 -SET_RESOURCE_ACCESS_RIGHTS=18 -ASSIGN=19 -DEASSIGN=20 -FROM=21 -SET_PROPERTIES=22 -OF=23 -TO=24 -ASSOCIATE=25 -AND=26 -WITH=27 -DISSOCIATE=28 -DENY=29 -PROHIBITION=30 -OBLIGATION=31 -ACCESS_RIGHTS=32 -POLICY_CLASS=33 -OBJECT_ATTRIBUTE=34 -USER_ATTRIBUTE=35 -OBJECT=36 -USER=37 -ATTR=38 -ANY=39 -LET=40 -CONST=41 -FUNCTION=42 -RETURN=43 -BOOLEAN=44 -TRUE=45 -FALSE=46 -STRING_TYPE=47 -BOOLEAN_TYPE=48 -VOID_TYPE=49 -ARRAY_TYPE=50 -MAP_TYPE=51 -FOREACH=52 -FOR=53 -IN=54 -IF=55 -ELSE=56 -IN_RANGE=57 -NUMBER=58 -ID=59 -STRING=60 -DOUBLE_QUOTE_STRING=61 -SINGLE_QUOTE_STRING=62 -LINE_COMMENT=63 -WS=64 -COMMA=65 -COLON=66 -OPEN_CURLY=67 -CLOSE_CURLY=68 -OPEN_BRACKET=69 -CLOSE_BRACKET=70 -OPEN_ANGLE_BRACKET=71 -CLOSE_ANGLE_BRACKET=72 -OPEN_PAREN=73 -CLOSE_PAREN=74 -IS_COMPLEMENT=75 -EQUALS=76 -AND_OP=77 -OR_OP=78 -EQUALS_OP=79 -NOT_EQUALS_OP=80 -','=65 -':'=66 -'{'=67 -'}'=68 -'['=69 -']'=70 -'<'=71 -'>'=72 -'('=73 -')'=74 -'!'=75 -'='=76 -'&&'=77 -'||'=78 -'=='=79 -'!='=80 diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseListener.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseListener.java deleted file mode 100644 index d1134beb0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseListener.java +++ /dev/null @@ -1,927 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; - -import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.TerminalNode; - -/** - * This class provides an empty implementation of {@link PMLListener}, - * which can be extended to create a listener which only needs to handle a subset - * of the available methods. - */ -public class PMLBaseListener implements PMLListener { - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterPml(PMLParser.PmlContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitPml(PMLParser.PmlContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterStatement(PMLParser.StatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitStatement(PMLParser.StatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyUserSubject(PMLParser.AnyUserSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyUserSubject(PMLParser.AnyUserSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterUserSubject(PMLParser.UserSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitUserSubject(PMLParser.UserSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterUsersListSubject(PMLParser.UsersListSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitUsersListSubject(PMLParser.UsersListSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterUserAttrSubject(PMLParser.UserAttrSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitUserAttrSubject(PMLParser.UserAttrSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterProcessSubject(PMLParser.ProcessSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitProcessSubject(PMLParser.ProcessSubjectContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterPolicyElement(PMLParser.PolicyElementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitPolicyElement(PMLParser.PolicyElementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyContainedIn(PMLParser.AnyContainedInContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyContainedIn(PMLParser.AnyContainedInContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyOfSet(PMLParser.AnyOfSetContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyOfSet(PMLParser.AnyOfSetContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyPe(PMLParser.AnyPeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyPe(PMLParser.AnyPeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterResponse(PMLParser.ResponseContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitResponse(PMLParser.ResponseContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterResponseBlock(PMLParser.ResponseBlockContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitResponseBlock(PMLParser.ResponseBlockContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterResponseStatement(PMLParser.ResponseStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitResponseStatement(PMLParser.ResponseStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAssignStatement(PMLParser.AssignStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAssignStatement(PMLParser.AssignStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeassignStatement(PMLParser.DeassignStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeassignStatement(PMLParser.DeassignStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAssociateStatement(PMLParser.AssociateStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAssociateStatement(PMLParser.AssociateStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDissociateStatement(PMLParser.DissociateStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDissociateStatement(PMLParser.DissociateStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeleteStatement(PMLParser.DeleteStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeleteStatement(PMLParser.DeleteStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeleteNode(PMLParser.DeleteNodeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeleteNode(PMLParser.DeleteNodeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeleteObligation(PMLParser.DeleteObligationContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeleteObligation(PMLParser.DeleteObligationContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterNodeType(PMLParser.NodeTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitNodeType(PMLParser.NodeTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFormalArgList(PMLParser.FormalArgListContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFormalArgList(PMLParser.FormalArgListContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFormalArg(PMLParser.FormalArgContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFormalArg(PMLParser.FormalArgContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFormalArgType(PMLParser.FormalArgTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFormalArgType(PMLParser.FormalArgTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterVariableReturnType(PMLParser.VariableReturnTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitVariableReturnType(PMLParser.VariableReturnTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterVoidReturnType(PMLParser.VoidReturnTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitVoidReturnType(PMLParser.VoidReturnTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFuncBody(PMLParser.FuncBodyContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFuncBody(PMLParser.FuncBodyContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterForeachStatement(PMLParser.ForeachStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitForeachStatement(PMLParser.ForeachStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterForRangeStatement(PMLParser.ForRangeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitForRangeStatement(PMLParser.ForRangeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterBreakStatement(PMLParser.BreakStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitBreakStatement(PMLParser.BreakStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterContinueStatement(PMLParser.ContinueStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitContinueStatement(PMLParser.ContinueStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterIfStatement(PMLParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitIfStatement(PMLParser.IfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterElseIfStatement(PMLParser.ElseIfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitElseIfStatement(PMLParser.ElseIfStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterElseStatement(PMLParser.ElseStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitElseStatement(PMLParser.ElseStatementContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterStringType(PMLParser.StringTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitStringType(PMLParser.StringTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterBooleanType(PMLParser.BooleanTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitBooleanType(PMLParser.BooleanTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterArrayVarType(PMLParser.ArrayVarTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitArrayVarType(PMLParser.ArrayVarTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterMapVarType(PMLParser.MapVarTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitMapVarType(PMLParser.MapVarTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterAnyType(PMLParser.AnyTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitAnyType(PMLParser.AnyTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterMapType(PMLParser.MapTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitMapType(PMLParser.MapTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterArrayType(PMLParser.ArrayTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitArrayType(PMLParser.ArrayTypeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterStatementBlock(PMLParser.StatementBlockContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitStatementBlock(PMLParser.StatementBlockContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterExpression(PMLParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitExpression(PMLParser.ExpressionContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterArray(PMLParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitArray(PMLParser.ArrayContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterMap(PMLParser.MapContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitMap(PMLParser.MapContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterMapEntry(PMLParser.MapEntryContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitMapEntry(PMLParser.MapEntryContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterEntryReference(PMLParser.EntryReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitEntryReference(PMLParser.EntryReferenceContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterStringLiteral(PMLParser.StringLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitStringLiteral(PMLParser.StringLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterBooleanLiteral(PMLParser.BooleanLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitBooleanLiteral(PMLParser.BooleanLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterNumberLiteral(PMLParser.NumberLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitNumberLiteral(PMLParser.NumberLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterArrayLiteral(PMLParser.ArrayLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterMapLiteral(PMLParser.MapLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitMapLiteral(PMLParser.MapLiteralContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterReferenceByID(PMLParser.ReferenceByIDContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitReferenceByID(PMLParser.ReferenceByIDContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterReferenceByEntry(PMLParser.ReferenceByEntryContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitReferenceByEntry(PMLParser.ReferenceByEntryContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { } - - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitEveryRule(ParserRuleContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void visitTerminal(TerminalNode node) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void visitErrorNode(ErrorNode node) { } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseVisitor.java deleted file mode 100644 index 4d53b3f4d..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLBaseVisitor.java +++ /dev/null @@ -1,532 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; -import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; - -/** - * This class provides an empty implementation of {@link PMLVisitor}, - * which can be extended to create a visitor which only needs to handle a subset - * of the available methods. - * - * @param The return type of the visit operation. Use {@link Void} for - * operations with no return type. - */ -public class PMLBaseVisitor extends AbstractParseTreeVisitor implements PMLVisitor { - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitPml(PMLParser.PmlContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitStatement(PMLParser.StatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyUserSubject(PMLParser.AnyUserSubjectContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitUserSubject(PMLParser.UserSubjectContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitUsersListSubject(PMLParser.UsersListSubjectContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitUserAttrSubject(PMLParser.UserAttrSubjectContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitProcessSubject(PMLParser.ProcessSubjectContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitPolicyElement(PMLParser.PolicyElementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyContainedIn(PMLParser.AnyContainedInContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyOfSet(PMLParser.AnyOfSetContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyPe(PMLParser.AnyPeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitResponse(PMLParser.ResponseContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitResponseBlock(PMLParser.ResponseBlockContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitResponseStatement(PMLParser.ResponseStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAssignStatement(PMLParser.AssignStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeleteNode(PMLParser.DeleteNodeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeleteObligation(PMLParser.DeleteObligationContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitNodeType(PMLParser.NodeTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFormalArgList(PMLParser.FormalArgListContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFormalArg(PMLParser.FormalArgContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFormalArgType(PMLParser.FormalArgTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitVariableReturnType(PMLParser.VariableReturnTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitVoidReturnType(PMLParser.VoidReturnTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFuncBody(PMLParser.FuncBodyContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitForeachStatement(PMLParser.ForeachStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitForRangeStatement(PMLParser.ForRangeStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitBreakStatement(PMLParser.BreakStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitContinueStatement(PMLParser.ContinueStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitIfStatement(PMLParser.IfStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitElseIfStatement(PMLParser.ElseIfStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitElseStatement(PMLParser.ElseStatementContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitStringType(PMLParser.StringTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitBooleanType(PMLParser.BooleanTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitArrayVarType(PMLParser.ArrayVarTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMapVarType(PMLParser.MapVarTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitAnyType(PMLParser.AnyTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMapType(PMLParser.MapTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitArrayType(PMLParser.ArrayTypeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitStatementBlock(PMLParser.StatementBlockContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitExpression(PMLParser.ExpressionContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitArray(PMLParser.ArrayContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMap(PMLParser.MapContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMapEntry(PMLParser.MapEntryContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitEntryReference(PMLParser.EntryReferenceContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitStringLiteral(PMLParser.StringLiteralContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitBooleanLiteral(PMLParser.BooleanLiteralContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitNumberLiteral(PMLParser.NumberLiteralContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitMapLiteral(PMLParser.MapLiteralContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitReferenceByID(PMLParser.ReferenceByIDContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitReferenceByEntry(PMLParser.ReferenceByEntryContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

The default implementation returns the result of calling - * {@link #visitChildren} on {@code ctx}.

- */ - @Override public T visitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx) { return visitChildren(ctx); } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.interp b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.interp deleted file mode 100644 index 6118c2801..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.interp +++ /dev/null @@ -1,257 +0,0 @@ -token literal names: -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -null -',' -':' -'{' -'}' -'[' -']' -'<' -'>' -'(' -')' -'!' -'=' -'&&' -'||' -'==' -'!=' - -token symbolic names: -null -CREATE -DELETE -BREAK -CONTINUE -POLICY_ELEMENT -RULE -WHEN -PERFORMS -AS -ON -DO -ANY_USER -USERS -ANY_USER_WITH_ATTRIBUTE -PROCESS -INTERSECTION -UNION -SET_RESOURCE_ACCESS_RIGHTS -ASSIGN -DEASSIGN -FROM -SET_PROPERTIES -OF -TO -ASSOCIATE -AND -WITH -DISSOCIATE -DENY -PROHIBITION -OBLIGATION -ACCESS_RIGHTS -POLICY_CLASS -OBJECT_ATTRIBUTE -USER_ATTRIBUTE -OBJECT -USER -ATTR -ANY -LET -CONST -FUNCTION -RETURN -BOOLEAN -TRUE -FALSE -STRING_TYPE -BOOLEAN_TYPE -VOID_TYPE -ARRAY_TYPE -MAP_TYPE -FOREACH -FOR -IN -IF -ELSE -IN_RANGE -NUMBER -ID -STRING -DOUBLE_QUOTE_STRING -SINGLE_QUOTE_STRING -LINE_COMMENT -WS -COMMA -COLON -OPEN_CURLY -CLOSE_CURLY -OPEN_BRACKET -CLOSE_BRACKET -OPEN_ANGLE_BRACKET -CLOSE_ANGLE_BRACKET -OPEN_PAREN -CLOSE_PAREN -IS_COMPLEMENT -EQUALS -AND_OP -OR_OP -EQUALS_OP -NOT_EQUALS_OP - -rule names: -CREATE -DELETE -BREAK -CONTINUE -POLICY_ELEMENT -RULE -WHEN -PERFORMS -AS -ON -DO -ANY_USER -USERS -ANY_USER_WITH_ATTRIBUTE -PROCESS -INTERSECTION -UNION -SET_RESOURCE_ACCESS_RIGHTS -ASSIGN -DEASSIGN -FROM -SET_PROPERTIES -OF -TO -ASSOCIATE -AND -WITH -DISSOCIATE -DENY -PROHIBITION -OBLIGATION -ACCESS_RIGHTS -POLICY_CLASS -OBJECT_ATTRIBUTE -USER_ATTRIBUTE -OBJECT -USER -ATTR -ANY -LET -CONST -FUNCTION -RETURN -BOOLEAN -TRUE -FALSE -STRING_TYPE -BOOLEAN_TYPE -VOID_TYPE -ARRAY_TYPE -MAP_TYPE -FOREACH -FOR -IN -IF -ELSE -IN_RANGE -NUMBER -ID -STRING -DOUBLE_QUOTE_STRING -SINGLE_QUOTE_STRING -LINE_COMMENT -WS -COMMA -COLON -OPEN_CURLY -CLOSE_CURLY -OPEN_BRACKET -CLOSE_BRACKET -OPEN_ANGLE_BRACKET -CLOSE_ANGLE_BRACKET -OPEN_PAREN -CLOSE_PAREN -IS_COMPLEMENT -EQUALS -AND_OP -OR_OP -EQUALS_OP -NOT_EQUALS_OP - -channel names: -DEFAULT_TOKEN_CHANNEL -HIDDEN - -mode names: -DEFAULT_MODE - -atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 82, 662, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 5, 34, 422, 10, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 430, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 438, 10, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 447, 10, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 454, 10, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 5, 45, 498, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 6, 59, 574, 10, 59, 13, 59, 14, 59, 575, 3, 60, 6, 60, 579, 10, 60, 13, 60, 14, 60, 580, 3, 61, 3, 61, 5, 61, 585, 10, 61, 3, 62, 3, 62, 3, 62, 3, 62, 7, 62, 591, 10, 62, 12, 62, 14, 62, 594, 11, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 7, 63, 602, 10, 63, 12, 63, 14, 63, 605, 11, 63, 3, 63, 3, 63, 3, 64, 3, 64, 7, 64, 611, 10, 64, 12, 64, 14, 64, 614, 11, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 6, 65, 621, 10, 65, 13, 65, 14, 65, 622, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 69, 3, 69, 3, 70, 3, 70, 3, 71, 3, 71, 3, 72, 3, 72, 3, 73, 3, 73, 3, 74, 3, 74, 3, 75, 3, 75, 3, 76, 3, 76, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 4, 592, 603, 2, 82, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 3, 2, 31, 3, 2, 101, 101, 3, 2, 116, 116, 3, 2, 103, 103, 3, 2, 99, 99, 3, 2, 118, 118, 3, 2, 102, 102, 3, 2, 110, 110, 3, 2, 100, 100, 3, 2, 109, 109, 3, 2, 113, 113, 3, 2, 112, 112, 3, 2, 107, 107, 3, 2, 119, 119, 3, 2, 114, 114, 3, 2, 123, 123, 3, 2, 34, 34, 3, 2, 111, 111, 3, 2, 121, 121, 3, 2, 106, 106, 3, 2, 104, 104, 3, 2, 117, 117, 3, 2, 105, 105, 3, 2, 108, 108, 3, 2, 120, 120, 3, 2, 50, 59, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 4, 2, 12, 12, 15, 15, 3, 2, 12, 12, 5, 2, 11, 12, 15, 15, 34, 34, 2, 676, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 3, 163, 3, 2, 2, 2, 5, 170, 3, 2, 2, 2, 7, 177, 3, 2, 2, 2, 9, 183, 3, 2, 2, 2, 11, 192, 3, 2, 2, 2, 13, 207, 3, 2, 2, 2, 15, 212, 3, 2, 2, 2, 17, 217, 3, 2, 2, 2, 19, 226, 3, 2, 2, 2, 21, 229, 3, 2, 2, 2, 23, 232, 3, 2, 2, 2, 25, 235, 3, 2, 2, 2, 27, 239, 3, 2, 2, 2, 29, 242, 3, 2, 2, 2, 31, 251, 3, 2, 2, 2, 33, 259, 3, 2, 2, 2, 35, 272, 3, 2, 2, 2, 37, 278, 3, 2, 2, 2, 39, 293, 3, 2, 2, 2, 41, 300, 3, 2, 2, 2, 43, 309, 3, 2, 2, 2, 45, 314, 3, 2, 2, 2, 47, 329, 3, 2, 2, 2, 49, 332, 3, 2, 2, 2, 51, 335, 3, 2, 2, 2, 53, 345, 3, 2, 2, 2, 55, 349, 3, 2, 2, 2, 57, 354, 3, 2, 2, 2, 59, 365, 3, 2, 2, 2, 61, 370, 3, 2, 2, 2, 63, 382, 3, 2, 2, 2, 65, 393, 3, 2, 2, 2, 67, 421, 3, 2, 2, 2, 69, 429, 3, 2, 2, 2, 71, 437, 3, 2, 2, 2, 73, 446, 3, 2, 2, 2, 75, 453, 3, 2, 2, 2, 77, 455, 3, 2, 2, 2, 79, 465, 3, 2, 2, 2, 81, 469, 3, 2, 2, 2, 83, 473, 3, 2, 2, 2, 85, 479, 3, 2, 2, 2, 87, 488, 3, 2, 2, 2, 89, 497, 3, 2, 2, 2, 91, 499, 3, 2, 2, 2, 93, 504, 3, 2, 2, 2, 95, 510, 3, 2, 2, 2, 97, 517, 3, 2, 2, 2, 99, 525, 3, 2, 2, 2, 101, 530, 3, 2, 2, 2, 103, 536, 3, 2, 2, 2, 105, 540, 3, 2, 2, 2, 107, 548, 3, 2, 2, 2, 109, 552, 3, 2, 2, 2, 111, 555, 3, 2, 2, 2, 113, 558, 3, 2, 2, 2, 115, 563, 3, 2, 2, 2, 117, 573, 3, 2, 2, 2, 119, 578, 3, 2, 2, 2, 121, 584, 3, 2, 2, 2, 123, 586, 3, 2, 2, 2, 125, 597, 3, 2, 2, 2, 127, 608, 3, 2, 2, 2, 129, 620, 3, 2, 2, 2, 131, 626, 3, 2, 2, 2, 133, 628, 3, 2, 2, 2, 135, 630, 3, 2, 2, 2, 137, 632, 3, 2, 2, 2, 139, 634, 3, 2, 2, 2, 141, 636, 3, 2, 2, 2, 143, 638, 3, 2, 2, 2, 145, 640, 3, 2, 2, 2, 147, 642, 3, 2, 2, 2, 149, 644, 3, 2, 2, 2, 151, 646, 3, 2, 2, 2, 153, 648, 3, 2, 2, 2, 155, 650, 3, 2, 2, 2, 157, 653, 3, 2, 2, 2, 159, 656, 3, 2, 2, 2, 161, 659, 3, 2, 2, 2, 163, 164, 9, 2, 2, 2, 164, 165, 9, 3, 2, 2, 165, 166, 9, 4, 2, 2, 166, 167, 9, 5, 2, 2, 167, 168, 9, 6, 2, 2, 168, 169, 9, 4, 2, 2, 169, 4, 3, 2, 2, 2, 170, 171, 9, 7, 2, 2, 171, 172, 9, 4, 2, 2, 172, 173, 9, 8, 2, 2, 173, 174, 9, 4, 2, 2, 174, 175, 9, 6, 2, 2, 175, 176, 9, 4, 2, 2, 176, 6, 3, 2, 2, 2, 177, 178, 9, 9, 2, 2, 178, 179, 9, 3, 2, 2, 179, 180, 9, 4, 2, 2, 180, 181, 9, 5, 2, 2, 181, 182, 9, 10, 2, 2, 182, 8, 3, 2, 2, 2, 183, 184, 9, 2, 2, 2, 184, 185, 9, 11, 2, 2, 185, 186, 9, 12, 2, 2, 186, 187, 9, 6, 2, 2, 187, 188, 9, 13, 2, 2, 188, 189, 9, 12, 2, 2, 189, 190, 9, 14, 2, 2, 190, 191, 9, 4, 2, 2, 191, 10, 3, 2, 2, 2, 192, 193, 9, 15, 2, 2, 193, 194, 9, 11, 2, 2, 194, 195, 9, 8, 2, 2, 195, 196, 9, 13, 2, 2, 196, 197, 9, 2, 2, 2, 197, 198, 9, 16, 2, 2, 198, 199, 9, 17, 2, 2, 199, 200, 9, 4, 2, 2, 200, 201, 9, 8, 2, 2, 201, 202, 9, 4, 2, 2, 202, 203, 9, 18, 2, 2, 203, 204, 9, 4, 2, 2, 204, 205, 9, 12, 2, 2, 205, 206, 9, 6, 2, 2, 206, 12, 3, 2, 2, 2, 207, 208, 9, 3, 2, 2, 208, 209, 9, 14, 2, 2, 209, 210, 9, 8, 2, 2, 210, 211, 9, 4, 2, 2, 211, 14, 3, 2, 2, 2, 212, 213, 9, 19, 2, 2, 213, 214, 9, 20, 2, 2, 214, 215, 9, 4, 2, 2, 215, 216, 9, 12, 2, 2, 216, 16, 3, 2, 2, 2, 217, 218, 9, 15, 2, 2, 218, 219, 9, 4, 2, 2, 219, 220, 9, 3, 2, 2, 220, 221, 9, 21, 2, 2, 221, 222, 9, 11, 2, 2, 222, 223, 9, 3, 2, 2, 223, 224, 9, 18, 2, 2, 224, 225, 9, 22, 2, 2, 225, 18, 3, 2, 2, 2, 226, 227, 9, 5, 2, 2, 227, 228, 9, 22, 2, 2, 228, 20, 3, 2, 2, 2, 229, 230, 9, 11, 2, 2, 230, 231, 9, 12, 2, 2, 231, 22, 3, 2, 2, 2, 232, 233, 9, 7, 2, 2, 233, 234, 9, 11, 2, 2, 234, 24, 3, 2, 2, 2, 235, 236, 5, 79, 40, 2, 236, 237, 9, 17, 2, 2, 237, 238, 5, 75, 38, 2, 238, 26, 3, 2, 2, 2, 239, 240, 5, 75, 38, 2, 240, 241, 9, 22, 2, 2, 241, 28, 3, 2, 2, 2, 242, 243, 5, 25, 13, 2, 243, 244, 9, 17, 2, 2, 244, 245, 9, 19, 2, 2, 245, 246, 9, 13, 2, 2, 246, 247, 9, 6, 2, 2, 247, 248, 9, 20, 2, 2, 248, 249, 9, 17, 2, 2, 249, 250, 5, 77, 39, 2, 250, 30, 3, 2, 2, 2, 251, 252, 9, 15, 2, 2, 252, 253, 9, 3, 2, 2, 253, 254, 9, 11, 2, 2, 254, 255, 9, 2, 2, 2, 255, 256, 9, 4, 2, 2, 256, 257, 9, 22, 2, 2, 257, 258, 9, 22, 2, 2, 258, 32, 3, 2, 2, 2, 259, 260, 9, 13, 2, 2, 260, 261, 9, 12, 2, 2, 261, 262, 9, 6, 2, 2, 262, 263, 9, 4, 2, 2, 263, 264, 9, 3, 2, 2, 264, 265, 9, 22, 2, 2, 265, 266, 9, 4, 2, 2, 266, 267, 9, 2, 2, 2, 267, 268, 9, 6, 2, 2, 268, 269, 9, 13, 2, 2, 269, 270, 9, 11, 2, 2, 270, 271, 9, 12, 2, 2, 271, 34, 3, 2, 2, 2, 272, 273, 9, 14, 2, 2, 273, 274, 9, 12, 2, 2, 274, 275, 9, 13, 2, 2, 275, 276, 9, 11, 2, 2, 276, 277, 9, 12, 2, 2, 277, 36, 3, 2, 2, 2, 278, 279, 9, 22, 2, 2, 279, 280, 9, 4, 2, 2, 280, 281, 9, 6, 2, 2, 281, 282, 9, 17, 2, 2, 282, 283, 9, 3, 2, 2, 283, 284, 9, 4, 2, 2, 284, 285, 9, 22, 2, 2, 285, 286, 9, 11, 2, 2, 286, 287, 9, 14, 2, 2, 287, 288, 9, 3, 2, 2, 288, 289, 9, 2, 2, 2, 289, 290, 9, 4, 2, 2, 290, 291, 9, 17, 2, 2, 291, 292, 5, 65, 33, 2, 292, 38, 3, 2, 2, 2, 293, 294, 9, 5, 2, 2, 294, 295, 9, 22, 2, 2, 295, 296, 9, 22, 2, 2, 296, 297, 9, 13, 2, 2, 297, 298, 9, 23, 2, 2, 298, 299, 9, 12, 2, 2, 299, 40, 3, 2, 2, 2, 300, 301, 9, 7, 2, 2, 301, 302, 9, 4, 2, 2, 302, 303, 9, 5, 2, 2, 303, 304, 9, 22, 2, 2, 304, 305, 9, 22, 2, 2, 305, 306, 9, 13, 2, 2, 306, 307, 9, 23, 2, 2, 307, 308, 9, 12, 2, 2, 308, 42, 3, 2, 2, 2, 309, 310, 9, 21, 2, 2, 310, 311, 9, 3, 2, 2, 311, 312, 9, 11, 2, 2, 312, 313, 9, 18, 2, 2, 313, 44, 3, 2, 2, 2, 314, 315, 9, 22, 2, 2, 315, 316, 9, 4, 2, 2, 316, 317, 9, 6, 2, 2, 317, 318, 9, 17, 2, 2, 318, 319, 9, 15, 2, 2, 319, 320, 9, 3, 2, 2, 320, 321, 9, 11, 2, 2, 321, 322, 9, 15, 2, 2, 322, 323, 9, 4, 2, 2, 323, 324, 9, 3, 2, 2, 324, 325, 9, 6, 2, 2, 325, 326, 9, 13, 2, 2, 326, 327, 9, 4, 2, 2, 327, 328, 9, 22, 2, 2, 328, 46, 3, 2, 2, 2, 329, 330, 9, 11, 2, 2, 330, 331, 9, 21, 2, 2, 331, 48, 3, 2, 2, 2, 332, 333, 9, 6, 2, 2, 333, 334, 9, 11, 2, 2, 334, 50, 3, 2, 2, 2, 335, 336, 9, 5, 2, 2, 336, 337, 9, 22, 2, 2, 337, 338, 9, 22, 2, 2, 338, 339, 9, 11, 2, 2, 339, 340, 9, 2, 2, 2, 340, 341, 9, 13, 2, 2, 341, 342, 9, 5, 2, 2, 342, 343, 9, 6, 2, 2, 343, 344, 9, 4, 2, 2, 344, 52, 3, 2, 2, 2, 345, 346, 9, 5, 2, 2, 346, 347, 9, 12, 2, 2, 347, 348, 9, 7, 2, 2, 348, 54, 3, 2, 2, 2, 349, 350, 9, 19, 2, 2, 350, 351, 9, 13, 2, 2, 351, 352, 9, 6, 2, 2, 352, 353, 9, 20, 2, 2, 353, 56, 3, 2, 2, 2, 354, 355, 9, 7, 2, 2, 355, 356, 9, 13, 2, 2, 356, 357, 9, 22, 2, 2, 357, 358, 9, 22, 2, 2, 358, 359, 9, 11, 2, 2, 359, 360, 9, 2, 2, 2, 360, 361, 9, 13, 2, 2, 361, 362, 9, 5, 2, 2, 362, 363, 9, 6, 2, 2, 363, 364, 9, 4, 2, 2, 364, 58, 3, 2, 2, 2, 365, 366, 9, 7, 2, 2, 366, 367, 9, 4, 2, 2, 367, 368, 9, 12, 2, 2, 368, 369, 9, 16, 2, 2, 369, 60, 3, 2, 2, 2, 370, 371, 9, 15, 2, 2, 371, 372, 9, 3, 2, 2, 372, 373, 9, 11, 2, 2, 373, 374, 9, 20, 2, 2, 374, 375, 9, 13, 2, 2, 375, 376, 9, 9, 2, 2, 376, 377, 9, 13, 2, 2, 377, 378, 9, 6, 2, 2, 378, 379, 9, 13, 2, 2, 379, 380, 9, 11, 2, 2, 380, 381, 9, 12, 2, 2, 381, 62, 3, 2, 2, 2, 382, 383, 9, 11, 2, 2, 383, 384, 9, 9, 2, 2, 384, 385, 9, 8, 2, 2, 385, 386, 9, 13, 2, 2, 386, 387, 9, 23, 2, 2, 387, 388, 9, 5, 2, 2, 388, 389, 9, 6, 2, 2, 389, 390, 9, 13, 2, 2, 390, 391, 9, 11, 2, 2, 391, 392, 9, 12, 2, 2, 392, 64, 3, 2, 2, 2, 393, 394, 9, 5, 2, 2, 394, 395, 9, 2, 2, 2, 395, 396, 9, 2, 2, 2, 396, 397, 9, 4, 2, 2, 397, 398, 9, 22, 2, 2, 398, 399, 9, 22, 2, 2, 399, 400, 9, 17, 2, 2, 400, 401, 9, 3, 2, 2, 401, 402, 9, 13, 2, 2, 402, 403, 9, 23, 2, 2, 403, 404, 9, 20, 2, 2, 404, 405, 9, 6, 2, 2, 405, 406, 9, 22, 2, 2, 406, 66, 3, 2, 2, 2, 407, 408, 9, 15, 2, 2, 408, 409, 9, 11, 2, 2, 409, 410, 9, 8, 2, 2, 410, 411, 9, 13, 2, 2, 411, 412, 9, 2, 2, 2, 412, 413, 9, 16, 2, 2, 413, 414, 9, 17, 2, 2, 414, 415, 9, 2, 2, 2, 415, 416, 9, 8, 2, 2, 416, 417, 9, 5, 2, 2, 417, 418, 9, 22, 2, 2, 418, 422, 9, 22, 2, 2, 419, 420, 9, 15, 2, 2, 420, 422, 9, 2, 2, 2, 421, 407, 3, 2, 2, 2, 421, 419, 3, 2, 2, 2, 422, 68, 3, 2, 2, 2, 423, 424, 5, 73, 37, 2, 424, 425, 9, 17, 2, 2, 425, 426, 5, 77, 39, 2, 426, 430, 3, 2, 2, 2, 427, 428, 9, 11, 2, 2, 428, 430, 9, 5, 2, 2, 429, 423, 3, 2, 2, 2, 429, 427, 3, 2, 2, 2, 430, 70, 3, 2, 2, 2, 431, 432, 5, 75, 38, 2, 432, 433, 9, 17, 2, 2, 433, 434, 5, 77, 39, 2, 434, 438, 3, 2, 2, 2, 435, 436, 9, 14, 2, 2, 436, 438, 9, 5, 2, 2, 437, 431, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 438, 72, 3, 2, 2, 2, 439, 440, 9, 11, 2, 2, 440, 441, 9, 9, 2, 2, 441, 442, 9, 24, 2, 2, 442, 443, 9, 4, 2, 2, 443, 444, 9, 2, 2, 2, 444, 447, 9, 6, 2, 2, 445, 447, 9, 11, 2, 2, 446, 439, 3, 2, 2, 2, 446, 445, 3, 2, 2, 2, 447, 74, 3, 2, 2, 2, 448, 449, 9, 14, 2, 2, 449, 450, 9, 22, 2, 2, 450, 451, 9, 4, 2, 2, 451, 454, 9, 3, 2, 2, 452, 454, 9, 14, 2, 2, 453, 448, 3, 2, 2, 2, 453, 452, 3, 2, 2, 2, 454, 76, 3, 2, 2, 2, 455, 456, 9, 5, 2, 2, 456, 457, 9, 6, 2, 2, 457, 458, 9, 6, 2, 2, 458, 459, 9, 3, 2, 2, 459, 460, 9, 13, 2, 2, 460, 461, 9, 9, 2, 2, 461, 462, 9, 14, 2, 2, 462, 463, 9, 6, 2, 2, 463, 464, 9, 4, 2, 2, 464, 78, 3, 2, 2, 2, 465, 466, 9, 5, 2, 2, 466, 467, 9, 12, 2, 2, 467, 468, 9, 16, 2, 2, 468, 80, 3, 2, 2, 2, 469, 470, 9, 8, 2, 2, 470, 471, 9, 4, 2, 2, 471, 472, 9, 6, 2, 2, 472, 82, 3, 2, 2, 2, 473, 474, 9, 2, 2, 2, 474, 475, 9, 11, 2, 2, 475, 476, 9, 12, 2, 2, 476, 477, 9, 22, 2, 2, 477, 478, 9, 6, 2, 2, 478, 84, 3, 2, 2, 2, 479, 480, 9, 21, 2, 2, 480, 481, 9, 14, 2, 2, 481, 482, 9, 12, 2, 2, 482, 483, 9, 2, 2, 2, 483, 484, 9, 6, 2, 2, 484, 485, 9, 13, 2, 2, 485, 486, 9, 11, 2, 2, 486, 487, 9, 12, 2, 2, 487, 86, 3, 2, 2, 2, 488, 489, 9, 3, 2, 2, 489, 490, 9, 4, 2, 2, 490, 491, 9, 6, 2, 2, 491, 492, 9, 14, 2, 2, 492, 493, 9, 3, 2, 2, 493, 494, 9, 12, 2, 2, 494, 88, 3, 2, 2, 2, 495, 498, 5, 91, 46, 2, 496, 498, 5, 93, 47, 2, 497, 495, 3, 2, 2, 2, 497, 496, 3, 2, 2, 2, 498, 90, 3, 2, 2, 2, 499, 500, 9, 6, 2, 2, 500, 501, 9, 3, 2, 2, 501, 502, 9, 14, 2, 2, 502, 503, 9, 4, 2, 2, 503, 92, 3, 2, 2, 2, 504, 505, 9, 21, 2, 2, 505, 506, 9, 5, 2, 2, 506, 507, 9, 8, 2, 2, 507, 508, 9, 22, 2, 2, 508, 509, 9, 4, 2, 2, 509, 94, 3, 2, 2, 2, 510, 511, 9, 22, 2, 2, 511, 512, 9, 6, 2, 2, 512, 513, 9, 3, 2, 2, 513, 514, 9, 13, 2, 2, 514, 515, 9, 12, 2, 2, 515, 516, 9, 23, 2, 2, 516, 96, 3, 2, 2, 2, 517, 518, 9, 9, 2, 2, 518, 519, 9, 11, 2, 2, 519, 520, 9, 11, 2, 2, 520, 521, 9, 8, 2, 2, 521, 522, 9, 4, 2, 2, 522, 523, 9, 5, 2, 2, 523, 524, 9, 12, 2, 2, 524, 98, 3, 2, 2, 2, 525, 526, 9, 25, 2, 2, 526, 527, 9, 11, 2, 2, 527, 528, 9, 13, 2, 2, 528, 529, 9, 7, 2, 2, 529, 100, 3, 2, 2, 2, 530, 531, 9, 5, 2, 2, 531, 532, 9, 3, 2, 2, 532, 533, 9, 3, 2, 2, 533, 534, 9, 5, 2, 2, 534, 535, 9, 16, 2, 2, 535, 102, 3, 2, 2, 2, 536, 537, 9, 18, 2, 2, 537, 538, 9, 5, 2, 2, 538, 539, 9, 15, 2, 2, 539, 104, 3, 2, 2, 2, 540, 541, 9, 21, 2, 2, 541, 542, 9, 11, 2, 2, 542, 543, 9, 3, 2, 2, 543, 544, 9, 4, 2, 2, 544, 545, 9, 5, 2, 2, 545, 546, 9, 2, 2, 2, 546, 547, 9, 20, 2, 2, 547, 106, 3, 2, 2, 2, 548, 549, 9, 21, 2, 2, 549, 550, 9, 11, 2, 2, 550, 551, 9, 3, 2, 2, 551, 108, 3, 2, 2, 2, 552, 553, 9, 13, 2, 2, 553, 554, 9, 12, 2, 2, 554, 110, 3, 2, 2, 2, 555, 556, 9, 13, 2, 2, 556, 557, 9, 21, 2, 2, 557, 112, 3, 2, 2, 2, 558, 559, 9, 4, 2, 2, 559, 560, 9, 8, 2, 2, 560, 561, 9, 22, 2, 2, 561, 562, 9, 4, 2, 2, 562, 114, 3, 2, 2, 2, 563, 564, 9, 13, 2, 2, 564, 565, 9, 12, 2, 2, 565, 566, 9, 17, 2, 2, 566, 567, 9, 3, 2, 2, 567, 568, 9, 5, 2, 2, 568, 569, 9, 12, 2, 2, 569, 570, 9, 23, 2, 2, 570, 571, 9, 4, 2, 2, 571, 116, 3, 2, 2, 2, 572, 574, 9, 26, 2, 2, 573, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 573, 3, 2, 2, 2, 575, 576, 3, 2, 2, 2, 576, 118, 3, 2, 2, 2, 577, 579, 9, 27, 2, 2, 578, 577, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 578, 3, 2, 2, 2, 580, 581, 3, 2, 2, 2, 581, 120, 3, 2, 2, 2, 582, 585, 5, 123, 62, 2, 583, 585, 5, 125, 63, 2, 584, 582, 3, 2, 2, 2, 584, 583, 3, 2, 2, 2, 585, 122, 3, 2, 2, 2, 586, 592, 7, 36, 2, 2, 587, 588, 7, 94, 2, 2, 588, 591, 7, 36, 2, 2, 589, 591, 10, 28, 2, 2, 590, 587, 3, 2, 2, 2, 590, 589, 3, 2, 2, 2, 591, 594, 3, 2, 2, 2, 592, 593, 3, 2, 2, 2, 592, 590, 3, 2, 2, 2, 593, 595, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 595, 596, 7, 36, 2, 2, 596, 124, 3, 2, 2, 2, 597, 603, 7, 41, 2, 2, 598, 599, 7, 94, 2, 2, 599, 602, 7, 41, 2, 2, 600, 602, 10, 28, 2, 2, 601, 598, 3, 2, 2, 2, 601, 600, 3, 2, 2, 2, 602, 605, 3, 2, 2, 2, 603, 604, 3, 2, 2, 2, 603, 601, 3, 2, 2, 2, 604, 606, 3, 2, 2, 2, 605, 603, 3, 2, 2, 2, 606, 607, 7, 41, 2, 2, 607, 126, 3, 2, 2, 2, 608, 612, 7, 37, 2, 2, 609, 611, 10, 29, 2, 2, 610, 609, 3, 2, 2, 2, 611, 614, 3, 2, 2, 2, 612, 610, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 615, 3, 2, 2, 2, 614, 612, 3, 2, 2, 2, 615, 616, 7, 12, 2, 2, 616, 617, 3, 2, 2, 2, 617, 618, 8, 64, 2, 2, 618, 128, 3, 2, 2, 2, 619, 621, 9, 30, 2, 2, 620, 619, 3, 2, 2, 2, 621, 622, 3, 2, 2, 2, 622, 620, 3, 2, 2, 2, 622, 623, 3, 2, 2, 2, 623, 624, 3, 2, 2, 2, 624, 625, 8, 65, 3, 2, 625, 130, 3, 2, 2, 2, 626, 627, 7, 46, 2, 2, 627, 132, 3, 2, 2, 2, 628, 629, 7, 60, 2, 2, 629, 134, 3, 2, 2, 2, 630, 631, 7, 125, 2, 2, 631, 136, 3, 2, 2, 2, 632, 633, 7, 127, 2, 2, 633, 138, 3, 2, 2, 2, 634, 635, 7, 93, 2, 2, 635, 140, 3, 2, 2, 2, 636, 637, 7, 95, 2, 2, 637, 142, 3, 2, 2, 2, 638, 639, 7, 62, 2, 2, 639, 144, 3, 2, 2, 2, 640, 641, 7, 64, 2, 2, 641, 146, 3, 2, 2, 2, 642, 643, 7, 42, 2, 2, 643, 148, 3, 2, 2, 2, 644, 645, 7, 43, 2, 2, 645, 150, 3, 2, 2, 2, 646, 647, 7, 35, 2, 2, 647, 152, 3, 2, 2, 2, 648, 649, 7, 63, 2, 2, 649, 154, 3, 2, 2, 2, 650, 651, 7, 40, 2, 2, 651, 652, 7, 40, 2, 2, 652, 156, 3, 2, 2, 2, 653, 654, 7, 126, 2, 2, 654, 655, 7, 126, 2, 2, 655, 158, 3, 2, 2, 2, 656, 657, 7, 63, 2, 2, 657, 658, 7, 63, 2, 2, 658, 160, 3, 2, 2, 2, 659, 660, 7, 35, 2, 2, 660, 661, 7, 63, 2, 2, 661, 162, 3, 2, 2, 2, 18, 2, 421, 429, 437, 446, 453, 497, 575, 580, 584, 590, 592, 601, 603, 612, 622, 4, 2, 3, 2, 8, 2, 2] \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.java deleted file mode 100644 index f8acc2ec0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.java +++ /dev/null @@ -1,383 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.TokenStream; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.misc.*; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) -public class PMLLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - CREATE=1, DELETE=2, BREAK=3, CONTINUE=4, POLICY_ELEMENT=5, RULE=6, WHEN=7, - PERFORMS=8, AS=9, ON=10, DO=11, ANY_USER=12, USERS=13, ANY_USER_WITH_ATTRIBUTE=14, - PROCESS=15, INTERSECTION=16, UNION=17, SET_RESOURCE_ACCESS_RIGHTS=18, - ASSIGN=19, DEASSIGN=20, FROM=21, SET_PROPERTIES=22, OF=23, TO=24, ASSOCIATE=25, - AND=26, WITH=27, DISSOCIATE=28, DENY=29, PROHIBITION=30, OBLIGATION=31, - ACCESS_RIGHTS=32, POLICY_CLASS=33, OBJECT_ATTRIBUTE=34, USER_ATTRIBUTE=35, - OBJECT=36, USER=37, ATTR=38, ANY=39, LET=40, CONST=41, FUNCTION=42, RETURN=43, - BOOLEAN=44, TRUE=45, FALSE=46, STRING_TYPE=47, BOOLEAN_TYPE=48, VOID_TYPE=49, - ARRAY_TYPE=50, MAP_TYPE=51, FOREACH=52, FOR=53, IN=54, IF=55, ELSE=56, - IN_RANGE=57, NUMBER=58, ID=59, STRING=60, DOUBLE_QUOTE_STRING=61, SINGLE_QUOTE_STRING=62, - LINE_COMMENT=63, WS=64, COMMA=65, COLON=66, OPEN_CURLY=67, CLOSE_CURLY=68, - OPEN_BRACKET=69, CLOSE_BRACKET=70, OPEN_ANGLE_BRACKET=71, CLOSE_ANGLE_BRACKET=72, - OPEN_PAREN=73, CLOSE_PAREN=74, IS_COMPLEMENT=75, EQUALS=76, AND_OP=77, - OR_OP=78, EQUALS_OP=79, NOT_EQUALS_OP=80; - public static String[] channelNames = { - "DEFAULT_TOKEN_CHANNEL", "HIDDEN" - }; - - public static String[] modeNames = { - "DEFAULT_MODE" - }; - - private static String[] makeRuleNames() { - return new String[] { - "CREATE", "DELETE", "BREAK", "CONTINUE", "POLICY_ELEMENT", "RULE", "WHEN", - "PERFORMS", "AS", "ON", "DO", "ANY_USER", "USERS", "ANY_USER_WITH_ATTRIBUTE", - "PROCESS", "INTERSECTION", "UNION", "SET_RESOURCE_ACCESS_RIGHTS", "ASSIGN", - "DEASSIGN", "FROM", "SET_PROPERTIES", "OF", "TO", "ASSOCIATE", "AND", - "WITH", "DISSOCIATE", "DENY", "PROHIBITION", "OBLIGATION", "ACCESS_RIGHTS", - "POLICY_CLASS", "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", "OBJECT", "USER", - "ATTR", "ANY", "LET", "CONST", "FUNCTION", "RETURN", "BOOLEAN", "TRUE", - "FALSE", "STRING_TYPE", "BOOLEAN_TYPE", "VOID_TYPE", "ARRAY_TYPE", "MAP_TYPE", - "FOREACH", "FOR", "IN", "IF", "ELSE", "IN_RANGE", "NUMBER", "ID", "STRING", - "DOUBLE_QUOTE_STRING", "SINGLE_QUOTE_STRING", "LINE_COMMENT", "WS", "COMMA", - "COLON", "OPEN_CURLY", "CLOSE_CURLY", "OPEN_BRACKET", "CLOSE_BRACKET", - "OPEN_ANGLE_BRACKET", "CLOSE_ANGLE_BRACKET", "OPEN_PAREN", "CLOSE_PAREN", - "IS_COMPLEMENT", "EQUALS", "AND_OP", "OR_OP", "EQUALS_OP", "NOT_EQUALS_OP" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, "','", "':'", "'{'", "'}'", "'['", "']'", - "'<'", "'>'", "'('", "')'", "'!'", "'='", "'&&'", "'||'", "'=='", "'!='" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "CREATE", "DELETE", "BREAK", "CONTINUE", "POLICY_ELEMENT", "RULE", - "WHEN", "PERFORMS", "AS", "ON", "DO", "ANY_USER", "USERS", "ANY_USER_WITH_ATTRIBUTE", - "PROCESS", "INTERSECTION", "UNION", "SET_RESOURCE_ACCESS_RIGHTS", "ASSIGN", - "DEASSIGN", "FROM", "SET_PROPERTIES", "OF", "TO", "ASSOCIATE", "AND", - "WITH", "DISSOCIATE", "DENY", "PROHIBITION", "OBLIGATION", "ACCESS_RIGHTS", - "POLICY_CLASS", "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", "OBJECT", "USER", - "ATTR", "ANY", "LET", "CONST", "FUNCTION", "RETURN", "BOOLEAN", "TRUE", - "FALSE", "STRING_TYPE", "BOOLEAN_TYPE", "VOID_TYPE", "ARRAY_TYPE", "MAP_TYPE", - "FOREACH", "FOR", "IN", "IF", "ELSE", "IN_RANGE", "NUMBER", "ID", "STRING", - "DOUBLE_QUOTE_STRING", "SINGLE_QUOTE_STRING", "LINE_COMMENT", "WS", "COMMA", - "COLON", "OPEN_CURLY", "CLOSE_CURLY", "OPEN_BRACKET", "CLOSE_BRACKET", - "OPEN_ANGLE_BRACKET", "CLOSE_ANGLE_BRACKET", "OPEN_PAREN", "CLOSE_PAREN", - "IS_COMPLEMENT", "EQUALS", "AND_OP", "OR_OP", "EQUALS_OP", "NOT_EQUALS_OP" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - - public PMLLexer(CharStream input) { - super(input); - _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - @Override - public String getGrammarFileName() { return "PML.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public String[] getChannelNames() { return channelNames; } - - @Override - public String[] getModeNames() { return modeNames; } - - @Override - public ATN getATN() { return _ATN; } - - public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2R\u0296\b\1\4\2\t"+ - "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ - "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ - "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ - "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ - "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\3\2\3\2\3\2\3\2\3"+ - "\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5"+ - "\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+ - "\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t"+ - "\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\r\3"+ - "\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+ - "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27"+ - "\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\31\3\31\3\31"+ - "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33"+ - "\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35"+ - "\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3"+ - "!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3"+ - "\"\3\"\3\"\3\"\3\"\5\"\u01a6\n\"\3#\3#\3#\3#\3#\3#\5#\u01ae\n#\3$\3$\3"+ - "$\3$\3$\3$\5$\u01b6\n$\3%\3%\3%\3%\3%\3%\3%\5%\u01bf\n%\3&\3&\3&\3&\3"+ - "&\5&\u01c6\n&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3)\3"+ - ")\3)\3)\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\3"+ - ",\3,\3-\3-\5-\u01f2\n-\3.\3.\3.\3.\3.\3/\3/\3/\3/\3/\3/\3\60\3\60\3\60"+ - "\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\62\3\62"+ - "\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\65"+ - "\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\67\3\67\3\67"+ - "\38\38\38\39\39\39\39\39\3:\3:\3:\3:\3:\3:\3:\3:\3:\3;\6;\u023e\n;\r;"+ - "\16;\u023f\3<\6<\u0243\n<\r<\16<\u0244\3=\3=\5=\u0249\n=\3>\3>\3>\3>\7"+ - ">\u024f\n>\f>\16>\u0252\13>\3>\3>\3?\3?\3?\3?\7?\u025a\n?\f?\16?\u025d"+ - "\13?\3?\3?\3@\3@\7@\u0263\n@\f@\16@\u0266\13@\3@\3@\3@\3@\3A\6A\u026d"+ - "\nA\rA\16A\u026e\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3G\3G\3H\3H\3I\3"+ - "I\3J\3J\3K\3K\3L\3L\3M\3M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3Q\3Q\3Q\4\u0250"+ - "\u025b\2R\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+ - "\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+ - "\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65"+ - "i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b"+ - "G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f"+ - "Q\u00a1R\3\2\37\3\2ee\3\2tt\3\2gg\3\2cc\3\2vv\3\2ff\3\2nn\3\2dd\3\2mm"+ - "\3\2qq\3\2pp\3\2kk\3\2ww\3\2rr\3\2{{\3\2\"\"\3\2oo\3\2yy\3\2jj\3\2hh\3"+ - "\2uu\3\2ii\3\2ll\3\2xx\3\2\62;\6\2\62;C\\aac|\4\2\f\f\17\17\3\2\f\f\5"+ - "\2\13\f\17\17\"\"\2\u02a4\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2"+ - "\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2"+ - "\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3"+ - "\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2"+ - "\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67"+ - "\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2"+ - "\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2"+ - "\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]"+ - "\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2"+ - "\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2"+ - "\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2"+ - "\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2"+ - "\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093"+ - "\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2"+ - "\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\3\u00a3\3\2\2\2\5\u00aa"+ - "\3\2\2\2\7\u00b1\3\2\2\2\t\u00b7\3\2\2\2\13\u00c0\3\2\2\2\r\u00cf\3\2"+ - "\2\2\17\u00d4\3\2\2\2\21\u00d9\3\2\2\2\23\u00e2\3\2\2\2\25\u00e5\3\2\2"+ - "\2\27\u00e8\3\2\2\2\31\u00eb\3\2\2\2\33\u00ef\3\2\2\2\35\u00f2\3\2\2\2"+ - "\37\u00fb\3\2\2\2!\u0103\3\2\2\2#\u0110\3\2\2\2%\u0116\3\2\2\2\'\u0125"+ - "\3\2\2\2)\u012c\3\2\2\2+\u0135\3\2\2\2-\u013a\3\2\2\2/\u0149\3\2\2\2\61"+ - "\u014c\3\2\2\2\63\u014f\3\2\2\2\65\u0159\3\2\2\2\67\u015d\3\2\2\29\u0162"+ - "\3\2\2\2;\u016d\3\2\2\2=\u0172\3\2\2\2?\u017e\3\2\2\2A\u0189\3\2\2\2C"+ - "\u01a5\3\2\2\2E\u01ad\3\2\2\2G\u01b5\3\2\2\2I\u01be\3\2\2\2K\u01c5\3\2"+ - "\2\2M\u01c7\3\2\2\2O\u01d1\3\2\2\2Q\u01d5\3\2\2\2S\u01d9\3\2\2\2U\u01df"+ - "\3\2\2\2W\u01e8\3\2\2\2Y\u01f1\3\2\2\2[\u01f3\3\2\2\2]\u01f8\3\2\2\2_"+ - "\u01fe\3\2\2\2a\u0205\3\2\2\2c\u020d\3\2\2\2e\u0212\3\2\2\2g\u0218\3\2"+ - "\2\2i\u021c\3\2\2\2k\u0224\3\2\2\2m\u0228\3\2\2\2o\u022b\3\2\2\2q\u022e"+ - "\3\2\2\2s\u0233\3\2\2\2u\u023d\3\2\2\2w\u0242\3\2\2\2y\u0248\3\2\2\2{"+ - "\u024a\3\2\2\2}\u0255\3\2\2\2\177\u0260\3\2\2\2\u0081\u026c\3\2\2\2\u0083"+ - "\u0272\3\2\2\2\u0085\u0274\3\2\2\2\u0087\u0276\3\2\2\2\u0089\u0278\3\2"+ - "\2\2\u008b\u027a\3\2\2\2\u008d\u027c\3\2\2\2\u008f\u027e\3\2\2\2\u0091"+ - "\u0280\3\2\2\2\u0093\u0282\3\2\2\2\u0095\u0284\3\2\2\2\u0097\u0286\3\2"+ - "\2\2\u0099\u0288\3\2\2\2\u009b\u028a\3\2\2\2\u009d\u028d\3\2\2\2\u009f"+ - "\u0290\3\2\2\2\u00a1\u0293\3\2\2\2\u00a3\u00a4\t\2\2\2\u00a4\u00a5\t\3"+ - "\2\2\u00a5\u00a6\t\4\2\2\u00a6\u00a7\t\5\2\2\u00a7\u00a8\t\6\2\2\u00a8"+ - "\u00a9\t\4\2\2\u00a9\4\3\2\2\2\u00aa\u00ab\t\7\2\2\u00ab\u00ac\t\4\2\2"+ - "\u00ac\u00ad\t\b\2\2\u00ad\u00ae\t\4\2\2\u00ae\u00af\t\6\2\2\u00af\u00b0"+ - "\t\4\2\2\u00b0\6\3\2\2\2\u00b1\u00b2\t\t\2\2\u00b2\u00b3\t\3\2\2\u00b3"+ - "\u00b4\t\4\2\2\u00b4\u00b5\t\5\2\2\u00b5\u00b6\t\n\2\2\u00b6\b\3\2\2\2"+ - "\u00b7\u00b8\t\2\2\2\u00b8\u00b9\t\13\2\2\u00b9\u00ba\t\f\2\2\u00ba\u00bb"+ - "\t\6\2\2\u00bb\u00bc\t\r\2\2\u00bc\u00bd\t\f\2\2\u00bd\u00be\t\16\2\2"+ - "\u00be\u00bf\t\4\2\2\u00bf\n\3\2\2\2\u00c0\u00c1\t\17\2\2\u00c1\u00c2"+ - "\t\13\2\2\u00c2\u00c3\t\b\2\2\u00c3\u00c4\t\r\2\2\u00c4\u00c5\t\2\2\2"+ - "\u00c5\u00c6\t\20\2\2\u00c6\u00c7\t\21\2\2\u00c7\u00c8\t\4\2\2\u00c8\u00c9"+ - "\t\b\2\2\u00c9\u00ca\t\4\2\2\u00ca\u00cb\t\22\2\2\u00cb\u00cc\t\4\2\2"+ - "\u00cc\u00cd\t\f\2\2\u00cd\u00ce\t\6\2\2\u00ce\f\3\2\2\2\u00cf\u00d0\t"+ - "\3\2\2\u00d0\u00d1\t\16\2\2\u00d1\u00d2\t\b\2\2\u00d2\u00d3\t\4\2\2\u00d3"+ - "\16\3\2\2\2\u00d4\u00d5\t\23\2\2\u00d5\u00d6\t\24\2\2\u00d6\u00d7\t\4"+ - "\2\2\u00d7\u00d8\t\f\2\2\u00d8\20\3\2\2\2\u00d9\u00da\t\17\2\2\u00da\u00db"+ - "\t\4\2\2\u00db\u00dc\t\3\2\2\u00dc\u00dd\t\25\2\2\u00dd\u00de\t\13\2\2"+ - "\u00de\u00df\t\3\2\2\u00df\u00e0\t\22\2\2\u00e0\u00e1\t\26\2\2\u00e1\22"+ - "\3\2\2\2\u00e2\u00e3\t\5\2\2\u00e3\u00e4\t\26\2\2\u00e4\24\3\2\2\2\u00e5"+ - "\u00e6\t\13\2\2\u00e6\u00e7\t\f\2\2\u00e7\26\3\2\2\2\u00e8\u00e9\t\7\2"+ - "\2\u00e9\u00ea\t\13\2\2\u00ea\30\3\2\2\2\u00eb\u00ec\5O(\2\u00ec\u00ed"+ - "\t\21\2\2\u00ed\u00ee\5K&\2\u00ee\32\3\2\2\2\u00ef\u00f0\5K&\2\u00f0\u00f1"+ - "\t\26\2\2\u00f1\34\3\2\2\2\u00f2\u00f3\5\31\r\2\u00f3\u00f4\t\21\2\2\u00f4"+ - "\u00f5\t\23\2\2\u00f5\u00f6\t\r\2\2\u00f6\u00f7\t\6\2\2\u00f7\u00f8\t"+ - "\24\2\2\u00f8\u00f9\t\21\2\2\u00f9\u00fa\5M\'\2\u00fa\36\3\2\2\2\u00fb"+ - "\u00fc\t\17\2\2\u00fc\u00fd\t\3\2\2\u00fd\u00fe\t\13\2\2\u00fe\u00ff\t"+ - "\2\2\2\u00ff\u0100\t\4\2\2\u0100\u0101\t\26\2\2\u0101\u0102\t\26\2\2\u0102"+ - " \3\2\2\2\u0103\u0104\t\r\2\2\u0104\u0105\t\f\2\2\u0105\u0106\t\6\2\2"+ - "\u0106\u0107\t\4\2\2\u0107\u0108\t\3\2\2\u0108\u0109\t\26\2\2\u0109\u010a"+ - "\t\4\2\2\u010a\u010b\t\2\2\2\u010b\u010c\t\6\2\2\u010c\u010d\t\r\2\2\u010d"+ - "\u010e\t\13\2\2\u010e\u010f\t\f\2\2\u010f\"\3\2\2\2\u0110\u0111\t\16\2"+ - "\2\u0111\u0112\t\f\2\2\u0112\u0113\t\r\2\2\u0113\u0114\t\13\2\2\u0114"+ - "\u0115\t\f\2\2\u0115$\3\2\2\2\u0116\u0117\t\26\2\2\u0117\u0118\t\4\2\2"+ - "\u0118\u0119\t\6\2\2\u0119\u011a\t\21\2\2\u011a\u011b\t\3\2\2\u011b\u011c"+ - "\t\4\2\2\u011c\u011d\t\26\2\2\u011d\u011e\t\13\2\2\u011e\u011f\t\16\2"+ - "\2\u011f\u0120\t\3\2\2\u0120\u0121\t\2\2\2\u0121\u0122\t\4\2\2\u0122\u0123"+ - "\t\21\2\2\u0123\u0124\5A!\2\u0124&\3\2\2\2\u0125\u0126\t\5\2\2\u0126\u0127"+ - "\t\26\2\2\u0127\u0128\t\26\2\2\u0128\u0129\t\r\2\2\u0129\u012a\t\27\2"+ - "\2\u012a\u012b\t\f\2\2\u012b(\3\2\2\2\u012c\u012d\t\7\2\2\u012d\u012e"+ - "\t\4\2\2\u012e\u012f\t\5\2\2\u012f\u0130\t\26\2\2\u0130\u0131\t\26\2\2"+ - "\u0131\u0132\t\r\2\2\u0132\u0133\t\27\2\2\u0133\u0134\t\f\2\2\u0134*\3"+ - "\2\2\2\u0135\u0136\t\25\2\2\u0136\u0137\t\3\2\2\u0137\u0138\t\13\2\2\u0138"+ - "\u0139\t\22\2\2\u0139,\3\2\2\2\u013a\u013b\t\26\2\2\u013b\u013c\t\4\2"+ - "\2\u013c\u013d\t\6\2\2\u013d\u013e\t\21\2\2\u013e\u013f\t\17\2\2\u013f"+ - "\u0140\t\3\2\2\u0140\u0141\t\13\2\2\u0141\u0142\t\17\2\2\u0142\u0143\t"+ - "\4\2\2\u0143\u0144\t\3\2\2\u0144\u0145\t\6\2\2\u0145\u0146\t\r\2\2\u0146"+ - "\u0147\t\4\2\2\u0147\u0148\t\26\2\2\u0148.\3\2\2\2\u0149\u014a\t\13\2"+ - "\2\u014a\u014b\t\25\2\2\u014b\60\3\2\2\2\u014c\u014d\t\6\2\2\u014d\u014e"+ - "\t\13\2\2\u014e\62\3\2\2\2\u014f\u0150\t\5\2\2\u0150\u0151\t\26\2\2\u0151"+ - "\u0152\t\26\2\2\u0152\u0153\t\13\2\2\u0153\u0154\t\2\2\2\u0154\u0155\t"+ - "\r\2\2\u0155\u0156\t\5\2\2\u0156\u0157\t\6\2\2\u0157\u0158\t\4\2\2\u0158"+ - "\64\3\2\2\2\u0159\u015a\t\5\2\2\u015a\u015b\t\f\2\2\u015b\u015c\t\7\2"+ - "\2\u015c\66\3\2\2\2\u015d\u015e\t\23\2\2\u015e\u015f\t\r\2\2\u015f\u0160"+ - "\t\6\2\2\u0160\u0161\t\24\2\2\u01618\3\2\2\2\u0162\u0163\t\7\2\2\u0163"+ - "\u0164\t\r\2\2\u0164\u0165\t\26\2\2\u0165\u0166\t\26\2\2\u0166\u0167\t"+ - "\13\2\2\u0167\u0168\t\2\2\2\u0168\u0169\t\r\2\2\u0169\u016a\t\5\2\2\u016a"+ - "\u016b\t\6\2\2\u016b\u016c\t\4\2\2\u016c:\3\2\2\2\u016d\u016e\t\7\2\2"+ - "\u016e\u016f\t\4\2\2\u016f\u0170\t\f\2\2\u0170\u0171\t\20\2\2\u0171<\3"+ - "\2\2\2\u0172\u0173\t\17\2\2\u0173\u0174\t\3\2\2\u0174\u0175\t\13\2\2\u0175"+ - "\u0176\t\24\2\2\u0176\u0177\t\r\2\2\u0177\u0178\t\t\2\2\u0178\u0179\t"+ - "\r\2\2\u0179\u017a\t\6\2\2\u017a\u017b\t\r\2\2\u017b\u017c\t\13\2\2\u017c"+ - "\u017d\t\f\2\2\u017d>\3\2\2\2\u017e\u017f\t\13\2\2\u017f\u0180\t\t\2\2"+ - "\u0180\u0181\t\b\2\2\u0181\u0182\t\r\2\2\u0182\u0183\t\27\2\2\u0183\u0184"+ - "\t\5\2\2\u0184\u0185\t\6\2\2\u0185\u0186\t\r\2\2\u0186\u0187\t\13\2\2"+ - "\u0187\u0188\t\f\2\2\u0188@\3\2\2\2\u0189\u018a\t\5\2\2\u018a\u018b\t"+ - "\2\2\2\u018b\u018c\t\2\2\2\u018c\u018d\t\4\2\2\u018d\u018e\t\26\2\2\u018e"+ - "\u018f\t\26\2\2\u018f\u0190\t\21\2\2\u0190\u0191\t\3\2\2\u0191\u0192\t"+ - "\r\2\2\u0192\u0193\t\27\2\2\u0193\u0194\t\24\2\2\u0194\u0195\t\6\2\2\u0195"+ - "\u0196\t\26\2\2\u0196B\3\2\2\2\u0197\u0198\t\17\2\2\u0198\u0199\t\13\2"+ - "\2\u0199\u019a\t\b\2\2\u019a\u019b\t\r\2\2\u019b\u019c\t\2\2\2\u019c\u019d"+ - "\t\20\2\2\u019d\u019e\t\21\2\2\u019e\u019f\t\2\2\2\u019f\u01a0\t\b\2\2"+ - "\u01a0\u01a1\t\5\2\2\u01a1\u01a2\t\26\2\2\u01a2\u01a6\t\26\2\2\u01a3\u01a4"+ - "\t\17\2\2\u01a4\u01a6\t\2\2\2\u01a5\u0197\3\2\2\2\u01a5\u01a3\3\2\2\2"+ - "\u01a6D\3\2\2\2\u01a7\u01a8\5I%\2\u01a8\u01a9\t\21\2\2\u01a9\u01aa\5M"+ - "\'\2\u01aa\u01ae\3\2\2\2\u01ab\u01ac\t\13\2\2\u01ac\u01ae\t\5\2\2\u01ad"+ - "\u01a7\3\2\2\2\u01ad\u01ab\3\2\2\2\u01aeF\3\2\2\2\u01af\u01b0\5K&\2\u01b0"+ - "\u01b1\t\21\2\2\u01b1\u01b2\5M\'\2\u01b2\u01b6\3\2\2\2\u01b3\u01b4\t\16"+ - "\2\2\u01b4\u01b6\t\5\2\2\u01b5\u01af\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b6"+ - "H\3\2\2\2\u01b7\u01b8\t\13\2\2\u01b8\u01b9\t\t\2\2\u01b9\u01ba\t\30\2"+ - "\2\u01ba\u01bb\t\4\2\2\u01bb\u01bc\t\2\2\2\u01bc\u01bf\t\6\2\2\u01bd\u01bf"+ - "\t\13\2\2\u01be\u01b7\3\2\2\2\u01be\u01bd\3\2\2\2\u01bfJ\3\2\2\2\u01c0"+ - "\u01c1\t\16\2\2\u01c1\u01c2\t\26\2\2\u01c2\u01c3\t\4\2\2\u01c3\u01c6\t"+ - "\3\2\2\u01c4\u01c6\t\16\2\2\u01c5\u01c0\3\2\2\2\u01c5\u01c4\3\2\2\2\u01c6"+ - "L\3\2\2\2\u01c7\u01c8\t\5\2\2\u01c8\u01c9\t\6\2\2\u01c9\u01ca\t\6\2\2"+ - "\u01ca\u01cb\t\3\2\2\u01cb\u01cc\t\r\2\2\u01cc\u01cd\t\t\2\2\u01cd\u01ce"+ - "\t\16\2\2\u01ce\u01cf\t\6\2\2\u01cf\u01d0\t\4\2\2\u01d0N\3\2\2\2\u01d1"+ - "\u01d2\t\5\2\2\u01d2\u01d3\t\f\2\2\u01d3\u01d4\t\20\2\2\u01d4P\3\2\2\2"+ - "\u01d5\u01d6\t\b\2\2\u01d6\u01d7\t\4\2\2\u01d7\u01d8\t\6\2\2\u01d8R\3"+ - "\2\2\2\u01d9\u01da\t\2\2\2\u01da\u01db\t\13\2\2\u01db\u01dc\t\f\2\2\u01dc"+ - "\u01dd\t\26\2\2\u01dd\u01de\t\6\2\2\u01deT\3\2\2\2\u01df\u01e0\t\25\2"+ - "\2\u01e0\u01e1\t\16\2\2\u01e1\u01e2\t\f\2\2\u01e2\u01e3\t\2\2\2\u01e3"+ - "\u01e4\t\6\2\2\u01e4\u01e5\t\r\2\2\u01e5\u01e6\t\13\2\2\u01e6\u01e7\t"+ - "\f\2\2\u01e7V\3\2\2\2\u01e8\u01e9\t\3\2\2\u01e9\u01ea\t\4\2\2\u01ea\u01eb"+ - "\t\6\2\2\u01eb\u01ec\t\16\2\2\u01ec\u01ed\t\3\2\2\u01ed\u01ee\t\f\2\2"+ - "\u01eeX\3\2\2\2\u01ef\u01f2\5[.\2\u01f0\u01f2\5]/\2\u01f1\u01ef\3\2\2"+ - "\2\u01f1\u01f0\3\2\2\2\u01f2Z\3\2\2\2\u01f3\u01f4\t\6\2\2\u01f4\u01f5"+ - "\t\3\2\2\u01f5\u01f6\t\16\2\2\u01f6\u01f7\t\4\2\2\u01f7\\\3\2\2\2\u01f8"+ - "\u01f9\t\25\2\2\u01f9\u01fa\t\5\2\2\u01fa\u01fb\t\b\2\2\u01fb\u01fc\t"+ - "\26\2\2\u01fc\u01fd\t\4\2\2\u01fd^\3\2\2\2\u01fe\u01ff\t\26\2\2\u01ff"+ - "\u0200\t\6\2\2\u0200\u0201\t\3\2\2\u0201\u0202\t\r\2\2\u0202\u0203\t\f"+ - "\2\2\u0203\u0204\t\27\2\2\u0204`\3\2\2\2\u0205\u0206\t\t\2\2\u0206\u0207"+ - "\t\13\2\2\u0207\u0208\t\13\2\2\u0208\u0209\t\b\2\2\u0209\u020a\t\4\2\2"+ - "\u020a\u020b\t\5\2\2\u020b\u020c\t\f\2\2\u020cb\3\2\2\2\u020d\u020e\t"+ - "\31\2\2\u020e\u020f\t\13\2\2\u020f\u0210\t\r\2\2\u0210\u0211\t\7\2\2\u0211"+ - "d\3\2\2\2\u0212\u0213\t\5\2\2\u0213\u0214\t\3\2\2\u0214\u0215\t\3\2\2"+ - "\u0215\u0216\t\5\2\2\u0216\u0217\t\20\2\2\u0217f\3\2\2\2\u0218\u0219\t"+ - "\22\2\2\u0219\u021a\t\5\2\2\u021a\u021b\t\17\2\2\u021bh\3\2\2\2\u021c"+ - "\u021d\t\25\2\2\u021d\u021e\t\13\2\2\u021e\u021f\t\3\2\2\u021f\u0220\t"+ - "\4\2\2\u0220\u0221\t\5\2\2\u0221\u0222\t\2\2\2\u0222\u0223\t\24\2\2\u0223"+ - "j\3\2\2\2\u0224\u0225\t\25\2\2\u0225\u0226\t\13\2\2\u0226\u0227\t\3\2"+ - "\2\u0227l\3\2\2\2\u0228\u0229\t\r\2\2\u0229\u022a\t\f\2\2\u022an\3\2\2"+ - "\2\u022b\u022c\t\r\2\2\u022c\u022d\t\25\2\2\u022dp\3\2\2\2\u022e\u022f"+ - "\t\4\2\2\u022f\u0230\t\b\2\2\u0230\u0231\t\26\2\2\u0231\u0232\t\4\2\2"+ - "\u0232r\3\2\2\2\u0233\u0234\t\r\2\2\u0234\u0235\t\f\2\2\u0235\u0236\t"+ - "\21\2\2\u0236\u0237\t\3\2\2\u0237\u0238\t\5\2\2\u0238\u0239\t\f\2\2\u0239"+ - "\u023a\t\27\2\2\u023a\u023b\t\4\2\2\u023bt\3\2\2\2\u023c\u023e\t\32\2"+ - "\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u023d\3\2\2\2\u023f\u0240"+ - "\3\2\2\2\u0240v\3\2\2\2\u0241\u0243\t\33\2\2\u0242\u0241\3\2\2\2\u0243"+ - "\u0244\3\2\2\2\u0244\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245x\3\2\2\2"+ - "\u0246\u0249\5{>\2\u0247\u0249\5}?\2\u0248\u0246\3\2\2\2\u0248\u0247\3"+ - "\2\2\2\u0249z\3\2\2\2\u024a\u0250\7$\2\2\u024b\u024c\7^\2\2\u024c\u024f"+ - "\7$\2\2\u024d\u024f\n\34\2\2\u024e\u024b\3\2\2\2\u024e\u024d\3\2\2\2\u024f"+ - "\u0252\3\2\2\2\u0250\u0251\3\2\2\2\u0250\u024e\3\2\2\2\u0251\u0253\3\2"+ - "\2\2\u0252\u0250\3\2\2\2\u0253\u0254\7$\2\2\u0254|\3\2\2\2\u0255\u025b"+ - "\7)\2\2\u0256\u0257\7^\2\2\u0257\u025a\7)\2\2\u0258\u025a\n\34\2\2\u0259"+ - "\u0256\3\2\2\2\u0259\u0258\3\2\2\2\u025a\u025d\3\2\2\2\u025b\u025c\3\2"+ - "\2\2\u025b\u0259\3\2\2\2\u025c\u025e\3\2\2\2\u025d\u025b\3\2\2\2\u025e"+ - "\u025f\7)\2\2\u025f~\3\2\2\2\u0260\u0264\7%\2\2\u0261\u0263\n\35\2\2\u0262"+ - "\u0261\3\2\2\2\u0263\u0266\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2"+ - "\2\2\u0265\u0267\3\2\2\2\u0266\u0264\3\2\2\2\u0267\u0268\7\f\2\2\u0268"+ - "\u0269\3\2\2\2\u0269\u026a\b@\2\2\u026a\u0080\3\2\2\2\u026b\u026d\t\36"+ - "\2\2\u026c\u026b\3\2\2\2\u026d\u026e\3\2\2\2\u026e\u026c\3\2\2\2\u026e"+ - "\u026f\3\2\2\2\u026f\u0270\3\2\2\2\u0270\u0271\bA\3\2\u0271\u0082\3\2"+ - "\2\2\u0272\u0273\7.\2\2\u0273\u0084\3\2\2\2\u0274\u0275\7<\2\2\u0275\u0086"+ - "\3\2\2\2\u0276\u0277\7}\2\2\u0277\u0088\3\2\2\2\u0278\u0279\7\177\2\2"+ - "\u0279\u008a\3\2\2\2\u027a\u027b\7]\2\2\u027b\u008c\3\2\2\2\u027c\u027d"+ - "\7_\2\2\u027d\u008e\3\2\2\2\u027e\u027f\7>\2\2\u027f\u0090\3\2\2\2\u0280"+ - "\u0281\7@\2\2\u0281\u0092\3\2\2\2\u0282\u0283\7*\2\2\u0283\u0094\3\2\2"+ - "\2\u0284\u0285\7+\2\2\u0285\u0096\3\2\2\2\u0286\u0287\7#\2\2\u0287\u0098"+ - "\3\2\2\2\u0288\u0289\7?\2\2\u0289\u009a\3\2\2\2\u028a\u028b\7(\2\2\u028b"+ - "\u028c\7(\2\2\u028c\u009c\3\2\2\2\u028d\u028e\7~\2\2\u028e\u028f\7~\2"+ - "\2\u028f\u009e\3\2\2\2\u0290\u0291\7?\2\2\u0291\u0292\7?\2\2\u0292\u00a0"+ - "\3\2\2\2\u0293\u0294\7#\2\2\u0294\u0295\7?\2\2\u0295\u00a2\3\2\2\2\22"+ - "\2\u01a5\u01ad\u01b5\u01be\u01c5\u01f1\u023f\u0244\u0248\u024e\u0250\u0259"+ - "\u025b\u0264\u026e\4\2\3\2\b\2\2"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.tokens b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.tokens deleted file mode 100644 index 5d93e50e8..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLLexer.tokens +++ /dev/null @@ -1,96 +0,0 @@ -CREATE=1 -DELETE=2 -BREAK=3 -CONTINUE=4 -POLICY_ELEMENT=5 -RULE=6 -WHEN=7 -PERFORMS=8 -AS=9 -ON=10 -DO=11 -ANY_USER=12 -USERS=13 -ANY_USER_WITH_ATTRIBUTE=14 -PROCESS=15 -INTERSECTION=16 -UNION=17 -SET_RESOURCE_ACCESS_RIGHTS=18 -ASSIGN=19 -DEASSIGN=20 -FROM=21 -SET_PROPERTIES=22 -OF=23 -TO=24 -ASSOCIATE=25 -AND=26 -WITH=27 -DISSOCIATE=28 -DENY=29 -PROHIBITION=30 -OBLIGATION=31 -ACCESS_RIGHTS=32 -POLICY_CLASS=33 -OBJECT_ATTRIBUTE=34 -USER_ATTRIBUTE=35 -OBJECT=36 -USER=37 -ATTR=38 -ANY=39 -LET=40 -CONST=41 -FUNCTION=42 -RETURN=43 -BOOLEAN=44 -TRUE=45 -FALSE=46 -STRING_TYPE=47 -BOOLEAN_TYPE=48 -VOID_TYPE=49 -ARRAY_TYPE=50 -MAP_TYPE=51 -FOREACH=52 -FOR=53 -IN=54 -IF=55 -ELSE=56 -IN_RANGE=57 -NUMBER=58 -ID=59 -STRING=60 -DOUBLE_QUOTE_STRING=61 -SINGLE_QUOTE_STRING=62 -LINE_COMMENT=63 -WS=64 -COMMA=65 -COLON=66 -OPEN_CURLY=67 -CLOSE_CURLY=68 -OPEN_BRACKET=69 -CLOSE_BRACKET=70 -OPEN_ANGLE_BRACKET=71 -CLOSE_ANGLE_BRACKET=72 -OPEN_PAREN=73 -CLOSE_PAREN=74 -IS_COMPLEMENT=75 -EQUALS=76 -AND_OP=77 -OR_OP=78 -EQUALS_OP=79 -NOT_EQUALS_OP=80 -','=65 -':'=66 -'{'=67 -'}'=68 -'['=69 -']'=70 -'<'=71 -'>'=72 -'('=73 -')'=74 -'!'=75 -'='=76 -'&&'=77 -'||'=78 -'=='=79 -'!='=80 diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLListener.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLListener.java deleted file mode 100644 index 7507a882b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLListener.java +++ /dev/null @@ -1,802 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; -import org.antlr.v4.runtime.tree.ParseTreeListener; - -/** - * This interface defines a complete listener for a parse tree produced by - * {@link PMLParser}. - */ -public interface PMLListener extends ParseTreeListener { - /** - * Enter a parse tree produced by {@link PMLParser#pml}. - * @param ctx the parse tree - */ - void enterPml(PMLParser.PmlContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#pml}. - * @param ctx the parse tree - */ - void exitPml(PMLParser.PmlContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#statement}. - * @param ctx the parse tree - */ - void enterStatement(PMLParser.StatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#statement}. - * @param ctx the parse tree - */ - void exitStatement(PMLParser.StatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createPolicyStatement}. - * @param ctx the parse tree - */ - void enterCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createPolicyStatement}. - * @param ctx the parse tree - */ - void exitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createAttributeStatement}. - * @param ctx the parse tree - */ - void enterCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createAttributeStatement}. - * @param ctx the parse tree - */ - void exitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createUserOrObjectStatement}. - * @param ctx the parse tree - */ - void enterCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createUserOrObjectStatement}. - * @param ctx the parse tree - */ - void exitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createObligationStatement}. - * @param ctx the parse tree - */ - void enterCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createObligationStatement}. - * @param ctx the parse tree - */ - void exitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createRuleStatement}. - * @param ctx the parse tree - */ - void enterCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createRuleStatement}. - * @param ctx the parse tree - */ - void exitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); - /** - * Enter a parse tree produced by the {@code AnyUserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void enterAnyUserSubject(PMLParser.AnyUserSubjectContext ctx); - /** - * Exit a parse tree produced by the {@code AnyUserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void exitAnyUserSubject(PMLParser.AnyUserSubjectContext ctx); - /** - * Enter a parse tree produced by the {@code UserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void enterUserSubject(PMLParser.UserSubjectContext ctx); - /** - * Exit a parse tree produced by the {@code UserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void exitUserSubject(PMLParser.UserSubjectContext ctx); - /** - * Enter a parse tree produced by the {@code UsersListSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void enterUsersListSubject(PMLParser.UsersListSubjectContext ctx); - /** - * Exit a parse tree produced by the {@code UsersListSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void exitUsersListSubject(PMLParser.UsersListSubjectContext ctx); - /** - * Enter a parse tree produced by the {@code UserAttrSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void enterUserAttrSubject(PMLParser.UserAttrSubjectContext ctx); - /** - * Exit a parse tree produced by the {@code UserAttrSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void exitUserAttrSubject(PMLParser.UserAttrSubjectContext ctx); - /** - * Enter a parse tree produced by the {@code ProcessSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void enterProcessSubject(PMLParser.ProcessSubjectContext ctx); - /** - * Exit a parse tree produced by the {@code ProcessSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - */ - void exitProcessSubject(PMLParser.ProcessSubjectContext ctx); - /** - * Enter a parse tree produced by the {@code PolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void enterPolicyElement(PMLParser.PolicyElementContext ctx); - /** - * Exit a parse tree produced by the {@code PolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void exitPolicyElement(PMLParser.PolicyElementContext ctx); - /** - * Enter a parse tree produced by the {@code AnyPolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void enterAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); - /** - * Exit a parse tree produced by the {@code AnyPolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void exitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); - /** - * Enter a parse tree produced by the {@code AnyContainedIn} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void enterAnyContainedIn(PMLParser.AnyContainedInContext ctx); - /** - * Exit a parse tree produced by the {@code AnyContainedIn} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void exitAnyContainedIn(PMLParser.AnyContainedInContext ctx); - /** - * Enter a parse tree produced by the {@code AnyOfSet} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void enterAnyOfSet(PMLParser.AnyOfSetContext ctx); - /** - * Exit a parse tree produced by the {@code AnyOfSet} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - */ - void exitAnyOfSet(PMLParser.AnyOfSetContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#anyPe}. - * @param ctx the parse tree - */ - void enterAnyPe(PMLParser.AnyPeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#anyPe}. - * @param ctx the parse tree - */ - void exitAnyPe(PMLParser.AnyPeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#response}. - * @param ctx the parse tree - */ - void enterResponse(PMLParser.ResponseContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#response}. - * @param ctx the parse tree - */ - void exitResponse(PMLParser.ResponseContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#responseBlock}. - * @param ctx the parse tree - */ - void enterResponseBlock(PMLParser.ResponseBlockContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#responseBlock}. - * @param ctx the parse tree - */ - void exitResponseBlock(PMLParser.ResponseBlockContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#responseStatement}. - * @param ctx the parse tree - */ - void enterResponseStatement(PMLParser.ResponseStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#responseStatement}. - * @param ctx the parse tree - */ - void exitResponseStatement(PMLParser.ResponseStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#createProhibitionStatement}. - * @param ctx the parse tree - */ - void enterCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#createProhibitionStatement}. - * @param ctx the parse tree - */ - void exitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#prohibitionContainerList}. - * @param ctx the parse tree - */ - void enterProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#prohibitionContainerList}. - * @param ctx the parse tree - */ - void exitProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#prohibitionContainerExpression}. - * @param ctx the parse tree - */ - void enterProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#prohibitionContainerExpression}. - * @param ctx the parse tree - */ - void exitProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. - * @param ctx the parse tree - */ - void enterSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. - * @param ctx the parse tree - */ - void exitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#assignStatement}. - * @param ctx the parse tree - */ - void enterAssignStatement(PMLParser.AssignStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#assignStatement}. - * @param ctx the parse tree - */ - void exitAssignStatement(PMLParser.AssignStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#deassignStatement}. - * @param ctx the parse tree - */ - void enterDeassignStatement(PMLParser.DeassignStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#deassignStatement}. - * @param ctx the parse tree - */ - void exitDeassignStatement(PMLParser.DeassignStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#associateStatement}. - * @param ctx the parse tree - */ - void enterAssociateStatement(PMLParser.AssociateStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#associateStatement}. - * @param ctx the parse tree - */ - void exitAssociateStatement(PMLParser.AssociateStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#dissociateStatement}. - * @param ctx the parse tree - */ - void enterDissociateStatement(PMLParser.DissociateStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#dissociateStatement}. - * @param ctx the parse tree - */ - void exitDissociateStatement(PMLParser.DissociateStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#setResourceAccessRightsStatement}. - * @param ctx the parse tree - */ - void enterSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#setResourceAccessRightsStatement}. - * @param ctx the parse tree - */ - void exitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#deleteStatement}. - * @param ctx the parse tree - */ - void enterDeleteStatement(PMLParser.DeleteStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#deleteStatement}. - * @param ctx the parse tree - */ - void exitDeleteStatement(PMLParser.DeleteStatementContext ctx); - /** - * Enter a parse tree produced by the {@code DeleteNode} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void enterDeleteNode(PMLParser.DeleteNodeContext ctx); - /** - * Exit a parse tree produced by the {@code DeleteNode} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void exitDeleteNode(PMLParser.DeleteNodeContext ctx); - /** - * Enter a parse tree produced by the {@code DeleteObligation} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void enterDeleteObligation(PMLParser.DeleteObligationContext ctx); - /** - * Exit a parse tree produced by the {@code DeleteObligation} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void exitDeleteObligation(PMLParser.DeleteObligationContext ctx); - /** - * Enter a parse tree produced by the {@code DeleteProhibition} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void enterDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); - /** - * Exit a parse tree produced by the {@code DeleteProhibition} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - */ - void exitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#nodeType}. - * @param ctx the parse tree - */ - void enterNodeType(PMLParser.NodeTypeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#nodeType}. - * @param ctx the parse tree - */ - void exitNodeType(PMLParser.NodeTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#deleteRuleStatement}. - * @param ctx the parse tree - */ - void enterDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#deleteRuleStatement}. - * @param ctx the parse tree - */ - void exitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#variableDeclarationStatement}. - * @param ctx the parse tree - */ - void enterVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#variableDeclarationStatement}. - * @param ctx the parse tree - */ - void exitVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#functionDefinitionStatement}. - * @param ctx the parse tree - */ - void enterFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#functionDefinitionStatement}. - * @param ctx the parse tree - */ - void exitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#formalArgList}. - * @param ctx the parse tree - */ - void enterFormalArgList(PMLParser.FormalArgListContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#formalArgList}. - * @param ctx the parse tree - */ - void exitFormalArgList(PMLParser.FormalArgListContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#formalArg}. - * @param ctx the parse tree - */ - void enterFormalArg(PMLParser.FormalArgContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#formalArg}. - * @param ctx the parse tree - */ - void exitFormalArg(PMLParser.FormalArgContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#formalArgType}. - * @param ctx the parse tree - */ - void enterFormalArgType(PMLParser.FormalArgTypeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#formalArgType}. - * @param ctx the parse tree - */ - void exitFormalArgType(PMLParser.FormalArgTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#functionReturnStatement}. - * @param ctx the parse tree - */ - void enterFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#functionReturnStatement}. - * @param ctx the parse tree - */ - void exitFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx); - /** - * Enter a parse tree produced by the {@code VariableReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - */ - void enterVariableReturnType(PMLParser.VariableReturnTypeContext ctx); - /** - * Exit a parse tree produced by the {@code VariableReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - */ - void exitVariableReturnType(PMLParser.VariableReturnTypeContext ctx); - /** - * Enter a parse tree produced by the {@code VoidReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - */ - void enterVoidReturnType(PMLParser.VoidReturnTypeContext ctx); - /** - * Exit a parse tree produced by the {@code VoidReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - */ - void exitVoidReturnType(PMLParser.VoidReturnTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#funcBody}. - * @param ctx the parse tree - */ - void enterFuncBody(PMLParser.FuncBodyContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#funcBody}. - * @param ctx the parse tree - */ - void exitFuncBody(PMLParser.FuncBodyContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#foreachStatement}. - * @param ctx the parse tree - */ - void enterForeachStatement(PMLParser.ForeachStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#foreachStatement}. - * @param ctx the parse tree - */ - void exitForeachStatement(PMLParser.ForeachStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#forRangeStatement}. - * @param ctx the parse tree - */ - void enterForRangeStatement(PMLParser.ForRangeStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#forRangeStatement}. - * @param ctx the parse tree - */ - void exitForRangeStatement(PMLParser.ForRangeStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#breakStatement}. - * @param ctx the parse tree - */ - void enterBreakStatement(PMLParser.BreakStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#breakStatement}. - * @param ctx the parse tree - */ - void exitBreakStatement(PMLParser.BreakStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#continueStatement}. - * @param ctx the parse tree - */ - void enterContinueStatement(PMLParser.ContinueStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#continueStatement}. - * @param ctx the parse tree - */ - void exitContinueStatement(PMLParser.ContinueStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#functionInvokeStatement}. - * @param ctx the parse tree - */ - void enterFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#functionInvokeStatement}. - * @param ctx the parse tree - */ - void exitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#ifStatement}. - * @param ctx the parse tree - */ - void enterIfStatement(PMLParser.IfStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#ifStatement}. - * @param ctx the parse tree - */ - void exitIfStatement(PMLParser.IfStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#elseIfStatement}. - * @param ctx the parse tree - */ - void enterElseIfStatement(PMLParser.ElseIfStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#elseIfStatement}. - * @param ctx the parse tree - */ - void exitElseIfStatement(PMLParser.ElseIfStatementContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#elseStatement}. - * @param ctx the parse tree - */ - void enterElseStatement(PMLParser.ElseStatementContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#elseStatement}. - * @param ctx the parse tree - */ - void exitElseStatement(PMLParser.ElseStatementContext ctx); - /** - * Enter a parse tree produced by the {@code StringType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void enterStringType(PMLParser.StringTypeContext ctx); - /** - * Exit a parse tree produced by the {@code StringType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void exitStringType(PMLParser.StringTypeContext ctx); - /** - * Enter a parse tree produced by the {@code BooleanType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void enterBooleanType(PMLParser.BooleanTypeContext ctx); - /** - * Exit a parse tree produced by the {@code BooleanType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void exitBooleanType(PMLParser.BooleanTypeContext ctx); - /** - * Enter a parse tree produced by the {@code ArrayVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void enterArrayVarType(PMLParser.ArrayVarTypeContext ctx); - /** - * Exit a parse tree produced by the {@code ArrayVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void exitArrayVarType(PMLParser.ArrayVarTypeContext ctx); - /** - * Enter a parse tree produced by the {@code MapVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void enterMapVarType(PMLParser.MapVarTypeContext ctx); - /** - * Exit a parse tree produced by the {@code MapVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void exitMapVarType(PMLParser.MapVarTypeContext ctx); - /** - * Enter a parse tree produced by the {@code AnyType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void enterAnyType(PMLParser.AnyTypeContext ctx); - /** - * Exit a parse tree produced by the {@code AnyType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - */ - void exitAnyType(PMLParser.AnyTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#mapType}. - * @param ctx the parse tree - */ - void enterMapType(PMLParser.MapTypeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#mapType}. - * @param ctx the parse tree - */ - void exitMapType(PMLParser.MapTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#arrayType}. - * @param ctx the parse tree - */ - void enterArrayType(PMLParser.ArrayTypeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#arrayType}. - * @param ctx the parse tree - */ - void exitArrayType(PMLParser.ArrayTypeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#statementBlock}. - * @param ctx the parse tree - */ - void enterStatementBlock(PMLParser.StatementBlockContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#statementBlock}. - * @param ctx the parse tree - */ - void exitStatementBlock(PMLParser.StatementBlockContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#expression}. - * @param ctx the parse tree - */ - void enterExpression(PMLParser.ExpressionContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#expression}. - * @param ctx the parse tree - */ - void exitExpression(PMLParser.ExpressionContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#array}. - * @param ctx the parse tree - */ - void enterArray(PMLParser.ArrayContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#array}. - * @param ctx the parse tree - */ - void exitArray(PMLParser.ArrayContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#map}. - * @param ctx the parse tree - */ - void enterMap(PMLParser.MapContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#map}. - * @param ctx the parse tree - */ - void exitMap(PMLParser.MapContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#mapEntry}. - * @param ctx the parse tree - */ - void enterMapEntry(PMLParser.MapEntryContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#mapEntry}. - * @param ctx the parse tree - */ - void exitMapEntry(PMLParser.MapEntryContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#entryReference}. - * @param ctx the parse tree - */ - void enterEntryReference(PMLParser.EntryReferenceContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#entryReference}. - * @param ctx the parse tree - */ - void exitEntryReference(PMLParser.EntryReferenceContext ctx); - /** - * Enter a parse tree produced by the {@code StringLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void enterStringLiteral(PMLParser.StringLiteralContext ctx); - /** - * Exit a parse tree produced by the {@code StringLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void exitStringLiteral(PMLParser.StringLiteralContext ctx); - /** - * Enter a parse tree produced by the {@code BooleanLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void enterBooleanLiteral(PMLParser.BooleanLiteralContext ctx); - /** - * Exit a parse tree produced by the {@code BooleanLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void exitBooleanLiteral(PMLParser.BooleanLiteralContext ctx); - /** - * Enter a parse tree produced by the {@code NumberLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void enterNumberLiteral(PMLParser.NumberLiteralContext ctx); - /** - * Exit a parse tree produced by the {@code NumberLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void exitNumberLiteral(PMLParser.NumberLiteralContext ctx); - /** - * Enter a parse tree produced by the {@code ArrayLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void enterArrayLiteral(PMLParser.ArrayLiteralContext ctx); - /** - * Exit a parse tree produced by the {@code ArrayLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void exitArrayLiteral(PMLParser.ArrayLiteralContext ctx); - /** - * Enter a parse tree produced by the {@code MapLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void enterMapLiteral(PMLParser.MapLiteralContext ctx); - /** - * Exit a parse tree produced by the {@code MapLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - */ - void exitMapLiteral(PMLParser.MapLiteralContext ctx); - /** - * Enter a parse tree produced by the {@code ReferenceByID} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - */ - void enterReferenceByID(PMLParser.ReferenceByIDContext ctx); - /** - * Exit a parse tree produced by the {@code ReferenceByID} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - */ - void exitReferenceByID(PMLParser.ReferenceByIDContext ctx); - /** - * Enter a parse tree produced by the {@code ReferenceByEntry} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - */ - void enterReferenceByEntry(PMLParser.ReferenceByEntryContext ctx); - /** - * Exit a parse tree produced by the {@code ReferenceByEntry} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - */ - void exitReferenceByEntry(PMLParser.ReferenceByEntryContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#functionInvoke}. - * @param ctx the parse tree - */ - void enterFunctionInvoke(PMLParser.FunctionInvokeContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#functionInvoke}. - * @param ctx the parse tree - */ - void exitFunctionInvoke(PMLParser.FunctionInvokeContext ctx); - /** - * Enter a parse tree produced by {@link PMLParser#functionInvokeArgs}. - * @param ctx the parse tree - */ - void enterFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); - /** - * Exit a parse tree produced by {@link PMLParser#functionInvokeArgs}. - * @param ctx the parse tree - */ - void exitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLParser.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLParser.java deleted file mode 100644 index 8092be594..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLParser.java +++ /dev/null @@ -1,4689 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; -import org.antlr.v4.runtime.atn.*; -import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.misc.*; -import org.antlr.v4.runtime.tree.*; -import java.util.List; -import java.util.Iterator; -import java.util.ArrayList; - -@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) -public class PMLParser extends Parser { - static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } - - protected static final DFA[] _decisionToDFA; - protected static final PredictionContextCache _sharedContextCache = - new PredictionContextCache(); - public static final int - CREATE=1, DELETE=2, BREAK=3, CONTINUE=4, POLICY_ELEMENT=5, RULE=6, WHEN=7, - PERFORMS=8, AS=9, ON=10, DO=11, ANY_USER=12, USERS=13, ANY_USER_WITH_ATTRIBUTE=14, - PROCESS=15, INTERSECTION=16, UNION=17, SET_RESOURCE_ACCESS_RIGHTS=18, - ASSIGN=19, DEASSIGN=20, FROM=21, SET_PROPERTIES=22, OF=23, TO=24, ASSOCIATE=25, - AND=26, WITH=27, DISSOCIATE=28, DENY=29, PROHIBITION=30, OBLIGATION=31, - ACCESS_RIGHTS=32, POLICY_CLASS=33, OBJECT_ATTRIBUTE=34, USER_ATTRIBUTE=35, - OBJECT=36, USER=37, ATTR=38, ANY=39, LET=40, CONST=41, FUNCTION=42, RETURN=43, - BOOLEAN=44, TRUE=45, FALSE=46, STRING_TYPE=47, BOOLEAN_TYPE=48, VOID_TYPE=49, - ARRAY_TYPE=50, MAP_TYPE=51, FOREACH=52, FOR=53, IN=54, IF=55, ELSE=56, - IN_RANGE=57, NUMBER=58, ID=59, STRING=60, DOUBLE_QUOTE_STRING=61, SINGLE_QUOTE_STRING=62, - LINE_COMMENT=63, WS=64, COMMA=65, COLON=66, OPEN_CURLY=67, CLOSE_CURLY=68, - OPEN_BRACKET=69, CLOSE_BRACKET=70, OPEN_ANGLE_BRACKET=71, CLOSE_ANGLE_BRACKET=72, - OPEN_PAREN=73, CLOSE_PAREN=74, IS_COMPLEMENT=75, EQUALS=76, AND_OP=77, - OR_OP=78, EQUALS_OP=79, NOT_EQUALS_OP=80; - public static final int - RULE_pml = 0, RULE_statement = 1, RULE_createPolicyStatement = 2, RULE_createAttributeStatement = 3, - RULE_createUserOrObjectStatement = 4, RULE_createObligationStatement = 5, - RULE_createRuleStatement = 6, RULE_subjectClause = 7, RULE_onClause = 8, - RULE_anyPe = 9, RULE_response = 10, RULE_responseBlock = 11, RULE_responseStatement = 12, - RULE_createProhibitionStatement = 13, RULE_prohibitionContainerList = 14, - RULE_prohibitionContainerExpression = 15, RULE_setNodePropertiesStatement = 16, - RULE_assignStatement = 17, RULE_deassignStatement = 18, RULE_associateStatement = 19, - RULE_dissociateStatement = 20, RULE_setResourceAccessRightsStatement = 21, - RULE_deleteStatement = 22, RULE_deleteType = 23, RULE_nodeType = 24, RULE_deleteRuleStatement = 25, - RULE_variableDeclarationStatement = 26, RULE_functionDefinitionStatement = 27, - RULE_formalArgList = 28, RULE_formalArg = 29, RULE_formalArgType = 30, - RULE_functionReturnStatement = 31, RULE_funcReturnType = 32, RULE_funcBody = 33, - RULE_foreachStatement = 34, RULE_forRangeStatement = 35, RULE_breakStatement = 36, - RULE_continueStatement = 37, RULE_functionInvokeStatement = 38, RULE_ifStatement = 39, - RULE_elseIfStatement = 40, RULE_elseStatement = 41, RULE_variableType = 42, - RULE_mapType = 43, RULE_arrayType = 44, RULE_statementBlock = 45, RULE_expression = 46, - RULE_array = 47, RULE_map = 48, RULE_mapEntry = 49, RULE_entryReference = 50, - RULE_literal = 51, RULE_variableReference = 52, RULE_functionInvoke = 53, - RULE_functionInvokeArgs = 54; - private static String[] makeRuleNames() { - return new String[] { - "pml", "statement", "createPolicyStatement", "createAttributeStatement", - "createUserOrObjectStatement", "createObligationStatement", "createRuleStatement", - "subjectClause", "onClause", "anyPe", "response", "responseBlock", "responseStatement", - "createProhibitionStatement", "prohibitionContainerList", "prohibitionContainerExpression", - "setNodePropertiesStatement", "assignStatement", "deassignStatement", - "associateStatement", "dissociateStatement", "setResourceAccessRightsStatement", - "deleteStatement", "deleteType", "nodeType", "deleteRuleStatement", "variableDeclarationStatement", - "functionDefinitionStatement", "formalArgList", "formalArg", "formalArgType", - "functionReturnStatement", "funcReturnType", "funcBody", "foreachStatement", - "forRangeStatement", "breakStatement", "continueStatement", "functionInvokeStatement", - "ifStatement", "elseIfStatement", "elseStatement", "variableType", "mapType", - "arrayType", "statementBlock", "expression", "array", "map", "mapEntry", - "entryReference", "literal", "variableReference", "functionInvoke", "functionInvokeArgs" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, "','", "':'", "'{'", "'}'", "'['", "']'", - "'<'", "'>'", "'('", "')'", "'!'", "'='", "'&&'", "'||'", "'=='", "'!='" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, "CREATE", "DELETE", "BREAK", "CONTINUE", "POLICY_ELEMENT", "RULE", - "WHEN", "PERFORMS", "AS", "ON", "DO", "ANY_USER", "USERS", "ANY_USER_WITH_ATTRIBUTE", - "PROCESS", "INTERSECTION", "UNION", "SET_RESOURCE_ACCESS_RIGHTS", "ASSIGN", - "DEASSIGN", "FROM", "SET_PROPERTIES", "OF", "TO", "ASSOCIATE", "AND", - "WITH", "DISSOCIATE", "DENY", "PROHIBITION", "OBLIGATION", "ACCESS_RIGHTS", - "POLICY_CLASS", "OBJECT_ATTRIBUTE", "USER_ATTRIBUTE", "OBJECT", "USER", - "ATTR", "ANY", "LET", "CONST", "FUNCTION", "RETURN", "BOOLEAN", "TRUE", - "FALSE", "STRING_TYPE", "BOOLEAN_TYPE", "VOID_TYPE", "ARRAY_TYPE", "MAP_TYPE", - "FOREACH", "FOR", "IN", "IF", "ELSE", "IN_RANGE", "NUMBER", "ID", "STRING", - "DOUBLE_QUOTE_STRING", "SINGLE_QUOTE_STRING", "LINE_COMMENT", "WS", "COMMA", - "COLON", "OPEN_CURLY", "CLOSE_CURLY", "OPEN_BRACKET", "CLOSE_BRACKET", - "OPEN_ANGLE_BRACKET", "CLOSE_ANGLE_BRACKET", "OPEN_PAREN", "CLOSE_PAREN", - "IS_COMPLEMENT", "EQUALS", "AND_OP", "OR_OP", "EQUALS_OP", "NOT_EQUALS_OP" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); - public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); - - /** - * @deprecated Use {@link #VOCABULARY} instead. - */ - @Deprecated - public static final String[] tokenNames; - static { - tokenNames = new String[_SYMBOLIC_NAMES.length]; - for (int i = 0; i < tokenNames.length; i++) { - tokenNames[i] = VOCABULARY.getLiteralName(i); - if (tokenNames[i] == null) { - tokenNames[i] = VOCABULARY.getSymbolicName(i); - } - - if (tokenNames[i] == null) { - tokenNames[i] = ""; - } - } - } - - @Override - @Deprecated - public String[] getTokenNames() { - return tokenNames; - } - - @Override - - public Vocabulary getVocabulary() { - return VOCABULARY; - } - - @Override - public String getGrammarFileName() { return "PML.g4"; } - - @Override - public String[] getRuleNames() { return ruleNames; } - - @Override - public String getSerializedATN() { return _serializedATN; } - - @Override - public ATN getATN() { return _ATN; } - - public PMLParser(TokenStream input) { - super(input); - _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); - } - - public static class PmlContext extends ParserRuleContext { - public TerminalNode EOF() { return getToken(PMLParser.EOF, 0); } - public List statement() { - return getRuleContexts(StatementContext.class); - } - public StatementContext statement(int i) { - return getRuleContext(StatementContext.class,i); - } - public PmlContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_pml; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterPml(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitPml(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitPml(this); - else return visitor.visitChildren(this); - } - } - - public final PmlContext pml() throws RecognitionException { - PmlContext _localctx = new PmlContext(_ctx, getState()); - enterRule(_localctx, 0, RULE_pml); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(113); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CREATE) | (1L << DELETE) | (1L << BREAK) | (1L << CONTINUE) | (1L << SET_RESOURCE_ACCESS_RIGHTS) | (1L << ASSIGN) | (1L << DEASSIGN) | (1L << SET_PROPERTIES) | (1L << ASSOCIATE) | (1L << DISSOCIATE) | (1L << LET) | (1L << CONST) | (1L << FUNCTION) | (1L << RETURN) | (1L << FOREACH) | (1L << FOR) | (1L << IF) | (1L << ID))) != 0)) { - { - { - setState(110); - statement(); - } - } - setState(115); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(116); - match(EOF); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class StatementContext extends ParserRuleContext { - public CreatePolicyStatementContext createPolicyStatement() { - return getRuleContext(CreatePolicyStatementContext.class,0); - } - public CreateAttributeStatementContext createAttributeStatement() { - return getRuleContext(CreateAttributeStatementContext.class,0); - } - public CreateUserOrObjectStatementContext createUserOrObjectStatement() { - return getRuleContext(CreateUserOrObjectStatementContext.class,0); - } - public CreateObligationStatementContext createObligationStatement() { - return getRuleContext(CreateObligationStatementContext.class,0); - } - public CreateProhibitionStatementContext createProhibitionStatement() { - return getRuleContext(CreateProhibitionStatementContext.class,0); - } - public SetNodePropertiesStatementContext setNodePropertiesStatement() { - return getRuleContext(SetNodePropertiesStatementContext.class,0); - } - public AssignStatementContext assignStatement() { - return getRuleContext(AssignStatementContext.class,0); - } - public DeassignStatementContext deassignStatement() { - return getRuleContext(DeassignStatementContext.class,0); - } - public AssociateStatementContext associateStatement() { - return getRuleContext(AssociateStatementContext.class,0); - } - public DissociateStatementContext dissociateStatement() { - return getRuleContext(DissociateStatementContext.class,0); - } - public SetResourceAccessRightsStatementContext setResourceAccessRightsStatement() { - return getRuleContext(SetResourceAccessRightsStatementContext.class,0); - } - public DeleteStatementContext deleteStatement() { - return getRuleContext(DeleteStatementContext.class,0); - } - public DeleteRuleStatementContext deleteRuleStatement() { - return getRuleContext(DeleteRuleStatementContext.class,0); - } - public VariableDeclarationStatementContext variableDeclarationStatement() { - return getRuleContext(VariableDeclarationStatementContext.class,0); - } - public FunctionDefinitionStatementContext functionDefinitionStatement() { - return getRuleContext(FunctionDefinitionStatementContext.class,0); - } - public FunctionReturnStatementContext functionReturnStatement() { - return getRuleContext(FunctionReturnStatementContext.class,0); - } - public ForeachStatementContext foreachStatement() { - return getRuleContext(ForeachStatementContext.class,0); - } - public ForRangeStatementContext forRangeStatement() { - return getRuleContext(ForRangeStatementContext.class,0); - } - public BreakStatementContext breakStatement() { - return getRuleContext(BreakStatementContext.class,0); - } - public ContinueStatementContext continueStatement() { - return getRuleContext(ContinueStatementContext.class,0); - } - public FunctionInvokeStatementContext functionInvokeStatement() { - return getRuleContext(FunctionInvokeStatementContext.class,0); - } - public IfStatementContext ifStatement() { - return getRuleContext(IfStatementContext.class,0); - } - public StatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_statement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitStatement(this); - else return visitor.visitChildren(this); - } - } - - public final StatementContext statement() throws RecognitionException { - StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 2, RULE_statement); - try { - enterOuterAlt(_localctx, 1); - { - setState(140); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { - case 1: - { - setState(118); - createPolicyStatement(); - } - break; - case 2: - { - setState(119); - createAttributeStatement(); - } - break; - case 3: - { - setState(120); - createUserOrObjectStatement(); - } - break; - case 4: - { - setState(121); - createObligationStatement(); - } - break; - case 5: - { - setState(122); - createProhibitionStatement(); - } - break; - case 6: - { - setState(123); - setNodePropertiesStatement(); - } - break; - case 7: - { - setState(124); - assignStatement(); - } - break; - case 8: - { - setState(125); - deassignStatement(); - } - break; - case 9: - { - setState(126); - associateStatement(); - } - break; - case 10: - { - setState(127); - dissociateStatement(); - } - break; - case 11: - { - setState(128); - setResourceAccessRightsStatement(); - } - break; - case 12: - { - setState(129); - deleteStatement(); - } - break; - case 13: - { - setState(130); - deleteRuleStatement(); - } - break; - case 14: - { - setState(131); - variableDeclarationStatement(); - } - break; - case 15: - { - setState(132); - functionDefinitionStatement(); - } - break; - case 16: - { - setState(133); - functionReturnStatement(); - } - break; - case 17: - { - setState(134); - foreachStatement(); - } - break; - case 18: - { - setState(135); - forRangeStatement(); - } - break; - case 19: - { - setState(136); - breakStatement(); - } - break; - case 20: - { - setState(137); - continueStatement(); - } - break; - case 21: - { - setState(138); - functionInvokeStatement(); - } - break; - case 22: - { - setState(139); - ifStatement(); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreatePolicyStatementContext extends ParserRuleContext { - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode POLICY_CLASS() { return getToken(PMLParser.POLICY_CLASS, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public CreatePolicyStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createPolicyStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreatePolicyStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreatePolicyStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreatePolicyStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreatePolicyStatementContext createPolicyStatement() throws RecognitionException { - CreatePolicyStatementContext _localctx = new CreatePolicyStatementContext(_ctx, getState()); - enterRule(_localctx, 4, RULE_createPolicyStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(142); - match(CREATE); - setState(143); - match(POLICY_CLASS); - setState(144); - expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreateAttributeStatementContext extends ParserRuleContext { - public ExpressionContext name; - public ExpressionContext parents; - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode IN() { return getToken(PMLParser.IN, 0); } - public TerminalNode OBJECT_ATTRIBUTE() { return getToken(PMLParser.OBJECT_ATTRIBUTE, 0); } - public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public CreateAttributeStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createAttributeStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreateAttributeStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreateAttributeStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreateAttributeStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreateAttributeStatementContext createAttributeStatement() throws RecognitionException { - CreateAttributeStatementContext _localctx = new CreateAttributeStatementContext(_ctx, getState()); - enterRule(_localctx, 6, RULE_createAttributeStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(146); - match(CREATE); - setState(147); - _la = _input.LA(1); - if ( !(_la==OBJECT_ATTRIBUTE || _la==USER_ATTRIBUTE) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(148); - ((CreateAttributeStatementContext)_localctx).name = expression(0); - setState(149); - match(IN); - setState(150); - ((CreateAttributeStatementContext)_localctx).parents = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreateUserOrObjectStatementContext extends ParserRuleContext { - public ExpressionContext name; - public ExpressionContext parents; - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode IN() { return getToken(PMLParser.IN, 0); } - public TerminalNode USER() { return getToken(PMLParser.USER, 0); } - public TerminalNode OBJECT() { return getToken(PMLParser.OBJECT, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public CreateUserOrObjectStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createUserOrObjectStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreateUserOrObjectStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreateUserOrObjectStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreateUserOrObjectStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreateUserOrObjectStatementContext createUserOrObjectStatement() throws RecognitionException { - CreateUserOrObjectStatementContext _localctx = new CreateUserOrObjectStatementContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_createUserOrObjectStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(152); - match(CREATE); - setState(153); - _la = _input.LA(1); - if ( !(_la==OBJECT || _la==USER) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(154); - ((CreateUserOrObjectStatementContext)_localctx).name = expression(0); - setState(155); - match(IN); - setState(156); - ((CreateUserOrObjectStatementContext)_localctx).parents = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreateObligationStatementContext extends ParserRuleContext { - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } - public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } - public List createRuleStatement() { - return getRuleContexts(CreateRuleStatementContext.class); - } - public CreateRuleStatementContext createRuleStatement(int i) { - return getRuleContext(CreateRuleStatementContext.class,i); - } - public CreateObligationStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createObligationStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreateObligationStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreateObligationStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreateObligationStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreateObligationStatementContext createObligationStatement() throws RecognitionException { - CreateObligationStatementContext _localctx = new CreateObligationStatementContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_createObligationStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(158); - match(CREATE); - setState(159); - match(OBLIGATION); - setState(160); - expression(0); - setState(161); - match(OPEN_CURLY); - setState(165); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==CREATE) { - { - { - setState(162); - createRuleStatement(); - } - } - setState(167); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(168); - match(CLOSE_CURLY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreateRuleStatementContext extends ParserRuleContext { - public ExpressionContext ruleName; - public ExpressionContext performsClause; - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode RULE() { return getToken(PMLParser.RULE, 0); } - public TerminalNode WHEN() { return getToken(PMLParser.WHEN, 0); } - public SubjectClauseContext subjectClause() { - return getRuleContext(SubjectClauseContext.class,0); - } - public TerminalNode PERFORMS() { return getToken(PMLParser.PERFORMS, 0); } - public ResponseContext response() { - return getRuleContext(ResponseContext.class,0); - } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public TerminalNode ON() { return getToken(PMLParser.ON, 0); } - public OnClauseContext onClause() { - return getRuleContext(OnClauseContext.class,0); - } - public CreateRuleStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createRuleStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreateRuleStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreateRuleStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreateRuleStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreateRuleStatementContext createRuleStatement() throws RecognitionException { - CreateRuleStatementContext _localctx = new CreateRuleStatementContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_createRuleStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(170); - match(CREATE); - setState(171); - match(RULE); - setState(172); - ((CreateRuleStatementContext)_localctx).ruleName = expression(0); - setState(173); - match(WHEN); - setState(174); - subjectClause(); - setState(175); - match(PERFORMS); - setState(176); - ((CreateRuleStatementContext)_localctx).performsClause = expression(0); - setState(179); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ON) { - { - setState(177); - match(ON); - setState(178); - onClause(); - } - } - - setState(181); - response(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class SubjectClauseContext extends ParserRuleContext { - public SubjectClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_subjectClause; } - - public SubjectClauseContext() { } - public void copyFrom(SubjectClauseContext ctx) { - super.copyFrom(ctx); - } - } - public static class UserSubjectContext extends SubjectClauseContext { - public ExpressionContext user; - public TerminalNode USER() { return getToken(PMLParser.USER, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public UserSubjectContext(SubjectClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterUserSubject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitUserSubject(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitUserSubject(this); - else return visitor.visitChildren(this); - } - } - public static class UsersListSubjectContext extends SubjectClauseContext { - public ExpressionContext users; - public TerminalNode USERS() { return getToken(PMLParser.USERS, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public UsersListSubjectContext(SubjectClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterUsersListSubject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitUsersListSubject(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitUsersListSubject(this); - else return visitor.visitChildren(this); - } - } - public static class UserAttrSubjectContext extends SubjectClauseContext { - public ExpressionContext attribute; - public TerminalNode ANY_USER_WITH_ATTRIBUTE() { return getToken(PMLParser.ANY_USER_WITH_ATTRIBUTE, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public UserAttrSubjectContext(SubjectClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterUserAttrSubject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitUserAttrSubject(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitUserAttrSubject(this); - else return visitor.visitChildren(this); - } - } - public static class ProcessSubjectContext extends SubjectClauseContext { - public ExpressionContext process; - public TerminalNode PROCESS() { return getToken(PMLParser.PROCESS, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public ProcessSubjectContext(SubjectClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterProcessSubject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitProcessSubject(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitProcessSubject(this); - else return visitor.visitChildren(this); - } - } - public static class AnyUserSubjectContext extends SubjectClauseContext { - public TerminalNode ANY_USER() { return getToken(PMLParser.ANY_USER, 0); } - public AnyUserSubjectContext(SubjectClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyUserSubject(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyUserSubject(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyUserSubject(this); - else return visitor.visitChildren(this); - } - } - - public final SubjectClauseContext subjectClause() throws RecognitionException { - SubjectClauseContext _localctx = new SubjectClauseContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_subjectClause); - try { - setState(192); - _errHandler.sync(this); - switch (_input.LA(1)) { - case ANY_USER: - _localctx = new AnyUserSubjectContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(183); - match(ANY_USER); - } - break; - case USER: - _localctx = new UserSubjectContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(184); - match(USER); - setState(185); - ((UserSubjectContext)_localctx).user = expression(0); - } - break; - case USERS: - _localctx = new UsersListSubjectContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(186); - match(USERS); - setState(187); - ((UsersListSubjectContext)_localctx).users = expression(0); - } - break; - case ANY_USER_WITH_ATTRIBUTE: - _localctx = new UserAttrSubjectContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(188); - match(ANY_USER_WITH_ATTRIBUTE); - setState(189); - ((UserAttrSubjectContext)_localctx).attribute = expression(0); - } - break; - case PROCESS: - _localctx = new ProcessSubjectContext(_localctx); - enterOuterAlt(_localctx, 5); - { - setState(190); - match(PROCESS); - setState(191); - ((ProcessSubjectContext)_localctx).process = expression(0); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class OnClauseContext extends ParserRuleContext { - public OnClauseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_onClause; } - - public OnClauseContext() { } - public void copyFrom(OnClauseContext ctx) { - super.copyFrom(ctx); - } - } - public static class AnyContainedInContext extends OnClauseContext { - public AnyPeContext anyPe() { - return getRuleContext(AnyPeContext.class,0); - } - public TerminalNode IN() { return getToken(PMLParser.IN, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public AnyContainedInContext(OnClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyContainedIn(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyContainedIn(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyContainedIn(this); - else return visitor.visitChildren(this); - } - } - public static class AnyOfSetContext extends OnClauseContext { - public AnyPeContext anyPe() { - return getRuleContext(AnyPeContext.class,0); - } - public TerminalNode OF() { return getToken(PMLParser.OF, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public AnyOfSetContext(OnClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyOfSet(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyOfSet(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyOfSet(this); - else return visitor.visitChildren(this); - } - } - public static class AnyPolicyElementContext extends OnClauseContext { - public AnyPeContext anyPe() { - return getRuleContext(AnyPeContext.class,0); - } - public AnyPolicyElementContext(OnClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyPolicyElement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyPolicyElement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyPolicyElement(this); - else return visitor.visitChildren(this); - } - } - public static class PolicyElementContext extends OnClauseContext { - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public PolicyElementContext(OnClauseContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterPolicyElement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitPolicyElement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitPolicyElement(this); - else return visitor.visitChildren(this); - } - } - - public final OnClauseContext onClause() throws RecognitionException { - OnClauseContext _localctx = new OnClauseContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_onClause); - try { - setState(204); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { - case 1: - _localctx = new PolicyElementContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(194); - expression(0); - } - break; - case 2: - _localctx = new AnyPolicyElementContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(195); - anyPe(); - } - break; - case 3: - _localctx = new AnyContainedInContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(196); - anyPe(); - setState(197); - match(IN); - setState(198); - expression(0); - } - break; - case 4: - _localctx = new AnyOfSetContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(200); - anyPe(); - setState(201); - match(OF); - setState(202); - expression(0); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AnyPeContext extends ParserRuleContext { - public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } - public TerminalNode POLICY_ELEMENT() { return getToken(PMLParser.POLICY_ELEMENT, 0); } - public AnyPeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_anyPe; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyPe(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyPe(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyPe(this); - else return visitor.visitChildren(this); - } - } - - public final AnyPeContext anyPe() throws RecognitionException { - AnyPeContext _localctx = new AnyPeContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_anyPe); - try { - enterOuterAlt(_localctx, 1); - { - setState(206); - match(ANY); - setState(207); - match(POLICY_ELEMENT); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ResponseContext extends ParserRuleContext { - public TerminalNode DO() { return getToken(PMLParser.DO, 0); } - public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } - public ResponseBlockContext responseBlock() { - return getRuleContext(ResponseBlockContext.class,0); - } - public ResponseContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_response; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterResponse(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitResponse(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitResponse(this); - else return visitor.visitChildren(this); - } - } - - public final ResponseContext response() throws RecognitionException { - ResponseContext _localctx = new ResponseContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_response); - try { - enterOuterAlt(_localctx, 1); - { - setState(209); - match(DO); - setState(210); - match(OPEN_PAREN); - setState(211); - match(ID); - setState(212); - match(CLOSE_PAREN); - setState(213); - responseBlock(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ResponseBlockContext extends ParserRuleContext { - public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } - public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } - public List responseStatement() { - return getRuleContexts(ResponseStatementContext.class); - } - public ResponseStatementContext responseStatement(int i) { - return getRuleContext(ResponseStatementContext.class,i); - } - public ResponseBlockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_responseBlock; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterResponseBlock(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitResponseBlock(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitResponseBlock(this); - else return visitor.visitChildren(this); - } - } - - public final ResponseBlockContext responseBlock() throws RecognitionException { - ResponseBlockContext _localctx = new ResponseBlockContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_responseBlock); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(215); - match(OPEN_CURLY); - setState(219); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CREATE) | (1L << DELETE) | (1L << BREAK) | (1L << CONTINUE) | (1L << SET_RESOURCE_ACCESS_RIGHTS) | (1L << ASSIGN) | (1L << DEASSIGN) | (1L << SET_PROPERTIES) | (1L << ASSOCIATE) | (1L << DISSOCIATE) | (1L << LET) | (1L << CONST) | (1L << FUNCTION) | (1L << RETURN) | (1L << FOREACH) | (1L << FOR) | (1L << IF) | (1L << ID))) != 0)) { - { - { - setState(216); - responseStatement(); - } - } - setState(221); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(222); - match(CLOSE_CURLY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ResponseStatementContext extends ParserRuleContext { - public StatementContext statement() { - return getRuleContext(StatementContext.class,0); - } - public CreateRuleStatementContext createRuleStatement() { - return getRuleContext(CreateRuleStatementContext.class,0); - } - public DeleteRuleStatementContext deleteRuleStatement() { - return getRuleContext(DeleteRuleStatementContext.class,0); - } - public ResponseStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_responseStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterResponseStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitResponseStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitResponseStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ResponseStatementContext responseStatement() throws RecognitionException { - ResponseStatementContext _localctx = new ResponseStatementContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_responseStatement); - try { - setState(227); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { - case 1: - enterOuterAlt(_localctx, 1); - { - setState(224); - statement(); - } - break; - case 2: - enterOuterAlt(_localctx, 2); - { - setState(225); - createRuleStatement(); - } - break; - case 3: - enterOuterAlt(_localctx, 3); - { - setState(226); - deleteRuleStatement(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class CreateProhibitionStatementContext extends ParserRuleContext { - public ExpressionContext name; - public ExpressionContext subject; - public ExpressionContext accessRights; - public ProhibitionContainerListContext containers; - public TerminalNode CREATE() { return getToken(PMLParser.CREATE, 0); } - public TerminalNode PROHIBITION() { return getToken(PMLParser.PROHIBITION, 0); } - public TerminalNode DENY() { return getToken(PMLParser.DENY, 0); } - public TerminalNode ACCESS_RIGHTS() { return getToken(PMLParser.ACCESS_RIGHTS, 0); } - public TerminalNode ON() { return getToken(PMLParser.ON, 0); } - public TerminalNode OF() { return getToken(PMLParser.OF, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public TerminalNode USER() { return getToken(PMLParser.USER, 0); } - public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } - public TerminalNode PROCESS() { return getToken(PMLParser.PROCESS, 0); } - public TerminalNode INTERSECTION() { return getToken(PMLParser.INTERSECTION, 0); } - public TerminalNode UNION() { return getToken(PMLParser.UNION, 0); } - public ProhibitionContainerListContext prohibitionContainerList() { - return getRuleContext(ProhibitionContainerListContext.class,0); - } - public CreateProhibitionStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_createProhibitionStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterCreateProhibitionStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitCreateProhibitionStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitCreateProhibitionStatement(this); - else return visitor.visitChildren(this); - } - } - - public final CreateProhibitionStatementContext createProhibitionStatement() throws RecognitionException { - CreateProhibitionStatementContext _localctx = new CreateProhibitionStatementContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_createProhibitionStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(229); - match(CREATE); - setState(230); - match(PROHIBITION); - setState(231); - ((CreateProhibitionStatementContext)_localctx).name = expression(0); - setState(232); - match(DENY); - setState(233); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PROCESS) | (1L << USER_ATTRIBUTE) | (1L << USER))) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(234); - ((CreateProhibitionStatementContext)_localctx).subject = expression(0); - setState(235); - match(ACCESS_RIGHTS); - setState(236); - ((CreateProhibitionStatementContext)_localctx).accessRights = expression(0); - setState(237); - match(ON); - setState(238); - _la = _input.LA(1); - if ( !(_la==INTERSECTION || _la==UNION) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(239); - match(OF); - setState(240); - ((CreateProhibitionStatementContext)_localctx).containers = prohibitionContainerList(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ProhibitionContainerListContext extends ParserRuleContext { - public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } - public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } - public List prohibitionContainerExpression() { - return getRuleContexts(ProhibitionContainerExpressionContext.class); - } - public ProhibitionContainerExpressionContext prohibitionContainerExpression(int i) { - return getRuleContext(ProhibitionContainerExpressionContext.class,i); - } - public List COMMA() { return getTokens(PMLParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(PMLParser.COMMA, i); - } - public ProhibitionContainerListContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_prohibitionContainerList; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterProhibitionContainerList(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitProhibitionContainerList(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitProhibitionContainerList(this); - else return visitor.visitChildren(this); - } - } - - public final ProhibitionContainerListContext prohibitionContainerList() throws RecognitionException { - ProhibitionContainerListContext _localctx = new ProhibitionContainerListContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_prohibitionContainerList); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(242); - match(OPEN_BRACKET); - setState(251); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (BOOLEAN - 44)) | (1L << (NUMBER - 44)) | (1L << (ID - 44)) | (1L << (STRING - 44)) | (1L << (OPEN_CURLY - 44)) | (1L << (OPEN_BRACKET - 44)) | (1L << (IS_COMPLEMENT - 44)))) != 0)) { - { - setState(243); - prohibitionContainerExpression(); - setState(248); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(244); - match(COMMA); - setState(245); - prohibitionContainerExpression(); - } - } - setState(250); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - setState(253); - match(CLOSE_BRACKET); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ProhibitionContainerExpressionContext extends ParserRuleContext { - public ExpressionContext container; - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public TerminalNode IS_COMPLEMENT() { return getToken(PMLParser.IS_COMPLEMENT, 0); } - public ProhibitionContainerExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_prohibitionContainerExpression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterProhibitionContainerExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitProhibitionContainerExpression(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitProhibitionContainerExpression(this); - else return visitor.visitChildren(this); - } - } - - public final ProhibitionContainerExpressionContext prohibitionContainerExpression() throws RecognitionException { - ProhibitionContainerExpressionContext _localctx = new ProhibitionContainerExpressionContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_prohibitionContainerExpression); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(256); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==IS_COMPLEMENT) { - { - setState(255); - match(IS_COMPLEMENT); - } - } - - setState(258); - ((ProhibitionContainerExpressionContext)_localctx).container = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class SetNodePropertiesStatementContext extends ParserRuleContext { - public ExpressionContext name; - public ExpressionContext properties; - public TerminalNode SET_PROPERTIES() { return getToken(PMLParser.SET_PROPERTIES, 0); } - public TerminalNode OF() { return getToken(PMLParser.OF, 0); } - public TerminalNode TO() { return getToken(PMLParser.TO, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public SetNodePropertiesStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_setNodePropertiesStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterSetNodePropertiesStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitSetNodePropertiesStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitSetNodePropertiesStatement(this); - else return visitor.visitChildren(this); - } - } - - public final SetNodePropertiesStatementContext setNodePropertiesStatement() throws RecognitionException { - SetNodePropertiesStatementContext _localctx = new SetNodePropertiesStatementContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_setNodePropertiesStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(260); - match(SET_PROPERTIES); - setState(261); - match(OF); - setState(262); - ((SetNodePropertiesStatementContext)_localctx).name = expression(0); - setState(263); - match(TO); - setState(264); - ((SetNodePropertiesStatementContext)_localctx).properties = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AssignStatementContext extends ParserRuleContext { - public ExpressionContext childNode; - public ExpressionContext parentNodes; - public TerminalNode ASSIGN() { return getToken(PMLParser.ASSIGN, 0); } - public TerminalNode TO() { return getToken(PMLParser.TO, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public AssignStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_assignStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAssignStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAssignStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAssignStatement(this); - else return visitor.visitChildren(this); - } - } - - public final AssignStatementContext assignStatement() throws RecognitionException { - AssignStatementContext _localctx = new AssignStatementContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_assignStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(266); - match(ASSIGN); - setState(267); - ((AssignStatementContext)_localctx).childNode = expression(0); - setState(268); - match(TO); - setState(269); - ((AssignStatementContext)_localctx).parentNodes = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class DeassignStatementContext extends ParserRuleContext { - public ExpressionContext childNode; - public ExpressionContext parentNodes; - public TerminalNode DEASSIGN() { return getToken(PMLParser.DEASSIGN, 0); } - public TerminalNode FROM() { return getToken(PMLParser.FROM, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public DeassignStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_deassignStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeassignStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeassignStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeassignStatement(this); - else return visitor.visitChildren(this); - } - } - - public final DeassignStatementContext deassignStatement() throws RecognitionException { - DeassignStatementContext _localctx = new DeassignStatementContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_deassignStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(271); - match(DEASSIGN); - setState(272); - ((DeassignStatementContext)_localctx).childNode = expression(0); - setState(273); - match(FROM); - setState(274); - ((DeassignStatementContext)_localctx).parentNodes = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class AssociateStatementContext extends ParserRuleContext { - public ExpressionContext ua; - public ExpressionContext target; - public ExpressionContext accessRights; - public TerminalNode ASSOCIATE() { return getToken(PMLParser.ASSOCIATE, 0); } - public TerminalNode AND() { return getToken(PMLParser.AND, 0); } - public TerminalNode WITH() { return getToken(PMLParser.WITH, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public AssociateStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_associateStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAssociateStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAssociateStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAssociateStatement(this); - else return visitor.visitChildren(this); - } - } - - public final AssociateStatementContext associateStatement() throws RecognitionException { - AssociateStatementContext _localctx = new AssociateStatementContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_associateStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(276); - match(ASSOCIATE); - setState(277); - ((AssociateStatementContext)_localctx).ua = expression(0); - setState(278); - match(AND); - setState(279); - ((AssociateStatementContext)_localctx).target = expression(0); - setState(280); - match(WITH); - setState(281); - ((AssociateStatementContext)_localctx).accessRights = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class DissociateStatementContext extends ParserRuleContext { - public ExpressionContext ua; - public ExpressionContext target; - public TerminalNode DISSOCIATE() { return getToken(PMLParser.DISSOCIATE, 0); } - public TerminalNode AND() { return getToken(PMLParser.AND, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public DissociateStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_dissociateStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDissociateStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDissociateStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDissociateStatement(this); - else return visitor.visitChildren(this); - } - } - - public final DissociateStatementContext dissociateStatement() throws RecognitionException { - DissociateStatementContext _localctx = new DissociateStatementContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_dissociateStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(283); - match(DISSOCIATE); - setState(284); - ((DissociateStatementContext)_localctx).ua = expression(0); - setState(285); - match(AND); - setState(286); - ((DissociateStatementContext)_localctx).target = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class SetResourceAccessRightsStatementContext extends ParserRuleContext { - public ExpressionContext accessRights; - public TerminalNode SET_RESOURCE_ACCESS_RIGHTS() { return getToken(PMLParser.SET_RESOURCE_ACCESS_RIGHTS, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public SetResourceAccessRightsStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_setResourceAccessRightsStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterSetResourceAccessRightsStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitSetResourceAccessRightsStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitSetResourceAccessRightsStatement(this); - else return visitor.visitChildren(this); - } - } - - public final SetResourceAccessRightsStatementContext setResourceAccessRightsStatement() throws RecognitionException { - SetResourceAccessRightsStatementContext _localctx = new SetResourceAccessRightsStatementContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_setResourceAccessRightsStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(288); - match(SET_RESOURCE_ACCESS_RIGHTS); - setState(289); - ((SetResourceAccessRightsStatementContext)_localctx).accessRights = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class DeleteStatementContext extends ParserRuleContext { - public TerminalNode DELETE() { return getToken(PMLParser.DELETE, 0); } - public DeleteTypeContext deleteType() { - return getRuleContext(DeleteTypeContext.class,0); - } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public DeleteStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_deleteStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeleteStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeleteStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeleteStatement(this); - else return visitor.visitChildren(this); - } - } - - public final DeleteStatementContext deleteStatement() throws RecognitionException { - DeleteStatementContext _localctx = new DeleteStatementContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_deleteStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(291); - match(DELETE); - setState(292); - deleteType(); - setState(293); - expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class DeleteTypeContext extends ParserRuleContext { - public DeleteTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_deleteType; } - - public DeleteTypeContext() { } - public void copyFrom(DeleteTypeContext ctx) { - super.copyFrom(ctx); - } - } - public static class DeleteNodeContext extends DeleteTypeContext { - public NodeTypeContext nodeType() { - return getRuleContext(NodeTypeContext.class,0); - } - public DeleteNodeContext(DeleteTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeleteNode(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeleteNode(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeleteNode(this); - else return visitor.visitChildren(this); - } - } - public static class DeleteProhibitionContext extends DeleteTypeContext { - public TerminalNode PROHIBITION() { return getToken(PMLParser.PROHIBITION, 0); } - public DeleteProhibitionContext(DeleteTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeleteProhibition(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeleteProhibition(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeleteProhibition(this); - else return visitor.visitChildren(this); - } - } - public static class DeleteObligationContext extends DeleteTypeContext { - public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } - public DeleteObligationContext(DeleteTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeleteObligation(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeleteObligation(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeleteObligation(this); - else return visitor.visitChildren(this); - } - } - - public final DeleteTypeContext deleteType() throws RecognitionException { - DeleteTypeContext _localctx = new DeleteTypeContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_deleteType); - try { - setState(298); - _errHandler.sync(this); - switch (_input.LA(1)) { - case POLICY_CLASS: - case OBJECT_ATTRIBUTE: - case USER_ATTRIBUTE: - case OBJECT: - case USER: - _localctx = new DeleteNodeContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(295); - nodeType(); - } - break; - case OBLIGATION: - _localctx = new DeleteObligationContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(296); - match(OBLIGATION); - } - break; - case PROHIBITION: - _localctx = new DeleteProhibitionContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(297); - match(PROHIBITION); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class NodeTypeContext extends ParserRuleContext { - public TerminalNode POLICY_CLASS() { return getToken(PMLParser.POLICY_CLASS, 0); } - public TerminalNode OBJECT_ATTRIBUTE() { return getToken(PMLParser.OBJECT_ATTRIBUTE, 0); } - public TerminalNode USER_ATTRIBUTE() { return getToken(PMLParser.USER_ATTRIBUTE, 0); } - public TerminalNode OBJECT() { return getToken(PMLParser.OBJECT, 0); } - public TerminalNode USER() { return getToken(PMLParser.USER, 0); } - public NodeTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_nodeType; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterNodeType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitNodeType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitNodeType(this); - else return visitor.visitChildren(this); - } - } - - public final NodeTypeContext nodeType() throws RecognitionException { - NodeTypeContext _localctx = new NodeTypeContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_nodeType); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(300); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << POLICY_CLASS) | (1L << OBJECT_ATTRIBUTE) | (1L << USER_ATTRIBUTE) | (1L << OBJECT) | (1L << USER))) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class DeleteRuleStatementContext extends ParserRuleContext { - public ExpressionContext ruleName; - public ExpressionContext obligationName; - public TerminalNode DELETE() { return getToken(PMLParser.DELETE, 0); } - public TerminalNode RULE() { return getToken(PMLParser.RULE, 0); } - public TerminalNode FROM() { return getToken(PMLParser.FROM, 0); } - public TerminalNode OBLIGATION() { return getToken(PMLParser.OBLIGATION, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public DeleteRuleStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_deleteRuleStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterDeleteRuleStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitDeleteRuleStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitDeleteRuleStatement(this); - else return visitor.visitChildren(this); - } - } - - public final DeleteRuleStatementContext deleteRuleStatement() throws RecognitionException { - DeleteRuleStatementContext _localctx = new DeleteRuleStatementContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_deleteRuleStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(302); - match(DELETE); - setState(303); - match(RULE); - setState(304); - ((DeleteRuleStatementContext)_localctx).ruleName = expression(0); - setState(305); - match(FROM); - setState(306); - match(OBLIGATION); - setState(307); - ((DeleteRuleStatementContext)_localctx).obligationName = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class VariableDeclarationStatementContext extends ParserRuleContext { - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public TerminalNode EQUALS() { return getToken(PMLParser.EQUALS, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public TerminalNode LET() { return getToken(PMLParser.LET, 0); } - public TerminalNode CONST() { return getToken(PMLParser.CONST, 0); } - public VariableDeclarationStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_variableDeclarationStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterVariableDeclarationStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitVariableDeclarationStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitVariableDeclarationStatement(this); - else return visitor.visitChildren(this); - } - } - - public final VariableDeclarationStatementContext variableDeclarationStatement() throws RecognitionException { - VariableDeclarationStatementContext _localctx = new VariableDeclarationStatementContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_variableDeclarationStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(310); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==LET || _la==CONST) { - { - setState(309); - _la = _input.LA(1); - if ( !(_la==LET || _la==CONST) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - } - } - - setState(312); - match(ID); - setState(313); - match(EQUALS); - setState(314); - expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FunctionDefinitionStatementContext extends ParserRuleContext { - public TerminalNode FUNCTION() { return getToken(PMLParser.FUNCTION, 0); } - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } - public FormalArgListContext formalArgList() { - return getRuleContext(FormalArgListContext.class,0); - } - public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } - public FuncBodyContext funcBody() { - return getRuleContext(FuncBodyContext.class,0); - } - public FuncReturnTypeContext funcReturnType() { - return getRuleContext(FuncReturnTypeContext.class,0); - } - public FunctionDefinitionStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionDefinitionStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFunctionDefinitionStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFunctionDefinitionStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFunctionDefinitionStatement(this); - else return visitor.visitChildren(this); - } - } - - public final FunctionDefinitionStatementContext functionDefinitionStatement() throws RecognitionException { - FunctionDefinitionStatementContext _localctx = new FunctionDefinitionStatementContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_functionDefinitionStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(316); - match(FUNCTION); - setState(317); - match(ID); - setState(318); - match(OPEN_PAREN); - setState(319); - formalArgList(); - setState(320); - match(CLOSE_PAREN); - setState(322); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 39)) & ~0x3f) == 0 && ((1L << (_la - 39)) & ((1L << (ANY - 39)) | (1L << (STRING_TYPE - 39)) | (1L << (BOOLEAN_TYPE - 39)) | (1L << (VOID_TYPE - 39)) | (1L << (MAP_TYPE - 39)) | (1L << (OPEN_BRACKET - 39)))) != 0)) { - { - setState(321); - funcReturnType(); - } - } - - setState(324); - funcBody(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FormalArgListContext extends ParserRuleContext { - public List formalArg() { - return getRuleContexts(FormalArgContext.class); - } - public FormalArgContext formalArg(int i) { - return getRuleContext(FormalArgContext.class,i); - } - public List COMMA() { return getTokens(PMLParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(PMLParser.COMMA, i); - } - public FormalArgListContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_formalArgList; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFormalArgList(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFormalArgList(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFormalArgList(this); - else return visitor.visitChildren(this); - } - } - - public final FormalArgListContext formalArgList() throws RecognitionException { - FormalArgListContext _localctx = new FormalArgListContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_formalArgList); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(334); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 39)) & ~0x3f) == 0 && ((1L << (_la - 39)) & ((1L << (ANY - 39)) | (1L << (STRING_TYPE - 39)) | (1L << (BOOLEAN_TYPE - 39)) | (1L << (MAP_TYPE - 39)) | (1L << (OPEN_BRACKET - 39)))) != 0)) { - { - setState(326); - formalArg(); - setState(331); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(327); - match(COMMA); - setState(328); - formalArg(); - } - } - setState(333); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FormalArgContext extends ParserRuleContext { - public FormalArgTypeContext formalArgType() { - return getRuleContext(FormalArgTypeContext.class,0); - } - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public FormalArgContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_formalArg; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFormalArg(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFormalArg(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFormalArg(this); - else return visitor.visitChildren(this); - } - } - - public final FormalArgContext formalArg() throws RecognitionException { - FormalArgContext _localctx = new FormalArgContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_formalArg); - try { - enterOuterAlt(_localctx, 1); - { - setState(336); - formalArgType(); - setState(337); - match(ID); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FormalArgTypeContext extends ParserRuleContext { - public VariableTypeContext variableType() { - return getRuleContext(VariableTypeContext.class,0); - } - public FormalArgTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_formalArgType; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFormalArgType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFormalArgType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFormalArgType(this); - else return visitor.visitChildren(this); - } - } - - public final FormalArgTypeContext formalArgType() throws RecognitionException { - FormalArgTypeContext _localctx = new FormalArgTypeContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_formalArgType); - try { - enterOuterAlt(_localctx, 1); - { - setState(339); - variableType(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FunctionReturnStatementContext extends ParserRuleContext { - public TerminalNode RETURN() { return getToken(PMLParser.RETURN, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public FunctionReturnStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionReturnStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFunctionReturnStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFunctionReturnStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFunctionReturnStatement(this); - else return visitor.visitChildren(this); - } - } - - public final FunctionReturnStatementContext functionReturnStatement() throws RecognitionException { - FunctionReturnStatementContext _localctx = new FunctionReturnStatementContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_functionReturnStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(344); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { - case 1: - { - setState(341); - match(RETURN); - setState(342); - expression(0); - } - break; - case 2: - { - setState(343); - match(RETURN); - } - break; - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FuncReturnTypeContext extends ParserRuleContext { - public FuncReturnTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_funcReturnType; } - - public FuncReturnTypeContext() { } - public void copyFrom(FuncReturnTypeContext ctx) { - super.copyFrom(ctx); - } - } - public static class VariableReturnTypeContext extends FuncReturnTypeContext { - public VariableTypeContext variableType() { - return getRuleContext(VariableTypeContext.class,0); - } - public VariableReturnTypeContext(FuncReturnTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterVariableReturnType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitVariableReturnType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitVariableReturnType(this); - else return visitor.visitChildren(this); - } - } - public static class VoidReturnTypeContext extends FuncReturnTypeContext { - public TerminalNode VOID_TYPE() { return getToken(PMLParser.VOID_TYPE, 0); } - public VoidReturnTypeContext(FuncReturnTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterVoidReturnType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitVoidReturnType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitVoidReturnType(this); - else return visitor.visitChildren(this); - } - } - - public final FuncReturnTypeContext funcReturnType() throws RecognitionException { - FuncReturnTypeContext _localctx = new FuncReturnTypeContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_funcReturnType); - try { - setState(348); - _errHandler.sync(this); - switch (_input.LA(1)) { - case ANY: - case STRING_TYPE: - case BOOLEAN_TYPE: - case MAP_TYPE: - case OPEN_BRACKET: - _localctx = new VariableReturnTypeContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(346); - variableType(); - } - break; - case VOID_TYPE: - _localctx = new VoidReturnTypeContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(347); - match(VOID_TYPE); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FuncBodyContext extends ParserRuleContext { - public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } - public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } - public List statement() { - return getRuleContexts(StatementContext.class); - } - public StatementContext statement(int i) { - return getRuleContext(StatementContext.class,i); - } - public FuncBodyContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_funcBody; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFuncBody(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFuncBody(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFuncBody(this); - else return visitor.visitChildren(this); - } - } - - public final FuncBodyContext funcBody() throws RecognitionException { - FuncBodyContext _localctx = new FuncBodyContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_funcBody); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(350); - match(OPEN_CURLY); - setState(354); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CREATE) | (1L << DELETE) | (1L << BREAK) | (1L << CONTINUE) | (1L << SET_RESOURCE_ACCESS_RIGHTS) | (1L << ASSIGN) | (1L << DEASSIGN) | (1L << SET_PROPERTIES) | (1L << ASSOCIATE) | (1L << DISSOCIATE) | (1L << LET) | (1L << CONST) | (1L << FUNCTION) | (1L << RETURN) | (1L << FOREACH) | (1L << FOR) | (1L << IF) | (1L << ID))) != 0)) { - { - { - setState(351); - statement(); - } - } - setState(356); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(357); - match(CLOSE_CURLY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ForeachStatementContext extends ParserRuleContext { - public Token key; - public Token mapValue; - public TerminalNode FOREACH() { return getToken(PMLParser.FOREACH, 0); } - public TerminalNode IN() { return getToken(PMLParser.IN, 0); } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public StatementBlockContext statementBlock() { - return getRuleContext(StatementBlockContext.class,0); - } - public List ID() { return getTokens(PMLParser.ID); } - public TerminalNode ID(int i) { - return getToken(PMLParser.ID, i); - } - public TerminalNode COMMA() { return getToken(PMLParser.COMMA, 0); } - public ForeachStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_foreachStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterForeachStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitForeachStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitForeachStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ForeachStatementContext foreachStatement() throws RecognitionException { - ForeachStatementContext _localctx = new ForeachStatementContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_foreachStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(359); - match(FOREACH); - setState(360); - ((ForeachStatementContext)_localctx).key = match(ID); - setState(363); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==COMMA) { - { - setState(361); - match(COMMA); - setState(362); - ((ForeachStatementContext)_localctx).mapValue = match(ID); - } - } - - setState(365); - match(IN); - setState(366); - expression(0); - setState(367); - statementBlock(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ForRangeStatementContext extends ParserRuleContext { - public Token lowerBound; - public ExpressionContext lower; - public ExpressionContext upper; - public Token upperBound; - public TerminalNode FOR() { return getToken(PMLParser.FOR, 0); } - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public TerminalNode IN_RANGE() { return getToken(PMLParser.IN_RANGE, 0); } - public TerminalNode COMMA() { return getToken(PMLParser.COMMA, 0); } - public StatementBlockContext statementBlock() { - return getRuleContext(StatementBlockContext.class,0); - } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } - public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } - public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } - public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } - public ForRangeStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_forRangeStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterForRangeStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitForRangeStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitForRangeStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ForRangeStatementContext forRangeStatement() throws RecognitionException { - ForRangeStatementContext _localctx = new ForRangeStatementContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_forRangeStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(369); - match(FOR); - setState(370); - match(ID); - setState(371); - match(IN_RANGE); - setState(372); - ((ForRangeStatementContext)_localctx).lowerBound = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==OPEN_BRACKET || _la==OPEN_PAREN) ) { - ((ForRangeStatementContext)_localctx).lowerBound = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(373); - ((ForRangeStatementContext)_localctx).lower = expression(0); - setState(374); - match(COMMA); - setState(375); - ((ForRangeStatementContext)_localctx).upper = expression(0); - setState(376); - ((ForRangeStatementContext)_localctx).upperBound = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==CLOSE_BRACKET || _la==CLOSE_PAREN) ) { - ((ForRangeStatementContext)_localctx).upperBound = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(377); - statementBlock(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class BreakStatementContext extends ParserRuleContext { - public TerminalNode BREAK() { return getToken(PMLParser.BREAK, 0); } - public BreakStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_breakStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterBreakStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitBreakStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitBreakStatement(this); - else return visitor.visitChildren(this); - } - } - - public final BreakStatementContext breakStatement() throws RecognitionException { - BreakStatementContext _localctx = new BreakStatementContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_breakStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(379); - match(BREAK); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ContinueStatementContext extends ParserRuleContext { - public TerminalNode CONTINUE() { return getToken(PMLParser.CONTINUE, 0); } - public ContinueStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_continueStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterContinueStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitContinueStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitContinueStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ContinueStatementContext continueStatement() throws RecognitionException { - ContinueStatementContext _localctx = new ContinueStatementContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_continueStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(381); - match(CONTINUE); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FunctionInvokeStatementContext extends ParserRuleContext { - public FunctionInvokeContext functionInvoke() { - return getRuleContext(FunctionInvokeContext.class,0); - } - public FunctionInvokeStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionInvokeStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFunctionInvokeStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFunctionInvokeStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFunctionInvokeStatement(this); - else return visitor.visitChildren(this); - } - } - - public final FunctionInvokeStatementContext functionInvokeStatement() throws RecognitionException { - FunctionInvokeStatementContext _localctx = new FunctionInvokeStatementContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_functionInvokeStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(383); - functionInvoke(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class IfStatementContext extends ParserRuleContext { - public ExpressionContext condition; - public TerminalNode IF() { return getToken(PMLParser.IF, 0); } - public StatementBlockContext statementBlock() { - return getRuleContext(StatementBlockContext.class,0); - } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public TerminalNode IS_COMPLEMENT() { return getToken(PMLParser.IS_COMPLEMENT, 0); } - public List elseIfStatement() { - return getRuleContexts(ElseIfStatementContext.class); - } - public ElseIfStatementContext elseIfStatement(int i) { - return getRuleContext(ElseIfStatementContext.class,i); - } - public ElseStatementContext elseStatement() { - return getRuleContext(ElseStatementContext.class,0); - } - public IfStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_ifStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterIfStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitIfStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitIfStatement(this); - else return visitor.visitChildren(this); - } - } - - public final IfStatementContext ifStatement() throws RecognitionException { - IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_ifStatement); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(385); - match(IF); - setState(387); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==IS_COMPLEMENT) { - { - setState(386); - match(IS_COMPLEMENT); - } - } - - setState(389); - ((IfStatementContext)_localctx).condition = expression(0); - setState(390); - statementBlock(); - setState(394); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,21,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - { - { - setState(391); - elseIfStatement(); - } - } - } - setState(396); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,21,_ctx); - } - setState(398); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==ELSE) { - { - setState(397); - elseStatement(); - } - } - - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ElseIfStatementContext extends ParserRuleContext { - public ExpressionContext condition; - public TerminalNode ELSE() { return getToken(PMLParser.ELSE, 0); } - public TerminalNode IF() { return getToken(PMLParser.IF, 0); } - public StatementBlockContext statementBlock() { - return getRuleContext(StatementBlockContext.class,0); - } - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public TerminalNode IS_COMPLEMENT() { return getToken(PMLParser.IS_COMPLEMENT, 0); } - public ElseIfStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_elseIfStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterElseIfStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitElseIfStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitElseIfStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ElseIfStatementContext elseIfStatement() throws RecognitionException { - ElseIfStatementContext _localctx = new ElseIfStatementContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_elseIfStatement); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(400); - match(ELSE); - setState(401); - match(IF); - setState(403); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==IS_COMPLEMENT) { - { - setState(402); - match(IS_COMPLEMENT); - } - } - - setState(405); - ((ElseIfStatementContext)_localctx).condition = expression(0); - setState(406); - statementBlock(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ElseStatementContext extends ParserRuleContext { - public TerminalNode ELSE() { return getToken(PMLParser.ELSE, 0); } - public StatementBlockContext statementBlock() { - return getRuleContext(StatementBlockContext.class,0); - } - public ElseStatementContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_elseStatement; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterElseStatement(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitElseStatement(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitElseStatement(this); - else return visitor.visitChildren(this); - } - } - - public final ElseStatementContext elseStatement() throws RecognitionException { - ElseStatementContext _localctx = new ElseStatementContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_elseStatement); - try { - enterOuterAlt(_localctx, 1); - { - setState(408); - match(ELSE); - setState(409); - statementBlock(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class VariableTypeContext extends ParserRuleContext { - public VariableTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_variableType; } - - public VariableTypeContext() { } - public void copyFrom(VariableTypeContext ctx) { - super.copyFrom(ctx); - } - } - public static class MapVarTypeContext extends VariableTypeContext { - public MapTypeContext mapType() { - return getRuleContext(MapTypeContext.class,0); - } - public MapVarTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterMapVarType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitMapVarType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitMapVarType(this); - else return visitor.visitChildren(this); - } - } - public static class StringTypeContext extends VariableTypeContext { - public TerminalNode STRING_TYPE() { return getToken(PMLParser.STRING_TYPE, 0); } - public StringTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterStringType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitStringType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitStringType(this); - else return visitor.visitChildren(this); - } - } - public static class ArrayVarTypeContext extends VariableTypeContext { - public ArrayTypeContext arrayType() { - return getRuleContext(ArrayTypeContext.class,0); - } - public ArrayVarTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterArrayVarType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitArrayVarType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitArrayVarType(this); - else return visitor.visitChildren(this); - } - } - public static class BooleanTypeContext extends VariableTypeContext { - public TerminalNode BOOLEAN_TYPE() { return getToken(PMLParser.BOOLEAN_TYPE, 0); } - public BooleanTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterBooleanType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitBooleanType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitBooleanType(this); - else return visitor.visitChildren(this); - } - } - public static class AnyTypeContext extends VariableTypeContext { - public TerminalNode ANY() { return getToken(PMLParser.ANY, 0); } - public AnyTypeContext(VariableTypeContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterAnyType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitAnyType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitAnyType(this); - else return visitor.visitChildren(this); - } - } - - public final VariableTypeContext variableType() throws RecognitionException { - VariableTypeContext _localctx = new VariableTypeContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_variableType); - try { - setState(416); - _errHandler.sync(this); - switch (_input.LA(1)) { - case STRING_TYPE: - _localctx = new StringTypeContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(411); - match(STRING_TYPE); - } - break; - case BOOLEAN_TYPE: - _localctx = new BooleanTypeContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(412); - match(BOOLEAN_TYPE); - } - break; - case OPEN_BRACKET: - _localctx = new ArrayVarTypeContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(413); - arrayType(); - } - break; - case MAP_TYPE: - _localctx = new MapVarTypeContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(414); - mapType(); - } - break; - case ANY: - _localctx = new AnyTypeContext(_localctx); - enterOuterAlt(_localctx, 5); - { - setState(415); - match(ANY); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class MapTypeContext extends ParserRuleContext { - public VariableTypeContext keyType; - public VariableTypeContext valueType; - public TerminalNode MAP_TYPE() { return getToken(PMLParser.MAP_TYPE, 0); } - public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } - public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } - public List variableType() { - return getRuleContexts(VariableTypeContext.class); - } - public VariableTypeContext variableType(int i) { - return getRuleContext(VariableTypeContext.class,i); - } - public MapTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_mapType; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterMapType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitMapType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitMapType(this); - else return visitor.visitChildren(this); - } - } - - public final MapTypeContext mapType() throws RecognitionException { - MapTypeContext _localctx = new MapTypeContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_mapType); - try { - enterOuterAlt(_localctx, 1); - { - setState(418); - match(MAP_TYPE); - setState(419); - match(OPEN_BRACKET); - setState(420); - ((MapTypeContext)_localctx).keyType = variableType(); - setState(421); - match(CLOSE_BRACKET); - setState(422); - ((MapTypeContext)_localctx).valueType = variableType(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ArrayTypeContext extends ParserRuleContext { - public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } - public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } - public VariableTypeContext variableType() { - return getRuleContext(VariableTypeContext.class,0); - } - public ArrayTypeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_arrayType; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterArrayType(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitArrayType(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitArrayType(this); - else return visitor.visitChildren(this); - } - } - - public final ArrayTypeContext arrayType() throws RecognitionException { - ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_arrayType); - try { - enterOuterAlt(_localctx, 1); - { - setState(424); - match(OPEN_BRACKET); - setState(425); - match(CLOSE_BRACKET); - setState(426); - variableType(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class StatementBlockContext extends ParserRuleContext { - public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } - public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } - public List statement() { - return getRuleContexts(StatementContext.class); - } - public StatementContext statement(int i) { - return getRuleContext(StatementContext.class,i); - } - public StatementBlockContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_statementBlock; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterStatementBlock(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitStatementBlock(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitStatementBlock(this); - else return visitor.visitChildren(this); - } - } - - public final StatementBlockContext statementBlock() throws RecognitionException { - StatementBlockContext _localctx = new StatementBlockContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_statementBlock); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(428); - match(OPEN_CURLY); - setState(432); - _errHandler.sync(this); - _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CREATE) | (1L << DELETE) | (1L << BREAK) | (1L << CONTINUE) | (1L << SET_RESOURCE_ACCESS_RIGHTS) | (1L << ASSIGN) | (1L << DEASSIGN) | (1L << SET_PROPERTIES) | (1L << ASSOCIATE) | (1L << DISSOCIATE) | (1L << LET) | (1L << CONST) | (1L << FUNCTION) | (1L << RETURN) | (1L << FOREACH) | (1L << FOR) | (1L << IF) | (1L << ID))) != 0)) { - { - { - setState(429); - statement(); - } - } - setState(434); - _errHandler.sync(this); - _la = _input.LA(1); - } - setState(435); - match(CLOSE_CURLY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class ExpressionContext extends ParserRuleContext { - public ExpressionContext left; - public ExpressionContext right; - public VariableReferenceContext variableReference() { - return getRuleContext(VariableReferenceContext.class,0); - } - public FunctionInvokeContext functionInvoke() { - return getRuleContext(FunctionInvokeContext.class,0); - } - public LiteralContext literal() { - return getRuleContext(LiteralContext.class,0); - } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public TerminalNode EQUALS_OP() { return getToken(PMLParser.EQUALS_OP, 0); } - public TerminalNode NOT_EQUALS_OP() { return getToken(PMLParser.NOT_EQUALS_OP, 0); } - public TerminalNode AND_OP() { return getToken(PMLParser.AND_OP, 0); } - public TerminalNode OR_OP() { return getToken(PMLParser.OR_OP, 0); } - public ExpressionContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_expression; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterExpression(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitExpression(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitExpression(this); - else return visitor.visitChildren(this); - } - } - - public final ExpressionContext expression() throws RecognitionException { - return expression(0); - } - - private ExpressionContext expression(int _p) throws RecognitionException { - ParserRuleContext _parentctx = _ctx; - int _parentState = getState(); - ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); - ExpressionContext _prevctx = _localctx; - int _startState = 92; - enterRecursionRule(_localctx, 92, RULE_expression, _p); - int _la; - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(441); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { - case 1: - { - setState(438); - variableReference(); - } - break; - case 2: - { - setState(439); - functionInvoke(); - } - break; - case 3: - { - setState(440); - literal(); - } - break; - } - _ctx.stop = _input.LT(-1); - setState(451); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { - if ( _alt==1 ) { - if ( _parseListeners!=null ) triggerExitRuleEvent(); - _prevctx = _localctx; - { - setState(449); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { - case 1: - { - _localctx = new ExpressionContext(_parentctx, _parentState); - _localctx.left = _prevctx; - _localctx.left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(443); - if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(444); - _la = _input.LA(1); - if ( !(_la==EQUALS_OP || _la==NOT_EQUALS_OP) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(445); - ((ExpressionContext)_localctx).right = expression(3); - } - break; - case 2: - { - _localctx = new ExpressionContext(_parentctx, _parentState); - _localctx.left = _prevctx; - _localctx.left = _prevctx; - pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(446); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(447); - _la = _input.LA(1); - if ( !(_la==AND_OP || _la==OR_OP) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(448); - ((ExpressionContext)_localctx).right = expression(2); - } - break; - } - } - } - setState(453); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,28,_ctx); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - unrollRecursionContexts(_parentctx); - } - return _localctx; - } - - public static class ArrayContext extends ParserRuleContext { - public TerminalNode OPEN_BRACKET() { return getToken(PMLParser.OPEN_BRACKET, 0); } - public TerminalNode CLOSE_BRACKET() { return getToken(PMLParser.CLOSE_BRACKET, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public List COMMA() { return getTokens(PMLParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(PMLParser.COMMA, i); - } - public ArrayContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_array; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterArray(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitArray(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitArray(this); - else return visitor.visitChildren(this); - } - } - - public final ArrayContext array() throws RecognitionException { - ArrayContext _localctx = new ArrayContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_array); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(454); - match(OPEN_BRACKET); - setState(463); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (BOOLEAN - 44)) | (1L << (NUMBER - 44)) | (1L << (ID - 44)) | (1L << (STRING - 44)) | (1L << (OPEN_CURLY - 44)) | (1L << (OPEN_BRACKET - 44)))) != 0)) { - { - setState(455); - expression(0); - setState(460); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(456); - match(COMMA); - setState(457); - expression(0); - } - } - setState(462); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - setState(465); - match(CLOSE_BRACKET); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class MapContext extends ParserRuleContext { - public TerminalNode OPEN_CURLY() { return getToken(PMLParser.OPEN_CURLY, 0); } - public TerminalNode CLOSE_CURLY() { return getToken(PMLParser.CLOSE_CURLY, 0); } - public List mapEntry() { - return getRuleContexts(MapEntryContext.class); - } - public MapEntryContext mapEntry(int i) { - return getRuleContext(MapEntryContext.class,i); - } - public List COMMA() { return getTokens(PMLParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(PMLParser.COMMA, i); - } - public MapContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_map; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterMap(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitMap(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitMap(this); - else return visitor.visitChildren(this); - } - } - - public final MapContext map() throws RecognitionException { - MapContext _localctx = new MapContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_map); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(467); - match(OPEN_CURLY); - setState(476); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (BOOLEAN - 44)) | (1L << (NUMBER - 44)) | (1L << (ID - 44)) | (1L << (STRING - 44)) | (1L << (OPEN_CURLY - 44)) | (1L << (OPEN_BRACKET - 44)))) != 0)) { - { - setState(468); - mapEntry(); - setState(473); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(469); - match(COMMA); - setState(470); - mapEntry(); - } - } - setState(475); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - setState(478); - match(CLOSE_CURLY); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class MapEntryContext extends ParserRuleContext { - public ExpressionContext key; - public ExpressionContext value; - public TerminalNode COLON() { return getToken(PMLParser.COLON, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public MapEntryContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_mapEntry; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterMapEntry(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitMapEntry(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitMapEntry(this); - else return visitor.visitChildren(this); - } - } - - public final MapEntryContext mapEntry() throws RecognitionException { - MapEntryContext _localctx = new MapEntryContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_mapEntry); - try { - enterOuterAlt(_localctx, 1); - { - setState(480); - ((MapEntryContext)_localctx).key = expression(0); - setState(481); - match(COLON); - setState(482); - ((MapEntryContext)_localctx).value = expression(0); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class EntryReferenceContext extends ParserRuleContext { - public ExpressionContext key; - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public List OPEN_BRACKET() { return getTokens(PMLParser.OPEN_BRACKET); } - public TerminalNode OPEN_BRACKET(int i) { - return getToken(PMLParser.OPEN_BRACKET, i); - } - public List CLOSE_BRACKET() { return getTokens(PMLParser.CLOSE_BRACKET); } - public TerminalNode CLOSE_BRACKET(int i) { - return getToken(PMLParser.CLOSE_BRACKET, i); - } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public EntryReferenceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_entryReference; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterEntryReference(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitEntryReference(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitEntryReference(this); - else return visitor.visitChildren(this); - } - } - - public final EntryReferenceContext entryReference() throws RecognitionException { - EntryReferenceContext _localctx = new EntryReferenceContext(_ctx, getState()); - enterRule(_localctx, 100, RULE_entryReference); - try { - int _alt; - enterOuterAlt(_localctx, 1); - { - setState(484); - match(ID); - setState(489); - _errHandler.sync(this); - _alt = 1; - do { - switch (_alt) { - case 1: - { - { - setState(485); - match(OPEN_BRACKET); - setState(486); - ((EntryReferenceContext)_localctx).key = expression(0); - setState(487); - match(CLOSE_BRACKET); - } - } - break; - default: - throw new NoViableAltException(this); - } - setState(491); - _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); - } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class LiteralContext extends ParserRuleContext { - public LiteralContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_literal; } - - public LiteralContext() { } - public void copyFrom(LiteralContext ctx) { - super.copyFrom(ctx); - } - } - public static class MapLiteralContext extends LiteralContext { - public MapContext map() { - return getRuleContext(MapContext.class,0); - } - public MapLiteralContext(LiteralContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterMapLiteral(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitMapLiteral(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitMapLiteral(this); - else return visitor.visitChildren(this); - } - } - public static class StringLiteralContext extends LiteralContext { - public TerminalNode STRING() { return getToken(PMLParser.STRING, 0); } - public StringLiteralContext(LiteralContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterStringLiteral(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitStringLiteral(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitStringLiteral(this); - else return visitor.visitChildren(this); - } - } - public static class BooleanLiteralContext extends LiteralContext { - public TerminalNode BOOLEAN() { return getToken(PMLParser.BOOLEAN, 0); } - public BooleanLiteralContext(LiteralContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterBooleanLiteral(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitBooleanLiteral(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitBooleanLiteral(this); - else return visitor.visitChildren(this); - } - } - public static class ArrayLiteralContext extends LiteralContext { - public ArrayContext array() { - return getRuleContext(ArrayContext.class,0); - } - public ArrayLiteralContext(LiteralContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterArrayLiteral(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitArrayLiteral(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitArrayLiteral(this); - else return visitor.visitChildren(this); - } - } - public static class NumberLiteralContext extends LiteralContext { - public TerminalNode NUMBER() { return getToken(PMLParser.NUMBER, 0); } - public NumberLiteralContext(LiteralContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterNumberLiteral(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitNumberLiteral(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitNumberLiteral(this); - else return visitor.visitChildren(this); - } - } - - public final LiteralContext literal() throws RecognitionException { - LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 102, RULE_literal); - try { - setState(498); - _errHandler.sync(this); - switch (_input.LA(1)) { - case STRING: - _localctx = new StringLiteralContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(493); - match(STRING); - } - break; - case BOOLEAN: - _localctx = new BooleanLiteralContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(494); - match(BOOLEAN); - } - break; - case NUMBER: - _localctx = new NumberLiteralContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(495); - match(NUMBER); - } - break; - case OPEN_BRACKET: - _localctx = new ArrayLiteralContext(_localctx); - enterOuterAlt(_localctx, 4); - { - setState(496); - array(); - } - break; - case OPEN_CURLY: - _localctx = new MapLiteralContext(_localctx); - enterOuterAlt(_localctx, 5); - { - setState(497); - map(); - } - break; - default: - throw new NoViableAltException(this); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class VariableReferenceContext extends ParserRuleContext { - public VariableReferenceContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_variableReference; } - - public VariableReferenceContext() { } - public void copyFrom(VariableReferenceContext ctx) { - super.copyFrom(ctx); - } - } - public static class ReferenceByEntryContext extends VariableReferenceContext { - public EntryReferenceContext entryReference() { - return getRuleContext(EntryReferenceContext.class,0); - } - public ReferenceByEntryContext(VariableReferenceContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterReferenceByEntry(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitReferenceByEntry(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitReferenceByEntry(this); - else return visitor.visitChildren(this); - } - } - public static class ReferenceByIDContext extends VariableReferenceContext { - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public ReferenceByIDContext(VariableReferenceContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterReferenceByID(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitReferenceByID(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitReferenceByID(this); - else return visitor.visitChildren(this); - } - } - - public final VariableReferenceContext variableReference() throws RecognitionException { - VariableReferenceContext _localctx = new VariableReferenceContext(_ctx, getState()); - enterRule(_localctx, 104, RULE_variableReference); - try { - setState(502); - _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { - case 1: - _localctx = new ReferenceByIDContext(_localctx); - enterOuterAlt(_localctx, 1); - { - setState(500); - match(ID); - } - break; - case 2: - _localctx = new ReferenceByEntryContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(501); - entryReference(); - } - break; - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FunctionInvokeContext extends ParserRuleContext { - public TerminalNode ID() { return getToken(PMLParser.ID, 0); } - public FunctionInvokeArgsContext functionInvokeArgs() { - return getRuleContext(FunctionInvokeArgsContext.class,0); - } - public FunctionInvokeContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionInvoke; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFunctionInvoke(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFunctionInvoke(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFunctionInvoke(this); - else return visitor.visitChildren(this); - } - } - - public final FunctionInvokeContext functionInvoke() throws RecognitionException { - FunctionInvokeContext _localctx = new FunctionInvokeContext(_ctx, getState()); - enterRule(_localctx, 106, RULE_functionInvoke); - try { - enterOuterAlt(_localctx, 1); - { - setState(504); - match(ID); - setState(505); - functionInvokeArgs(); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class FunctionInvokeArgsContext extends ParserRuleContext { - public TerminalNode OPEN_PAREN() { return getToken(PMLParser.OPEN_PAREN, 0); } - public TerminalNode CLOSE_PAREN() { return getToken(PMLParser.CLOSE_PAREN, 0); } - public List expression() { - return getRuleContexts(ExpressionContext.class); - } - public ExpressionContext expression(int i) { - return getRuleContext(ExpressionContext.class,i); - } - public List COMMA() { return getTokens(PMLParser.COMMA); } - public TerminalNode COMMA(int i) { - return getToken(PMLParser.COMMA, i); - } - public FunctionInvokeArgsContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_functionInvokeArgs; } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).enterFunctionInvokeArgs(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof PMLListener ) ((PMLListener)listener).exitFunctionInvokeArgs(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof PMLVisitor ) return ((PMLVisitor)visitor).visitFunctionInvokeArgs(this); - else return visitor.visitChildren(this); - } - } - - public final FunctionInvokeArgsContext functionInvokeArgs() throws RecognitionException { - FunctionInvokeArgsContext _localctx = new FunctionInvokeArgsContext(_ctx, getState()); - enterRule(_localctx, 108, RULE_functionInvokeArgs); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(507); - match(OPEN_PAREN); - setState(516); - _errHandler.sync(this); - _la = _input.LA(1); - if (((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (BOOLEAN - 44)) | (1L << (NUMBER - 44)) | (1L << (ID - 44)) | (1L << (STRING - 44)) | (1L << (OPEN_CURLY - 44)) | (1L << (OPEN_BRACKET - 44)))) != 0)) { - { - setState(508); - expression(0); - setState(513); - _errHandler.sync(this); - _la = _input.LA(1); - while (_la==COMMA) { - { - { - setState(509); - match(COMMA); - setState(510); - expression(0); - } - } - setState(515); - _errHandler.sync(this); - _la = _input.LA(1); - } - } - } - - setState(518); - match(CLOSE_PAREN); - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { - switch (ruleIndex) { - case 46: - return expression_sempred((ExpressionContext)_localctx, predIndex); - } - return true; - } - private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { - switch (predIndex) { - case 0: - return precpred(_ctx, 2); - case 1: - return precpred(_ctx, 1); - } - return true; - } - - public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3R\u020b\4\2\t\2\4"+ - "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ - "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ - "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ - "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ - "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\3\2\7\2r\n\2\f\2\16\2u\13\2\3"+ - "\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"+ - "\3\3\3\3\3\3\3\3\3\3\3\3\5\3\u008f\n\3\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5"+ - "\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\7\7\u00a6\n\7\f\7"+ - "\16\7\u00a9\13\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\5\b\u00b6"+ - "\n\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u00c3\n\t\3\n\3\n"+ - "\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u00cf\n\n\3\13\3\13\3\13\3\f\3\f"+ - "\3\f\3\f\3\f\3\f\3\r\3\r\7\r\u00dc\n\r\f\r\16\r\u00df\13\r\3\r\3\r\3\16"+ - "\3\16\3\16\5\16\u00e6\n\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17"+ - "\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\7\20\u00f9\n\20\f\20\16\20\u00fc"+ - "\13\20\5\20\u00fe\n\20\3\20\3\20\3\21\5\21\u0103\n\21\3\21\3\21\3\22\3"+ - "\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3"+ - "\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\27\3"+ - "\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\5\31\u012d\n\31\3\32\3\32"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\5\34\u0139\n\34\3\34\3\34\3\34"+ - "\3\34\3\35\3\35\3\35\3\35\3\35\3\35\5\35\u0145\n\35\3\35\3\35\3\36\3\36"+ - "\3\36\7\36\u014c\n\36\f\36\16\36\u014f\13\36\5\36\u0151\n\36\3\37\3\37"+ - "\3\37\3 \3 \3!\3!\3!\5!\u015b\n!\3\"\3\"\5\"\u015f\n\"\3#\3#\7#\u0163"+ - "\n#\f#\16#\u0166\13#\3#\3#\3$\3$\3$\3$\5$\u016e\n$\3$\3$\3$\3$\3%\3%\3"+ - "%\3%\3%\3%\3%\3%\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\5)\u0186\n)\3)\3)\3)"+ - "\7)\u018b\n)\f)\16)\u018e\13)\3)\5)\u0191\n)\3*\3*\3*\5*\u0196\n*\3*\3"+ - "*\3*\3+\3+\3+\3,\3,\3,\3,\3,\5,\u01a3\n,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3"+ - ".\3/\3/\7/\u01b1\n/\f/\16/\u01b4\13/\3/\3/\3\60\3\60\3\60\3\60\5\60\u01bc"+ - "\n\60\3\60\3\60\3\60\3\60\3\60\3\60\7\60\u01c4\n\60\f\60\16\60\u01c7\13"+ - "\60\3\61\3\61\3\61\3\61\7\61\u01cd\n\61\f\61\16\61\u01d0\13\61\5\61\u01d2"+ - "\n\61\3\61\3\61\3\62\3\62\3\62\3\62\7\62\u01da\n\62\f\62\16\62\u01dd\13"+ - "\62\5\62\u01df\n\62\3\62\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64"+ - "\3\64\6\64\u01ec\n\64\r\64\16\64\u01ed\3\65\3\65\3\65\3\65\3\65\5\65\u01f5"+ - "\n\65\3\66\3\66\5\66\u01f9\n\66\3\67\3\67\3\67\38\38\38\38\78\u0202\n"+ - "8\f8\168\u0205\138\58\u0207\n8\38\38\38\2\3^9\2\4\6\b\n\f\16\20\22\24"+ - "\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjln\2\f"+ - "\3\2$%\3\2&\'\5\2\21\21%%\'\'\3\2\22\23\3\2#\'\3\2*+\4\2GGKK\4\2HHLL\3"+ - "\2QR\3\2OP\2\u021b\2s\3\2\2\2\4\u008e\3\2\2\2\6\u0090\3\2\2\2\b\u0094"+ - "\3\2\2\2\n\u009a\3\2\2\2\f\u00a0\3\2\2\2\16\u00ac\3\2\2\2\20\u00c2\3\2"+ - "\2\2\22\u00ce\3\2\2\2\24\u00d0\3\2\2\2\26\u00d3\3\2\2\2\30\u00d9\3\2\2"+ - "\2\32\u00e5\3\2\2\2\34\u00e7\3\2\2\2\36\u00f4\3\2\2\2 \u0102\3\2\2\2\""+ - "\u0106\3\2\2\2$\u010c\3\2\2\2&\u0111\3\2\2\2(\u0116\3\2\2\2*\u011d\3\2"+ - "\2\2,\u0122\3\2\2\2.\u0125\3\2\2\2\60\u012c\3\2\2\2\62\u012e\3\2\2\2\64"+ - "\u0130\3\2\2\2\66\u0138\3\2\2\28\u013e\3\2\2\2:\u0150\3\2\2\2<\u0152\3"+ - "\2\2\2>\u0155\3\2\2\2@\u015a\3\2\2\2B\u015e\3\2\2\2D\u0160\3\2\2\2F\u0169"+ - "\3\2\2\2H\u0173\3\2\2\2J\u017d\3\2\2\2L\u017f\3\2\2\2N\u0181\3\2\2\2P"+ - "\u0183\3\2\2\2R\u0192\3\2\2\2T\u019a\3\2\2\2V\u01a2\3\2\2\2X\u01a4\3\2"+ - "\2\2Z\u01aa\3\2\2\2\\\u01ae\3\2\2\2^\u01bb\3\2\2\2`\u01c8\3\2\2\2b\u01d5"+ - "\3\2\2\2d\u01e2\3\2\2\2f\u01e6\3\2\2\2h\u01f4\3\2\2\2j\u01f8\3\2\2\2l"+ - "\u01fa\3\2\2\2n\u01fd\3\2\2\2pr\5\4\3\2qp\3\2\2\2ru\3\2\2\2sq\3\2\2\2"+ - "st\3\2\2\2tv\3\2\2\2us\3\2\2\2vw\7\2\2\3w\3\3\2\2\2x\u008f\5\6\4\2y\u008f"+ - "\5\b\5\2z\u008f\5\n\6\2{\u008f\5\f\7\2|\u008f\5\34\17\2}\u008f\5\"\22"+ - "\2~\u008f\5$\23\2\177\u008f\5&\24\2\u0080\u008f\5(\25\2\u0081\u008f\5"+ - "*\26\2\u0082\u008f\5,\27\2\u0083\u008f\5.\30\2\u0084\u008f\5\64\33\2\u0085"+ - "\u008f\5\66\34\2\u0086\u008f\58\35\2\u0087\u008f\5@!\2\u0088\u008f\5F"+ - "$\2\u0089\u008f\5H%\2\u008a\u008f\5J&\2\u008b\u008f\5L\'\2\u008c\u008f"+ - "\5N(\2\u008d\u008f\5P)\2\u008ex\3\2\2\2\u008ey\3\2\2\2\u008ez\3\2\2\2"+ - "\u008e{\3\2\2\2\u008e|\3\2\2\2\u008e}\3\2\2\2\u008e~\3\2\2\2\u008e\177"+ - "\3\2\2\2\u008e\u0080\3\2\2\2\u008e\u0081\3\2\2\2\u008e\u0082\3\2\2\2\u008e"+ - "\u0083\3\2\2\2\u008e\u0084\3\2\2\2\u008e\u0085\3\2\2\2\u008e\u0086\3\2"+ - "\2\2\u008e\u0087\3\2\2\2\u008e\u0088\3\2\2\2\u008e\u0089\3\2\2\2\u008e"+ - "\u008a\3\2\2\2\u008e\u008b\3\2\2\2\u008e\u008c\3\2\2\2\u008e\u008d\3\2"+ - "\2\2\u008f\5\3\2\2\2\u0090\u0091\7\3\2\2\u0091\u0092\7#\2\2\u0092\u0093"+ - "\5^\60\2\u0093\7\3\2\2\2\u0094\u0095\7\3\2\2\u0095\u0096\t\2\2\2\u0096"+ - "\u0097\5^\60\2\u0097\u0098\78\2\2\u0098\u0099\5^\60\2\u0099\t\3\2\2\2"+ - "\u009a\u009b\7\3\2\2\u009b\u009c\t\3\2\2\u009c\u009d\5^\60\2\u009d\u009e"+ - "\78\2\2\u009e\u009f\5^\60\2\u009f\13\3\2\2\2\u00a0\u00a1\7\3\2\2\u00a1"+ - "\u00a2\7!\2\2\u00a2\u00a3\5^\60\2\u00a3\u00a7\7E\2\2\u00a4\u00a6\5\16"+ - "\b\2\u00a5\u00a4\3\2\2\2\u00a6\u00a9\3\2\2\2\u00a7\u00a5\3\2\2\2\u00a7"+ - "\u00a8\3\2\2\2\u00a8\u00aa\3\2\2\2\u00a9\u00a7\3\2\2\2\u00aa\u00ab\7F"+ - "\2\2\u00ab\r\3\2\2\2\u00ac\u00ad\7\3\2\2\u00ad\u00ae\7\b\2\2\u00ae\u00af"+ - "\5^\60\2\u00af\u00b0\7\t\2\2\u00b0\u00b1\5\20\t\2\u00b1\u00b2\7\n\2\2"+ - "\u00b2\u00b5\5^\60\2\u00b3\u00b4\7\f\2\2\u00b4\u00b6\5\22\n\2\u00b5\u00b3"+ - "\3\2\2\2\u00b5\u00b6\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00b8\5\26\f\2"+ - "\u00b8\17\3\2\2\2\u00b9\u00c3\7\16\2\2\u00ba\u00bb\7\'\2\2\u00bb\u00c3"+ - "\5^\60\2\u00bc\u00bd\7\17\2\2\u00bd\u00c3\5^\60\2\u00be\u00bf\7\20\2\2"+ - "\u00bf\u00c3\5^\60\2\u00c0\u00c1\7\21\2\2\u00c1\u00c3\5^\60\2\u00c2\u00b9"+ - "\3\2\2\2\u00c2\u00ba\3\2\2\2\u00c2\u00bc\3\2\2\2\u00c2\u00be\3\2\2\2\u00c2"+ - "\u00c0\3\2\2\2\u00c3\21\3\2\2\2\u00c4\u00cf\5^\60\2\u00c5\u00cf\5\24\13"+ - "\2\u00c6\u00c7\5\24\13\2\u00c7\u00c8\78\2\2\u00c8\u00c9\5^\60\2\u00c9"+ - "\u00cf\3\2\2\2\u00ca\u00cb\5\24\13\2\u00cb\u00cc\7\31\2\2\u00cc\u00cd"+ - "\5^\60\2\u00cd\u00cf\3\2\2\2\u00ce\u00c4\3\2\2\2\u00ce\u00c5\3\2\2\2\u00ce"+ - "\u00c6\3\2\2\2\u00ce\u00ca\3\2\2\2\u00cf\23\3\2\2\2\u00d0\u00d1\7)\2\2"+ - "\u00d1\u00d2\7\7\2\2\u00d2\25\3\2\2\2\u00d3\u00d4\7\r\2\2\u00d4\u00d5"+ - "\7K\2\2\u00d5\u00d6\7=\2\2\u00d6\u00d7\7L\2\2\u00d7\u00d8\5\30\r\2\u00d8"+ - "\27\3\2\2\2\u00d9\u00dd\7E\2\2\u00da\u00dc\5\32\16\2\u00db\u00da\3\2\2"+ - "\2\u00dc\u00df\3\2\2\2\u00dd\u00db\3\2\2\2\u00dd\u00de\3\2\2\2\u00de\u00e0"+ - "\3\2\2\2\u00df\u00dd\3\2\2\2\u00e0\u00e1\7F\2\2\u00e1\31\3\2\2\2\u00e2"+ - "\u00e6\5\4\3\2\u00e3\u00e6\5\16\b\2\u00e4\u00e6\5\64\33\2\u00e5\u00e2"+ - "\3\2\2\2\u00e5\u00e3\3\2\2\2\u00e5\u00e4\3\2\2\2\u00e6\33\3\2\2\2\u00e7"+ - "\u00e8\7\3\2\2\u00e8\u00e9\7 \2\2\u00e9\u00ea\5^\60\2\u00ea\u00eb\7\37"+ - "\2\2\u00eb\u00ec\t\4\2\2\u00ec\u00ed\5^\60\2\u00ed\u00ee\7\"\2\2\u00ee"+ - "\u00ef\5^\60\2\u00ef\u00f0\7\f\2\2\u00f0\u00f1\t\5\2\2\u00f1\u00f2\7\31"+ - "\2\2\u00f2\u00f3\5\36\20\2\u00f3\35\3\2\2\2\u00f4\u00fd\7G\2\2\u00f5\u00fa"+ - "\5 \21\2\u00f6\u00f7\7C\2\2\u00f7\u00f9\5 \21\2\u00f8\u00f6\3\2\2\2\u00f9"+ - "\u00fc\3\2\2\2\u00fa\u00f8\3\2\2\2\u00fa\u00fb\3\2\2\2\u00fb\u00fe\3\2"+ - "\2\2\u00fc\u00fa\3\2\2\2\u00fd\u00f5\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe"+ - "\u00ff\3\2\2\2\u00ff\u0100\7H\2\2\u0100\37\3\2\2\2\u0101\u0103\7M\2\2"+ - "\u0102\u0101\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105"+ - "\5^\60\2\u0105!\3\2\2\2\u0106\u0107\7\30\2\2\u0107\u0108\7\31\2\2\u0108"+ - "\u0109\5^\60\2\u0109\u010a\7\32\2\2\u010a\u010b\5^\60\2\u010b#\3\2\2\2"+ - "\u010c\u010d\7\25\2\2\u010d\u010e\5^\60\2\u010e\u010f\7\32\2\2\u010f\u0110"+ - "\5^\60\2\u0110%\3\2\2\2\u0111\u0112\7\26\2\2\u0112\u0113\5^\60\2\u0113"+ - "\u0114\7\27\2\2\u0114\u0115\5^\60\2\u0115\'\3\2\2\2\u0116\u0117\7\33\2"+ - "\2\u0117\u0118\5^\60\2\u0118\u0119\7\34\2\2\u0119\u011a\5^\60\2\u011a"+ - "\u011b\7\35\2\2\u011b\u011c\5^\60\2\u011c)\3\2\2\2\u011d\u011e\7\36\2"+ - "\2\u011e\u011f\5^\60\2\u011f\u0120\7\34\2\2\u0120\u0121\5^\60\2\u0121"+ - "+\3\2\2\2\u0122\u0123\7\24\2\2\u0123\u0124\5^\60\2\u0124-\3\2\2\2\u0125"+ - "\u0126\7\4\2\2\u0126\u0127\5\60\31\2\u0127\u0128\5^\60\2\u0128/\3\2\2"+ - "\2\u0129\u012d\5\62\32\2\u012a\u012d\7!\2\2\u012b\u012d\7 \2\2\u012c\u0129"+ - "\3\2\2\2\u012c\u012a\3\2\2\2\u012c\u012b\3\2\2\2\u012d\61\3\2\2\2\u012e"+ - "\u012f\t\6\2\2\u012f\63\3\2\2\2\u0130\u0131\7\4\2\2\u0131\u0132\7\b\2"+ - "\2\u0132\u0133\5^\60\2\u0133\u0134\7\27\2\2\u0134\u0135\7!\2\2\u0135\u0136"+ - "\5^\60\2\u0136\65\3\2\2\2\u0137\u0139\t\7\2\2\u0138\u0137\3\2\2\2\u0138"+ - "\u0139\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013b\7=\2\2\u013b\u013c\7N\2"+ - "\2\u013c\u013d\5^\60\2\u013d\67\3\2\2\2\u013e\u013f\7,\2\2\u013f\u0140"+ - "\7=\2\2\u0140\u0141\7K\2\2\u0141\u0142\5:\36\2\u0142\u0144\7L\2\2\u0143"+ - "\u0145\5B\"\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0146\3\2"+ - "\2\2\u0146\u0147\5D#\2\u01479\3\2\2\2\u0148\u014d\5<\37\2\u0149\u014a"+ - "\7C\2\2\u014a\u014c\5<\37\2\u014b\u0149\3\2\2\2\u014c\u014f\3\2\2\2\u014d"+ - "\u014b\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0151\3\2\2\2\u014f\u014d\3\2"+ - "\2\2\u0150\u0148\3\2\2\2\u0150\u0151\3\2\2\2\u0151;\3\2\2\2\u0152\u0153"+ - "\5> \2\u0153\u0154\7=\2\2\u0154=\3\2\2\2\u0155\u0156\5V,\2\u0156?\3\2"+ - "\2\2\u0157\u0158\7-\2\2\u0158\u015b\5^\60\2\u0159\u015b\7-\2\2\u015a\u0157"+ - "\3\2\2\2\u015a\u0159\3\2\2\2\u015bA\3\2\2\2\u015c\u015f\5V,\2\u015d\u015f"+ - "\7\63\2\2\u015e\u015c\3\2\2\2\u015e\u015d\3\2\2\2\u015fC\3\2\2\2\u0160"+ - "\u0164\7E\2\2\u0161\u0163\5\4\3\2\u0162\u0161\3\2\2\2\u0163\u0166\3\2"+ - "\2\2\u0164\u0162\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166"+ - "\u0164\3\2\2\2\u0167\u0168\7F\2\2\u0168E\3\2\2\2\u0169\u016a\7\66\2\2"+ - "\u016a\u016d\7=\2\2\u016b\u016c\7C\2\2\u016c\u016e\7=\2\2\u016d\u016b"+ - "\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u016f\3\2\2\2\u016f\u0170\78\2\2\u0170"+ - "\u0171\5^\60\2\u0171\u0172\5\\/\2\u0172G\3\2\2\2\u0173\u0174\7\67\2\2"+ - "\u0174\u0175\7=\2\2\u0175\u0176\7;\2\2\u0176\u0177\t\b\2\2\u0177\u0178"+ - "\5^\60\2\u0178\u0179\7C\2\2\u0179\u017a\5^\60\2\u017a\u017b\t\t\2\2\u017b"+ - "\u017c\5\\/\2\u017cI\3\2\2\2\u017d\u017e\7\5\2\2\u017eK\3\2\2\2\u017f"+ - "\u0180\7\6\2\2\u0180M\3\2\2\2\u0181\u0182\5l\67\2\u0182O\3\2\2\2\u0183"+ - "\u0185\79\2\2\u0184\u0186\7M\2\2\u0185\u0184\3\2\2\2\u0185\u0186\3\2\2"+ - "\2\u0186\u0187\3\2\2\2\u0187\u0188\5^\60\2\u0188\u018c\5\\/\2\u0189\u018b"+ - "\5R*\2\u018a\u0189\3\2\2\2\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c"+ - "\u018d\3\2\2\2\u018d\u0190\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0191\5T"+ - "+\2\u0190\u018f\3\2\2\2\u0190\u0191\3\2\2\2\u0191Q\3\2\2\2\u0192\u0193"+ - "\7:\2\2\u0193\u0195\79\2\2\u0194\u0196\7M\2\2\u0195\u0194\3\2\2\2\u0195"+ - "\u0196\3\2\2\2\u0196\u0197\3\2\2\2\u0197\u0198\5^\60\2\u0198\u0199\5\\"+ - "/\2\u0199S\3\2\2\2\u019a\u019b\7:\2\2\u019b\u019c\5\\/\2\u019cU\3\2\2"+ - "\2\u019d\u01a3\7\61\2\2\u019e\u01a3\7\62\2\2\u019f\u01a3\5Z.\2\u01a0\u01a3"+ - "\5X-\2\u01a1\u01a3\7)\2\2\u01a2\u019d\3\2\2\2\u01a2\u019e\3\2\2\2\u01a2"+ - "\u019f\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a2\u01a1\3\2\2\2\u01a3W\3\2\2\2"+ - "\u01a4\u01a5\7\65\2\2\u01a5\u01a6\7G\2\2\u01a6\u01a7\5V,\2\u01a7\u01a8"+ - "\7H\2\2\u01a8\u01a9\5V,\2\u01a9Y\3\2\2\2\u01aa\u01ab\7G\2\2\u01ab\u01ac"+ - "\7H\2\2\u01ac\u01ad\5V,\2\u01ad[\3\2\2\2\u01ae\u01b2\7E\2\2\u01af\u01b1"+ - "\5\4\3\2\u01b0\u01af\3\2\2\2\u01b1\u01b4\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b2"+ - "\u01b3\3\2\2\2\u01b3\u01b5\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b6\7F"+ - "\2\2\u01b6]\3\2\2\2\u01b7\u01b8\b\60\1\2\u01b8\u01bc\5j\66\2\u01b9\u01bc"+ - "\5l\67\2\u01ba\u01bc\5h\65\2\u01bb\u01b7\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bb"+ - "\u01ba\3\2\2\2\u01bc\u01c5\3\2\2\2\u01bd\u01be\f\4\2\2\u01be\u01bf\t\n"+ - "\2\2\u01bf\u01c4\5^\60\5\u01c0\u01c1\f\3\2\2\u01c1\u01c2\t\13\2\2\u01c2"+ - "\u01c4\5^\60\4\u01c3\u01bd\3\2\2\2\u01c3\u01c0\3\2\2\2\u01c4\u01c7\3\2"+ - "\2\2\u01c5\u01c3\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6_\3\2\2\2\u01c7\u01c5"+ - "\3\2\2\2\u01c8\u01d1\7G\2\2\u01c9\u01ce\5^\60\2\u01ca\u01cb\7C\2\2\u01cb"+ - "\u01cd\5^\60\2\u01cc\u01ca\3\2\2\2\u01cd\u01d0\3\2\2\2\u01ce\u01cc\3\2"+ - "\2\2\u01ce\u01cf\3\2\2\2\u01cf\u01d2\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d1"+ - "\u01c9\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\7H"+ - "\2\2\u01d4a\3\2\2\2\u01d5\u01de\7E\2\2\u01d6\u01db\5d\63\2\u01d7\u01d8"+ - "\7C\2\2\u01d8\u01da\5d\63\2\u01d9\u01d7\3\2\2\2\u01da\u01dd\3\2\2\2\u01db"+ - "\u01d9\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01df\3\2\2\2\u01dd\u01db\3\2"+ - "\2\2\u01de\u01d6\3\2\2\2\u01de\u01df\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0"+ - "\u01e1\7F\2\2\u01e1c\3\2\2\2\u01e2\u01e3\5^\60\2\u01e3\u01e4\7D\2\2\u01e4"+ - "\u01e5\5^\60\2\u01e5e\3\2\2\2\u01e6\u01eb\7=\2\2\u01e7\u01e8\7G\2\2\u01e8"+ - "\u01e9\5^\60\2\u01e9\u01ea\7H\2\2\u01ea\u01ec\3\2\2\2\u01eb\u01e7\3\2"+ - "\2\2\u01ec\u01ed\3\2\2\2\u01ed\u01eb\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee"+ - "g\3\2\2\2\u01ef\u01f5\7>\2\2\u01f0\u01f5\7.\2\2\u01f1\u01f5\7<\2\2\u01f2"+ - "\u01f5\5`\61\2\u01f3\u01f5\5b\62\2\u01f4\u01ef\3\2\2\2\u01f4\u01f0\3\2"+ - "\2\2\u01f4\u01f1\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4\u01f3\3\2\2\2\u01f5"+ - "i\3\2\2\2\u01f6\u01f9\7=\2\2\u01f7\u01f9\5f\64\2\u01f8\u01f6\3\2\2\2\u01f8"+ - "\u01f7\3\2\2\2\u01f9k\3\2\2\2\u01fa\u01fb\7=\2\2\u01fb\u01fc\5n8\2\u01fc"+ - "m\3\2\2\2\u01fd\u0206\7K\2\2\u01fe\u0203\5^\60\2\u01ff\u0200\7C\2\2\u0200"+ - "\u0202\5^\60\2\u0201\u01ff\3\2\2\2\u0202\u0205\3\2\2\2\u0203\u0201\3\2"+ - "\2\2\u0203\u0204\3\2\2\2\u0204\u0207\3\2\2\2\u0205\u0203\3\2\2\2\u0206"+ - "\u01fe\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0208\3\2\2\2\u0208\u0209\7L"+ - "\2\2\u0209o\3\2\2\2(s\u008e\u00a7\u00b5\u00c2\u00ce\u00dd\u00e5\u00fa"+ - "\u00fd\u0102\u012c\u0138\u0144\u014d\u0150\u015a\u015e\u0164\u016d\u0185"+ - "\u018c\u0190\u0195\u01a2\u01b2\u01bb\u01c3\u01c5\u01ce\u01d1\u01db\u01de"+ - "\u01ed\u01f4\u01f8\u0203\u0206"; - public static final ATN _ATN = - new ATNDeserializer().deserialize(_serializedATN.toCharArray()); - static { - _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; - for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { - _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); - } - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLVisitor.java deleted file mode 100644 index 4107191ef..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/antlr/PMLVisitor.java +++ /dev/null @@ -1,483 +0,0 @@ -// Generated from PML.g4 by ANTLR 4.8 -package gov.nist.csd.pm.policy.pml.antlr; -import org.antlr.v4.runtime.tree.ParseTreeVisitor; - -/** - * This interface defines a complete generic visitor for a parse tree produced - * by {@link PMLParser}. - * - * @param The return type of the visit operation. Use {@link Void} for - * operations with no return type. - */ -public interface PMLVisitor extends ParseTreeVisitor { - /** - * Visit a parse tree produced by {@link PMLParser#pml}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitPml(PMLParser.PmlContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#statement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitStatement(PMLParser.StatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createPolicyStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createAttributeStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createUserOrObjectStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createObligationStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createRuleStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx); - /** - * Visit a parse tree produced by the {@code AnyUserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyUserSubject(PMLParser.AnyUserSubjectContext ctx); - /** - * Visit a parse tree produced by the {@code UserSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitUserSubject(PMLParser.UserSubjectContext ctx); - /** - * Visit a parse tree produced by the {@code UsersListSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitUsersListSubject(PMLParser.UsersListSubjectContext ctx); - /** - * Visit a parse tree produced by the {@code UserAttrSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitUserAttrSubject(PMLParser.UserAttrSubjectContext ctx); - /** - * Visit a parse tree produced by the {@code ProcessSubject} - * labeled alternative in {@link PMLParser#subjectClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitProcessSubject(PMLParser.ProcessSubjectContext ctx); - /** - * Visit a parse tree produced by the {@code PolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitPolicyElement(PMLParser.PolicyElementContext ctx); - /** - * Visit a parse tree produced by the {@code AnyPolicyElement} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyPolicyElement(PMLParser.AnyPolicyElementContext ctx); - /** - * Visit a parse tree produced by the {@code AnyContainedIn} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyContainedIn(PMLParser.AnyContainedInContext ctx); - /** - * Visit a parse tree produced by the {@code AnyOfSet} - * labeled alternative in {@link PMLParser#onClause}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyOfSet(PMLParser.AnyOfSetContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#anyPe}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyPe(PMLParser.AnyPeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#response}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitResponse(PMLParser.ResponseContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#responseBlock}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitResponseBlock(PMLParser.ResponseBlockContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#responseStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitResponseStatement(PMLParser.ResponseStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#createProhibitionStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#prohibitionContainerList}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitProhibitionContainerList(PMLParser.ProhibitionContainerListContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#prohibitionContainerExpression}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitProhibitionContainerExpression(PMLParser.ProhibitionContainerExpressionContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#setNodePropertiesStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#assignStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAssignStatement(PMLParser.AssignStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#deassignStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeassignStatement(PMLParser.DeassignStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#associateStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAssociateStatement(PMLParser.AssociateStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#dissociateStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDissociateStatement(PMLParser.DissociateStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#setResourceAccessRightsStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#deleteStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeleteStatement(PMLParser.DeleteStatementContext ctx); - /** - * Visit a parse tree produced by the {@code DeleteNode} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeleteNode(PMLParser.DeleteNodeContext ctx); - /** - * Visit a parse tree produced by the {@code DeleteObligation} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeleteObligation(PMLParser.DeleteObligationContext ctx); - /** - * Visit a parse tree produced by the {@code DeleteProhibition} - * labeled alternative in {@link PMLParser#deleteType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeleteProhibition(PMLParser.DeleteProhibitionContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#nodeType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitNodeType(PMLParser.NodeTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#deleteRuleStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#variableDeclarationStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#functionDefinitionStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#formalArgList}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFormalArgList(PMLParser.FormalArgListContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#formalArg}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFormalArg(PMLParser.FormalArgContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#formalArgType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFormalArgType(PMLParser.FormalArgTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#functionReturnStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx); - /** - * Visit a parse tree produced by the {@code VariableReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitVariableReturnType(PMLParser.VariableReturnTypeContext ctx); - /** - * Visit a parse tree produced by the {@code VoidReturnType} - * labeled alternative in {@link PMLParser#funcReturnType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitVoidReturnType(PMLParser.VoidReturnTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#funcBody}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFuncBody(PMLParser.FuncBodyContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#foreachStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitForeachStatement(PMLParser.ForeachStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#forRangeStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitForRangeStatement(PMLParser.ForRangeStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#breakStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitBreakStatement(PMLParser.BreakStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#continueStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitContinueStatement(PMLParser.ContinueStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#functionInvokeStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#ifStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitIfStatement(PMLParser.IfStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#elseIfStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitElseIfStatement(PMLParser.ElseIfStatementContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#elseStatement}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitElseStatement(PMLParser.ElseStatementContext ctx); - /** - * Visit a parse tree produced by the {@code StringType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitStringType(PMLParser.StringTypeContext ctx); - /** - * Visit a parse tree produced by the {@code BooleanType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitBooleanType(PMLParser.BooleanTypeContext ctx); - /** - * Visit a parse tree produced by the {@code ArrayVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitArrayVarType(PMLParser.ArrayVarTypeContext ctx); - /** - * Visit a parse tree produced by the {@code MapVarType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMapVarType(PMLParser.MapVarTypeContext ctx); - /** - * Visit a parse tree produced by the {@code AnyType} - * labeled alternative in {@link PMLParser#variableType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitAnyType(PMLParser.AnyTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#mapType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMapType(PMLParser.MapTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#arrayType}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitArrayType(PMLParser.ArrayTypeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#statementBlock}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitStatementBlock(PMLParser.StatementBlockContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#expression}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitExpression(PMLParser.ExpressionContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#array}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitArray(PMLParser.ArrayContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#map}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMap(PMLParser.MapContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#mapEntry}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMapEntry(PMLParser.MapEntryContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#entryReference}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitEntryReference(PMLParser.EntryReferenceContext ctx); - /** - * Visit a parse tree produced by the {@code StringLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitStringLiteral(PMLParser.StringLiteralContext ctx); - /** - * Visit a parse tree produced by the {@code BooleanLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitBooleanLiteral(PMLParser.BooleanLiteralContext ctx); - /** - * Visit a parse tree produced by the {@code NumberLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitNumberLiteral(PMLParser.NumberLiteralContext ctx); - /** - * Visit a parse tree produced by the {@code ArrayLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitArrayLiteral(PMLParser.ArrayLiteralContext ctx); - /** - * Visit a parse tree produced by the {@code MapLiteral} - * labeled alternative in {@link PMLParser#literal}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitMapLiteral(PMLParser.MapLiteralContext ctx); - /** - * Visit a parse tree produced by the {@code ReferenceByID} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitReferenceByID(PMLParser.ReferenceByIDContext ctx); - /** - * Visit a parse tree produced by the {@code ReferenceByEntry} - * labeled alternative in {@link PMLParser#variableReference}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitReferenceByEntry(PMLParser.ReferenceByEntryContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#functionInvoke}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx); - /** - * Visit a parse tree produced by {@link PMLParser#functionInvokeArgs}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitFunctionInvokeArgs(PMLParser.FunctionInvokeArgsContext ctx); -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/CompileError.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/CompileError.java deleted file mode 100644 index bdae186e5..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/error/CompileError.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.error; - -import gov.nist.csd.pm.policy.pml.PMLFormatter; -import gov.nist.csd.pm.policy.pml.compiler.Position; -import org.antlr.v4.runtime.ParserRuleContext; - -import java.util.Objects; - -public record CompileError(Position position, String errorMessage) { - - public static String getText(ParserRuleContext ctx) { - return PMLFormatter.getText(ctx); - } - - public static CompileError fromParserRuleContext(ParserRuleContext ctx, String message) { - return new CompileError( - new Position(ctx), - message - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CompileError that = (CompileError) o; - return Objects.equals(position, that.position) && Objects.equals(errorMessage, that.errorMessage); - } - - @Override - public int hashCode() { - return Objects.hash(position, errorMessage); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssignStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssignStmtVisitor.java deleted file mode 100644 index 49f0ca85d..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssignStmtVisitor.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.AssignStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class AssignStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public AssignStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public AssignStatement visitAssignStatement(PMLParser.AssignStatementContext ctx) { - Expression child = Expression.compile(visitorCtx, ctx.childNode, Type.string()); - Expression parents = Expression.compile(visitorCtx, ctx.parentNodes, Type.array(Type.string())); - - return new AssignStatement(child, parents); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssociateStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssociateStmtVisitor.java deleted file mode 100644 index 98180091c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/AssociateStmtVisitor.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.AssociateStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class AssociateStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public AssociateStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public AssociateStatement visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { - Expression ua = Expression.compile(visitorCtx, ctx.ua, Type.string()); - Expression target = Expression.compile(visitorCtx, ctx.target, Type.string()); - Expression accessRights = Expression.compile(visitorCtx, ctx.accessRights, Type.array(Type.string())); - - return new AssociateStatement(ua, target, accessRights); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/BreakStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/BreakStmtVisitor.java deleted file mode 100644 index 1221480c5..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/BreakStmtVisitor.java +++ /dev/null @@ -1,39 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.BreakStatement; -import org.antlr.v4.runtime.ParserRuleContext; - -public class BreakStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public BreakStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public BreakStatement visitBreakStatement(PMLParser.BreakStatementContext ctx) { - // check that there is a for loop parent - if (!inFor(ctx)) { - visitorCtx.errorLog().addError( - ctx, - "continue statement not in foreach" - ); - } - - return new BreakStatement(); - } - - private boolean inFor(ParserRuleContext ctx) { - if (ctx instanceof PMLParser.ForeachStatementContext) { - return true; - } else if (ctx == null) { - return false; - } - - return inFor(ctx.getParent()); - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ContinueStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ContinueStmtVisitor.java deleted file mode 100644 index 756f80509..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ContinueStmtVisitor.java +++ /dev/null @@ -1,39 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.ContinueStatement; -import org.antlr.v4.runtime.ParserRuleContext; - -public class ContinueStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public ContinueStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public ContinueStatement visitContinueStatement(PMLParser.ContinueStatementContext ctx) { - // check that there is a for loop parent - if (!inFor(ctx)) { - visitorCtx.errorLog().addError( - ctx, - "continue statement not in foreach" - ); - } - - return new ContinueStatement(); - } - - private boolean inFor(ParserRuleContext ctx) { - if (ctx instanceof PMLParser.ForeachStatementContext) { - return true; - } else if (ctx == null) { - return false; - } - - return inFor(ctx.getParent()); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateAttrStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateAttrStmtVisitor.java deleted file mode 100644 index eef0c5fbc..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateAttrStmtVisitor.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.CreateAttrStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -public class CreateAttrStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreateAttrStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreateAttrStatement visitCreateAttributeStatement(PMLParser.CreateAttributeStatementContext ctx) { - NodeType type = ctx.OBJECT_ATTRIBUTE() != null ? - NodeType.OA : NodeType.UA; - Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); - Expression assignTo = Expression.compile(visitorCtx, ctx.parents, Type.array(Type.string())); - - return new CreateAttrStatement(name, type, assignTo); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateObligationStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateObligationStmtVisitor.java deleted file mode 100644 index 26d446ae4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateObligationStmtVisitor.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.CreateObligationStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class CreateObligationStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreateObligationStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreateObligationStatement visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { - Expression name = Expression.compile(visitorCtx, ctx.expression(), Type.string()); - - List ruleStmts = new ArrayList<>(); - for (PMLParser.CreateRuleStatementContext ruleStmt : ctx.createRuleStatement()) { - PMLStatement createRuleStmt = new CreateRuleStmtVisitor(visitorCtx) - .visitCreateRuleStatement(ruleStmt); - ruleStmts.add(createRuleStmt); - } - - return new CreateObligationStatement(name, ruleStmts); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreatePolicyStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreatePolicyStmtVisitor.java deleted file mode 100644 index 19e2b699b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreatePolicyStmtVisitor.java +++ /dev/null @@ -1,23 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.CreatePolicyStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class CreatePolicyStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreatePolicyStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreatePolicyStatement visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { - Expression name = Expression.compile(visitorCtx, ctx.expression(), Type.string()); - return new CreatePolicyStatement(name); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateProhibitionStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateProhibitionStmtVisitor.java deleted file mode 100644 index aa88a70c0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateProhibitionStmtVisitor.java +++ /dev/null @@ -1,49 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import gov.nist.csd.pm.policy.pml.statement.CreateProhibitionStatement; - -import java.util.ArrayList; -import java.util.List; - -public class CreateProhibitionStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreateProhibitionStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreateProhibitionStatement visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { - Expression label = Expression.compile(visitorCtx, ctx.name, Type.string()); - Expression subject = Expression.compile(visitorCtx, ctx.subject, Type.string()); - ProhibitionSubject.Type type; - if (ctx.USER() != null) { - type = ProhibitionSubject.Type.USER; - } else if (ctx.USER_ATTRIBUTE() != null) { - type = ProhibitionSubject.Type.USER_ATTRIBUTE; - } else { - type = ProhibitionSubject.Type.PROCESS; - } - - Expression accessRights = Expression.compile(visitorCtx, ctx.accessRights, Type.array(Type.string())); - - boolean isIntersection = ctx.INTERSECTION() != null; - - List containers = new ArrayList<>(); - for (PMLParser.ProhibitionContainerExpressionContext contExprCtx : ctx.containers.prohibitionContainerExpression()) { - boolean isComplement = - contExprCtx.IS_COMPLEMENT() != null && contExprCtx.IS_COMPLEMENT().getText().equals("!"); - Expression name = Expression.compile(visitorCtx, contExprCtx.container, Type.string()); - containers.add(new CreateProhibitionStatement.Container(isComplement, name)); - } - - return new CreateProhibitionStatement(label, subject, type, accessRights, isIntersection, containers); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateRuleStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateRuleStmtVisitor.java deleted file mode 100644 index 6f97448a4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateRuleStmtVisitor.java +++ /dev/null @@ -1,124 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.scope.VariableAlreadyDefinedInScopeException; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.CreateRuleStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class CreateRuleStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreateRuleStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreateRuleStatement visitCreateRuleStatement(PMLParser.CreateRuleStatementContext ctx) { - Expression name = Expression.compile(visitorCtx, ctx.ruleName, Type.string()); - - CreateRuleStatement.SubjectClause subjectClause = getSubjectClause(ctx.subjectClause()); - CreateRuleStatement.PerformsClause performsClause = getPerformsClause(ctx.performsClause); - CreateRuleStatement.OnClause onClause = getOnClause(ctx.onClause()); - CreateRuleStatement.ResponseBlock responseBlock = new CreateRuleStatement.ResponseBlock(); - try { - responseBlock = getResponse(ctx.response()); - } catch (VariableAlreadyDefinedInScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - return new CreateRuleStatement(name, subjectClause, performsClause, onClause, responseBlock); - } - - private CreateRuleStatement.ResponseBlock getResponse(PMLParser.ResponseContext ctx) throws VariableAlreadyDefinedInScopeException { - String evtVar = ctx.ID().getText(); - - // create a new local parser scope for the response block - // add the event name and event context map to the local parser scope - VisitorContext localVisitorCtx = visitorCtx.copy(); - localVisitorCtx.scope().addVariable(evtVar, Type.map(Type.string(), Type.any()), true); - - PMLParser.ResponseBlockContext responseBlockCtx = ctx.responseBlock(); - List responseStmtsCtx = responseBlockCtx.responseStatement(); - - List stmts = new ArrayList<>(); - for (PMLParser.ResponseStatementContext responseStmtCtx : responseStmtsCtx) { - PMLStatement stmt = null; - - if (responseStmtCtx.statement() != null) { - stmt = new StatementVisitor(localVisitorCtx) - .visitStatement(responseStmtCtx.statement()); - } else if (responseStmtCtx.createRuleStatement() != null) { - stmt = new CreateRuleStmtVisitor(localVisitorCtx) - .visitCreateRuleStatement(responseStmtCtx.createRuleStatement()); - } else if (responseStmtCtx.deleteRuleStatement() != null) { - stmt = new DeleteRuleStmtVisitor(localVisitorCtx) - .visitDeleteRuleStatement(responseStmtCtx.deleteRuleStatement()); - } - - stmts.add(stmt); - } - - return new CreateRuleStatement.ResponseBlock(evtVar, stmts); - } - - private CreateRuleStatement.OnClause getOnClause(PMLParser.OnClauseContext onClauseCtx) { - Expression name = null; - CreateRuleStatement.TargetType onClauseType = null; - if (onClauseCtx instanceof PMLParser.PolicyElementContext policyElementContext) { - name = Expression.compile(visitorCtx, policyElementContext.expression(), Type.string()); - onClauseType = CreateRuleStatement.TargetType.POLICY_ELEMENT; - } else if (onClauseCtx instanceof PMLParser.AnyPolicyElementContext) { - onClauseType = CreateRuleStatement.TargetType.ANY_POLICY_ELEMENT; - } else if (onClauseCtx instanceof PMLParser.AnyContainedInContext anyContainedInContext) { - name = Expression.compile(visitorCtx, anyContainedInContext.expression(), Type.string()); - onClauseType = CreateRuleStatement.TargetType.ANY_CONTAINED_IN; - } else if (onClauseCtx instanceof PMLParser.AnyOfSetContext anyOfSetContext) { - name = Expression.compile(visitorCtx, anyOfSetContext.expression(), Type.array(Type.string())); - onClauseType = CreateRuleStatement.TargetType.ANY_OF_SET; - } else { - onClauseType = CreateRuleStatement.TargetType.ANY_POLICY_ELEMENT; - } - - return new CreateRuleStatement.OnClause(name, onClauseType); - } - - private CreateRuleStatement.PerformsClause getPerformsClause(PMLParser.ExpressionContext performsClause) { - Expression expression = Expression.compile(visitorCtx, performsClause, Type.array(Type.string())); - return new CreateRuleStatement.PerformsClause(expression); - } - - private CreateRuleStatement.SubjectClause getSubjectClause(PMLParser.SubjectClauseContext ctx) { - CreateRuleStatement.SubjectType type; - Expression expr; - - if (ctx instanceof PMLParser.AnyUserSubjectContext) { - type = CreateRuleStatement.SubjectType.ANY_USER; - return new CreateRuleStatement.SubjectClause(type); - } else if (ctx instanceof PMLParser.UserSubjectContext userSubjectCtx) { - type = CreateRuleStatement.SubjectType.USER; - expr = Expression.compile(visitorCtx, userSubjectCtx.user, Type.string()); - - } else if (ctx instanceof PMLParser.UsersListSubjectContext usersListSubjectCtx) { - type = CreateRuleStatement.SubjectType.USERS; - expr = Expression.compile(visitorCtx, usersListSubjectCtx.users, Type.array(Type.string())); - - } else if (ctx instanceof PMLParser.UserAttrSubjectContext userAttrSubjectCtx) { - type = CreateRuleStatement.SubjectType.USER; - expr = Expression.compile(visitorCtx, userAttrSubjectCtx.attribute, Type.string()); - - } else { - type = CreateRuleStatement.SubjectType.USER; - expr = Expression.compile(visitorCtx, ((PMLParser.ProcessSubjectContext)ctx).process, Type.string()); - } - - return new CreateRuleStatement.SubjectClause(type, expr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateUserOrObjectStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateUserOrObjectStmtVisitor.java deleted file mode 100644 index 66ea65be1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/CreateUserOrObjectStmtVisitor.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.CreateUserOrObjectStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -public class CreateUserOrObjectStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public CreateUserOrObjectStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public CreateUserOrObjectStatement visitCreateUserOrObjectStatement(PMLParser.CreateUserOrObjectStatementContext ctx) { - NodeType type = ctx.OBJECT() != null ? - NodeType.O : NodeType.U; - Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); - Expression assignTo = Expression.compile(visitorCtx, ctx.parents, Type.array(Type.string())); - - return new CreateUserOrObjectStatement(name, type, assignTo); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeassignStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeassignStmtVisitor.java deleted file mode 100644 index 54edcc9f2..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeassignStmtVisitor.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.DeassignStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class DeassignStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public DeassignStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public DeassignStatement visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { - Expression name = Expression.compile(visitorCtx, ctx.childNode, Type.string()); - Expression parents = Expression.compile(visitorCtx, ctx.parentNodes, Type.array(Type.string())); - - return new DeassignStatement(name, parents); - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteRuleStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteRuleStmtVisitor.java deleted file mode 100644 index 0f2650e7e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteRuleStmtVisitor.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.DeleteRuleStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class DeleteRuleStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public DeleteRuleStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public DeleteRuleStatement visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { - Expression ruleNameExpr = Expression.compile(visitorCtx, ctx.ruleName, Type.string()); - Expression oblNameExpr = Expression.compile(visitorCtx, ctx.obligationName, Type.string()); - return new DeleteRuleStatement(ruleNameExpr, oblNameExpr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteStmtVisitor.java deleted file mode 100644 index 4fa448467..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DeleteStmtVisitor.java +++ /dev/null @@ -1,45 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.DeleteStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class DeleteStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public DeleteStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public DeleteStatement visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { - Expression nameExpr = Expression.compile(visitorCtx, ctx.expression(), Type.string()); - - PMLParser.DeleteTypeContext deleteTypeCtx = ctx.deleteType(); - if (deleteTypeCtx instanceof PMLParser.DeleteNodeContext deleteNodeCtx) { - DeleteStatement.Type deleteNodeType; - PMLParser.NodeTypeContext nodeTypeCtx = deleteNodeCtx.nodeType(); - if (nodeTypeCtx.POLICY_CLASS() != null) { - deleteNodeType = DeleteStatement.Type.POLICY_CLASS; - } else if (nodeTypeCtx.OBJECT_ATTRIBUTE() != null) { - deleteNodeType = DeleteStatement.Type.OBJECT_ATTRIBUTE; - } else if (nodeTypeCtx.USER_ATTRIBUTE() != null) { - deleteNodeType = DeleteStatement.Type.USER_ATTRIBUTE; - } else if (nodeTypeCtx.OBJECT() != null) { - deleteNodeType = DeleteStatement.Type.OBJECT; - } else { - deleteNodeType = DeleteStatement.Type.USER; - } - - return new DeleteStatement(deleteNodeType, nameExpr); - } else if (deleteTypeCtx instanceof PMLParser.DeleteProhibitionContext) { - return new DeleteStatement(DeleteStatement.Type.PROHIBITION, nameExpr); - } else { - return new DeleteStatement(DeleteStatement.Type.OBLIGATION, nameExpr); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DissociateStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DissociateStmtVisitor.java deleted file mode 100644 index 4e3c71edb..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/DissociateStmtVisitor.java +++ /dev/null @@ -1,24 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.DissociateStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -public class DissociateStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public DissociateStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public DissociateStatement visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { - Expression ua = Expression.compile(visitorCtx, ctx.ua, Type.string()); - Expression target = Expression.compile(visitorCtx, ctx.target, Type.string()); - return new DissociateStatement(ua, target); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForRangeStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForRangeStmtVisitor.java deleted file mode 100644 index c0a31938b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForRangeStmtVisitor.java +++ /dev/null @@ -1,52 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.ForRangeStatement; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class ForRangeStmtVisitor extends PMLBaseVisitor { - private final VisitorContext visitorCtx; - - public ForRangeStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public ForRangeStatement visitForRangeStatement(PMLParser.ForRangeStatementContext ctx) { - String varName = ctx.ID().getText(); - - boolean lowerBound = ctx.lowerBound.getText().equals("("); - boolean upperBound = ctx.upperBound.getText().equals(")"); - - Expression lower = Expression.compile(visitorCtx, ctx.lower, Type.number()); - Expression upper = Expression.compile(visitorCtx, ctx.upper, Type.number()); - - VisitorContext localVisitorCtx = visitorCtx.copy(); - List block = new ArrayList<>(); - - for (PMLParser.StatementContext stmtCtx : ctx.statementBlock().statement()) { - - try { - localVisitorCtx.scope().addVariable(varName, Type.number(), false); - }catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - PMLStatement statement = new StatementVisitor(localVisitorCtx) - .visitStatement(stmtCtx); - block.add(statement); - - visitorCtx.scope().overwriteVariables(localVisitorCtx.scope()); - } - - return new ForRangeStatement(varName, lower, lowerBound, upper, upperBound, block); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForeachStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForeachStmtVisitor.java deleted file mode 100644 index 8382df398..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/ForeachStmtVisitor.java +++ /dev/null @@ -1,79 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.ForeachStatement; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class ForeachStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public ForeachStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public ForeachStatement visitForeachStatement(PMLParser.ForeachStatementContext ctx) { - Type anyArrayType = Type.array(Type.any()); - Type anyMapType = Type.map(Type.any(), Type.any()); - - Expression iter = Expression.compile(visitorCtx, ctx.expression(), anyArrayType, anyMapType); - Type iterType = Type.any(); - try { - iterType = iter.getType(visitorCtx.scope()); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - String varName = ctx.key.getText(); - String mapValueVarName = null; - if (ctx.mapValue != null) { - if (!iterType.equals(Type.map(Type.any(), Type.any()))) { - visitorCtx.errorLog().addError( - ctx, - "use of key, value in foreach only available for maps" - ); - } else { - mapValueVarName = ctx.mapValue.getText(); - } - } - - List block = new ArrayList<>(); - Type keyType; - Type valueType = null; - if (iterType.equals(anyArrayType)) { - keyType = iterType.getArrayType(); - } else { - keyType = iterType.getMapKeyType(); - valueType = iterType.getMapValueType(); - } - - VisitorContext localVisitorCtx = visitorCtx.copy(); - for (PMLParser.StatementContext stmtCtx : ctx.statementBlock().statement()) { - try { - localVisitorCtx.scope().addVariable(varName, keyType, false); - if (valueType != null) { - localVisitorCtx.scope().addVariable(mapValueVarName, valueType, false); - } - }catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - PMLStatement statement = new StatementVisitor(localVisitorCtx) - .visitStatement(stmtCtx); - block.add(statement); - - visitorCtx.scope().overwriteVariables(localVisitorCtx.scope()); - } - - return new ForeachStatement(varName, mapValueVarName, iter, block); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionDefinitionVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionDefinitionVisitor.java deleted file mode 100644 index 771e8a0d4..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionDefinitionVisitor.java +++ /dev/null @@ -1,150 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionReturnStmt; -import gov.nist.csd.pm.policy.pml.model.scope.FunctionAlreadyDefinedInScopeException; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -public class FunctionDefinitionVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public FunctionDefinitionVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public FunctionDefinitionStatement visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { - String funcName = ctx.ID().getText(); - List args = parseFormalArgs(ctx.formalArgList()); - Type returnType = parseReturnType(ctx.funcReturnType()); - List body = parseBody(ctx, args); - - FunctionDefinitionStatement functionDefinition = new FunctionDefinitionStatement(funcName, returnType, args, body); - - // add function to scope - try { - visitorCtx.scope().addFunction(functionDefinition); - } catch (FunctionAlreadyDefinedInScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - // check that the body has a return statement IF the return type is NOT VOID - PMLStatement lastStmt = null; - if (body.size() > 0) { - lastStmt = body.get(body.size()-1); - } - - if (returnType.isVoid()) { - if (lastStmt instanceof FunctionReturnStmt returnStmt) { - if (!returnStmt.isVoid()) { - visitorCtx.errorLog().addError( - ctx, - "return statement should be empty for functions that return VOID" - ); - } - } - } else { - if (lastStmt instanceof FunctionReturnStmt returnStmt) { - Type retExprType = Type.any(); - try { - retExprType = returnStmt.getExpr().getType(visitorCtx.scope()); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - if (returnStmt.isVoid()) { - visitorCtx.errorLog().addError( - ctx, - "return statement missing expression" - ); - } else if (!retExprType.equals(returnType)) { - visitorCtx.errorLog().addError( - ctx, - "function expected to return type " + returnType + " not " + retExprType - ); - } - } else { - visitorCtx.errorLog().addError( - ctx, - "function missing return statement at end of function body" - ); - } - } - - return functionDefinition; - } - - private List parseBody(PMLParser.FunctionDefinitionStatementContext ctx, List args) { - PMLParser.FuncBodyContext funcBodyCtx = ctx.funcBody(); - - // create a new scope for the function body - VisitorContext localVisitorCtx = visitorCtx.copy(); - // add the args to the local scope - for (FormalArgument formalArgument : args) { - // string literal as a placeholder since the actual value is not determined yet - try { - localVisitorCtx.scope().addVariable(formalArgument.name(), formalArgument.type(), false); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - } - - StatementVisitor statementVisitor = new StatementVisitor(localVisitorCtx); - List stmts = new ArrayList<>(); - for (PMLParser.StatementContext stmtCtx : funcBodyCtx.statement()) { - stmts.add(statementVisitor.visitStatement(stmtCtx)); - } - - return stmts; - } - - private List parseFormalArgs(PMLParser.FormalArgListContext formalArgListCtx) { - List formalArguments = new ArrayList<>(); - Set argNames = new HashSet<>(); - for (PMLParser.FormalArgContext formalArgCtx : formalArgListCtx.formalArg()) { - String name = formalArgCtx.ID().getText(); - PMLParser.VariableTypeContext varTypeContext = formalArgCtx.formalArgType().variableType(); - - // check that a formalArg does not clash with an already defined variable - if (visitorCtx.scope().variableExists(name) || argNames.contains(name)) { - visitorCtx.errorLog().addError( - formalArgCtx, - String.format("formal arg '%s' already defined in scope", name) - ); - } - - Type type = Type.toType(varTypeContext); - - argNames.add(name); - formalArguments.add(new FormalArgument(name, type)); - } - - return formalArguments; - } - - private Type parseReturnType(PMLParser.FuncReturnTypeContext funcReturnTypeCtx) { - if (funcReturnTypeCtx == null) { - return Type.voidType(); - } - - if (funcReturnTypeCtx instanceof PMLParser.VariableReturnTypeContext varReturnTypeCtx) { - PMLParser.VariableTypeContext varTypeCtx = varReturnTypeCtx.variableType(); - return Type.toType(varTypeCtx); - } else if (funcReturnTypeCtx instanceof PMLParser.VoidReturnTypeContext) { - return Type.voidType(); - } - - return Type.any(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionInvokeVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionInvokeVisitor.java deleted file mode 100644 index 77e6b0340..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionInvokeVisitor.java +++ /dev/null @@ -1,91 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownFunctionInScopeException; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.FunctionInvocationStatement; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.ArrayList; -import java.util.List; - -public class FunctionInvokeVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public FunctionInvokeVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public FunctionInvocationStatement visitFunctionInvoke(PMLParser.FunctionInvokeContext ctx) { - return parse(ctx); - } - - @Override - public FunctionInvocationStatement visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { - return parse(ctx.functionInvoke()); - } - - private FunctionInvocationStatement parse(PMLParser.FunctionInvokeContext funcCallCtx) { - String funcName = funcCallCtx.ID().getText(); - - // get actual arg expressions - PMLParser.FunctionInvokeArgsContext funcCallArgsCtx = funcCallCtx.functionInvokeArgs(); - List actualArgs = new ArrayList<>(); - for (PMLParser.ExpressionContext exprCtx : funcCallArgsCtx.expression()) { - Expression expr = Expression.compile(visitorCtx, exprCtx); - - actualArgs.add(expr); - } - - // check the function is in scope and the args are correct - FunctionDefinitionStatement functionDefinitionStmt = null; - try { - functionDefinitionStmt = visitorCtx.scope().getFunction(funcName); - } catch (UnknownFunctionInScopeException e) { - visitorCtx.errorLog().addError(funcCallCtx, e.getMessage()); - } - - // if the stmt is null then there was a compilation error, just return the statement - if (functionDefinitionStmt == null) { - return new FunctionInvocationStatement(funcName, actualArgs); - } - - // check that the actual args are correct type - List formalArgs = functionDefinitionStmt.getArgs(); - - if (formalArgs.size() != actualArgs.size()) { - visitorCtx.errorLog().addError( - funcCallCtx, - "wrong number of args for function call " + funcName + ": " + - "expected " + formalArgs.size() + ", got " + actualArgs.size() - ); - } else { - for (int i = 0; i < actualArgs.size(); i++) { - try { - Expression actual = actualArgs.get(i); - Type actualType = actual.getType(visitorCtx.scope()); - FormalArgument formal = formalArgs.get(i); - - if (!actual.getType(visitorCtx.scope()).equals(formal.type())) { - visitorCtx.errorLog().addError( - funcCallCtx, - "invalid argument type: expected " + formal.type() + ", got " + - actualType + " at arg " + i - ); - } - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(funcCallCtx, e.getMessage()); - } - } - } - - return new FunctionInvocationStatement(funcName, actualArgs); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionReturnStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionReturnStmtVisitor.java deleted file mode 100644 index 6730f5c36..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/FunctionReturnStmtVisitor.java +++ /dev/null @@ -1,46 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.FunctionReturnStmt; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import org.antlr.v4.runtime.ParserRuleContext; - -public class FunctionReturnStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public FunctionReturnStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public FunctionReturnStmt visitFunctionReturnStatement(PMLParser.FunctionReturnStatementContext ctx) { - // check that the return statement is inside a function - if (!inFunction(ctx)) { - visitorCtx.errorLog().addError( - ctx, - "return statement not in function definition" - ); - } - - if (ctx.expression() == null) { - return new FunctionReturnStmt(); - } else { - Expression expr = Expression.compile(visitorCtx, ctx.expression()); - - return new FunctionReturnStmt(expr); - } - } - - private boolean inFunction(ParserRuleContext ctx) { - if (ctx instanceof PMLParser.FunctionDefinitionStatementContext) { - return true; - } else if (ctx == null) { - return false; - } - - return inFunction(ctx.getParent()); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/IfStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/IfStmtVisitor.java deleted file mode 100644 index 0080e1c9a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/IfStmtVisitor.java +++ /dev/null @@ -1,75 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.IfStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class IfStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public IfStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public IfStatement visitIfStatement(PMLParser.IfStatementContext ctx) { - // if block - VisitorContext localVisitorCtx = visitorCtx.copy(); - boolean isComp = ctx.IS_COMPLEMENT() != null; - Expression condition = Expression.compile(localVisitorCtx, ctx.condition, Type.bool()); - - List block = new ArrayList<>(); - StatementVisitor statementVisitor = new StatementVisitor(localVisitorCtx); - for (PMLParser.StatementContext stmtCtx : ctx.statementBlock().statement()) { - PMLStatement statement = statementVisitor.visitStatement(stmtCtx); - block.add(statement); - } - - // update outer scoped variables - visitorCtx.scope().overwriteVariables(localVisitorCtx.scope()); - - IfStatement.ConditionalBlock ifBlock = new IfStatement.ConditionalBlock(isComp, condition, block); - - // else ifs - localVisitorCtx = visitorCtx.copy(); - statementVisitor = new StatementVisitor(localVisitorCtx); - List elseIfs = new ArrayList<>(); - for (PMLParser.ElseIfStatementContext elseIfStmtCtx : ctx.elseIfStatement()) { - isComp = elseIfStmtCtx.IS_COMPLEMENT() != null; - condition = Expression.compile(visitorCtx, elseIfStmtCtx.condition, Type.bool()); - block = new ArrayList<>(); - for (PMLParser.StatementContext stmtCtx : elseIfStmtCtx.statementBlock().statement()) { - PMLStatement statement = statementVisitor.visitStatement(stmtCtx); - block.add(statement); - } - elseIfs.add(new IfStatement.ConditionalBlock(isComp, condition, block)); - - // update outer scoped variables - visitorCtx.scope().overwriteVariables(localVisitorCtx.scope()); - } - - // else - localVisitorCtx = visitorCtx.copy(); - statementVisitor = new StatementVisitor(localVisitorCtx); - block = new ArrayList<>(); - if (ctx.elseStatement() != null) { - for (PMLParser.StatementContext stmtCtx : ctx.elseStatement().statementBlock().statement()) { - PMLStatement statement = statementVisitor.visitStatement(stmtCtx); - block.add(statement); - } - - // update outer scoped variables - visitorCtx.scope().overwriteVariables(localVisitorCtx.scope()); - } - - return new IfStatement(ifBlock, elseIfs, block); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/LiteralExprVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/LiteralExprVisitor.java deleted file mode 100644 index b9fa4552a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/LiteralExprVisitor.java +++ /dev/null @@ -1,167 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Literal; -import gov.nist.csd.pm.policy.pml.model.expression.MapLiteral; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.ArrayLiteral; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class LiteralExprVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public LiteralExprVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - public Literal visitLiteral(PMLParser.LiteralContext literalCtx) { - if (literalCtx instanceof PMLParser.StringLiteralContext stringLiteralCtx) { - return parseStringLiteral(stringLiteralCtx); - } else if (literalCtx instanceof PMLParser.NumberLiteralContext numberLiteralCtx) { - return parseNumberLiteral(numberLiteralCtx); - } else if (literalCtx instanceof PMLParser.BooleanLiteralContext booleanLiteralCtx) { - return parseBooleanLiteral(booleanLiteralCtx); - } else if (literalCtx instanceof PMLParser.ArrayLiteralContext arrayLiteralCtx) { - return parseArrayLiteral(arrayLiteralCtx); - } else { - return parseMapLiteral((PMLParser.MapLiteralContext) literalCtx); - } - } - - @Override - public Literal visitNumberLiteral(PMLParser.NumberLiteralContext ctx) { - return visitLiteral(ctx); - } - - @Override - public Literal visitStringLiteral(PMLParser.StringLiteralContext ctx) { - return visitLiteral(ctx); - } - - @Override - public Literal visitBooleanLiteral(PMLParser.BooleanLiteralContext ctx) { - return visitLiteral(ctx); - } - - @Override - public Literal visitArrayLiteral(PMLParser.ArrayLiteralContext ctx) { - return visitLiteral(ctx); - } - - @Override - public Literal visitMapLiteral(PMLParser.MapLiteralContext ctx) { - return visitLiteral(ctx); - } - - private Literal parseNumberLiteral(PMLParser.NumberLiteralContext ctx) { - return new Literal(Integer.parseInt(ctx.NUMBER().getText())); - } - - private Literal parseStringLiteral(PMLParser.StringLiteralContext ctx) { - return new Literal(removeQuotes(ctx.STRING().getText())); - } - - private Literal parseBooleanLiteral(PMLParser.BooleanLiteralContext ctx) { - return new Literal(ctx.BOOLEAN().getText().equalsIgnoreCase("true")); - } - - private Literal parseArrayLiteral(PMLParser.ArrayLiteralContext ctx) { - PMLParser.ArrayContext arrayCtx = ctx.array(); - Type elementType = null; - if (arrayCtx.expression().isEmpty()) { - elementType = Type.any(); - } - - // determine the type of the array literal elements - // if all the elements are of the same type then that is the element type - // if the elements are of different types then the type is ANY - List exprs = new ArrayList<>(); - for (PMLParser.ExpressionContext expressionCtx : arrayCtx.expression()) { - Expression expr = Expression.compile(visitorCtx, expressionCtx); - Type type = Type.any(); - try { - type = expr.getType(visitorCtx.scope()); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(expressionCtx, e.getMessage()); - } - - if (elementType == null) { - elementType = type; - } else if (!type.equals(elementType)) { - elementType = Type.any(); - } - - exprs.add(expr); - } - - return new Literal(new ArrayLiteral(exprs.toArray(new Expression[]{}), elementType)); - } - - private Literal parseMapLiteral(PMLParser.MapLiteralContext ctx) { - Map map = new HashMap<>(); - - Type keyType = null; - Type valueType = null; - - for(PMLParser.MapEntryContext mapEntryCtx : ctx.map().mapEntry()) { - Expression keyExpr = Expression.compile(visitorCtx, mapEntryCtx.key); - Expression valueExpr = Expression.compile(visitorCtx, mapEntryCtx.value); - - Type keyExprType = Type.any(); - Type valueExprType = Type.any(); - try { - keyExprType = keyExpr.getType(visitorCtx.scope()); - valueExprType = valueExpr.getType(visitorCtx.scope()); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(mapEntryCtx, e.getMessage()); - } - - // check that all map keys are the same type - if (keyType == null) { - keyType = keyExprType; - } else if (!keyExprType.equals(keyType)) { - visitorCtx.errorLog().addError( - ctx, - "expected map keys to be of the same type but found: " - + keyExprType + " and " + keyType - ); - } - - // if map values are different types then the value type for this map is ANY - if (valueType == null) { - valueType = valueExprType; - } else if (!valueExprType.equals(valueType)) { - valueType = Type.any(); - } - - map.put(keyExpr, valueExpr); - } - - if (keyType == null) { - keyType = Type.any(); - } - - if (valueType == null) { - valueType = Type.any(); - } - - return new Literal(new MapLiteral(map, keyType, valueType)); - } - - private String removeQuotes(String s) { - if ((s.startsWith("'") && s.endsWith("'")) || (s.startsWith("\"") && s.endsWith("\""))) { - return s.substring(1, s.length() - 1); - } else { - return s; - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/PolicyVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/PolicyVisitor.java deleted file mode 100644 index 92ad89e0f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/PolicyVisitor.java +++ /dev/null @@ -1,30 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.util.ArrayList; -import java.util.List; - -public class PolicyVisitor extends PMLBaseVisitor> { - - private final VisitorContext visitorCtx; - - public PolicyVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public List visitPml(PMLParser.PmlContext ctx) { - List statements = new ArrayList<>(); - for (PMLParser.StatementContext stmtCtx : ctx.statement()) { - StatementVisitor statementVisitor = new StatementVisitor(visitorCtx); - PMLStatement statement = statementVisitor.visitStatement(stmtCtx); - statements.add(statement); - } - return statements; - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java deleted file mode 100644 index 8518a3f76..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetNodePropertiesStmtVisitor.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.SetNodePropertiesStatement; - -public class SetNodePropertiesStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public SetNodePropertiesStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public SetNodePropertiesStatement visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { - Expression name = Expression.compile(visitorCtx, ctx.name, Type.string()); - Expression props = Expression.compile(visitorCtx, ctx.properties, Type.map(Type.string(), Type.string())); - - return new SetNodePropertiesStatement(name, props); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetResourceAccessRightsStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetResourceAccessRightsStmtVisitor.java deleted file mode 100644 index a2bc4e79c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/SetResourceAccessRightsStmtVisitor.java +++ /dev/null @@ -1,31 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.SetResourceAccessRightsStatement; - -public class SetResourceAccessRightsStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public SetResourceAccessRightsStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public SetResourceAccessRightsStatement visitSetResourceAccessRightsStatement(PMLParser.SetResourceAccessRightsStatementContext ctx) { - if (visitorCtx.scope().isResourceAccessRightsExpressionSet()) { - visitorCtx.errorLog().addError(ctx, "set resource access rights has already been called"); - return new SetResourceAccessRightsStatement(visitorCtx.scope().getResourceAccessRightsExpression()); - } - - Expression exprList = Expression.compile(visitorCtx, ctx.accessRights, Type.array(Type.string())); - - visitorCtx.scope().setResourceAccessRightsExpression(exprList); - - return new SetResourceAccessRightsStatement(exprList); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/StatementVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/StatementVisitor.java deleted file mode 100644 index 35f67f070..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/StatementVisitor.java +++ /dev/null @@ -1,89 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -public class StatementVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public StatementVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public PMLStatement visitStatement(PMLParser.StatementContext ctx) { - PMLStatement statement = null; - if (ctx.variableDeclarationStatement() != null) { - statement = new VarStmtVisitor(visitorCtx) - .visitVariableDeclarationStatement(ctx.variableDeclarationStatement()); - } else if (ctx.functionDefinitionStatement() != null) { - statement = new FunctionDefinitionVisitor(visitorCtx) - .visitFunctionDefinitionStatement(ctx.functionDefinitionStatement()); - } else if (ctx.foreachStatement() != null) { - statement = new ForeachStmtVisitor(visitorCtx) - .visitForeachStatement(ctx.foreachStatement()); - } else if (ctx.forRangeStatement() != null) { - statement = new ForRangeStmtVisitor(visitorCtx) - .visitForRangeStatement(ctx.forRangeStatement()); - } else if (ctx.functionInvokeStatement() != null) { - statement = new FunctionInvokeVisitor(visitorCtx) - .visitFunctionInvokeStatement(ctx.functionInvokeStatement()); - } else if (ctx.ifStatement() != null) { - statement = new IfStmtVisitor(visitorCtx) - .visitIfStatement(ctx.ifStatement()); - } else if (ctx.createAttributeStatement() != null) { - statement = new CreateAttrStmtVisitor(visitorCtx) - .visitCreateAttributeStatement(ctx.createAttributeStatement()); - } else if (ctx.createPolicyStatement() != null) { - statement = new CreatePolicyStmtVisitor(visitorCtx) - .visitCreatePolicyStatement(ctx.createPolicyStatement()); - } else if (ctx.createUserOrObjectStatement() != null) { - statement = new CreateUserOrObjectStmtVisitor(visitorCtx) - .visitCreateUserOrObjectStatement(ctx.createUserOrObjectStatement()); - } else if (ctx.createProhibitionStatement() != null) { - statement = new CreateProhibitionStmtVisitor(visitorCtx) - .visitCreateProhibitionStatement(ctx.createProhibitionStatement()); - } else if (ctx.createObligationStatement() != null) { - statement = new CreateObligationStmtVisitor(visitorCtx) - .visitCreateObligationStatement(ctx.createObligationStatement()); - } else if (ctx.setNodePropertiesStatement() != null) { - statement = new SetNodePropertiesStmtVisitor(visitorCtx) - .visitSetNodePropertiesStatement(ctx.setNodePropertiesStatement()); - } else if (ctx.assignStatement() != null) { - statement = new AssignStmtVisitor(visitorCtx) - .visitAssignStatement(ctx.assignStatement()); - } else if (ctx.deassignStatement() != null) { - statement = new DeassignStmtVisitor(visitorCtx) - .visitDeassignStatement(ctx.deassignStatement()); - } else if (ctx.deleteStatement() != null) { - statement = new DeleteStmtVisitor(visitorCtx) - .visitDeleteStatement(ctx.deleteStatement()); - } else if (ctx.associateStatement() != null) { - statement = new AssociateStmtVisitor(visitorCtx) - .visitAssociateStatement(ctx.associateStatement()); - } else if (ctx.dissociateStatement() != null) { - statement = new DissociateStmtVisitor(visitorCtx) - .visitDissociateStatement(ctx.dissociateStatement()); - } else if (ctx.functionReturnStatement() != null) { - statement = new FunctionReturnStmtVisitor(visitorCtx) - .visitFunctionReturnStatement(ctx.functionReturnStatement()); - } else if (ctx.breakStatement() != null) { - statement = new BreakStmtVisitor(visitorCtx) - .visitBreakStatement(ctx.breakStatement()); - } else if (ctx.continueStatement() != null) { - statement = new ContinueStmtVisitor(visitorCtx) - .visitContinueStatement(ctx.continueStatement()); - } else if (ctx.setResourceAccessRightsStatement() != null) { - statement = new SetResourceAccessRightsStmtVisitor(visitorCtx) - .visitSetResourceAccessRightsStatement(ctx.setResourceAccessRightsStatement()); - } else if (ctx.deleteRuleStatement() != null) { - statement = new DeleteRuleStmtVisitor(visitorCtx) - .visitDeleteRuleStatement(ctx.deleteRuleStatement()); - } - - return statement; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VarStmtVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VarStmtVisitor.java deleted file mode 100644 index cfde7011a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VarStmtVisitor.java +++ /dev/null @@ -1,44 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.VarStatement; - -public class VarStmtVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public VarStmtVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - @Override - public VarStatement visitVariableDeclarationStatement(PMLParser.VariableDeclarationStatementContext ctx) { - String varName = ctx.ID().getText(); - PMLParser.ExpressionContext expressionCtx = ctx.expression(); - Expression expr = Expression.compile(visitorCtx, expressionCtx); - boolean isConst = ctx.CONST() != null; - - VarStatement varStatement = new VarStatement(varName, expr, isConst); - - try { - if (ctx.CONST() == null && ctx.LET() == null - && (visitorCtx.scope().variableExists(varName) && visitorCtx.scope().getVariable(varName).isConst())) { - visitorCtx.errorLog().addError( - ctx, - "cannot reassign const variable" - ); - return varStatement; - } - - visitorCtx.scope().addVariable(varName, expr.getType(visitorCtx.scope()), isConst); - } catch (PMLScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - return varStatement; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VariableReferenceVisitor.java b/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VariableReferenceVisitor.java deleted file mode 100644 index 725d2fe01..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/compiler/visitor/VariableReferenceVisitor.java +++ /dev/null @@ -1,113 +0,0 @@ -package gov.nist.csd.pm.policy.pml.compiler.visitor; - -import gov.nist.csd.pm.policy.pml.antlr.PMLBaseVisitor; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.compiler.Variable; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.EntryReference; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.VariableReference; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownVariableInScopeException; -import gov.nist.csd.pm.policy.pml.statement.Expression; - -import java.util.List; - -public class VariableReferenceVisitor extends PMLBaseVisitor { - - private final VisitorContext visitorCtx; - - public VariableReferenceVisitor(VisitorContext visitorCtx) { - this.visitorCtx = visitorCtx; - } - - public VariableReference visitVariableReference(PMLParser.VariableReferenceContext ctx) { - if (ctx instanceof PMLParser.ReferenceByIDContext referenceByIDContext) { - return visitReferenceByID(referenceByIDContext); - } else { - return visitReferenceByEntry((PMLParser.ReferenceByEntryContext) ctx); - } - } - - @Override - public VariableReference visitReferenceByID(PMLParser.ReferenceByIDContext ctx) { - String id = ctx.ID().getText(); - - // check variable id is in scope - Type type = Type.any(); - try { - Variable variable = visitorCtx.scope().getVariable(id); - type = variable.type(); - } catch (UnknownVariableInScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - return new VariableReference(id, type); - } - - @Override - public VariableReference visitReferenceByEntry(PMLParser.ReferenceByEntryContext ctx) { - String name = ctx.entryReference().ID().getText(); - Type type = Type.any(); - try { - Variable mapVar = visitorCtx.scope().getVariable(name); - type = mapVar.type(); - } catch (UnknownVariableInScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - - VariableReference mapVarRef = new VariableReference(name, type); - List exprCtxs = ctx.entryReference().expression(); - boolean first = true; - for (PMLParser.ExpressionContext exprCtx : exprCtxs) { - // if the variable reference is not a map or array and this is not the first accessor processed, there is an error - // if it is the first accessor than check if the variable id is a map - if (first) { - Type t = Type.any(); - - try { - t = visitorCtx.scope().getVariable(name).type(); - } catch (UnknownVariableInScopeException e) { - visitorCtx.errorLog().addError(ctx, e.getMessage()); - } - if (!t.isMap() && !t.isArray()) { - visitorCtx.errorLog().addError( - exprCtx, - "expected map or array type" - ); - } - } else { - if (!mapVarRef.getType().isMap() && !mapVarRef.getType().isArray()) { - visitorCtx.errorLog().addError( - exprCtx, - "expected map or array type" - ); - } - } - - Type allowed; - Type valueType; - if (mapVarRef.getType().isAny()) { - allowed = Type.any(); - valueType = Type.any(); - } else if (mapVarRef.getType().isMap()) { - allowed = Type.string(); - valueType = mapVarRef.getType().getMapValueType(); - if (valueType == null) { - valueType = Type.any(); - } - } else if (mapVarRef.getType().isArray()) { - allowed = Type.number(); - valueType = mapVarRef.getType().getArrayType(); - } else { - allowed = Type.any(); - valueType = Type.any(); - } - - Expression expr = Expression.compile(visitorCtx, exprCtx, allowed); - mapVarRef = new VariableReference(new EntryReference(mapVarRef, expr), valueType); - first = false; - } - - return mapVarRef; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Append.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Append.java deleted file mode 100644 index 498058aee..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Append.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.List; - -public class Append extends FunctionDefinitionStatement { - public Append() { - super( - "append", - Type.array(Type.any()), - args( - new FormalArgument("dst", Type.array(Type.any())), - new FormalArgument("src", Type.any()) - ), - (ctx, policy) -> { - List valueArr = ctx.scope().getValue("dst").getArrayValue(); - Value srcValue = ctx.scope().getValue("src").getValue(); - - valueArr.add(srcValue); - - return new Value(valueArr); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/AppendAll.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/AppendAll.java deleted file mode 100644 index 032cb98ab..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/AppendAll.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.List; - -public class AppendAll extends FunctionDefinitionStatement { - public AppendAll() { - super( - "appendAll", - Type.array(Type.any()), - args( - new FormalArgument("dst", Type.array(Type.any())), - new FormalArgument("src", Type.array(Type.any())) - ), - (ctx, policy) -> { - List dstValueArr = ctx.scope().getValue("dst").getArrayValue(); - List srcValueArr = ctx.scope().getValue("src").getArrayValue(); - - dstValueArr.addAll(srcValueArr); - - return new Value(dstValueArr); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/AssignAll.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/AssignAll.java deleted file mode 100644 index 2f2f7852f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/AssignAll.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.ArrayList; -import java.util.List; - -public class AssignAll extends FunctionDefinitionStatement { - public AssignAll() { - super( - "assignAll", - Type.voidType(), - args( - new FormalArgument("children", Type.array(Type.string())), - new FormalArgument("target", Type.string()) - ), - (ctx, policy) -> { - String target = ctx.scope().getValue("target").getStringValue(); - List childrenValues = ctx.scope().getValue("children").getArrayValue(); - List children = new ArrayList<>(); - for (Value value : childrenValues) { - children.add(value.getStringValue()); - } - - policy.graph().assignAll(children, target); - - return new Value(); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Concat.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Concat.java deleted file mode 100644 index ea48dcee9..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Concat.java +++ /dev/null @@ -1,31 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.List; - -public class Concat extends FunctionDefinitionStatement { - - private static final String ARR_ARG = "arr"; - - public Concat() { - super( - name("concat"), - returns(Type.string()), - args( - new FormalArgument(ARR_ARG, Type.array(Type.string())) - ), - (ctx, author) -> { - List arr = ctx.scope().getValue(ARR_ARG).getArrayValue(); - StringBuilder s = new StringBuilder(); - for (Value v : arr) { - s.append(v.getStringValue()); - } - return new Value(s.toString()); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Contains.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Contains.java deleted file mode 100644 index 4259af365..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Contains.java +++ /dev/null @@ -1,30 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.List; - -public class Contains extends FunctionDefinitionStatement { - - public Contains() { - super( - name("contains"), - returns(Type.bool()), - args( - new FormalArgument("arr", Type.array(Type.any())), - new FormalArgument("element", Type.any()) - ), - (ctx, author) -> { - List valueArr = ctx.scope().getValue("arr").getArrayValue(); - Value element = ctx.scope().getValue("element"); - boolean contains = valueArr.contains(element); - return new Value(contains); - } - ); - } - -} - diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/ContainsKey.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/ContainsKey.java deleted file mode 100644 index e7f20cdaf..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/ContainsKey.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.Map; - -public class ContainsKey extends FunctionDefinitionStatement { - - public ContainsKey() { - super( - name("containsKey"), - returns(Type.bool()), - args( - new FormalArgument("map", Type.map(Type.any(), Type.any())), - new FormalArgument("key", Type.any()) - ), - (ctx, author) -> { - Map valueMap = ctx.scope().getValue("map").getMapValue(); - Value element = ctx.scope().getValue("key"); - boolean contains = valueMap.containsKey(element); - return new Value(contains); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAll.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAll.java deleted file mode 100644 index e6ce8d3d1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAll.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import java.util.ArrayList; -import java.util.List; - -public class DeassignAll extends FunctionDefinitionStatement { - public DeassignAll() { - super( - "deassignAll", - Type.voidType(), - args( - new FormalArgument("children", Type.array(Type.string())), - new FormalArgument("target", Type.string()) - ), - (ctx, policy) -> { - String target = ctx.scope().getValue("target").getStringValue(); - List childrenValues = ctx.scope().getValue("children").getArrayValue(); - List children = new ArrayList<>(); - for (Value value : childrenValues) { - children.add(value.getStringValue()); - } - - policy.graph().deassignAll(children, target); - - return new Value(); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAllFromAndDelete.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAllFromAndDelete.java deleted file mode 100644 index 1932622d1..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/DeassignAllFromAndDelete.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -public class DeassignAllFromAndDelete extends FunctionDefinitionStatement { - public DeassignAllFromAndDelete() { - super( - "deassignAllFromAndDelete", - Type.voidType(), - args( - new FormalArgument("target", Type.string()) - ), - (ctx, policy) -> { - String target = ctx.scope().getValue("target").getStringValue(); - - policy.graph().deassignAllFromAndDelete(target); - - return new Value(); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Equals.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Equals.java deleted file mode 100644 index 5a64f9135..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Equals.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -public class Equals extends FunctionDefinitionStatement { - - private static final String VALUE1 = "value1"; - private static final String VALUE2 = "value2"; - - public Equals() { - super( - name("equals"), - returns(Type.bool()), - args( - new FormalArgument(VALUE1, Type.any()), - new FormalArgument(VALUE2, Type.any()) - ), - (ctx, author) -> { - Value v1 = ctx.scope().getValue(VALUE1); - Value v2 = ctx.scope().getValue(VALUE2); - - return new Value(v1.equals(v2)); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithSource.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithSource.java deleted file mode 100644 index a7d6f45da..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithSource.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.List; - -public class GetAssociationsWithSource extends FunctionDefinitionStatement { - - public GetAssociationsWithSource() { - super( - name("getAssociationsWithSource"), - returns(Type.array(Type.map(Type.string(), Type.any()))), - args( - new FormalArgument("source", Type.string()) - ), - (ctx, author) -> { - Value source = ctx.scope().getValue("source"); - List associations = author.graph().getAssociationsWithSource(source.getStringValue()); - List associationValues = new ArrayList<>(associations.size()); - for (int i = 0; i < associations.size(); i++) { - Association association = associations.get(i); - associationValues.add(Value.objectToValue(association)); - } - return new Value(associationValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithTarget.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithTarget.java deleted file mode 100644 index ac99c7d2f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetAssociationsWithTarget.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; - -import java.util.ArrayList; -import java.util.List; - -public class GetAssociationsWithTarget extends FunctionDefinitionStatement { - - public GetAssociationsWithTarget() { - super( - name("getAssociationsWithTarget"), - returns(Type.array(Type.map(Type.string(), Type.any()))), - args( - new FormalArgument("target", Type.string()) - ), - (ctx, author) -> { - Value target = ctx.scope().getValue("target"); - List associations = author.graph().getAssociationsWithTarget(target.getStringValue()); - List associationValues = new ArrayList<>(associations.size()); - for (int i = 0; i < associations.size(); i++) { - Association association = associations.get(i); - associationValues.add(Value.objectToValue(association)); - } - return new Value(associationValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetChildren.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetChildren.java deleted file mode 100644 index d9aa9b070..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetChildren.java +++ /dev/null @@ -1,32 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.ArrayList; -import java.util.List; - -public class GetChildren extends FunctionDefinitionStatement { - - public GetChildren() { - super( - name("getChildren"), - returns(Type.array(Type.string())), - args( - new FormalArgument("nodeName", Type.string()) - ), - (ctx, author) -> { - List children = author.graph().getChildren(ctx.scope().getValue("nodeName").getStringValue()); - List childValues = new ArrayList<>(children.size()); - for (int i = 0; i < children.size(); i++) { - childValues.add(new Value(children.get(i))); - } - - return new Value(childValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNode.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNode.java deleted file mode 100644 index fee9165de..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNode.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -public class GetNode extends FunctionDefinitionStatement { - - private static final String NODE_ARG = "nodeName"; - - public GetNode() { - super( - name("getNode"), - returns(Type.map(Type.string(), Type.any())), - args( - new FormalArgument(NODE_ARG, Type.string()) - ), - (ctx, author) -> { - Node node = author.graph().getNode(ctx.scope().getValue(NODE_ARG).getStringValue()); - return Value.objectToValue(node); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeProperties.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeProperties.java deleted file mode 100644 index d6075dd26..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeProperties.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -import java.util.HashMap; -import java.util.Map; - -public class GetNodeProperties extends FunctionDefinitionStatement { - - public GetNodeProperties() { - super( - name("getNodeProperties"), - returns(Type.map(Type.string(), Type.string())), - args( - new FormalArgument("nodeName", Type.string()) - ), - (ctx, author) -> { - Node node = author.graph().getNode(ctx.scope().getValue("nodeName").getStringValue()); - Map properties = node.getProperties(); - Map propertiesValues = new HashMap<>(); - for (Map.Entry prop : properties.entrySet()) { - propertiesValues.put(new Value(prop.getKey()), new Value(properties.get(prop.getValue()))); - } - - return new Value(propertiesValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeType.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeType.java deleted file mode 100644 index 19b429b5c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetNodeType.java +++ /dev/null @@ -1,26 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -public class GetNodeType extends FunctionDefinitionStatement { - - public GetNodeType() { - super( - name("getNodeType"), - returns(Type.string()), - args( - new FormalArgument("nodeName", Type.string()) - ), - (ctx, author) -> { - Node node = author.graph().getNode(ctx.scope().getValue("nodeName").getStringValue()); - return new Value(node.getType().toString()); - } - ); - } - -} - diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetParents.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetParents.java deleted file mode 100644 index 9b4c02138..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetParents.java +++ /dev/null @@ -1,32 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -import java.util.ArrayList; -import java.util.List; - -public class GetParents extends FunctionDefinitionStatement { - - public GetParents() { - super( - name("getParents"), - returns(Type.array(Type.string())), - args( - new FormalArgument("nodeName", Type.string()) - ), - (ctx, author) -> { - List parents = author.graph().getParents(ctx.scope().getValue("nodeName").getStringValue()); - List parentValues = new ArrayList<>(parents.size()); - for (int i = 0; i < parents.size(); i++) { - parentValues.add(new Value(parents.get(i))); - } - - return new Value(parentValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetProhibitionsFor.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetProhibitionsFor.java deleted file mode 100644 index a39cff5ba..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/GetProhibitionsFor.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.ArrayList; -import java.util.List; - -public class GetProhibitionsFor extends FunctionDefinitionStatement { - - public GetProhibitionsFor() { - super( - name("getProhibitionsFor"), - returns(Type.array(Type.map(Type.string(), Type.any()))), - args( - new FormalArgument("subject", Type.string()) - ), - (ctx, author) -> { - String subject = ctx.scope().getValue("subject").getStringValue(); - List prohibitions = author.prohibitions().getWithSubject(subject); - List prohibitionValues = new ArrayList<>(prohibitions.size()); - for (Prohibition prohibition : prohibitions) { - prohibitionValues.add(new Value(Value.objectToValue(prohibition))); - } - - return new Value(prohibitionValues); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyKey.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyKey.java deleted file mode 100644 index 13a70aa13..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyKey.java +++ /dev/null @@ -1,29 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -public class HasPropertyKey extends FunctionDefinitionStatement { - - public HasPropertyKey() { - super( - name("hasPropertyKey"), - returns(Type.bool()), - args( - new FormalArgument("nodeName", Type.string()), - new FormalArgument("key", Type.string()) - ), - (ctx, author) -> { - String nodeName = ctx.scope().getValue("nodeName").getStringValue(); - String key = ctx.scope().getValue("key").getStringValue(); - Node node = author.graph().getNode(nodeName); - boolean hasPropertyKey = node.getProperties().containsKey(key); - return new Value(hasPropertyKey); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyValue.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyValue.java deleted file mode 100644 index 4b028b825..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/HasPropertyValue.java +++ /dev/null @@ -1,36 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; - -public class HasPropertyValue extends FunctionDefinitionStatement { - - public HasPropertyValue() { - super( - name("hasPropertyValue"), - returns(Type.bool()), - args( - new FormalArgument("nodeName", Type.string()), - new FormalArgument("key", Type.string()), - new FormalArgument("value", Type.string()) - ), - (ctx, author) -> { - String nodeName = ctx.scope().getValue("nodeName").getStringValue(); - String key = ctx.scope().getValue("key").getStringValue(); - String value = ctx.scope().getValue("value").getStringValue(); - Node node = author.graph().getNode(nodeName); - boolean has = node.getProperties().containsKey(key); - if (!has) { - return new Value(false); - } - - has = node.getProperties().get(key).equals(value); - return new Value(has); - } - ); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Length.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Length.java deleted file mode 100644 index 37b8a82f0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Length.java +++ /dev/null @@ -1,31 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class Length extends FunctionDefinitionStatement { - public Length() { - super( - "length", - returns(Type.number()), - args( - new FormalArgument("x", Type.any()) - ), - (ctx, policy) -> { - Value x = ctx.scope().getValue("x"); - if (x.isMap()) { - return new Value(x.getMapValue().size()); - } else if (x.isArray()) { - return new Value(x.getArrayValue().size()); - } else if (x.isString()) { - return new Value(x.getStringValue().length()); - } - - throw new PMException("cannot get length of type " + x.getType()); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/NodeExists.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/NodeExists.java deleted file mode 100644 index b51e6ccbd..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/NodeExists.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; - -public class NodeExists extends FunctionDefinitionStatement { - - private static final String NODE_ARG = "nodeName"; - - public NodeExists() { - super( - name("nodeExists"), - returns(Type.bool()), - args( - new FormalArgument(NODE_ARG, Type.string()) - ), - (ctx, author) -> new Value(author.graph().nodeExists(ctx.scope().getValue(NODE_ARG).getStringValue())) - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/NumToStr.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/NumToStr.java deleted file mode 100644 index ff4b1ad69..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/NumToStr.java +++ /dev/null @@ -1,22 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; - -public class NumToStr extends FunctionDefinitionStatement { - - private static final String NUM_ARG = "num"; - - public NumToStr() { - super( - name("numToStr"), - returns(Type.string()), - args( - new FormalArgument(NUM_ARG, Type.number()) - ), - (ctx, author) -> new Value(String.valueOf(ctx.scope().getValue(NUM_ARG))) - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Search.java b/src/main/java/gov/nist/csd/pm/policy/pml/functions/Search.java deleted file mode 100644 index b3fa40ff2..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/functions/Search.java +++ /dev/null @@ -1,44 +0,0 @@ -package gov.nist.csd.pm.policy.pml.functions; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Search extends FunctionDefinitionStatement { - public Search() { - super( - name("search"), - returns(Type.array(Type.string())), - args( - new FormalArgument("type", Type.string()), - new FormalArgument("properties", Type.map(Type.string(), Type.string())) - ), - (ctx, author) -> { - NodeType nodeType = NodeType.toNodeType(ctx.scope().getValue("type").getStringValue()); - - Map propertiesValue = ctx.scope().getValue("properties").getMapValue(); - - Map properties = new HashMap<>(); - for (Map.Entry prop : propertiesValue.entrySet()) { - properties.put(prop.getKey().getStringValue(), prop.getValue().getStringValue()); - } - - List search = author.graph().search(nodeType, properties); - - List ret = new ArrayList<>(search.size()); - for (String s : search) { - ret.add(new Value(s)); - } - - return new Value(ret); - } - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/context/ExecutionContext.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/context/ExecutionContext.java deleted file mode 100644 index a7d4ea757..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/context/ExecutionContext.java +++ /dev/null @@ -1,60 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.context; - -import gov.nist.csd.pm.policy.pml.compiler.Variable; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.model.scope.*; - -import java.io.Serializable; -import java.util.Objects; - -public class ExecutionContext implements Serializable { - - private UserContext author; - private Scope scope; - - public ExecutionContext(UserContext author) { - this.author = author; - this.scope = new Scope(Scope.Mode.EXECUTE); - } - - public UserContext author() { - return author; - } - - public Scope scope() { - return scope; - } - - public ExecutionContext copy() throws UnknownFunctionInScopeException, FunctionAlreadyDefinedInScopeException, - UnknownVariableInScopeException, VariableAlreadyDefinedInScopeException { - ExecutionContext copy = new ExecutionContext(this.author); - - for (String funcName : this.scope.functions().keySet()) { - copy.scope.addFunction(this.scope.getFunction(funcName)); - } - - for (String varName : this.scope.variables().keySet()) { - Variable variable = this.scope.getVariable(varName); - copy.scope.addVariable(varName, variable.type(), variable.isConst()); - } - - for (String varName : this.scope.values().keySet()) { - copy.scope.putValue(varName, this.scope.getValue(varName)); - } - - return copy; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ExecutionContext that = (ExecutionContext) o; - return Objects.equals(author, that.author) && Objects.equals(scope, that.scope); - } - - @Override - public int hashCode() { - return Objects.hash(author, scope); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/context/VisitorContext.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/context/VisitorContext.java deleted file mode 100644 index b7b703f02..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/context/VisitorContext.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.context; - -import gov.nist.csd.pm.policy.pml.compiler.error.ErrorLog; -import gov.nist.csd.pm.policy.pml.model.scope.Scope; - -import java.util.Objects; - -public record VisitorContext(Scope scope, ErrorLog errorLog) { - - public VisitorContext copy() { - // want to persist the error tracker - return new VisitorContext(scope.copy(), this.errorLog); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - VisitorContext that = (VisitorContext) o; - return Objects.equals(scope, that.scope) && Objects.equals(errorLog, that.errorLog); - } - - @Override - public int hashCode() { - return Objects.hash(scope, errorLog); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLCompilationException.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLCompilationException.java deleted file mode 100644 index 3ce23e6fd..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLCompilationException.java +++ /dev/null @@ -1,35 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.exception; - -import gov.nist.csd.pm.policy.pml.compiler.error.CompileError; -import gov.nist.csd.pm.policy.pml.compiler.error.ErrorLog; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.*; - -public class PMLCompilationException extends PMException { - - private final List errors; - - public PMLCompilationException(ErrorLog errorLog) { - super(errorLog.toString()); - this.errors = new ArrayList<>(errorLog.getErrors()); - } - - public PMLCompilationException(CompileError error) { - super(error.errorMessage()); - this.errors = Arrays.asList(error); - } - - public List getErrors() { - return errors; - } - - @Override - public String getMessage() { - StringBuilder s = new StringBuilder(); - for (CompileError e : errors) { - s.append(e.toString()).append("\n"); - } - return s.toString(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLExecutionException.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLExecutionException.java deleted file mode 100644 index bbb76bbf0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/exception/PMLExecutionException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.exception; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class PMLExecutionException extends PMException { - public PMLExecutionException(String msg) { - super(msg); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/ArrayLiteral.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/ArrayLiteral.java deleted file mode 100644 index 52800546b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/ArrayLiteral.java +++ /dev/null @@ -1,64 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.pml.statement.Expression; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class ArrayLiteral implements Serializable { - - private final List array; - private final Type type; - - public ArrayLiteral(Type elementType) { - this.array = new ArrayList<>(); - this.type = Type.array(elementType); - } - - public ArrayLiteral(Expression[] array, Type elementType) { - this.array = Arrays.asList(array); - this.type = Type.array(elementType); - } - - public void add(Expression expression) { - this.array.add(expression); - } - - public Expression[] getArray() { - return this.array.toArray(new Expression[]{}); - } - - public Type getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ArrayLiteral that = (ArrayLiteral) o; - return Objects.equals(array, that.array) - && Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return Objects.hash(array, type); - } - - @Override - public String toString() { - StringBuilder s = new StringBuilder(); - for (Expression expression : array) { - if (s.length() > 0) { - s.append(", "); - } - - s.append(expression.toString()); - } - return String.format("[%s]", s); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/CompareExpression.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/CompareExpression.java deleted file mode 100644 index 1252c260d..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/CompareExpression.java +++ /dev/null @@ -1,48 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.io.Serializable; -import java.util.Objects; - -public class CompareExpression extends PMLStatement implements Serializable { - - private Expression left; - private Expression right; - private boolean isEquals; - - public CompareExpression(Expression left, Expression right, boolean isEquals) { - this.left = left; - this.right = right; - this.isEquals = isEquals; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CompareExpression that = (CompareExpression) o; - return isEquals == that.isEquals && left.equals(that.left) && right.equals(that.right); - } - - @Override - public int hashCode() { - return Objects.hash(left, right, isEquals); - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - return new Value( - isEquals == left.execute(ctx, policy).equals(right.execute(ctx, policy)) - ); - } - - @Override - public String toString() { - return left.toString() + (isEquals ? " == " : " != ") + right.toString(); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/EntryReference.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/EntryReference.java deleted file mode 100644 index b2a3c67ea..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/EntryReference.java +++ /dev/null @@ -1,44 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.pml.statement.Expression; - -import java.io.Serializable; -import java.util.Objects; - -public class EntryReference implements Serializable { - - private final VariableReference varRef; - private final Expression key; - - public EntryReference(VariableReference varRef, Expression key) { - this.varRef = varRef; - this.key = key; - } - - public VariableReference getVarRef() { - return varRef; - } - - public Expression getKey() { - return key; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EntryReference that = (EntryReference) o; - return Objects.equals(varRef, that.varRef) - && Objects.equals(key, that.key); - } - - @Override - public int hashCode() { - return Objects.hash(varRef, key); - } - - @Override - public String toString() { - return String.format("%s[%s]", varRef, key); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Literal.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Literal.java deleted file mode 100644 index 260fab99c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Literal.java +++ /dev/null @@ -1,179 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.*; - -public class Literal extends PMLStatement { - - private boolean isStringLiteral; - private String stringLiteral; - - private boolean isBooleanLiteral; - private boolean booleanLiteral; - - private boolean isArrayLiteral; - private ArrayLiteral arrayLiteral; - - private boolean isMapLiteral; - private MapLiteral mapLiteral; - - private boolean isNumberLiteral; - private int numberLiteral; - - private final Type type; - - public Literal(String stringLiteral) { - this.isStringLiteral = true; - this.stringLiteral = stringLiteral; - this.type = Type.string(); - } - - public Literal(int numberLiteral) { - this.isNumberLiteral = true; - this.numberLiteral = numberLiteral; - this.type = Type.number(); - } - - public Literal(boolean booleanLiteral) { - this.isBooleanLiteral = true; - this.booleanLiteral = booleanLiteral; - this.type = Type.bool(); - } - - public Literal(ArrayLiteral arrayLiteral) { - this.isArrayLiteral = true; - this.arrayLiteral = arrayLiteral; - this.type = arrayLiteral.getType(); - } - - public Literal(MapLiteral mapLiteral) { - this.isMapLiteral = true; - this.mapLiteral = mapLiteral; - this.type = mapLiteral.getType(); - } - - public boolean isNumberLiteral() { - return isNumberLiteral; - } - - public boolean isStringLiteral() { - return isStringLiteral; - } - - public boolean isBooleanLiteral() { - return isBooleanLiteral; - } - - public boolean isArrayLiteral() { - return isArrayLiteral; - } - - public boolean isMapLiteral() { - return isMapLiteral; - } - - public String getStringLiteral() { - return stringLiteral; - } - - public int getNumberLiteral() { - return numberLiteral; - } - - public boolean getBooleanLiteral() { - return booleanLiteral; - } - - public ArrayLiteral getArrayLiteral() { - return arrayLiteral; - } - - public MapLiteral getMapLiteral() { - return mapLiteral; - } - - public Type getType() { - return type; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - if (isStringLiteral()) { - return new Value(getStringLiteral()); - } else if (isArrayLiteral()) { - ArrayLiteral arrayLiteral = getArrayLiteral(); - Expression[] exprArr = arrayLiteral.getArray(); - List values = new ArrayList<>(exprArr.length); - for (Expression expr : exprArr) { - values.add(expr.execute(ctx, policy)); - } - return new Value(values); - } else if (isBooleanLiteral()) { - return new Value(getBooleanLiteral()); - } else if (isMapLiteral()){ - MapLiteral mapLiteral = getMapLiteral(); - Map map = mapLiteral.getMap(); - Map values = new HashMap<>(); - for (Expression key : map.keySet()) { - Expression expr = map.get(key); - values.put(key.execute(ctx, policy), expr.execute(ctx, policy)); - } - return new Value(values); - } else { - return new Value(getNumberLiteral()); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Literal literal = (Literal) o; - return isStringLiteral == literal.isStringLiteral - && isNumberLiteral == literal.isNumberLiteral - && isBooleanLiteral == literal.isBooleanLiteral - && booleanLiteral == literal.booleanLiteral - && isArrayLiteral == literal.isArrayLiteral - && isMapLiteral == literal.isMapLiteral - && Objects.equals(stringLiteral, literal.stringLiteral) - && numberLiteral == literal.numberLiteral - && Objects.equals(arrayLiteral, literal.arrayLiteral) - && Objects.equals(mapLiteral, literal.mapLiteral) - && Objects.equals(type, literal.type); - } - - @Override - public int hashCode() { - if (isStringLiteral) { - return stringLiteral.hashCode(); - } else if (isNumberLiteral) { - return Objects.hash(numberLiteral); - } else if (isBooleanLiteral) { - return Objects.hash(booleanLiteral); - } else if (isArrayLiteral) { - return arrayLiteral.hashCode(); - } else { - return mapLiteral.hashCode(); - } - } - - @Override - public String toString() { - if (isStringLiteral) { - return String.format("'%s'", getStringLiteral()); - } else if (isBooleanLiteral) { - return String.valueOf(getBooleanLiteral()); - } else if (isNumberLiteral) { - return String.valueOf(getNumberLiteral()); - } else if (isArrayLiteral) { - return getArrayLiteral().toString(); - } else { - return getMapLiteral().toString(); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/LogicalExpression.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/LogicalExpression.java deleted file mode 100644 index df523de84..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/LogicalExpression.java +++ /dev/null @@ -1,51 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import com.mysql.cj.log.Log; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; - -import java.io.Serializable; -import java.util.Objects; - -public class LogicalExpression extends PMLStatement implements Serializable { - - private Expression left; - private Expression right; - private boolean isAnd; - - public LogicalExpression(Expression left, Expression right, boolean isAnd) { - this.left = left; - this.right = right; - this.isAnd = isAnd; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - LogicalExpression that = (LogicalExpression) o; - return isAnd == that.isAnd && left.equals(that.left) && right.equals(that.right); - } - - @Override - public int hashCode() { - return Objects.hash(left, right, isAnd); - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - boolean leftValue = left.execute(ctx, policy).getBooleanValue(); - boolean rightValue = right.execute(ctx, policy).getBooleanValue(); - - return new Value(isAnd ? leftValue && rightValue : leftValue || rightValue); - } - - @Override - public String toString() { - return left.toString() + (isAnd ? " && " : " || ") + right.toString(); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/MapLiteral.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/MapLiteral.java deleted file mode 100644 index a9c1f6336..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/MapLiteral.java +++ /dev/null @@ -1,64 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.pml.statement.Expression; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class MapLiteral implements Serializable { - - private final Map map; - private final Type type; - - public MapLiteral(Map map, Type keyType, Type valueType) { - this.map = map; - this.type = Type.map(keyType, valueType); - } - - public MapLiteral(Type type) { - this.map = new HashMap<>(); - this.type = type; - } - - public void put(Expression key, Expression value){ - this.map.put(key, value); - } - - public Map getMap() { - return map; - } - - public Type getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - MapLiteral that = (MapLiteral) o; - return Objects.equals(this.map, that.map) - && Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return map.hashCode(); - } - - @Override - public String toString() { - StringBuilder s = new StringBuilder(); - for (Expression k : map.keySet()) { - if (s.length() > 0) { - s.append(", "); - } - - s.append(k.toString()).append(": ").append(map.get(k)); - } - - return String.format("{%s}", s); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Value.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Value.java deleted file mode 100644 index cd51b140b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/Value.java +++ /dev/null @@ -1,436 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import com.fasterxml.jackson.databind.ObjectMapper; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.io.Serializable; -import java.util.*; - -public class Value implements Serializable { - - private String sValue; - private boolean isString; - - private boolean isNumber; - private int nValue; - - private boolean bValue; - private boolean isBoolean; - - private List aValue; - private boolean isArray; - - private Map mValue; - private boolean isMap; - - private boolean isVoid; - - private boolean isReturn; - private boolean isBreak; - private boolean isContinue; - private Value value; - private boolean isValue; - private boolean isNull; - private Type type; - private Rule rule; - private boolean isRule; - - public static Value returnValue(Value value) { - value.isReturn = true; - return value; - } - - public static Value breakValue() { - Value value = new Value(); - value.isBreak = true; - return value; - } - - public static Value continueValue() { - Value value = new Value(); - value.isContinue = true; - return value; - } - - public static Value nullValue() { - Value value = new Value(); - value.isNull = true; - return value; - } - - public Value() { - this.isVoid = true; - this.type = Type.voidType(); - } - - public Value(Value value) { - this.isValue = true; - this.value = value; - this.type = Type.any(); - } - - public Value(String value) { - this.isString = true; - this.sValue = value; - this.type = Type.string(); - } - - public Value(int value) { - this.isNumber = true; - this.nValue = value; - this.type = Type.number(); - } - - public Value(boolean value) { - this.isBoolean = true; - this.bValue = value; - this.type = Type.bool(); - } - - public Value(List value) { - this.isArray = true; - this.aValue = value; - if (value.isEmpty()) { - this.type = Type.any(); - } else { - this.type = Type.array(value.iterator().next().getType()); - } - } - - public Value(AccessRightSet accessRightSet) { - this.isArray = true; - this.type = Type.array(Type.string()); - - this.aValue = new ArrayList<>(); - Object[] objects = accessRightSet.toArray(); - for (Object o : objects) { - this.aValue.add(new Value(o.toString())); - } - } - - public Value(Map value) { - this.isMap = true; - this.mValue = value; - if (value.isEmpty()) { - this.type = Type.map(Type.any(), Type.any()); - } else { - Value key = value.keySet().iterator().next(); - this.type = Type.map(key.getType(), value.get(key).getType()); - } - } - - // these should only be used be the CreateObligationStmt - public Value(Rule rule) { - this.isRule = true; - this.rule = rule; - } - - public Rule getRule() { - return rule; - } - - public boolean isReturn() { - return isReturn; - } - - public boolean isBreak() { - return isBreak; - } - - public boolean isContinue() { - return isContinue; - } - - public boolean isString() { - return isString; - } - - public boolean isNumber() { - return isNumber; - } - - public boolean isBoolean() { - return isBoolean; - } - - public boolean isArray() { - return this.isArray; - } - - public boolean isMap() { - return isMap; - } - - public boolean isVoid() { - return isVoid; - } - - public boolean isNull() { - return isNull; - } - - public boolean isValue() { - return isValue; - } - - public boolean isRule() { - return isRule; - } - - public String getStringValue() { - if (!isString) { - throw new IllegalStateException("expected value to be string but was " + type); - } - - return sValue; - } - - public int getNumberValue() { - if (!isNumber) { - throw new IllegalStateException("expected value to be number but was " + type); - } - - return nValue; - } - - public boolean getBooleanValue() { - if (!isBoolean) { - throw new IllegalStateException("expected value to be boolean but was " + type); - } - - return bValue; - } - - public List getArrayValue() { - if (!isArray) { - throw new IllegalStateException("expected value to be array but was " + type); - } - - return aValue; - } - - public Map getMapValue() { - if (!isMap) { - throw new IllegalStateException("expected value to be map but was " + type); - } - - return mValue; - } - - public Value getValue() { - if (!isValue) { - throw new IllegalStateException("expected value to be Value but was " + type); - } - - return value; - } - - public Type getType() { - return type; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Value value1 = (Value) o; - return isString == value1.isString - && bValue == value1.bValue - && isBoolean == value1.isBoolean - && isArray == value1.isArray - && isMap == value1.isMap - && isVoid == value1.isVoid - && isReturn == value1.isReturn - && isBreak == value1.isBreak - && isContinue == value1.isContinue - && isNull == value1.isNull - && isValue == value1.isValue - && Objects.equals(sValue, value1.sValue) - && Objects.equals(aValue, value1.aValue) - && Objects.equals(mValue, value1.mValue) - && Objects.equals(value, value1.value) - && Objects.equals(type, value1.type) - && Objects.equals(rule, value1.rule); - } - - @Override - public int hashCode() { - if (isString) { - return sValue.hashCode(); - } else if (isBoolean) { - return Objects.hashCode(bValue); - } else if (isArray) { - return aValue.hashCode(); - } else if (isMap) { - return mValue.hashCode(); - } else if (isValue) { - return value.hashCode(); - } else if (isRule) { - return rule.hashCode(); - } else if (isVoid) { - return "void".hashCode(); - } else if (isReturn) { - return "return".hashCode(); - } else if (isBreak) { - return "break".hashCode(); - } else if (isContinue) { - return "continue".hashCode(); - } else if (isNull) { - return "null".hashCode(); - } - - return -1; - } - - public static Value objectToValue(Object o) { - if (o == null) { - return Value.nullValue(); - } - - if (o instanceof String s) { - return new Value(s); - } else if (o instanceof Integer i) { - return new Value(i); - } if (o instanceof List list) { - return toListValue(list); - } else if (o instanceof Boolean b) { - return new Value(b); - } else if (o instanceof Map m) { - return toMapValue(m); - } else { - return objToValue(o); - } - } - - private static Value toArrayValue(Object o) { - Object[] arr = (Object[])o; - List list = new ArrayList<>(); - for (int i = 0; i < arr.length; i++) { - Object arrObj = arr[i]; - list.add(objectToValue(arrObj)); - } - - return new Value(list); - } - - private static Value toListValue(List list) { - List valueList = new ArrayList<>(); - for (Object arrObj : list) { - valueList.add(objectToValue(arrObj)); - } - - return new Value(valueList); - } - - private static Value toMapValue(Map m) { - Map map = new HashMap<>(); - for (Object key : m.keySet()) { - map.put(objectToValue(key), objectToValue(m.get(key))); - } - - return new Value(map); - } - - private static Value objToValue(Object o) { - ObjectMapper objectMapper = new ObjectMapper(); - Map map = objectMapper.convertValue(o, Map.class); - - Map valueMap = new HashMap<>(); - for (Object key : map.keySet()) { - String field = key.toString(); - Object obj = map.get(field); - valueMap.put(new Value(field), objectToValue(obj)); - } - - return new Value(valueMap); - } - - @Override - public String toString() { - if (isString()) { - return String.format("'%s'", getStringValue()); - } else if (isNumber()) { - return String.valueOf(getNumberValue()); - } else if (isBoolean()) { - return String.valueOf(getBooleanValue()); - } else if (isMap()) { - return mapToString(getMapValue()); - } else if (isArray()) { - return getArrayValue().toString(); - } else if (isVoid()) { - return "void"; - } else if (isReturn()) { - return "return"; - } else if (isBreak()) { - return "break"; - } else if (isContinue()) { - return "continue"; - } else if (isValue()) { - return value.toString(); - } else if (isNull()) { - return "null"; - } else { - return getRule().toString(); - } - } - - private String mapToString(Map mapValue) { - StringBuilder entries = new StringBuilder(); - for (Map.Entry entry : mapValue.entrySet()) { - if (entries.length() > 0) { - entries.append(", "); - } - - entries.append(entry.getKey()).append(": ").append(entry.getValue()); - } - - return String.format("{%s}", entries); - } - - public static Object valueToObject(Value v) throws PMException { - if (v == null) { - return null; - } - - if (v.isString()) { - return v.getStringValue(); - } else if (v.isNumber()) { - return v.getNumberValue(); - } else if (v.isArray()) { - return toListObject(v); - } else if (v.isBoolean()) { - return v.getBooleanValue(); - } else if (v.isMap()) { - return toMapObject(v); - } - - throw new PMException("unable to convert value " + v + " to an object"); - } - - private static Object toMapObject(Value v) throws PMException { - Map mapValue = v.getMapValue(); - Map object = new HashMap<>(); - - for (Map.Entry e : mapValue.entrySet()) { - Object key = valueToObject(e.getKey()); - Object value = valueToObject(e.getValue()); - - object.put(key, value); - } - - return object; - } - - private static Object toListObject(Value v) throws PMException { - List list = v.getArrayValue(); - List object = new ArrayList<>(); - for (Value l : list) { - Object o = valueToObject(l); - object.add(o); - } - - return object; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/VariableReference.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/VariableReference.java deleted file mode 100644 index 967b4d428..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/expression/VariableReference.java +++ /dev/null @@ -1,129 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.expression; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownVariableInScopeException; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.*; - -public class VariableReference extends PMLStatement { - - private boolean isID; - private String id; - private boolean isEntryReference; - private EntryReference entryReference; - private final Type type; - - public VariableReference(String id, Type type) { - this.isID = true; - this.id = id; - this.type = type; - } - - public VariableReference(EntryReference entryReference, Type type) { - this.isEntryReference = true; - this.entryReference = entryReference; - this.type = type; - } - - public boolean isID() { - return isID; - } - - public String getID() { - return id; - } - - public boolean isEntryReference() { - return isEntryReference; - } - - public EntryReference getEntryReference() { - return entryReference; - } - - public Type getType() { - return type; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - if (isID) { - try { - return ctx.scope().getValue(id); - } catch (UnknownVariableInScopeException e) { - throw new PMException(e.getMessage()); - } - } - - List refChain = new ArrayList<>(); - EntryReference ref = entryReference; - refChain.add(ref); - while (!ref.getVarRef().isID) { - EntryReference next = ref.getVarRef().getEntryReference(); - refChain.add(0, next); - - ref = next; - } - - Value value = null; - for (EntryReference entRef : refChain) { - if (value == null) { - Value mapValue = entRef.getVarRef().execute(ctx, policy); - Value keyValue = entRef.getKey().execute(ctx, policy); - - if (mapValue.isMap()) { - value = mapValue.getMapValue().get(keyValue); - } else if (mapValue.isArray()) { - value = mapValue.getArrayValue().get(keyValue.getNumberValue()); - } - - continue; - } - - if (!value.isMap() && !value.isArray()) { - break; - } - - if (value.isMap()) { - Map mapValue = value.getMapValue(); - Value keyValue = entRef.getKey().execute(ctx, policy); - value = mapValue.get(keyValue); - } else { - List arrayValue = value.getArrayValue(); - Value keyValue = entRef.getKey().execute(ctx, policy); - value = arrayValue.get(keyValue.getNumberValue()); - } - } - - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - VariableReference that = (VariableReference) o; - return isID == that.isID - && isEntryReference == that.isEntryReference - && Objects.equals(id, that.id) - && Objects.equals(entryReference, that.entryReference) - && Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return Objects.hash(isID, id, isEntryReference, entryReference, type); - } - - @Override - public String toString() { - if (isID) { - return id; - } else { - return entryReference.toString(); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FormalArgument.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FormalArgument.java deleted file mode 100644 index 6f672e51a..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FormalArgument.java +++ /dev/null @@ -1,21 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.function; - -import gov.nist.csd.pm.policy.pml.model.expression.Type; - -import java.io.Serializable; -import java.util.Objects; - -public record FormalArgument(String name, Type type) implements Serializable { - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FormalArgument that = (FormalArgument) o; - return Objects.equals(name, that.name) && Objects.equals(type, that.type); - } - - @Override - public int hashCode() { - return Objects.hash(name, type); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FunctionExecutor.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FunctionExecutor.java deleted file mode 100644 index 5a8f846d9..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/function/FunctionExecutor.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.function; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface FunctionExecutor { - - Value exec(ExecutionContext ctx, Policy policy) throws PMException, PMLScopeException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/PMLScopeException.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/PMLScopeException.java deleted file mode 100644 index adfe5bba6..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/PMLScopeException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.scope; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class PMLScopeException extends Exception { - public PMLScopeException(String message) { - super(message); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/Scope.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/Scope.java deleted file mode 100644 index 21470b236..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/Scope.java +++ /dev/null @@ -1,225 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.scope; - -import gov.nist.csd.pm.policy.pml.PMLBuiltinConstants; -import gov.nist.csd.pm.policy.pml.PMLBuiltinFunctions; -import gov.nist.csd.pm.policy.pml.PMLContext; -import gov.nist.csd.pm.policy.pml.compiler.Variable; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.io.Serializable; -import java.util.*; - -public class Scope implements Serializable { - - /** - * Store a set of function definition statements. - * These will include any builtin functions such as concat(). - */ - private Map functions; - - /** - * The variables accessible in the scope. - * Only used if mode is COMPILE. - */ - private Map variables; - - /** - * The values accessible in the scope. - * Only used if mode is EXECUTE. - */ - private final Map values; - - /** - * The resources access rights expression for the policy. This is used during compilation. - */ - private Expression resourceAccessRightsExpression; - - /** - * The resources access rights for the policy. This is used during execution. - */ - private AccessRightSet resourceAccessRights; - - private final Mode mode; - - public Scope(Mode mode) { - this.mode = mode; - this.functions = new HashMap<>(); - this.variables = new HashMap<>(); - this.values = new HashMap<>(); - this.resourceAccessRightsExpression = null; - this.resourceAccessRights = new AccessRightSet(); - } - - public Map functions() { - return functions; - } - - public Map variables() { - return variables; - } - - public Map values() { - return values; - } - - public Expression getResourceAccessRightsExpression() { - return resourceAccessRightsExpression; - } - - public boolean isResourceAccessRightsExpressionSet() { - return resourceAccessRightsExpression != null; - } - - public Scope copy() { - Scope copy = new Scope(this.mode); - - copy.functions = new HashMap<>(this.functions); - copy.variables = new HashMap<>(this.variables); - - if (isResourceAccessRightsExpressionSet()) { - copy.resourceAccessRightsExpression = this.resourceAccessRightsExpression; - } - - copy.resourceAccessRights = this.resourceAccessRights; - - return copy; - } - - public void overwriteVariables(Scope overwrite) { - for (String varName : overwrite.variables.keySet()) { - if (!this.variables.containsKey(varName)) { - continue; - } - - this.variables.put(varName, overwrite.variables.get(varName)); - } - } - - public void overwriteValues(Scope overwrite) { - for (String varName : overwrite.values.keySet()) { - if (!this.values.containsKey(varName)) { - continue; - } - - this.values.put(varName, overwrite.values.get(varName)); - } - } - - public void loadFromPMLContext(PMLContext pmlCtx) { - functions.putAll(pmlCtx.getFunctions()); - values.putAll(pmlCtx.getConstants()); - } - - public void setResourceAccessRightsExpression(Expression expression) { - this.resourceAccessRightsExpression = expression; - } - - public void setResourceAccessRights(AccessRightSet accessRightSet) { - this.resourceAccessRights = accessRightSet; - } - - public void addFunction(FunctionDefinitionStatement functionDefinitionStatement) throws FunctionAlreadyDefinedInScopeException { - if (functions.containsKey(functionDefinitionStatement.getFunctionName()) - || isBuiltinFunction(functionDefinitionStatement.getFunctionName())) { - throw new FunctionAlreadyDefinedInScopeException(functionDefinitionStatement.getFunctionName()); - } - - this.functions.put(functionDefinitionStatement.getFunctionName(), functionDefinitionStatement); - } - - public FunctionDefinitionStatement getFunction(String name) throws UnknownFunctionInScopeException { - if (functions.containsKey(name)) { - return functions.get(name); - } else if (isBuiltinFunction(name)) { - return PMLBuiltinFunctions.builtinFunctions().get(name); - } - - throw new UnknownFunctionInScopeException(name); - } - - public void addVariable(String name, Type type, boolean isConst) throws VariableAlreadyDefinedInScopeException { - if (constantExists(name) - || isBuiltinVariable(name)) { - throw new VariableAlreadyDefinedInScopeException(name); - } - - this.variables.put(name, new Variable(name, type, isConst)); - } - - private boolean constantExists(String name) { - return variables.containsKey(name) && variables.get(name).isConst(); - } - - public Variable getVariable(String name) throws UnknownVariableInScopeException { - if (variables.containsKey(name)) { - return variables.get(name); - } else if (isBuiltinVariable(name)) { - return PMLBuiltinConstants.builtinVariables().get(name); - } - - throw new UnknownVariableInScopeException(name); - } - - public boolean variableExists(String name) { - try { - getVariable(name); - } catch (UnknownVariableInScopeException e) { - return false; - } - - return true; - } - - public void putValue(String name, Value value) { - this.values.put(name, value); - } - - public Value getValue(String name) throws UnknownVariableInScopeException { - if (values.containsKey(name)) { - return values.get(name); - } else if (isBuiltinValue(name)) { - return PMLBuiltinConstants.builtinValues().get(name); - } else if (resourceAccessRights.contains(name)) { - return new Value(name); - } - - throw new UnknownVariableInScopeException(name); - } - - private boolean isBuiltinVariable(String name) { - return PMLBuiltinConstants.builtinVariables().containsKey(name); - } - private boolean isBuiltinValue(String name) { - return PMLBuiltinConstants.builtinValues().containsKey(name); - } - - private boolean isBuiltinFunction(String name) { - return PMLBuiltinFunctions.builtinFunctions().containsKey(name); - } - - public enum Mode { - COMPILE, - EXECUTE - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Scope scope = (Scope) o; - return Objects.equals(functions, scope.functions) - && Objects.equals(variables, scope.variables) - && Objects.equals(values, scope.values) - && Objects.equals(resourceAccessRights, scope.resourceAccessRights) - && mode == scope.mode; - } - - @Override - public int hashCode() { - return Objects.hash(functions, variables, values, resourceAccessRights, mode); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownVariableInScopeException.java b/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownVariableInScopeException.java deleted file mode 100644 index f3a1b5847..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/model/scope/UnknownVariableInScopeException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.pml.model.scope; - -public class UnknownVariableInScopeException extends PMLScopeException { - - public UnknownVariableInScopeException(String functionName) { - super(String.format("unknown variable '%s' in scope", functionName)); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssignStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssignStatement.java deleted file mode 100644 index 2699b0641..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssignStatement.java +++ /dev/null @@ -1,67 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.List; -import java.util.Objects; - -public class AssignStatement extends PMLStatement { - - private final Expression child; - private final Expression assignTo; - - public AssignStatement(Expression child, Expression assignTo) { - this.child = child; - this.assignTo = assignTo; - } - - public Expression getChild() { - return child; - } - - public Expression getAssignTo() { - return assignTo; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value childValue = this.child.execute(ctx, policy); - Value assignToValue = this.assignTo.execute(ctx, policy); - - String childStringValue = childValue.getStringValue(); - - if (assignToValue.isString()) { - String parent = assignToValue.getStringValue(); - policy.graph().assign(childStringValue, parent); - } else if (assignToValue.isArray()) { - List valueArr = assignToValue.getArrayValue(); - for (Value value : valueArr) { - String parent = value.getStringValue(); - policy.graph().assign(childStringValue, parent); - } - } - - return new Value(); - } - - @Override - public String toString() { - return String.format("assign %s to %s", child, assignTo); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AssignStatement that = (AssignStatement) o; - return Objects.equals(child, that.child) && Objects.equals(assignTo, that.assignTo); - } - - @Override - public int hashCode() { - return Objects.hash(child, assignTo); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssociateStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssociateStatement.java deleted file mode 100644 index 740b3735b..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/AssociateStatement.java +++ /dev/null @@ -1,73 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; - -import java.util.Objects; - -public class AssociateStatement extends PMLStatement { - - private final Expression ua; - private final Expression target; - private final Expression accessRights; - - public AssociateStatement(Expression ua, Expression target, Expression accessRights) { - this.ua = ua; - this.target = target; - this.accessRights = accessRights; - } - - public Expression getUa() { - return ua; - } - - public Expression getTarget() { - return target; - } - - public Expression getAccessRights() { - return accessRights; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value uaValue = ua.execute(ctx, policy); - Value targetValue = target.execute(ctx, policy); - Value permissionsValue = accessRights.execute(ctx, policy); - - AccessRightSet accessRightSet = new AccessRightSet(); - for (Value v : permissionsValue.getArrayValue()) { - accessRightSet.add(v.getStringValue()); - } - - policy.graph().associate( - uaValue.getStringValue(), - targetValue.getStringValue(), - accessRightSet - ); - - return new Value(); - } - - @Override - public String toString() { - return String.format("associate %s and %s with %s", - ua, target, accessRights); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - AssociateStatement that = (AssociateStatement) o; - return Objects.equals(ua, that.ua) && Objects.equals(target, that.target) && Objects.equals(accessRights, that.accessRights); - } - - @Override - public int hashCode() { - return Objects.hash(ua, target, accessRights); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/BreakStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/BreakStatement.java deleted file mode 100644 index 8f10367fb..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/BreakStatement.java +++ /dev/null @@ -1,18 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class BreakStatement extends PMLStatement { - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - return Value.breakValue(); - } - - @Override - public String toString() { - return "break"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ContinueStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/ContinueStatement.java deleted file mode 100644 index 47f10931c..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ContinueStatement.java +++ /dev/null @@ -1,18 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class ContinueStatement extends PMLStatement { - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - return Value.continueValue(); - } - - @Override - public String toString() { - return "continue"; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateAttrStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateAttrStatement.java deleted file mode 100644 index 62ee00ae7..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateAttrStatement.java +++ /dev/null @@ -1,102 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.OA; - -public class CreateAttrStatement extends PMLStatement { - - private final Expression name; - private final NodeType type; - private final Expression assignTo; - - public CreateAttrStatement(Expression name, NodeType type, Expression assignTo) { - this.name = name; - this.type = type; - this.assignTo = assignTo; - } - - public Expression getName() { - return name; - } - - public NodeType getType() { - return type; - } - - public Expression getAssignTo() { - return assignTo; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value nameValue = name.execute(ctx, policy); - Value assignToValue = assignTo.execute(ctx, policy); - - String initialParent = ""; - List parents = new ArrayList<>(); - if (assignToValue.isString()) { - initialParent = assignToValue.getStringValue(); - } else { - List arrayValue = assignToValue.getArrayValue(); - for (Value parentValue : arrayValue) { - if (initialParent.isEmpty()) { - initialParent = parentValue.getStringValue(); - } else { - parents.add(parentValue.getStringValue()); - } - } - } - - String[] parentsArr = parents.toArray(new String[]{}); - - if (type == OA) { - policy.graph().createObjectAttribute( - nameValue.getStringValue(), - new HashMap<>(), - initialParent, - parentsArr - ); - } else { - policy.graph().createUserAttribute( - nameValue.getStringValue(), - new HashMap<>(), - initialParent, - parentsArr - ); - } - - return new Value(); - } - - @Override - public String toString() { - return String.format("create %s %s in %s", - (type == OA ? "object attribute" : "user attribute"), - name, - assignTo - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreateAttrStatement that = (CreateAttrStatement) o; - return Objects.equals(name, that.name) && type == that.type && Objects.equals(assignTo, that.assignTo); - } - - @Override - public int hashCode() { - return Objects.hash(name, type, assignTo); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateObligationStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateObligationStatement.java deleted file mode 100644 index caa0ce11f..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateObligationStatement.java +++ /dev/null @@ -1,178 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.pml.PMLFormatter; -import gov.nist.csd.pm.policy.pml.model.expression.ArrayLiteral; -import gov.nist.csd.pm.policy.pml.model.expression.Literal; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; - -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class CreateObligationStatement extends PMLStatement { - - private final Expression name; - private final List ruleStmts; - - public CreateObligationStatement(Expression name, List ruleStmts) { - this.name = name; - this.ruleStmts = ruleStmts; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - UserContext author = ctx.author(); - String nameStr = name.execute(ctx, policy).getStringValue(); - - // execute the create rule statements and add to obligation - List rules = new ArrayList<>(); - for (PMLStatement createRuleStmt : ruleStmts) { - Value createRuleValue = createRuleStmt.execute(ctx, policy); - Rule rule = createRuleValue.getRule(); - rules.add(rule); - } - - policy.obligations().create(author, nameStr, rules.toArray(rules.toArray(Rule[]::new))); - - return new Value(); - } - - @Override - public String toString() { - return String.format("create obligation %s {%s}", name, PMLFormatter.statementsToString(ruleStmts)); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreateObligationStatement that = (CreateObligationStatement) o; - return Objects.equals(name, that.name) && Objects.equals(ruleStmts, that.ruleStmts); - } - - @Override - public int hashCode() { - return Objects.hash(name, ruleStmts); - } - - public static CreateObligationStatement fromObligation(Obligation obligation) { - return new CreateObligationStatement( - new Expression(new Literal(obligation.getLabel())), - createRuleStatementsFromObligation(obligation.getRules()) - ); - } - - private static List createRuleStatementsFromObligation(List rules) { - List createRuleStatements = new ArrayList<>(); - - for (Rule rule : rules) { - EventPattern event = rule.getEventPattern(); - - CreateRuleStatement createRuleStatement = new CreateRuleStatement( - new Expression(new Literal(rule.getLabel())), - getSubjectClause(event.getSubject()), - getPerformsClause(event.getOperations()), - getOnClause(event), - new CreateRuleStatement.ResponseBlock( - rule.getResponse().getEventCtxVariable(), - rule.getResponse().getStatements() - ) - ); - - createRuleStatements.add(createRuleStatement); - } - - return createRuleStatements; - } - - private static CreateRuleStatement.OnClause getOnClause(EventPattern event) { - Target target = event.getTarget(); - Target.Type type = target.getType(); - Expression expression = null; - CreateRuleStatement.TargetType onClauseType = null; - switch (type) { - case ANY_CONTAINED_IN -> { - expression = new Expression(new Literal(target.anyContainedIn())); - onClauseType = CreateRuleStatement.TargetType.ANY_CONTAINED_IN; - } - case POLICY_ELEMENT -> { - expression = new Expression(new Literal(target.policyElement())); - onClauseType = CreateRuleStatement.TargetType.POLICY_ELEMENT; - } - case ANY_OF_SET -> { - List set = target.anyOfSet(); - ArrayLiteral arrayLiteral = new ArrayLiteral(Type.string()); - for (String s : set) { - arrayLiteral.add(new Expression(new Literal(s))); - } - - expression = new Expression(new Literal(arrayLiteral)); - onClauseType = CreateRuleStatement.TargetType.ANY_OF_SET; - } - case ANY_POLICY_ELEMENT -> onClauseType = CreateRuleStatement.TargetType.ANY_POLICY_ELEMENT; - } - - return new CreateRuleStatement.OnClause(expression, onClauseType); - } - - private static CreateRuleStatement.PerformsClause getPerformsClause(List operations) { - ArrayLiteral arrayLiteral = new ArrayLiteral(Type.string()); - for (String op : operations) { - arrayLiteral.add(new Expression(new Literal(op))); - } - return new CreateRuleStatement.PerformsClause( - new Expression(new Literal(arrayLiteral)) - ); - } - - private static CreateRuleStatement.SubjectClause getSubjectClause(EventSubject subject) { - EventSubject.Type eventSubjectType = subject.getType(); - CreateRuleStatement.SubjectType type = null; - Expression subjectExpr = null; - CreateRuleStatement.SubjectClause subjectClause = null; - switch (eventSubjectType) { - case USERS -> { - if (subject.users().size() > 1) { - type = CreateRuleStatement.SubjectType.USERS; - - ArrayLiteral arrayLiteral = new ArrayLiteral(Type.string()); - for (String user : subject.users()) { - arrayLiteral.add(new Expression(new Literal(user))); - } - - subjectExpr = new Expression(new Literal(arrayLiteral)); - } else { - type = CreateRuleStatement.SubjectType.USER; - subjectExpr = new Expression(new Literal(subject.users().get(0))); - } - } - case PROCESS -> { - type = CreateRuleStatement.SubjectType.PROCESS; - subjectExpr = new Expression(new Literal(subject.process())); - } - case ANY_USER_WITH_ATTRIBUTE -> { - type = CreateRuleStatement.SubjectType.USER_ATTR; - subjectExpr = new Expression(new Literal(subject.anyUserWithAttribute())); - } - case ANY_USER -> type = CreateRuleStatement.SubjectType.ANY_USER; - } - - if (subjectExpr == null) { - subjectClause = new CreateRuleStatement.SubjectClause(type); - } else { - subjectClause = new CreateRuleStatement.SubjectClause(type, subjectExpr); - } - - return subjectClause; - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreatePolicyStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreatePolicyStatement.java deleted file mode 100644 index 382acce52..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreatePolicyStatement.java +++ /dev/null @@ -1,48 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Objects; - -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; - -public class CreatePolicyStatement extends PMLStatement { - - private final Expression name; - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreatePolicyStatement that = (CreatePolicyStatement) o; - return Objects.equals(name, that.name); - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - - public CreatePolicyStatement(Expression name) { - this.name = name; - } - - public Expression getName() { - return name; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - policy.graph().createPolicyClass(name.execute(ctx, policy).getStringValue(), NO_PROPERTIES); - - return new Value(); - } - - @Override - public String toString() { - return String.format("create policy class %s", name); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateProhibitionStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateProhibitionStatement.java deleted file mode 100644 index aa68fc8a0..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateProhibitionStatement.java +++ /dev/null @@ -1,167 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.pml.model.expression.*; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.isAdminAccessRight; - -public class CreateProhibitionStatement extends PMLStatement { - - private final Expression label; - private final Expression subject; - private final ProhibitionSubject.Type subjectType; - private final Expression accessRights; - private final boolean isIntersection; - private final List containers; - - public CreateProhibitionStatement(Expression label, Expression subject, ProhibitionSubject.Type subjectType, Expression accessRights, - boolean isIntersection, List containers) { - this.label = label; - this.subject = subject; - this.subjectType = subjectType; - this.accessRights = accessRights; - this.isIntersection = isIntersection; - this.containers = containers; - } - - public Expression getLabel() { - return label; - } - - public Expression getSubject() { - return subject; - } - - public ProhibitionSubject.Type getSubjectType() { - return subjectType; - } - - public Expression getAccessRights() { - return accessRights; - } - - public boolean isIntersection() { - return isIntersection; - } - - public List getContainers() { - return containers; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value labelValue = this.label .execute(ctx, policy); - Value subjectValue = this.subject.execute(ctx, policy); - Value permissionsValue = this.accessRights.execute(ctx, policy); - - List arrayValue = permissionsValue.getArrayValue(); - AccessRightSet ops = new AccessRightSet(); - for (Value v : arrayValue) { - ops.add(v.getStringValue()); - } - - List containerConditions = new ArrayList<>(); - for (Container container : containers) { - boolean isComplement = container.isComplement; - Value containerValue = container.name.execute(ctx, policy); - containerConditions.add(new ContainerCondition(containerValue.getStringValue(), isComplement)); - } - - - policy.prohibitions().create( - labelValue.getStringValue(), - new ProhibitionSubject(subjectValue.getStringValue(), subjectType), - ops, - isIntersection, - containerConditions.toArray(new ContainerCondition[]{}) - ); - - return new Value(); - } - - @Override - public String toString() { - String subjectStr = ""; - switch (subjectType) { - case USER_ATTRIBUTE -> subjectStr = "user attribute"; - case USER -> subjectStr = "user"; - case PROCESS -> subjectStr = "process"; - } - - StringBuilder containerStr = new StringBuilder((isIntersection ? "intersection" : "union") + " of ["); - int length = containerStr.length(); - for (Container c : containers) { - if (containerStr.length() != length) { - containerStr.append(", "); - } - containerStr.append(c); - } - containerStr.append("]"); - - return String.format("create prohibition %s deny %s %s access rights %s on %s", label, subjectStr, subject, accessRights, containerStr); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreateProhibitionStatement that = (CreateProhibitionStatement) o; - return isIntersection == that.isIntersection && Objects.equals(label, that.label) && Objects.equals(subject, that.subject) && Objects.equals(accessRights, that.accessRights) && Objects.equals(containers, that.containers); - } - - @Override - public int hashCode() { - return Objects.hash(label, subject, accessRights, isIntersection, containers); - } - - public static class Container implements Serializable { - private final boolean isComplement; - private final Expression name; - - public Container(boolean isComplement, Expression name) { - this.isComplement = isComplement; - this.name = name; - } - - @Override - public String toString() { - return (isComplement ? "!" : "") + name; - } - } - - public static CreateProhibitionStatement fromProhibition(Prohibition prohibition) { - ArrayLiteral arrayLiteral = new ArrayLiteral(Type.string()); - for (String ar : prohibition.getAccessRightSet()) { - if (isAdminAccessRight(ar)) { - arrayLiteral.add(new Expression(new VariableReference(ar, Type.string()))); - } else { - arrayLiteral.add(new Expression(new Literal(ar))); - } - } - - List containers = new ArrayList<>(); - for (ContainerCondition cc : prohibition.getContainers()) { - containers.add(new Container(cc.complement(), new Expression(new Literal(cc.name())))); - } - - return new CreateProhibitionStatement( - new Expression(new Literal(prohibition.getLabel())), - new Expression(new Literal(prohibition.getSubject().getName())), - prohibition.getSubject().getType(), - new Expression(new Literal(arrayLiteral)), - prohibition.isIntersection(), - containers - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateRuleStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateRuleStatement.java deleted file mode 100644 index 42ce2b575..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateRuleStatement.java +++ /dev/null @@ -1,329 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.exception.PMLExecutionException; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.pml.PMLFormatter; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class CreateRuleStatement extends PMLStatement { - - private final Expression name; - private final SubjectClause subjectClause; - private final PerformsClause performsClause; - private final OnClause onClause; - private final ResponseBlock responseBlock; - - public CreateRuleStatement(Expression name, SubjectClause subjectClause, - PerformsClause performsClause, OnClause onClause, ResponseBlock responseBlock) { - this.name = name; - this.subjectClause = subjectClause; - this.performsClause = performsClause; - this.onClause = onClause; - this.responseBlock = responseBlock; - } - - public Expression getName() { - return name; - } - - public SubjectClause getSubjectClause() { - return subjectClause; - } - - public PerformsClause getPerformsClause() { - return performsClause; - } - - public OnClause getOnClause() { - return onClause; - } - - public ResponseBlock getResponse() { - return responseBlock; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value nameValue = name.execute(ctx, policy); - - EventSubject subject = executeEventSubject(ctx, policy); - Performs performs = executePerforms(ctx, policy); - Target target = executeTarget(ctx, policy); - ExecutionContext ruleCtx; - try { - ruleCtx = ctx.copy(); - } catch (PMLScopeException e) { - throw new PMLExecutionException(e.getMessage()); - } - - Rule rule = new Rule( - nameValue.getStringValue(), - new EventPattern( - subject, - performs, - target - ), - new Response(responseBlock.evtVar, ruleCtx, responseBlock.getStatements()) - ); - - return new Value(rule); - } - - private EventSubject executeEventSubject(ExecutionContext ctx, Policy policy) throws PMException { - EventSubject subject; - if (subjectClause.type == SubjectType.USER || subjectClause.type == SubjectType.USERS) { - List subjectValues = new ArrayList<>(); - subjectValues.add(subjectClause.expr.execute(ctx, policy).getStringValue()); - subject = EventSubject.users(subjectValues.toArray(new String[]{})); - } else if (subjectClause.type == SubjectType.ANY_USER) { - subject = EventSubject.anyUser(); - } else if (subjectClause.type == SubjectType.USER_ATTR) { - subject = EventSubject.anyUserWithAttribute( - subjectClause.expr.execute(ctx, policy).getStringValue() - ); - } else { - // process - subject = EventSubject.process( - subjectClause.expr.execute(ctx, policy).getStringValue() - ); - } - - return subject; - } - - private Performs executePerforms(ExecutionContext ctx, Policy policy) throws PMException { - Performs performs; - Value performsValue = performsClause.events.execute(ctx, policy); - if (performsValue.isString()) { - performs = Performs.events(performsValue.getStringValue()); - } else { - List events = new ArrayList<>(); - List arrayValue = performsValue.getArrayValue(); - for (Value value : arrayValue) { - events.add(value.getStringValue()); - } - performs = Performs.events(events.toArray(new String[]{})); - } - - return performs; - } - - private Target executeTarget(ExecutionContext ctx, Policy policy) throws PMException { - Target target = Target.anyPolicyElement(); - Value onValue; - if (onClause.nameExpr != null) { - onValue = onClause.nameExpr.execute(ctx, policy); - } else { - onValue = new Value(); - } - - if (onValue.isString()) { - // with POLICY_ELEMENT or CONTAINED_IN - if (onClause.isPolicyElement()) { - target = Target.policyElement(onValue.getStringValue()); - } else { - target = Target.anyContainedIn(onValue.getStringValue()); - } - } else if (onValue.isArray()) { - // ANY_OF_SET - List values = onValue.getArrayValue(); - List policyElements = new ArrayList<>(); - for (Value value : values) { - policyElements.add(value.getStringValue()); - } - - target = Target.anyOfSet(policyElements.toArray(String[]::new)); - } - - return target; - } - - - @Override - public String toString() { - return String.format( - "create rule %s %s %s %s do (%s) {%s}", - name, subjectClause, performsClause, onClause, - responseBlock.evtVar, PMLFormatter.statementsToString(responseBlock.statements) - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreateRuleStatement that = (CreateRuleStatement) o; - return Objects.equals(name, that.name) && Objects.equals(subjectClause, that.subjectClause) && Objects.equals(performsClause, that.performsClause) && Objects.equals(onClause, that.onClause) && Objects.equals(responseBlock, that.responseBlock); - } - - @Override - public int hashCode() { - return Objects.hash(name, subjectClause, performsClause, onClause, responseBlock); - } - - public enum SubjectType implements Serializable { - ANY_USER, - USER, - USERS, - USER_ATTR, - PROCESS - } - - public static class SubjectClause implements Serializable { - private SubjectType type; - private Expression expr; - - public SubjectClause() { - } - - public SubjectClause(SubjectType type, Expression expr) { - this.type = type; - this.expr = expr; - } - - public SubjectClause(SubjectType type) { - this.type = type; - } - - public SubjectType getType() { - return type; - } - - @Override - public String toString() { - String s = "when "; - switch (type) { - case ANY_USER -> s += "any user"; - case USER_ATTR -> s += "any user with attribute " + expr; - case USERS -> s += "users " + expr; - case USER -> s += "user " + expr; - case PROCESS -> s += "process " + expr; - } - - return s; - } - } - - public static class PerformsClause implements Serializable { - private final Expression events; - - public PerformsClause(Expression events) { - this.events = events; - } - - public Expression getEvents() { - return events; - } - - @Override - public String toString() { - StringBuilder s = new StringBuilder("performs ["); - StringBuilder eventsStr = new StringBuilder(); - for (Expression event : events.getLiteral().getArrayLiteral().getArray()) { - if (!eventsStr.isEmpty()) { - eventsStr.append(", "); - } - eventsStr.append(event); - } - return s.append(eventsStr).append("]").toString(); - } - - public record Event(String eventName, String alias) { - @Override - public String toString() { - return String.format("%s%s", eventName, alias == null || alias.isEmpty() ? "" : "as " + alias); - } - } - } - - public enum TargetType { - ANY_POLICY_ELEMENT, ANY_CONTAINED_IN, ANY_OF_SET, POLICY_ELEMENT - - } - - public static class OnClause implements Serializable { - - private final Expression nameExpr; - private final TargetType onClauseType; - - public OnClause() { - nameExpr = null; - onClauseType = null; - } - - public OnClause(Expression nameExpr, TargetType onClauseType) { - this.nameExpr = nameExpr; - this.onClauseType = onClauseType; - } - - public boolean isPolicyElement() { - return onClauseType == TargetType.POLICY_ELEMENT; - } - - public boolean isAnyPolicyElement() { - return onClauseType == TargetType.ANY_POLICY_ELEMENT; - } - - public boolean isAnyContainedIn() { - return onClauseType == TargetType.ANY_CONTAINED_IN; - } - - public boolean isAnyOfSet() { - return onClauseType == TargetType.ANY_OF_SET; - } - - @Override - public String toString() { - if (onClauseType == null) { - return ""; - } - - String s = "on "; - switch (onClauseType) { - case POLICY_ELEMENT -> s += nameExpr; - case ANY_POLICY_ELEMENT -> s += "any policy element"; - case ANY_CONTAINED_IN -> s += "any policy element in " + nameExpr; - case ANY_OF_SET -> s += "any policy element of " + nameExpr; - } - - return s; - } - } - - public static class ResponseBlock implements Serializable { - private final String evtVar; - private final List statements; - - public ResponseBlock() { - this.evtVar = ""; - this.statements = new ArrayList<>(); - } - - public ResponseBlock(String evtVar, List statements) { - this.evtVar = evtVar; - this.statements = statements; - } - - public String getEvtVar() { - return evtVar; - } - - public List getStatements() { - return statements; - } - } -} \ No newline at end of file diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateUserOrObjectStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateUserOrObjectStatement.java deleted file mode 100644 index ae6588faf..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/CreateUserOrObjectStatement.java +++ /dev/null @@ -1,100 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Objects; - -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.O; - -public class CreateUserOrObjectStatement extends PMLStatement { - - private final Expression name; - private final NodeType type; - private final Expression assignTo; - - public CreateUserOrObjectStatement(Expression name, NodeType type, Expression assignTo) { - this.name = name; - this.type = type; - this.assignTo = assignTo; - } - - public Expression getName() { - return name; - } - - public NodeType getType() { - return type; - } - - public Expression getAssignTo() { - return assignTo; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value nameValue = name.execute(ctx, policy); - Value assignToValue = assignTo.execute(ctx, policy); - - String initialParent = ""; - List parents = new ArrayList<>(); - - List arrayValue = assignToValue.getArrayValue(); - for (Value parentValue : arrayValue) { - if (initialParent.isEmpty()) { - initialParent = parentValue.getStringValue(); - } else { - parents.add(parentValue.getStringValue()); - } - } - - String[] parentsArr = parents.toArray(new String[]{}); - - if (type == O) { - policy.graph().createObject( - nameValue.getStringValue(), - new HashMap<>(), - initialParent, - parentsArr - ); - } else { - policy.graph().createUser( - nameValue.getStringValue(), - new HashMap<>(), - initialParent, - parentsArr - ); - } - - return new Value(); - } - - @Override - public String toString() { - return String.format( - "create %s %s in %s", - (type == O ? "object" : "user"), - name, - assignTo - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - CreateUserOrObjectStatement that = (CreateUserOrObjectStatement) o; - return Objects.equals(name, that.name) && type == that.type && Objects.equals(assignTo, that.assignTo); - } - - @Override - public int hashCode() { - return Objects.hash(name, type, assignTo); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeassignStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeassignStatement.java deleted file mode 100644 index 476fc2539..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeassignStatement.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.List; -import java.util.Objects; - -public class DeassignStatement extends PMLStatement { - - private final Expression child; - private final Expression deassignFrom; - - public DeassignStatement(Expression child, Expression deassignFrom) { - this.child = child; - this.deassignFrom = deassignFrom; - } - - public Expression getChild() { - return child; - } - - public Expression getDeassignFrom() { - return deassignFrom; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value childValue = child.execute(ctx, policy); - Value deassignFromValue = deassignFrom.execute(ctx, policy); - - String childStringValue = childValue.getStringValue(); - - if (deassignFromValue.isString()) { - String parent = deassignFromValue.getStringValue(); - policy.graph().deassign(childStringValue, parent); - } else { - List valueArr = deassignFromValue.getArrayValue(); - for (Value value : valueArr) { - String parent = value.getStringValue(); - policy.graph().deassign(childStringValue, parent); - } - } - - return new Value(); - } - - @Override - public String toString() { - return String.format("deassign %s from %s", - child, - deassignFrom - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DeassignStatement that = (DeassignStatement) o; - return Objects.equals(child, that.child) && Objects.equals(deassignFrom, that.deassignFrom); - } - - @Override - public int hashCode() { - return Objects.hash(child, deassignFrom); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteRuleStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteRuleStatement.java deleted file mode 100644 index 7340dcb20..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteRuleStatement.java +++ /dev/null @@ -1,64 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Rule; - -import java.util.Objects; - -public class DeleteRuleStatement extends PMLStatement { - - private final Expression ruleExpr; - private final Expression oblExpr; - - public DeleteRuleStatement(Expression ruleExpr, Expression oblExpr) { - this.ruleExpr = ruleExpr; - this.oblExpr = oblExpr; - } - - public Expression getRuleExpr() { - return ruleExpr; - } - - public Expression getOblExpr() { - return oblExpr; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - String ruleLabel = ruleExpr.execute(ctx, policy).getStringValue(); - String oblLabel = oblExpr.execute(ctx, policy).getStringValue(); - - Obligation obligation = policy.obligations().get(oblLabel); - obligation.deleteRule(ruleLabel); - - policy.obligations().update( - obligation.getAuthor(), - obligation.getLabel(), - obligation.getRules().toArray(new Rule[]{}) - ); - - return new Value(); - } - - @Override - public String toString() { - return String.format("delete rule %s from obligation %s", ruleExpr, oblExpr); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DeleteRuleStatement that = (DeleteRuleStatement) o; - return Objects.equals(ruleExpr, that.ruleExpr) && Objects.equals(oblExpr, that.oblExpr); - } - - @Override - public int hashCode() { - return Objects.hash(ruleExpr, oblExpr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteStatement.java deleted file mode 100644 index 619508f44..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DeleteStatement.java +++ /dev/null @@ -1,80 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Objects; - -public class DeleteStatement extends PMLStatement { - - private final Type type; - private final Expression expression; - - public DeleteStatement(Type type, Expression expression) { - this.type = type; - this.expression = expression; - } - - public Type getType() { - return type; - } - - public Expression getExpression() { - return expression; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - String name = expression.execute(ctx, policy).getStringValue(); - if (type == Type.PROHIBITION) { - policy.prohibitions().delete(name); - } else if (type == Type.OBLIGATION) { - policy.obligations().delete(name); - } else { - policy.graph().deleteNode(name); - } - - return new Value(); - } - - @Override - public String toString() { - String typeStr = ""; - switch (type) { - case PROHIBITION -> typeStr = "prohibition"; - case OBLIGATION -> typeStr = "obligation"; - case POLICY_CLASS -> typeStr = "policy class"; - case OBJECT_ATTRIBUTE -> typeStr = "object attribute"; - case USER_ATTRIBUTE -> typeStr = "user attribute"; - case OBJECT -> typeStr = "object"; - case USER -> typeStr = "user"; - } - - return String.format("delete %s %s", typeStr, expression); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DeleteStatement that = (DeleteStatement) o; - return type == that.type && Objects.equals(expression, that.expression); - } - - @Override - public int hashCode() { - return Objects.hash(type, expression); - } - - public enum Type { - POLICY_CLASS, - OBJECT_ATTRIBUTE, - USER_ATTRIBUTE, - OBJECT, - USER, - PROHIBITION, - OBLIGATION - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DissociateStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/DissociateStatement.java deleted file mode 100644 index 6d052b5fd..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/DissociateStatement.java +++ /dev/null @@ -1,55 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Objects; - -public class DissociateStatement extends PMLStatement { - - private final Expression uaExpr; - private final Expression targetExpr; - - public DissociateStatement(Expression uaExpr, Expression targetExpr) { - this.uaExpr = uaExpr; - this.targetExpr = targetExpr; - } - - public Expression getUaExpr() { - return uaExpr; - } - - public Expression getTargetExpr() { - return targetExpr; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - String ua = uaExpr.execute(ctx, policy).getStringValue(); - String target = targetExpr.execute(ctx, policy).getStringValue(); - - policy.graph().dissociate(ua, target); - - return new Value(); - } - - @Override - public String toString() { - return String.format("dissociate %s and %s", uaExpr, targetExpr); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - DissociateStatement that = (DissociateStatement) o; - return Objects.equals(uaExpr, that.uaExpr) && Objects.equals(targetExpr, that.targetExpr); - } - - @Override - public int hashCode() { - return Objects.hash(uaExpr, targetExpr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/Expression.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/Expression.java deleted file mode 100644 index f60dc7414..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/Expression.java +++ /dev/null @@ -1,242 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import com.mysql.cj.log.Log; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.antlr.PMLParser; -import gov.nist.csd.pm.policy.pml.compiler.Variable; -import gov.nist.csd.pm.policy.pml.compiler.visitor.FunctionInvokeVisitor; -import gov.nist.csd.pm.policy.pml.compiler.visitor.LiteralExprVisitor; -import gov.nist.csd.pm.policy.pml.compiler.visitor.VariableReferenceVisitor; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.context.VisitorContext; -import gov.nist.csd.pm.policy.pml.model.expression.*; -import gov.nist.csd.pm.policy.pml.model.scope.Scope; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownFunctionInScopeException; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownVariableInScopeException; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class Expression extends PMLStatement { - - public static Expression compile(VisitorContext visitorCtx, - PMLParser.ExpressionContext expressionCtx, - Type... allowedTypes) { - Expression expression; - if (expressionCtx.literal() != null) { - PMLParser.LiteralContext litCtx = expressionCtx.literal(); - Literal literal = new LiteralExprVisitor(visitorCtx) - .visitLiteral(litCtx); - expression = new Expression(literal); - } else if (expressionCtx.functionInvoke() != null) { - FunctionInvocationStatement functionCall = new FunctionInvokeVisitor(visitorCtx) - .visitFunctionInvoke(expressionCtx.functionInvoke()); - expression = new Expression(functionCall); - } else if (expressionCtx.variableReference() != null){ - VariableReference varRef = new VariableReferenceVisitor(visitorCtx) - .visitVariableReference(expressionCtx.variableReference()); - expression = new Expression(varRef); - } else if (expressionCtx.AND_OP() != null || expressionCtx.OR_OP() != null) { - Expression left = compile(visitorCtx, expressionCtx.left, Type.bool()); - Expression right = compile(visitorCtx, expressionCtx.right, Type.bool()); - - expression = new Expression(new LogicalExpression(left, right, expressionCtx.AND_OP() != null)); - } else { - Expression left = compile(visitorCtx, expressionCtx.left); - Expression right = compile(visitorCtx, expressionCtx.right); - - expression = new Expression(new CompareExpression(left, right, expressionCtx.EQUALS_OP() != null)); - } - - Type type; - try { - type = expression.getType(visitorCtx.scope()); - } catch (UnknownFunctionInScopeException | UnknownVariableInScopeException e) { - visitorCtx.errorLog().addError(expressionCtx, e.getMessage()); - type = Type.any(); - } - - // check the expression type is part of the given allowed types - // if no types are given then any type is allowed - List allowedTypesList = Arrays.asList(allowedTypes); - if (!allowedTypesList.isEmpty() - && !allowedTypesList.contains(type)) { - visitorCtx.errorLog().addError( - expressionCtx, - "expression type " + type + " not allowed, only: " + allowedTypesList - ); - } - - return expression; - } - - private VariableReference variableReference; - private boolean isVariableReference; - private FunctionInvocationStatement functionCall; - private boolean isFunctionCall; - private Literal literal; - private boolean isLiteral; - private CompareExpression compareExpression; - private boolean isCompareExpression; - private LogicalExpression logicalExpression; - private boolean isLogicalExpression; - - public Expression(VariableReference variableReference) { - this.variableReference = variableReference; - this.isVariableReference = true; - } - - public Expression(FunctionInvocationStatement functionCall) { - this.functionCall = functionCall; - this.isFunctionCall = true; - } - - public Expression(Literal literal) { - this.literal = literal; - this.isLiteral = true; - } - - public Expression(CompareExpression compareExpression) { - this.compareExpression = compareExpression; - this.isCompareExpression = true; - } - - public Expression(LogicalExpression logicalExpression) { - this.logicalExpression = logicalExpression; - this.isLogicalExpression = true; - } - - public Expression() {} - - public VariableReference getVariableReference() { - return variableReference; - } - - public boolean isVariableReference() { - return isVariableReference; - } - - public FunctionInvocationStatement getFunctionCall() { - return functionCall; - } - - public boolean isFunctionCall() { - return isFunctionCall; - } - - public Literal getLiteral() { - return literal; - } - - public boolean isLiteral() { - return isLiteral; - } - - @Override - public String toString() { - if (isFunctionCall) { - return functionCall.toString(); - } else if (isLiteral) { - return literal.toString(); - } else { - return variableReference.toString(); - } - } - - public Type getType(Scope Scope) throws UnknownFunctionInScopeException, UnknownVariableInScopeException { - if (isFunctionCall) { - return getFunctionCallType(Scope); - } else if (isLiteral) { - return getLiteralType(); - } else if (isVariableReference){ - return getVarRefType(Scope); - } else {// (isLogicalExpression || isCompareExpression) { - return Type.bool(); - } - } - - private Type getVarRefType(Scope Scope) throws UnknownVariableInScopeException { - if (variableReference.isID()) { - return getIDType(Scope, variableReference); - } else { - return variableReference.getType(); - } - } - - private Type getIDType(Scope Scope, VariableReference variableReference) throws UnknownVariableInScopeException { - Variable variable = Scope.getVariable(variableReference.getID()); - if (variable == null) { - return null; - } - - return variable.type(); - } - - private Type getFunctionCallType(Scope Scope) throws UnknownFunctionInScopeException { - String functionName = functionCall.getFunctionName(); - FunctionDefinitionStatement function = Scope.getFunction(functionName); - if (function == null) { - return null; - } - - return function.getReturnType(); - } - - private Type getLiteralType() { - if (literal.isStringLiteral()) { - return Type.string(); - } else if (literal.isNumberLiteral()) { - return Type.number(); - } else if (literal.isBooleanLiteral()) { - return Type.bool(); - } else if (literal.isArrayLiteral()) { - return literal.getArrayLiteral().getType(); - }else if (literal.isMapLiteral()) { - return literal.getMapLiteral().getType(); - } else { - return Type.any(); - } - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - if (isLiteral) { - return literal.execute(ctx, policy); - } else if (isFunctionCall) { - return functionCall.execute(ctx, policy); - } else if (isVariableReference){ - return variableReference.execute(ctx, policy); - } else if (isCompareExpression) { - return compareExpression.execute(ctx, policy); - } else { - return logicalExpression.execute(ctx, policy); - } - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Expression that = (Expression) o; - return isVariableReference == that.isVariableReference - && isFunctionCall == that.isFunctionCall - && isLiteral == that.isLiteral - && Objects.equals(variableReference, that.variableReference) - && Objects.equals(functionCall, that.functionCall) - && Objects.equals(literal, that.literal); - } - - @Override - public int hashCode() { - if (isVariableReference) { - return variableReference.hashCode(); - } else if (isFunctionCall) { - return functionCall.hashCode(); - } else { - return literal.hashCode(); - } - } -} - diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForRangeStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForRangeStatement.java deleted file mode 100644 index 1cab16432..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForRangeStatement.java +++ /dev/null @@ -1,77 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import gov.nist.csd.pm.policy.pml.PMLFormatter; - -import java.util.List; - -public class ForRangeStatement extends PMLStatement{ - - private final String varName; - private final Expression lower; - private boolean lowerBound; - private final Expression upper; - private boolean upperBound; - private final List block; - - public ForRangeStatement(String varName, Expression lower, boolean lowerBound, Expression upper, boolean upperBound, List block) { - this.varName = varName; - this.lower = lower; - this.lowerBound = lowerBound; - this.upper = upper; - this.upperBound = upperBound; - this.block = block; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - if (block.isEmpty()) { - return new Value(); - } - - int lowerValue = lower.execute(ctx, policy).getNumberValue(); - if (lowerBound) { - lowerValue++; - } - - int upperValue = upper.execute(ctx, policy).getNumberValue(); - if (upperBound) { - upperValue--; - } - - for (int i = lowerValue; i <= upperValue; i++) { - ExecutionContext localExecutionCtx; - try { - localExecutionCtx = ctx.copy(); - } catch (PMLScopeException e) { - throw new RuntimeException(e); - } - - localExecutionCtx.scope().putValue(varName, new Value(i)); - - Value value = PMLExecutor.executeStatementBlock(localExecutionCtx, policy, block); - - if (value.isBreak()) { - break; - } else if (value.isReturn()) { - return value; - } - - ctx.scope().overwriteValues(localExecutionCtx.scope()); - } - - return new Value(); - } - - @Override - public String toString() { - return String.format("for %s in range [%s, %s] {%s}", - varName, lower, upper, PMLFormatter.statementsToString(block) - ); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForeachStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForeachStatement.java deleted file mode 100644 index 6d0932fcf..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/ForeachStatement.java +++ /dev/null @@ -1,119 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; - -import java.util.List; -import java.util.Objects; - -import static gov.nist.csd.pm.policy.pml.PMLExecutor.executeStatementBlock; -import static gov.nist.csd.pm.policy.pml.PMLFormatter.statementsToString; - -public class ForeachStatement extends PMLStatement { - - private final String varName; - private final String valueVarName; - private final Expression iter; - private final List statements; - - public ForeachStatement(String varName, String valueVarName, Expression iter, List statements) { - this.varName = varName; - this.valueVarName = valueVarName; - this.iter = iter; - this.statements = statements; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - if (statements.isEmpty()) { - return new Value(); - } - - Value iterValue = iter.execute(ctx, policy); - if (iterValue.isArray()) { - return executeArrayIterator(iterValue, ctx, policy); - } else if (iterValue.isMap()) { - return executeMapIterator(iterValue,ctx,policy); - } - - return new Value(); - } - - private Value executeArrayIterator(Value iterValue,ExecutionContext ctx, Policy policy ) throws PMException{ - for (Value v : iterValue.getArrayValue()) { - ExecutionContext localExecutionCtx; - try { - localExecutionCtx = ctx.copy(); - } catch (PMLScopeException e) { - throw new RuntimeException(e); - } - - localExecutionCtx.scope().putValue(varName, v); - - Value value = executeStatementBlock(localExecutionCtx, policy, statements); - - if (value.isBreak()) { - break; - } else if (value.isReturn()) { - return value; - } - - ctx.scope().overwriteValues(localExecutionCtx.scope()); - } - return new Value(); - } - - private Value executeMapIterator(Value iterValue, ExecutionContext ctx, Policy policy ) throws PMException{ - for (Value key : iterValue.getMapValue().keySet()) { - ExecutionContext localExecutionCtx; - try { - localExecutionCtx = ctx.copy(); - } catch (PMLScopeException e) { - throw new RuntimeException(e); - } - - Value mapValue = iterValue.getMapValue().get(key); - - localExecutionCtx.scope().putValue(varName, key); - if (valueVarName != null) { - localExecutionCtx.scope().putValue(valueVarName, mapValue); - } - - Value value = executeStatementBlock(localExecutionCtx, policy, statements); - - if (value.isBreak()) { - break; - } else if (value.isReturn()) { - return value; - } - - ctx.scope().overwriteValues(localExecutionCtx.scope()); - } - return new Value(); - } - @Override - public String toString() { - return String.format("foreach %s in %s {%s}", - (valueVarName != null ? String.format("%s, %s", varName, valueVarName) : varName), - iter, - statementsToString(statements) - ); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ForeachStatement that = (ForeachStatement) o; - return Objects.equals(varName, that.varName) && Objects.equals(valueVarName, that.valueVarName) && Objects.equals(iter, that.iter) && Objects.equals(statements, that.statements); - } - - @Override - public int hashCode() { - return Objects.hash(varName, valueVarName, iter, statements); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionDefinitionStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionDefinitionStatement.java deleted file mode 100644 index 5d30aba87..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionDefinitionStatement.java +++ /dev/null @@ -1,175 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.exception.PMLExecutionException; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.model.function.FunctionExecutor; -import gov.nist.csd.pm.policy.pml.model.scope.FunctionAlreadyDefinedInScopeException; -import gov.nist.csd.pm.policy.pml.PMLFormatter; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class FunctionDefinitionStatement extends PMLStatement { - - public static String name(String name) { - return name; - } - - public static Type returns(Type type) { - return type; - } - - public static List args(FormalArgument ... formalArguments) { - return Arrays.stream(formalArguments).toList(); - } - - private final String functionName; - private final Type returnType; - private final List args; - private List statements; - private FunctionExecutor functionExecutor; - private boolean isFuncExec; - - public FunctionDefinitionStatement(FunctionDefinitionStatement functionDefinitionStatement) { - this.functionName = functionDefinitionStatement.functionName; - this.returnType = functionDefinitionStatement.returnType; - this.args = functionDefinitionStatement.args; - this.statements = functionDefinitionStatement.statements; - this.functionExecutor = functionDefinitionStatement.functionExecutor; - this.isFuncExec = functionDefinitionStatement.isFuncExec; - } - public FunctionDefinitionStatement(String functionName, Type returnType, List args, List stmts) { - this.functionName = functionName; - this.returnType = returnType; - this.args = args; - this.statements = stmts; - } - - public FunctionDefinitionStatement(String functionName, Type returnType, - List args, FunctionExecutor executor) { - this.functionName = functionName; - this.returnType = returnType; - this.args = args; - this.functionExecutor = executor; - this.isFuncExec = true; - } - - public boolean isFunctionExecutor() { - return isFuncExec; - } - - public FunctionExecutor getFunctionExecutor() { - return functionExecutor; - } - - public String getFunctionName() { - return functionName; - } - - public Type getReturnType() { - return returnType; - } - - public List getArgs() { - return args; - } - - public List getBody() { - return statements; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMLExecutionException { - try { - ctx.scope().addFunction(this); - } catch (FunctionAlreadyDefinedInScopeException e) { - throw new PMLExecutionException(e.getMessage()); - } - - return new Value(); - } - - @Override - public String toString() { - String argsStr = serializeFormalArgs(); - - return String.format( - "function %s(%s) %s {%s}", - functionName, - argsStr, - returnType.toString(), - PMLFormatter.statementsToString(statements) - ); - } - - private String serializeFormalArgs() { - String pml = ""; - for (FormalArgument formalArgument : args) { - if (!pml.isEmpty()) { - pml += ", "; - } - - pml += formalArgument.type().toString() + " " + formalArgument.name(); - } - return pml; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FunctionDefinitionStatement that = (FunctionDefinitionStatement) o; - return isFuncExec == that.isFuncExec && Objects.equals(functionName, that.functionName) && Objects.equals(returnType, that.returnType) && Objects.equals(args, that.args) && Objects.equals(statements, that.statements) && Objects.equals(functionExecutor, that.functionExecutor); - } - - @Override - public int hashCode() { - return Objects.hash(functionName, returnType, args, statements, functionExecutor, isFuncExec); - } - - public static class Builder { - private final String name; - private Type returnType; - private List args; - private FunctionExecutor functionExecutor; - private List body; - - public Builder(String name) { - this.name = name; - } - - public Builder returns(Type type) { - this.returnType = type; - return this; - } - - public Builder args(FormalArgument ... args) { - this.args = new ArrayList<>(List.of(args)); - return this; - } - - public Builder executor(FunctionExecutor executor) { - this.functionExecutor = executor; - return this; - } - - public Builder body(PMLStatement ... body) { - this.body = new ArrayList<>(List.of(body)); - return this; - } - - public FunctionDefinitionStatement build() { - if (functionExecutor != null) { - return new FunctionDefinitionStatement(name, returnType, args, functionExecutor); - } - - return new FunctionDefinitionStatement(name, returnType, args, body); - } - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionInvocationStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionInvocationStatement.java deleted file mode 100644 index 3035c9214..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionInvocationStatement.java +++ /dev/null @@ -1,105 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FunctionExecutor; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.List; -import java.util.Objects; - -public class FunctionInvocationStatement extends PMLStatement { - - private final String functionName; - private final List actualArgs; - - public FunctionInvocationStatement(String functionName, List actualArgs) { - this.functionName = functionName; - this.actualArgs = actualArgs; - } - - public String getFunctionName() { - return functionName; - } - - public List getActualArgs() { - return actualArgs; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - try { - FunctionDefinitionStatement functionDef = ctx.scope().getFunction(functionName); - ExecutionContext localCtx = ctx.copy(); - - List formalArgs = functionDef.getArgs(); - - for (int i = 0; i < actualArgs.size(); i++) { - Expression argExpr = actualArgs.get(i); - Value argValue = argExpr.execute(localCtx, policy); - FormalArgument formalArg = formalArgs.get(i); - - if (!argValue.getType().equals(formalArg.type())) { - throw new PMException("actual arg value has type " + argValue.getType() + " expected " + formalArg.type()); - } - - localCtx.scope().putValue(formalArg.name(), argValue); - } - - Value value = new Value(); - if (functionDef.isFunctionExecutor()) { - FunctionExecutor functionExecutor = functionDef.getFunctionExecutor(); - value = functionExecutor.exec(localCtx, policy); - } else { - List statements = functionDef.getBody(); - for (PMLStatement stmt : statements) { - value = stmt.execute(localCtx, policy); - if (value.isReturn()) { - break; - } - } - } - - ctx.scope().overwriteValues(localCtx.scope()); - - return value; - } catch (PMLScopeException e) { - throw new PMException(e.getMessage()); - } - } - - @Override - public String toString() { - return String.format("%s(%s)", functionName, argsToString()); - } - - private String argsToString() { - StringBuilder s = new StringBuilder(); - for (Expression arg : actualArgs) { - if (s.length() > 0) { - s.append(", "); - } - s.append(arg); - } - - return s.toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FunctionInvocationStatement that = (FunctionInvocationStatement) o; - return Objects.equals(functionName, that.functionName) - && Objects.equals(actualArgs, that.actualArgs); - } - - @Override - public int hashCode() { - return Objects.hash(functionName, actualArgs); - } - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionReturnStmt.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionReturnStmt.java deleted file mode 100644 index fd736ca8e..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/FunctionReturnStmt.java +++ /dev/null @@ -1,60 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Objects; - -public class FunctionReturnStmt extends PMLStatement { - - private boolean isVoid; - private Expression expr; - - public FunctionReturnStmt() { - this.isVoid = true; - } - - public FunctionReturnStmt(Expression expr) { - this.expr = expr; - } - - public boolean isVoid() { - return isVoid; - } - - public Expression getExpr() { - return expr; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value value; - if (isVoid) { - value = new Value(); - } else { - value = expr.execute(ctx, policy); - } - - return Value.returnValue(value); - } - - @Override - public String toString() { - return String.format("return%s", (isVoid ? "" : String.format(" %s", expr))); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - FunctionReturnStmt that = (FunctionReturnStmt) o; - return isVoid == that.isVoid && Objects.equals(expr, that.expr); - } - - @Override - public int hashCode() { - return Objects.hash(isVoid, expr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/IfStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/IfStatement.java deleted file mode 100644 index 58185aeaa..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/IfStatement.java +++ /dev/null @@ -1,116 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import gov.nist.csd.pm.policy.pml.PMLFormatter; -import gov.nist.csd.pm.policy.pml.model.scope.PMLScopeException; - -import java.io.Serializable; -import java.util.List; -import java.util.Objects; - -public class IfStatement extends PMLStatement { - - private final ConditionalBlock ifBlock; - private final List ifElseBlocks; - private final List elseBlockStatements; - - public IfStatement(ConditionalBlock ifBlock, List ifElseBlocks, List elseBlock) { - this.ifBlock = ifBlock; - this.ifElseBlocks = ifElseBlocks; - this.elseBlockStatements = elseBlock; - } - - public ConditionalBlock getIfBlock() { - return ifBlock; - } - - public List getIfElseBlocks() { - return ifElseBlocks; - } - - public List getElseBlockStatements() { - return elseBlockStatements; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - boolean not = ifBlock.not; - boolean condition = ifBlock.condition.execute(ctx, policy).getBooleanValue(); - if ((condition && !not) || (!condition && not)) { - return executeBlock(ctx, policy, ifBlock.block); - } - - // check else ifs - for (ConditionalBlock conditionalBlock : ifElseBlocks) { - condition = conditionalBlock.condition.execute(ctx, policy).getBooleanValue(); - if (condition) { - return executeBlock(ctx, policy, conditionalBlock.block); - } - } - - return executeBlock(ctx, policy, elseBlockStatements); - } - - @Override - public String toString() { - return String.format( - "%s%s%s", - ifBlockToString(), - elseIfBlockToString(), - elseBlockToString() - ); - } - - private String elseBlockToString() { - if (elseBlockStatements.isEmpty()) { - return ""; - } - return String.format("else {%s}", PMLFormatter.statementsToString(elseBlockStatements)); - } - - private String elseIfBlockToString() { - StringBuilder s = new StringBuilder(); - for (ConditionalBlock b : ifElseBlocks) { - s.append(String.format(" else if %s {%s} ", b.condition, PMLFormatter.statementsToString(b.block))); - } - - return s.toString(); - } - - private String ifBlockToString() { - return String.format("if %s {%s}", ifBlock.condition, PMLFormatter.statementsToString(ifBlock.block)); - } - - private Value executeBlock(ExecutionContext ctx, Policy policy, List block) throws PMException { - ExecutionContext copy = null; - try { - copy = ctx.copy(); - } catch (PMLScopeException e) { - throw new PMException(e.getMessage()); - } - Value value = PMLExecutor.executeStatementBlock(copy, policy, block); - - ctx.scope().overwriteValues(copy.scope()); - - return value; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - IfStatement ifStmt = (IfStatement) o; - return Objects.equals(ifBlock, ifStmt.ifBlock) && Objects.equals(ifElseBlocks, ifStmt.ifElseBlocks) && Objects.equals(elseBlockStatements, ifStmt.elseBlockStatements); - } - - @Override - public int hashCode() { - return Objects.hash(ifBlock, ifElseBlocks, elseBlockStatements); - } - - public record ConditionalBlock(boolean not, Expression condition, List block) implements Serializable { } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/PMLStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/PMLStatement.java deleted file mode 100644 index 4184fbc63..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/PMLStatement.java +++ /dev/null @@ -1,18 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.io.Serializable; - -public abstract class PMLStatement implements Serializable { - - public PMLStatement() {} - - public abstract Value execute(ExecutionContext ctx, Policy policy) throws PMException; - - @Override - public abstract String toString(); -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetNodePropertiesStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetNodePropertiesStatement.java deleted file mode 100644 index b20965eac..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetNodePropertiesStatement.java +++ /dev/null @@ -1,62 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -public class SetNodePropertiesStatement extends PMLStatement { - - private final Expression nameExpr; - private final Expression propertiesExpr; - - public SetNodePropertiesStatement(Expression nameExpr, Expression propertiesExpr) { - this.nameExpr = nameExpr; - this.propertiesExpr = propertiesExpr; - } - - public Expression getNameExpr() { - return nameExpr; - } - - public Expression getPropertiesExpr() { - return propertiesExpr; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - String name = nameExpr.execute(ctx, policy).getStringValue(); - Map map = propertiesExpr.execute(ctx, policy).getMapValue(); - Map properties = new HashMap<>(); - for (Value key : map.keySet()) { - properties.put(key.getStringValue(), map.get(key).getStringValue()); - } - - policy.graph().setNodeProperties(name, properties); - - return new Value(); - } - - @Override - public String toString() { - return String.format("set properties of %s to %s", nameExpr, propertiesExpr); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - SetNodePropertiesStatement that = (SetNodePropertiesStatement) o; - return Objects.equals(nameExpr, that.nameExpr) - && Objects.equals(propertiesExpr, that.propertiesExpr); - } - - @Override - public int hashCode() { - return Objects.hash(nameExpr, propertiesExpr); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetResourceAccessRightsStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetResourceAccessRightsStatement.java deleted file mode 100644 index f25b75e14..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/SetResourceAccessRightsStatement.java +++ /dev/null @@ -1,43 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; - -public class SetResourceAccessRightsStatement extends PMLStatement{ - - private final Expression arExpr; - - public SetResourceAccessRightsStatement(Expression arExprList) { - this.arExpr = arExprList; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - Value arValue = arExpr.execute(ctx, policy); - AccessRightSet accessRightSet = new AccessRightSet(); - for (Value v : arValue.getArrayValue()) { - accessRightSet.add(v.getStringValue()); - } - - policy.graph().setResourceAccessRights(accessRightSet); - ctx.scope().setResourceAccessRights(accessRightSet); - return new Value(); - } - - @Override - public String toString() { - StringBuilder ars = new StringBuilder(); - for (Expression ar : arExpr.getLiteral().getArrayLiteral().getArray()) { - if (!ars.isEmpty()) { - ars.append(", "); - } - - ars.append(String.format("%s", ar)); - } - - return String.format("set resource access rights [%s]", ars); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/pml/statement/VarStatement.java b/src/main/java/gov/nist/csd/pm/policy/pml/statement/VarStatement.java deleted file mode 100644 index 737111406..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/pml/statement/VarStatement.java +++ /dev/null @@ -1,66 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.Objects; - -public class VarStatement extends PMLStatement { - - private final String varName; - private final Expression expression; - - private final boolean isConst; - - public VarStatement(String varName, Expression expression, boolean isConst) { - this.varName = varName; - this.expression = expression; - this.isConst = isConst; - } - - public String getVarName() { - return varName; - } - - public Expression getExpression() { - return expression; - } - - public boolean isConst() { - return isConst; - } - - @Override - public Value execute(ExecutionContext ctx, Policy policy) throws PMException { - ctx.scope().putValue(varName, expression.execute(ctx, policy)); - - return new Value(); - } - - @Override - public String toString() { - String s = ""; - if (isConst) { - s = "const "; - } else { - s = "let "; - } - - return String.format("%s%s = %s", s, varName, expression); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - VarStatement letStmt = (VarStatement) o; - return Objects.equals(varName, letStmt.varName) && Objects.equals(expression, letStmt.expression); - } - - @Override - public int hashCode() { - return Objects.hash(varName, expression); - } -} diff --git a/src/main/java/gov/nist/csd/pm/policy/review/AccessReview.java b/src/main/java/gov/nist/csd/pm/policy/review/AccessReview.java deleted file mode 100644 index 65f8b6078..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/review/AccessReview.java +++ /dev/null @@ -1,27 +0,0 @@ -package gov.nist.csd.pm.policy.review; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.audit.Explain; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -public interface AccessReview { - - AccessRightSet getAccessRights(UserContext userCtx, String target) throws PMException; - AccessRightSet getDeniedAccessRights(UserContext userCtx, String target) throws PMException; - Map getPolicyClassAccessRights(UserContext userContext, String target) throws PMException; - Map buildCapabilityList(UserContext userCtx) throws PMException; - Map buildACL(String target) throws PMException; - Map getBorderAttributes(String user) throws PMException; - // does not include the root in results - Map getSubgraphAccessRights(UserContext userCtx, String root) throws PMException; - Explain explain(UserContext userCtx, String target) throws PMException; - Set buildPOS(UserContext userCtx) throws PMException; - List getAccessibleChildren(UserContext userCtx, String root) throws PMException; - List getAccessibleParents(UserContext userCtx, String root) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/review/GraphReview.java b/src/main/java/gov/nist/csd/pm/policy/review/GraphReview.java deleted file mode 100644 index 754de2188..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/review/GraphReview.java +++ /dev/null @@ -1,13 +0,0 @@ -package gov.nist.csd.pm.policy.review; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -import java.util.List; - -public interface GraphReview { - - List getAttributeContainers(String node) throws PMException; - List getPolicyClassContainers(String node) throws PMException; - boolean isContained(String subject, String container) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/review/ObligationsReview.java b/src/main/java/gov/nist/csd/pm/policy/review/ObligationsReview.java deleted file mode 100644 index f7643bc06..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/review/ObligationsReview.java +++ /dev/null @@ -1,19 +0,0 @@ -package gov.nist.csd.pm.policy.review; - -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; - -import java.util.List; - -public interface ObligationsReview { - - List getObligationsWithAuthor(UserContext userCtx) throws PMException; - List getObligationsWithAttributeInEvent(String attribute) throws PMException; - List getObligationsWithAttributeInResponse(String attribute) throws PMException; - List getObligationsWithEvent(String event) throws PMException; - List getMatchingEventResponses(EventContext eventCtx) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/review/PolicyReview.java b/src/main/java/gov/nist/csd/pm/policy/review/PolicyReview.java deleted file mode 100644 index 39c51da29..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/review/PolicyReview.java +++ /dev/null @@ -1,5 +0,0 @@ -package gov.nist.csd.pm.policy.review; - -public interface PolicyReview extends AccessReview, GraphReview, ProhibitionsReview, ObligationsReview { - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/review/ProhibitionsReview.java b/src/main/java/gov/nist/csd/pm/policy/review/ProhibitionsReview.java deleted file mode 100644 index 4716ae7cb..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/review/ProhibitionsReview.java +++ /dev/null @@ -1,14 +0,0 @@ -package gov.nist.csd.pm.policy.review; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.List; - -public interface ProhibitionsReview { - - // TODO add function for getting prohibitions with given container - List getInheritedProhibitionsFor(String subject) throws PMException; - List getProhibitionsWithContainer(String container) throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/tx/Transactional.java b/src/main/java/gov/nist/csd/pm/policy/tx/Transactional.java deleted file mode 100644 index 3fcc2e922..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/tx/Transactional.java +++ /dev/null @@ -1,11 +0,0 @@ -package gov.nist.csd.pm.policy.tx; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public interface Transactional { - - void beginTx() throws PMException; - void commit() throws PMException; - void rollback() throws PMException; - -} diff --git a/src/main/java/gov/nist/csd/pm/policy/tx/TxCommitException.java b/src/main/java/gov/nist/csd/pm/policy/tx/TxCommitException.java deleted file mode 100644 index ad918bac6..000000000 --- a/src/main/java/gov/nist/csd/pm/policy/tx/TxCommitException.java +++ /dev/null @@ -1,9 +0,0 @@ -package gov.nist.csd.pm.policy.tx; - -import gov.nist.csd.pm.policy.exceptions.PMException; - -public class TxCommitException extends PMException { - public TxCommitException(Class target, Class tx) { - super(target.getName() + " cannot commit from an instance of " + tx.getName()); - } -} diff --git a/src/test/java/gov/nist/csd/pm/SamplePolicy.java b/src/test/java/gov/nist/csd/pm/SamplePolicy.java deleted file mode 100644 index b10bee6a7..000000000 --- a/src/test/java/gov/nist/csd/pm/SamplePolicy.java +++ /dev/null @@ -1,20 +0,0 @@ -package gov.nist.csd.pm; - -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.PMLSerializer; -import org.testcontainers.shaded.org.apache.commons.io.IOUtils; - -import java.io.IOException; -import java.nio.charset.StandardCharsets; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; - -public class SamplePolicy { - - public static void loadSamplePolicyFromPML(Policy policy) throws IOException, PMException { - String s = IOUtils.resourceToString("sample/sample.pml", StandardCharsets.UTF_8, SamplePolicy.class.getClassLoader()); - policy.deserialize().fromPML(new UserContext(SUPER_USER), s); - } -} diff --git a/src/test/java/gov/nist/csd/pm/common/obligation/EventPatternTest.java b/src/test/java/gov/nist/csd/pm/common/obligation/EventPatternTest.java new file mode 100644 index 000000000..cf89150a7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/common/obligation/EventPatternTest.java @@ -0,0 +1,230 @@ +package gov.nist.csd.pm.common.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.UnexpectedOperandTypeException; +import gov.nist.csd.pm.pap.op.graph.AssignOp; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.AnyOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.NodeOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.LogicalSubjectPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.subject.ProcessSubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.UsernamePattern; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.ASCENDANT_OPERAND; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; +import static org.junit.jupiter.api.Assertions.*; + +class EventPatternTest { + + @Test + void testOperationMatches() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(), + new OperationPattern(), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + null, + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertTrue(eventPattern.matches(eventContext, pap)); + } + + @Test + void testOperationDoesNotMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(), + new OperationPattern("op1"), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + null, + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertFalse(eventPattern.matches(eventContext, pap)); + } + + @Test + void testUserDoesNotMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new UsernamePattern("u2")), + new OperationPattern(), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + "", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertFalse(eventPattern.matches(eventContext, pap)); + } + + @Test + void testUserAndProcessMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new LogicalSubjectPatternExpression( + new UsernamePattern("u1"), + new ProcessSubjectPattern("p1"), + false + )), + new OperationPattern(), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + "p1", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertTrue(eventPattern.matches(eventContext, pap)); + } + + @Test + void testUserMatchesProcessDoesNotMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new LogicalSubjectPatternExpression( + new UsernamePattern("u1"), + new ProcessSubjectPattern("p1"), + false + )), + new OperationPattern(), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + "p2", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertTrue(eventPattern.matches(eventContext, pap)); + } + + @Test + void testUserAndProcessDoNotMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new LogicalSubjectPatternExpression( + new UsernamePattern("u2"), + new ProcessSubjectPattern("p1"), + false + )), + new OperationPattern(), + Map.of() + ); + + EventContext eventContext = new EventContext( + "u1", + "p2", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertFalse(eventPattern.matches(eventContext, pap)); + } + + @Test + void testOperandsMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("assign"), + Map.of( + "ascendant", List.of(new NodeOperandPattern("a")), + "descendant", List.of(new AnyOperandPattern()) + ) + ); + + EventContext eventContext = new EventContext( + "u1", + "", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertTrue(eventPattern.matches(eventContext, pap)); + } + + @Test + void testOperandsDoNotMatch() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("assign"), + Map.of( + "ascendant", List.of(new NodeOperandPattern("b")), + "descendant", List.of(new AnyOperandPattern()) + ) + ); + + EventContext eventContext = new EventContext( + "u1", + "", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertFalse(eventPattern.matches(eventContext, pap)); + } + + @Test + void testInvalidNodeOperandType() throws PMException { + EventPattern eventPattern = new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("assign"), + Map.of( + "ascendant", List.of(new AnyOperandPattern()), + "descendants", List.of(new AnyOperandPattern()) + ) + ); + + EventContext eventContext = new EventContext( + "u1", + "", + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, Map.of("b", "")) + ); + + MemoryPAP pap = new MemoryPAP(); + + assertThrows(UnexpectedOperandTypeException.class, + () -> eventPattern.matches(eventContext, pap)); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/common/obligation/ObligationTest.java b/src/test/java/gov/nist/csd/pm/common/obligation/ObligationTest.java new file mode 100644 index 000000000..d55a079e3 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/common/obligation/ObligationTest.java @@ -0,0 +1,83 @@ +package gov.nist.csd.pm.common.obligation; + +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.op.graph.AssignOp; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pap.exception.PMException; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.*; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ObligationTest { + + @Test + void testResponseWithExistingFunction() throws PMException { + String pml = """ + create pc "pc1" + create oa "oa1" in ["pc1"] + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + + associate "ua1" and ADMIN_POLICY_OBJECT with ["create_policy_class"] + + create obligation "obl1" { + create rule "rule1" + when user "u1" + performs "assign" + on { + ascendant: any, + descendant: "oa1" + } + do(ctx) { + createX() + } + } + """; + + MemoryPAP pap = new MemoryPAP(); + + pap.setPMLConstants(Map.of("x", new StringValue("hello world"))); + pap.setPMLOperations(new PMLOperation("createX", Type.voidType()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + ExecutionContext ctx = getCtx(); + pap.executePML(ctx.author(), "create pc x"); + + return new VoidValue(); + } + }); + + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + epp.getEventProcessor().processEvent( + new EventContext( + "u1", + null, + new AssignOp(), + Map.of(ASCENDANT_OPERAND, "o1", DESCENDANTS_OPERAND, List.of("oa1")) + ) + ); + assertTrue(pap.query().graph().nodeExists("hello world")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/common/tx/TxHandlerRunnerTest.java b/src/test/java/gov/nist/csd/pm/common/tx/TxHandlerRunnerTest.java new file mode 100644 index 000000000..0bfccdbd3 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/common/tx/TxHandlerRunnerTest.java @@ -0,0 +1,34 @@ +package gov.nist.csd.pm.common.tx; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.exception.NodeNameExistsException; +import gov.nist.csd.pm.pap.exception.PMException; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.tx.TxRunner.runTx; +import static org.junit.jupiter.api.Assertions.*; + +class TxHandlerRunnerTest { + + @Test + void testRunTx() throws PMException { + MemoryPAP pap = new MemoryPAP(); + + runTx(pap, () -> { + pap.modify().graph().createPolicyClass("pc1"); + }); + + assertTrue(pap.query().graph().nodeExists("pc1")); + + assertThrows(NodeNameExistsException.class, () -> runTx(pap, () -> { + pap.modify().graph().deleteNode("pc1"); + pap.modify().graph().createPolicyClass("pc2"); + // expect error and rollback + pap.modify().graph().createPolicyClass("pc2"); + })); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/epp/EPPTest.java b/src/test/java/gov/nist/csd/pm/epp/EPPTest.java index f537c5ca3..e8dd15450 100644 --- a/src/test/java/gov/nist/csd/pm/epp/EPPTest.java +++ b/src/test/java/gov/nist/csd/pm/epp/EPPTest.java @@ -1,139 +1,451 @@ package gov.nist.csd.pm.epp; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.memory.MemoryPDP; -import gov.nist.csd.pm.policy.pml.model.expression.ArrayLiteral; -import gov.nist.csd.pm.policy.pml.model.expression.Literal; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.VariableReference; -import gov.nist.csd.pm.policy.pml.statement.CreatePolicyStatement; -import gov.nist.csd.pm.policy.pml.statement.CreateUserOrObjectStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.events.CreateObjectAttributeEvent; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.PMRuntimeException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperation; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateNonPCStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.VoidValue; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.*; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; import org.junit.jupiter.api.Test; import java.util.Arrays; -import java.util.HashMap; +import java.util.List; +import java.util.Map; -import static gov.nist.csd.pm.pap.SuperPolicy.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.obligation.event.Performs.events; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; +import static gov.nist.csd.pm.pdp.Decision.GRANT; import static org.junit.jupiter.api.Assertions.*; class EPPTest { + @Test + void testCustomOperationEvent() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + operation op1(nodeop string a, nodeop []string b) { + + } + + create obligation "obl1" { + create rule "op1" + when any user + performs "op1" + on { + a: "oa1", + b: "oa1" + } + do(ctx) { + create pc ctx.operands.a + "pc1" + + foreach x in ctx.operands.b { + create pc x + "pc2" + } + } + + create rule "op2" + when any user + performs "op2" + on { + a: "oa2", + b: "oa2" + } + do(ctx) { + create pc ctx.operands.a + "pc1" + + foreach x in ctx.operands.b { + create pc x + "pc2" + } + } + } + """); + + pap.modify().operations().createAdminOperation(new Operation<>("op2", List.of("a", "b"), List.of("a", "b")) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + }); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + + AdminAdjudicationResponse response = pdp.adjudicateAdminOperations( + new UserContext("u1"), + List.of(new OperationRequest("op1", Map.of("a", "oa1", "b", List.of("oa1", "oa2")))) + ); + assertEquals(Decision.DENY, response.getDecision()); + + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*a")); + + response = pdp.adjudicateAdminOperations( + new UserContext("u1"), + List.of(new OperationRequest("op1", Map.of("a", "oa1", "b", List.of("oa1", "oa2")))) + ); + assertEquals(GRANT, response.getDecision()); + + response = pdp.adjudicateAdminOperations( + new UserContext("u1"), + List.of(new OperationRequest("op2", Map.of("a", "oa2", "b", "oa2"))) + ); + assertEquals(GRANT, response.getDecision()); + + assertTrue(pap.query().graph().nodeExists("oa1pc1")); + assertTrue(pap.query().graph().nodeExists("oa1pc2")); + assertTrue(pap.query().graph().nodeExists("oa2pc2")); + assertTrue(pap.query().graph().nodeExists("oa2pc1")); + assertTrue(pap.query().graph().nodeExists("oa2pc2")); + } + + @Test + void testResourceOperationEvent() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + + set resource operations ["read"] + + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["read"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create obligation "obl1" { + create rule "op1" + when any user + performs "read" + on { + target: "oa1" + } + do(ctx) { + create pc ctx.operands.target + "pc1" + } + } + """); + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + ResourceAdjudicationResponse response = pdp.adjudicateResourceOperation(new UserContext("u1"), "oa1", "read"); + assertEquals(GRANT, response.getDecision()); + + assertTrue(pap.query().graph().nodeExists("oa1pc1")); + } + @Test void test() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); + MemoryPAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); EPP epp = new EPP(pdp, pap); String pml = """ - create pc 'pc1'; - create oa 'oa1' in ['pc1']; - create obligation 'test' { - create rule 'rule1' + create pc "pc1" + create oa "oa1" in ["pc1"] + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + associate "ua1" and "oa1" with ["*"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*"] + create obligation "test" { + create rule "rule1" when any user - performs ['create_object_attribute'] - on 'oa1' + performs "create_object_attribute" + on { + descendants: "oa1" + } do(evtCtx) { - create policy class 'pc2'; + create policy class "pc2" } } """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("oa1")); - pdp.runTx(new UserContext(SUPER_USER), (txPDP) -> txPDP.graph().createObjectAttribute("oa2", "oa1")); + pdp.runTx(new UserContext("u1"), (txPDP) -> txPDP.modify().graph().createObjectAttribute("oa2", List.of("oa1"))); - assertTrue(pap.graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc2")); } @Test void testAccessingEventContextInResponse() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); + MemoryPAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); EPP epp = new EPP(pdp, pap); - String pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - create obligation 'test' { - create rule 'rule1' + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create obligation "test" { + create rule "rule1" when any user - performs ['create_object_attribute'] - on 'oa1' - do(evtCtx) { - create policy class evtCtx['eventName'] - let target = evtCtx['target'] - - create policy class concat([evtCtx['event']['name'], '_test']) - set properties of evtCtx['event']['name'] to {'key': target} - - let userCtx = evtCtx['userCtx'] - create policy class concat([userCtx['user'], '_test']) + performs "create_object_attribute" + on { + descendants: "oa1" + } + do(ctx) { + name := ctx.opName + create policy class name + + name = ctx.operands.name + create policy class name + "_test" + set properties of name + "_test" to {"key": name} + + userCtx := ctx["user"] + create policy class ctx["user"] + "_test" } } """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + pdp.runTx(new UserContext("u1"), (txPDP) -> txPDP.modify().graph().createObjectAttribute("oa2", + List.of("oa1"))); - pdp.runTx(new UserContext(SUPER_USER), (txPDP) -> txPDP.graph().createObjectAttribute("oa2", "oa1")); - assertTrue(pap.graph().getPolicyClasses().containsAll(Arrays.asList( - SUPER_PC, "pc1", "create_object_attribute", "oa2_test", "super_test" + assertTrue(pap.query().graph().getPolicyClasses().containsAll(Arrays.asList( + "pc1", "create_object_attribute", "oa2_test", "u1_test" ))); } @Test void testErrorInEPPResponse() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); + MemoryPAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); EPP epp = new EPP(pdp, pap); - pdp.runTx(new UserContext(SUPER_USER), (policy) -> { - policy.graph().createPolicyClass("pc1"); - policy.graph().createUserAttribute("ua1", "pc1"); - policy.graph().createObjectAttribute("oa1", "pc1"); - policy.graph().createUser("u1", "ua1"); - policy.graph().createObject("o1", "oa1"); - policy.graph().associate("ua1", SUPER_OA, new AccessRightSet(CREATE_OBLIGATION)); - policy.graph().associate("ua1", "oa1", new AccessRightSet(CREATE_OBJECT)); + pap.runTx((txPAP) -> { + txPAP.modify().graph().createPolicyClass("pc1"); + txPAP.modify().graph().createUserAttribute("ua1", List.of("pc1")); + txPAP.modify().graph().createUserAttribute("ua2", List.of("pc1")); + txPAP.modify().graph().associate("ua2", "ua1", new AccessRightSet("*")); + txPAP.modify().graph().associate("ua2", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); + txPAP.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + txPAP.modify().graph().createUser("u1", List.of("ua1", "ua2")); + txPAP.modify().graph().createObject("o1", List.of("oa1")); + txPAP.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), + new AccessRightSet(CREATE_OBLIGATION)); + txPAP.modify().graph().associate("ua1", "oa1", new AccessRightSet(CREATE_OBJECT)); + txPAP.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); }); pdp.runTx(new UserContext("u1"), (policy) -> { - policy.obligations().create(new UserContext("u1"), "test", - new Rule("rule1", - new EventPattern(EventSubject.anyUser(), events(CREATE_OBJECT_ATTRIBUTE)), - new Response(new UserContext("u1"), - new CreateUserOrObjectStatement( - new Expression(new VariableReference("o2", Type.string())), + policy.modify().obligations().createObligation("u1", "test", + List.of(new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern(CREATE_OBJECT_ATTRIBUTE)), + new Response("evtCtx", List.of( + new CreateNonPCStatement( + new StringLiteral("o2"), NodeType.O, - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new VariableReference("oa1", Type.string()))}, Type.string()))) + new ArrayLiteral(new Expression[]{new StringLiteral("oa1")}, Type.string()) ), - new CreatePolicyStatement(new Expression(new VariableReference("pc2", Type.string())))) - ) + + // expect error for node already exists + new CreatePolicyStatement(new StringLiteral("pc1")) + )) + )) ); }); - EventContext eventCtx = new EventContext(new UserContext(SUPER_USER), new CreateObjectAttributeEvent("oa2", new HashMap<>(), "pc1")); - assertThrows(PMRuntimeException.class, () -> { - epp.handlePolicyEvent(eventCtx); + EventContext eventCtx = new EventContext( + "u1", + CREATE_OBJECT_ATTRIBUTE, + Map.of( + NAME_OPERAND, "oa2", + DESCENDANTS_OPERAND, List.of("pc1") + ) + ); + + assertThrows(PMException.class, () -> { + epp.getEventProcessor().processEvent(eventCtx); + }); + + assertFalse(pap.query().graph().nodeExists("o2")); + assertFalse(pap.query().graph().nodeExists("pc2")); + } + + @Test + void testCustomFunctionInResponse() throws PMException { + MemoryPAP pap = new MemoryPAP(); + + PMLOperation pmlOperation = new PMLOperation("testFunc", Type.voidType()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Value execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass("test"); + + return new VoidValue(); + } + }; + + pap.setPMLOperations(pmlOperation); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["create_policy_class"] + + create obligation "test" { + create rule "rule1" + when any user + performs "create_object_attribute" + on { + descendants: "oa1" + } + do(evtCtx) { + testFunc() + } + } + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + pdp.runTx(new UserContext("u1"), (txPDP) -> { + txPDP.modify().graph().createObjectAttribute("oa2", List.of("oa1")); }); - assertFalse(pap.graph().nodeExists("o2")); - assertFalse(pap.graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("test")); + } + + @Test + void testReturnInResponse() throws PMException { + MemoryPAP pap = new MemoryPAP(); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["create_policy_class"] + + create obligation "test" { + create rule "rule1" + when any user + performs "create_object_attribute" + on { + descendants: "oa1" + } + do(evtCtx) { + if true { + return + } + + create policy class "test" + } + } + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + pdp.runTx(new UserContext("u1"), (txPDP) -> txPDP.modify().graph().createObjectAttribute("oa2", List.of("oa1"))); + assertFalse(pap.query().graph().nodeExists("test")); + } + + @Test + void testErrorInResponseOperation() throws PMException { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + associate "ua2" and ADMIN_POLICY_OBJECT with ["*a"] + + operation op1() { + check "assign" on "oa1" + } { + create pc "test_pc" + } + + routine routine1() { + create o "o1" in ["oa1"] + } + + create obligation "obl1" { + create rule "rule1" + when any user + performs "create_policy_class" + do(ctx) { + op1() + routine1() + } + } + """; + // as u1 - ok + MemoryPAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + pap.executePML(new UserContext("u1"), pml); + pdp.runTx(new UserContext("u1"), (txPDP) -> txPDP.modify().graph().createPolicyClass("u1_pc")); + assertTrue(pap.query().graph().nodeExists("test_pc")); + assertTrue(pap.query().graph().nodeExists("o1")); + assertTrue(pap.query().graph().nodeExists("u1_pc")); + + // as u2 fail + pap = new MemoryPAP(); + PDP pdp2 = new PDP(pap); + epp = new EPP(pdp2, pap); + pap.executePML(new UserContext("u2"), pml); + assertThrows(UnauthorizedException.class, () -> pdp2.runTx(new UserContext("u2"), (txPDP) -> txPDP.modify().graph().createPolicyClass("u2_pc"))); + assertFalse(pap.query().graph().nodeExists("test_pc")); + assertFalse(pap.query().graph().nodeExists("o1")); + assertFalse(pap.query().graph().nodeExists("u1_pc")); } } \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/integration/IntegrationTest.java b/src/test/java/gov/nist/csd/pm/integration/IntegrationTest.java new file mode 100644 index 000000000..c72959396 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/integration/IntegrationTest.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.integration; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class IntegrationTest { + + @Test + void testCallOperationInObligationResponse() throws PMException { + String pml = """ + create PC "pc1" + create UA "ua1" in ["pc1"] + create U "u1" in ["ua1"] + create OA "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["*"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*"] + + operation op1(string name) { + check "assign" on "oa1" + } { + create pc name + } + + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { + op1("test") + } + } + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + pdp.runTx(new UserContext("u1"), tx -> { + tx.modify().graph().createPolicyClass("test2"); + }); + + assertTrue(pap.query().graph().nodeExists("test")); + assertTrue(pap.query().graph().nodeExists("test2")); + } + + @Test + void testCallRoutineInObligationResponse() throws PMException { + String pml = """ + create PC "pc1" + create UA "ua1" in ["pc1"] + create U "u1" in ["ua1"] + create OA "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["*"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*"] + + routine op1(string name) { + if !nodeExists(name) { + create pc name + } + } + + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { + op1("test") + } + } + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + pdp.runTx(new UserContext("u1"), tx -> { + tx.modify().graph().createPolicyClass("test2"); + }); + + assertTrue(pap.query().graph().nodeExists("test")); + assertTrue(pap.query().graph().nodeExists("test2")); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryAccessQuerierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryAccessQuerierTest.java new file mode 100644 index 000000000..698479ede --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryAccessQuerierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.AccessQuerierTest; + +class MemoryAccessQuerierTest extends AccessQuerierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphModifierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphModifierTest.java new file mode 100644 index 000000000..92af814f6 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphModifierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.GraphModifierTest; + +class MemoryGraphModifierTest extends GraphModifierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphQuerierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphQuerierTest.java new file mode 100644 index 000000000..064e33559 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryGraphQuerierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.GraphQuerierTest; + +class MemoryGraphQuerierTest extends GraphQuerierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsModifierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsModifierTest.java new file mode 100644 index 000000000..de8e07e1c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsModifierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.ObligationsModifierTest; + +class MemoryObligationsModifierTest extends ObligationsModifierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsQuerierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsQuerierTest.java new file mode 100644 index 000000000..a84d132c9 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryObligationsQuerierTest.java @@ -0,0 +1,15 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.ObligationsQuerierTest; +import gov.nist.csd.pm.pap.exception.PMException; + +class MemoryObligationsQuerierTest extends ObligationsQuerierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsModifierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsModifierTest.java new file mode 100644 index 000000000..353b924d7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsModifierTest.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.OperationsModifierTest; + +public class MemoryOperationsModifierTest extends OperationsModifierTest { + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsQueryTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsQueryTest.java new file mode 100644 index 000000000..20ec98047 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryOperationsQueryTest.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.OperationsQuerierTest; + +public class MemoryOperationsQueryTest extends OperationsQuerierTest { + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryPAPTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryPAPTest.java new file mode 100644 index 000000000..1c99a5995 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryPAPTest.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.PAPTest; + +public class MemoryPAPTest extends PAPTest { + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsModifierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsModifierTest.java new file mode 100644 index 000000000..3e388bfd4 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsModifierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.ProhibitionsModifierTest; + +class MemoryProhibitionsModifierTest extends ProhibitionsModifierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsQuerierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsQuerierTest.java new file mode 100644 index 000000000..d3f1180db --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryProhibitionsQuerierTest.java @@ -0,0 +1,14 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.ProhibitionsQuerierTest; +import gov.nist.csd.pm.pap.exception.PMException; + +class MemoryProhibitionsQuerierTest extends ProhibitionsQuerierTest { + + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesModifierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesModifierTest.java new file mode 100644 index 000000000..f62d593ab --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesModifierTest.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.modification.RoutinesModifierTest; + +public class MemoryRoutinesModifierTest extends RoutinesModifierTest { + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesQuerierTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesQuerierTest.java new file mode 100644 index 000000000..cc7b9cf07 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/MemoryRoutinesQuerierTest.java @@ -0,0 +1,13 @@ +package gov.nist.csd.pm.memory.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.RoutinesQuerierTest; + +public class MemoryRoutinesQuerierTest extends RoutinesQuerierTest { + @Override + public PAP initializePAP() throws PMException { + return new MemoryPAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/dag/BreadthFirstGraphWalkerTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/dag/BreadthFirstGraphWalkerTest.java new file mode 100644 index 000000000..bbbac824e --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/dag/BreadthFirstGraphWalkerTest.java @@ -0,0 +1,103 @@ +package gov.nist.csd.pm.memory.pap.dag; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.Direction; +import gov.nist.csd.pm.pap.graph.dag.BreadthFirstGraphWalker; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class BreadthFirstGraphWalkerTest { + + static PAP pap; + + @BeforeAll + static void setup() throws PMException { + pap = new MemoryPAP(); + + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().graph().createObjectAttribute("oa1-1", List.of("oa1")); + pap.modify().graph().createObjectAttribute("oa1-1-1", List.of("oa1-1")); + pap.modify().graph().createObjectAttribute("oa1-1-2", List.of("oa1-1")); + pap.modify().graph().createObjectAttribute("oa1-1-3", List.of("oa1-1")); + + pap.modify().graph().createObjectAttribute("oa1-2", List.of("oa1")); + pap.modify().graph().createObjectAttribute("oa1-2-1", List.of("oa1-2")); + pap.modify().graph().createObjectAttribute("oa1-2-2", List.of("oa1-2")); + pap.modify().graph().createObjectAttribute("oa1-2-3", List.of("oa1-2")); + } + + @Test + void testWalk() throws PMException { + List visited = new ArrayList<>(); + BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(node -> { + visited.add(node); + }); + bfs.walk("pc1"); + List expected = List.of( + "pc1", + "oa1", + "oa1-1", + "oa1-2", + "oa1-1-1", + "oa1-1-2", + "oa1-1-3", + "oa1-2-1", + "oa1-2-2", + "oa1-2-3" + ); + + assertTrue(expected.containsAll(visited)); + assertTrue(visited.containsAll(expected)); + } + + @Test + void testAllPathsShortCircuit() throws PMException { + List visited = new ArrayList<>(); + BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(node -> { + visited.add(node); + }) + .withAllPathShortCircuit(node -> node.equals("oa1-2")); + + bfs.walk("pc1"); + + assertTrue(visited.containsAll(List.of("pc1", "oa1", "oa1-2"))); + + visited.clear(); + bfs = new BreadthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(visited::add) + .withAllPathShortCircuit(node -> node.equals("oa1-1")); + + bfs.walk("pc1"); + + assertTrue(visited.containsAll(List.of("pc1", "oa1", "oa1-1"))); + assertFalse(visited.containsAll(List.of("oa1-1-1", "oa1-1-2", "oa1-1-3", "oa1-2-1", "oa1-2-2", "oa1-2-3"))); + } + + @Test + void testSinglePathShortCircuit() throws PMException { + List visited = new ArrayList<>(); + BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(visited::add) + .withSinglePathShortCircuit(node -> node.equals("oa1-1")); + + bfs.walk("pc1"); + + assertTrue(visited.containsAll(List.of("pc1", "oa1", "oa1-1", "oa1-2", "oa1-2-1", "oa1-2-2", "oa1-2-3"))); + assertFalse(visited.containsAll(List.of("oa1-1-1", "oa1-1-2", "oa1-1-3"))); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/memory/pap/dag/DepthFirstGraphModificationWalkerTest.java b/src/test/java/gov/nist/csd/pm/memory/pap/dag/DepthFirstGraphModificationWalkerTest.java new file mode 100644 index 000000000..58241c10b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/memory/pap/dag/DepthFirstGraphModificationWalkerTest.java @@ -0,0 +1,87 @@ +package gov.nist.csd.pm.memory.pap.dag; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.dag.Direction; +import gov.nist.csd.pm.pap.graph.dag.DepthFirstGraphWalker; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class DepthFirstGraphWalkerTest { + + static PAP pap; + + @BeforeAll + static void setup() throws PMException { + pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().graph().createObjectAttribute("oa1-1", List.of("oa1")); + pap.modify().graph().createObjectAttribute("oa1-1-1", List.of("oa1-1")); + pap.modify().graph().createObjectAttribute("oa1-1-2", List.of("oa1-1")); + pap.modify().graph().createObjectAttribute("oa1-1-3", List.of("oa1-1")); + + pap.modify().graph().createObjectAttribute("oa1-2", List.of("oa1")); + pap.modify().graph().createObjectAttribute("oa1-2-1", List.of("oa1-2")); + pap.modify().graph().createObjectAttribute("oa1-2-2", List.of("oa1-2")); + pap.modify().graph().createObjectAttribute("oa1-2-3", List.of("oa1-2")); + } + + @Test + void testWalk() throws PMException { + List visited = new ArrayList<>(); + DepthFirstGraphWalker bfs = new DepthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor((node) -> { + visited.add(node); + }); + bfs.walk("pc1"); + List expected = List.of( + "oa1-1-1", "oa1-1-2", "oa1-1-3", "oa1-1", "oa1-2-1", "oa1-2-2", "oa1-2-3", "oa1-2", "oa1", "pc1" + ); + + assertTrue(expected.containsAll(visited)); + assertTrue(visited.containsAll(expected)); + } + + @Test + void testAllPathsShortCircuit() throws PMException { + List visited = new ArrayList<>(); + DepthFirstGraphWalker dfs = new DepthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(node -> { + visited.add(node); + }) + .withAllPathShortCircuit(node -> node.equals("oa1-2-1")); + + dfs.walk("pc1"); + + List expected = List.of("oa1-2-1", "oa1-2", "oa1", "pc1"); + assertTrue(expected.containsAll(visited)); + assertTrue(visited.containsAll(expected)); + } + + @Test + void testSinglePathShortCircuit() throws PMException { + List visited = new ArrayList<>(); + DepthFirstGraphWalker dfs = new DepthFirstGraphWalker(pap.query().graph()) + .withDirection(Direction.ASCENDANTS) + .withVisitor(node -> { + visited.add(node); + }) + .withSinglePathShortCircuit(node -> node.equals("oa1-1")); + + dfs.walk("pc1"); + + List expected = List.of("oa1-1", "oa1-2-1", "oa1-2-2", "oa1-2-3", "oa1-2", "oa1", "pc1"); + assertTrue(expected.containsAll(visited)); + assertTrue(visited.containsAll(expected)); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/AccessRightTest.java b/src/test/java/gov/nist/csd/pm/pap/AccessRightTest.java deleted file mode 100644 index 312f0adb8..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/AccessRightTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.UnknownAccessRightException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import static gov.nist.csd.pm.pap.PAPGraph.checkAccessRightsValid; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static org.junit.jupiter.api.Assertions.*; - -class AccessRightTest { - - @Nested - class CheckAccessRightsValid { - - PAP pap; - public CheckAccessRightsValid() throws PMException { - pap = new PAP(new MemoryPolicyStore()); - pap.graph().setResourceAccessRights(new AccessRightSet("r", "w")); - } - - @Test - void testInvalidWithSpecialAAR() throws PMException { - assertThrows(UnknownAccessRightException.class, - () -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_ACCESS_RIGHTS, "e"))); - } - - @Test - void testValidWithSpecialAAR() { - assertDoesNotThrow(() -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_ACCESS_RIGHTS, "w"))); - } - - @Test - void testInvalidWithSpecialAAAR() throws PMException { - assertThrows(UnknownAccessRightException.class, - () -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS, "e"))); - } - - @Test - void testValidWithSpecialAAAR() { - assertDoesNotThrow(() -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS, "w"))); - } - - @Test - void testInvalidWithSpecialARAR() throws PMException { - assertThrows(UnknownAccessRightException.class, - () -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS, "e"))); - } - - @Test - void testValidWithSpecialARAR() { - assertDoesNotThrow(() -> checkAccessRightsValid(pap.graph(), new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS, "w"))); - } - - @Test - void testInvalidWithAdminAccessRight() throws PMException { - assertThrows(UnknownAccessRightException.class, - () -> checkAccessRightsValid(pap.graph(), new AccessRightSet(CREATE_POLICY_CLASS, "e"))); - } - - @Test - void testValidWithAdminAccessRight() { - assertDoesNotThrow(() -> checkAccessRightsValid(pap.graph(), new AccessRightSet(CREATE_POLICY_CLASS, "w"))); - } - - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/PAPTest.java b/src/test/java/gov/nist/csd/pm/pap/PAPTest.java index d625e8cf5..f96388a06 100644 --- a/src/test/java/gov/nist/csd/pm/pap/PAPTest.java +++ b/src/test/java/gov/nist/csd/pm/pap/PAPTest.java @@ -1,1906 +1,141 @@ package gov.nist.csd.pm.pap; -import gov.nist.csd.pm.SamplePolicy; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pap.mysql.MysqlPolicyStore; -import gov.nist.csd.pm.pap.mysql.MysqlTestEnv; -import gov.nist.csd.pm.policy.PolicyEquals; -import gov.nist.csd.pm.policy.pml.model.expression.*; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.exceptions.*; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.Properties; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.graph.relationships.InvalidAssignmentException; -import gov.nist.csd.pm.policy.model.graph.relationships.InvalidAssociationException; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.pml.statement.CreateAttrStatement; -import gov.nist.csd.pm.policy.pml.statement.CreatePolicyStatement; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import org.junit.jupiter.api.*; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.VoidValue; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Test; import java.io.IOException; -import java.sql.*; import java.util.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.NodeType.*; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.toProperties; -import static gov.nist.csd.pm.pap.SuperPolicy.*; import static org.junit.jupiter.api.Assertions.*; -class PAPTest { - - private static MysqlTestEnv testEnv; - - public void runTest(TestRunner testRunner) throws PMException { - testRunner.run(new PAP(new MemoryPolicyStore())); - - try (Connection connection = testEnv.getConnection()) { - PAP mysqlPAP = new PAP(new MysqlPolicyStore(connection)); - testRunner.run(mysqlPAP); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public interface TestRunner { - void run(PAP pap) throws PMException; - } - - @BeforeAll - public static void start() throws IOException, PMException { - testEnv = new MysqlTestEnv(); - testEnv.start(); - } - - @AfterAll - public static void stop() { - testEnv.stop(); - } - - @AfterEach - void reset() throws SQLException { - testEnv.reset(); - } - - @Test - void testSetResourceAccessRights() throws PMException { - runTest(pap -> { - AccessRightSet arset = new AccessRightSet("read", "write"); - pap.graph().setResourceAccessRights(arset); - assertEquals(arset, pap.graph().getResourceAccessRights()); - - assertThrows(AdminAccessRightExistsException.class, () -> pap.graph().setResourceAccessRights(new AccessRightSet(CREATE_POLICY_CLASS))); - }); - } - - @Nested - class CreatePolicyClassTest { - @Test - void NameAlreadyExists() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - assertDoesNotThrow(() -> pap.graph().createPolicyClass(SUPER_PC)); - assertThrows(NodeNameExistsException.class, () -> pap.graph().createPolicyClass("pc1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - String rep = SuperPolicy.pcRepObjectAttribute("pc1"); - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists(rep)); - }); - } - } - - @Nested - class CreateObjectAttribute { - - @Test - void NameAlreadyExists() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - assertThrows(NodeNameExistsException.class, - () -> pap.graph().createObjectAttribute("oa1", "pc1")); - }); - } - - @Test - void ParentDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().createObjectAttribute("oa1", "pc1")); - - pap.graph().createPolicyClass("pc1"); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().createObjectAttribute("oa1", "pc1", "pc2")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createObjectAttribute("oa1", SUPER_OA); - pap.graph().createObjectAttribute("oa2", toProperties("k", "v"), SUPER_OA, "oa1"); - - assertTrue(pap.graph().nodeExists("oa1")); - assertTrue(pap.graph().nodeExists("oa2")); - assertEquals("v", pap.graph().getNode("oa2").getProperties().get("k")); - - assertTrue(pap.graph().getChildren(SUPER_OA).containsAll(List.of("oa1", "oa2"))); - assertTrue(pap.graph().getParents("oa1").contains(SUPER_OA)); - assertTrue(pap.graph().getChildren("oa1").contains("oa2")); - assertTrue(pap.graph().getParents("oa2").containsAll(List.of(SUPER_OA, "oa1"))); - }); - } - } - - @Nested - class CreateUserAttributeTest { - - @Test - void NameAlreadyExists() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.graph().createUserAttribute("ua1", SUPER_UA)); - assertThrows(NodeNameExistsException.class, () -> pap.graph().createUserAttribute("ua1", "pc1")); - }); - } - - @Test - void ParentDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, () -> pap.graph().createUserAttribute("ua1", "pc1")); - assertThrows(NodeDoesNotExistException.class, () -> pap.graph().createUserAttribute("ua1", SUPER_UA, "pc1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createUserAttribute("ua1", SUPER_UA); - pap.graph().createUserAttribute("ua2", toProperties("k", "v"), SUPER_UA, "ua1"); - - assertTrue(pap.graph().nodeExists("ua1")); - assertTrue(pap.graph().nodeExists("ua2")); - assertEquals("v", pap.graph().getNode("ua2").getProperties().get("k")); - - assertTrue(pap.graph().getChildren(SUPER_UA).containsAll(List.of("ua1", "ua2"))); - assertTrue(pap.graph().getParents("ua1").contains(SUPER_UA)); - assertTrue(pap.graph().getChildren("ua1").contains("ua2")); - assertTrue(pap.graph().getParents("ua2").containsAll(List.of(SUPER_UA, "ua1"))); - }); - } - } - - @Nested - class CreateObjectTest { - - @Test - void NameAlreadyExists() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObject("o1", "oa1"); - - assertThrows(NodeNameExistsException.class, - () -> pap.graph().createObject("o1", "oa1")); - }); - } - - @Test - void ParentDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().createObject("o1", "oa1")); - - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().createObject("o1", "oa1", "oa2")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createObject("o1", toProperties("k", "v"), SUPER_OA); - - assertTrue(pap.graph().nodeExists("o1")); - assertEquals("v", pap.graph().getNode("o1").getProperties().get("k")); - - assertTrue(pap.graph().getChildren(SUPER_OA).contains("o1")); - assertEquals( List.of(SUPER_OA), pap.graph().getParents("o1")); - assertTrue(pap.graph().getChildren(SUPER_OA).contains("o1")); - }); - } - } - - @Nested - class CreateUserTest { - - @Test - void NameAlreadyExists() throws PMException { - runTest(pap -> { - pap.graph().createUserAttribute("ua1", SUPER_UA); - pap.graph().createUser("u1", SUPER_UA); - assertDoesNotThrow(() -> pap.graph().createUser(SUPER_USER, "ua1")); - assertThrows(NodeNameExistsException.class, () -> pap.graph().createUser("u1", "ua1")); - }); - } - - @Test - void ParentDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, () -> pap.graph().createUser("u1", "ua1")); - assertThrows(NodeDoesNotExistException.class, () -> pap.graph().createUser("u1", SUPER_UA, "ua1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createUser("u1", toProperties("k", "v"), SUPER_UA, SUPER_UA1); - - assertTrue(pap.graph().nodeExists("u1")); - assertEquals("v", pap.graph().getNode("u1").getProperties().get("k")); - - assertTrue(pap.graph().getChildren(SUPER_UA).contains("u1")); - assertTrue(pap.graph().getParents("u1").containsAll(List.of(SUPER_UA, SUPER_UA1))); - assertTrue(pap.graph().getChildren(SUPER_UA).contains("u1")); - assertTrue(pap.graph().getChildren(SUPER_UA1).contains("u1")); - }); - } - } - - @Nested - class SetNodePropertiesTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().setNodeProperties("oa1", NO_PROPERTIES))); - } - - @Test - void EmptyProperties() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().setNodeProperties("pc1", NO_PROPERTIES); - - assertTrue(pap.graph().getNode("pc1").getProperties().isEmpty()); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().setNodeProperties("pc1", toProperties("k", "v")); - - assertEquals("v", pap.graph().getNode("pc1").getProperties().get("k")); - }); - } - } - - @Nested - class DeleteNodeTest { - - @Test - void NullNameOrNodeDoesNotExist() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.graph().deleteNode(null)); - assertDoesNotThrow(() -> pap.graph().deleteNode("pc1")); - }); - } - - @Test - void DeletePolicyClassHasChildren() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - assertThrows(NodeHasChildrenException.class, - () -> pap.graph().deleteNode("pc1")); - }); - } - - @Test - void DeletePolicyClass() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().deleteNode("pc1"); - assertFalse(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists(SuperPolicy.pcRepObjectAttribute("pc1"))); - }); - } - - @Test - void DeleteNodeHasChildren() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "oa1"); - - assertThrows(NodeHasChildrenException.class, - () -> pap.graph().deleteNode("oa1")); - }); - } - - @Test - void DeleteNodeWithProhibitionsAndObligations() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createUserAttribute("oa1", "pc1"); - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet(), true, new ContainerCondition("oa1", true)); - pap.obligations().create(new UserContext(SUPER_USER), "oblLabel", - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUserWithAttribute("ua1"), - new Performs("event1") - ), - new Response(new UserContext("")) - ), - new Rule( - "rule1", - new EventPattern( - EventSubject.users("ua1"), - new Performs("event1") - ), - new Response(new UserContext("")) - ) - ); - - assertThrows(NodeReferencedInProhibitionException.class, - () -> pap.graph().deleteNode("ua1")); - assertThrows(NodeReferencedInProhibitionException.class, - () -> pap.graph().deleteNode("oa1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - pap.graph().deleteNode("oa1"); - - assertFalse(pap.graph().nodeExists("oa1")); - }); - } - } - - @Nested - class GetNodeTest { - - @Test - void DoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, () -> pap.graph().getNode("pc1"))); - } - - @Test - void GetPolicyClass() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1", Properties.toProperties("k", "v")); - - Node pc1 = pap.graph().getNode("pc1"); - - assertEquals("pc1", pc1.getName()); - assertEquals(PC, pc1.getType()); - assertEquals("v", pc1.getProperties().get("k")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", Properties.toProperties("k", "v"), "pc1"); - - Node oa1 = pap.graph().getNode("oa1"); - - assertEquals("oa1", oa1.getName()); - assertEquals(OA, oa1.getType()); - assertEquals("v", oa1.getProperties().get("k")); - }); - } - } +public abstract class PAPTest extends PAPTestInitializer { @Test - void testSearch() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", toProperties("namespace", "test"), "pc1"); - pap.graph().createObjectAttribute("oa2", toProperties("key1", "value1"), "pc1"); - pap.graph().createObjectAttribute("oa3", toProperties("key1", "value1", "key2", "value2"), "pc1"); - - List nodes = pap.graph().search(OA, NO_PROPERTIES); - assertEquals(6, nodes.size()); - - nodes = pap.graph().search(ANY, toProperties("key1", "value1")); - assertEquals(2, nodes.size()); - - nodes = pap.graph().search(ANY, toProperties("namespace", "test")); - assertEquals(1, nodes.size()); - - nodes = pap.graph().search(OA, toProperties("namespace", "test")); - assertEquals(1, nodes.size()); - nodes = pap.graph().search(OA, toProperties("key1", "value1")); - assertEquals(2, nodes.size()); - nodes = pap.graph().search(OA, toProperties("key1", "*")); - assertEquals(2, nodes.size()); - nodes = pap.graph().search(OA, toProperties("key1", "value1", "key2", "value2")); - assertEquals(1, nodes.size()); - nodes = pap.graph().search(OA, toProperties("key1", "value1", "key2", "*")); - assertEquals(1, nodes.size()); - nodes = pap.graph().search(OA, toProperties("key1", "value1", "key2", "no_value")); - assertEquals(0, nodes.size()); - nodes = pap.graph().search(ANY, NO_PROPERTIES); - assertEquals(11, nodes.size()); - }); - } + void testTx() throws PMException { + pap.beginTx(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet()); + pap.commit(); - @Test - void testGetPolicyClasses() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createPolicyClass("pc2"); - pap.graph().createPolicyClass("pc3"); + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").iterator().next() + .equals(new Association("ua1", "oa1", new AccessRightSet()))); - assertTrue(pap.graph().getPolicyClasses().containsAll(Arrays.asList(SUPER_PC, "pc1", "pc2", "pc3"))); - }); + pap.beginTx(); + pap.modify().graph().deleteNode("ua1"); + pap.rollback(); + assertTrue(pap.query().graph().nodeExists("ua1")); } @Test - void testNodeExists() throws PMException { - runTest(pap -> { - assertTrue(pap.graph().nodeExists(SUPER_PC)); - assertTrue(pap.graph().nodeExists(SUPER_UA)); - assertTrue(pap.graph().nodeExists(SUPER_PC_REP)); - assertTrue(pap.graph().nodeExists(SUPER_USER)); - assertFalse(pap.graph().nodeExists("pc1")); - }); - } - - @Nested - class AssignTest { - - @Test - void ChildNodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().assign("oa1", "pc1"))); - } - - @Test - void ParentNodeDoesNotExist() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().assign("oa1", "oa2")); - }); - } - - @Test - void AssignmentExistsDoesNothing() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().assign("oa1", "pc1"); - }); - } - - @Test - void InvalidAssignment() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - - assertThrows(InvalidAssignmentException.class, - () -> pap.graph().assign("ua1", "oa1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().assign("oa2", "oa1"); - assertTrue(pap.graph().getParents("oa2").contains("oa1")); - assertTrue(pap.graph().getChildren("oa1").contains("oa2")); - }); - } - } - - @Nested - class GetChildrenTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().getChildren("oa1"))); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - - - assertTrue(pap.graph().getChildren("pc1").containsAll(List.of("oa1", "oa2", "oa3"))); - }); - } - } - - @Nested - class GetParentsTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().getParents("oa1"))); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - pap.graph().createObject("o1", "oa1"); - pap.graph().assign("o1", "oa2"); - pap.graph().assign("o1", "oa3"); - - assertTrue(pap.graph().getParents("o1").containsAll(List.of("oa1", "oa2", "oa3"))); - }); - } - } - - @Nested - class DeassignTest { - - @Test - void ChildNodeDoesNotExistDoesNothing() throws PMException { - runTest(pap -> pap.graph().deassign("oa1", "pc1")); - } - - @Test - void ParentNodeDoesNotExistDoesNothing() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().deassign("oa1", "oa2"); - }); - } - - @Test - void AssignmentDoesNotExistDoesNothing() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().deassign("oa1", "oa2"); - }); - } - - @Test - void DisconnectedNode() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - assertThrows(DisconnectedNodeException.class, - () -> pap.graph().deassign("oa1", "pc1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createPolicyClass("pc2"); - pap.graph().createObjectAttribute("oa1", "pc1", "pc2"); - pap.graph().deassign("oa1", "pc1"); - assertEquals(List.of("pc2"), pap.graph().getParents("oa1")); - assertFalse(pap.graph().getParents("oa1").contains("pc1")); - assertFalse(pap.graph().getChildren("pc1").contains("oa1")); - }); - } - - } - - @Nested - class AssociateTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().associate("ua1", "oa1", new AccessRightSet())); - - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().associate("ua1", "oa1", new AccessRightSet())); - }); - } - - @Test - void NodesAlreadyAssigned() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createUserAttribute("ua2", "ua1"); - assertDoesNotThrow(() -> pap.graph().associate("ua2", "ua1", new AccessRightSet())); - }); - } - - @Test - void UnknownResourceAccessRight() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - assertThrows(UnknownAccessRightException.class, - () -> pap.graph().associate("ua1", "oa1", new AccessRightSet("read"))); - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - assertThrows(UnknownAccessRightException.class, - () -> pap.graph().associate("ua1", "oa1", new AccessRightSet("write"))); - assertDoesNotThrow(() -> pap.graph().associate("ua1", "oa1", new AccessRightSet("read"))); - assertDoesNotThrow(() -> pap.graph().associate("ua1", "oa1", new AccessRightSet(ALL_ACCESS_RIGHTS))); - assertDoesNotThrow(() -> pap.graph().associate("ua1", "oa1", new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS))); - assertDoesNotThrow(() -> pap.graph().associate("ua1", "oa1", new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS))); - }); - } - - @Test - void InvalidAssociation() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createUserAttribute("ua2", "ua1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - - assertThrows(InvalidAssociationException.class, - () -> pap.graph().associate("ua2", "pc1", new AccessRightSet())); - assertThrows(InvalidAssociationException.class, - () -> pap.graph().associate("oa1", "oa2", new AccessRightSet())); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - - assertTrue( - pap.graph().getAssociationsWithSource("ua1") - .contains(new Association("ua1", "oa1")) - ); - assertTrue( - pap.graph().getAssociationsWithTarget("oa1") - .contains(new Association("ua1", "oa1")) - ); - }); - } - - @Test - void OverwriteSuccess() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - - List assocs = pap.graph().getAssociationsWithSource("ua1"); - Association assoc = assocs.get(0); - assertEquals("ua1", assoc.getSource()); - assertEquals("oa1", assoc.getTarget()); - assertEquals(new AccessRightSet("read"), assoc.getAccessRightSet()); - - pap.graph().associate("ua1", "oa1", new AccessRightSet("read", "write")); - - assocs = pap.graph().getAssociationsWithSource("ua1"); - assoc = assocs.get(0); - assertEquals("ua1", assoc.getSource()); - assertEquals("oa1", assoc.getTarget()); - assertEquals(new AccessRightSet("read", "write"), assoc.getAccessRightSet()); - }); - } - } - - @Nested - class DissociateTest { - - @Test - void NodeDoesNotExistDoesNothing() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.graph().dissociate("ua1", "oa1")); - - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - - assertDoesNotThrow(() -> pap.graph().dissociate("ua1", "oa2")); - }); - } - - @Test - void AssociationDoesNotExistDoesNothing() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - - assertDoesNotThrow(() -> pap.graph().dissociate("ua1", "oa1")); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet()); - - pap.graph().dissociate("ua1", "oa1"); - - assertFalse(pap.graph().getAssociationsWithSource("ua1") - .contains(new Association("ua1", "oa1"))); - assertFalse(pap.graph().getAssociationsWithTarget("oa1") - .contains(new Association("ua1", "oa1"))); - }); - } - } - - @Nested - class GetAssociationsWithSourceTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().getAssociationsWithSource("ua1"))); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - pap.graph().associate("ua1", "oa2", new AccessRightSet("read", "write")); - - List assocs = pap.graph().getAssociationsWithSource("ua1"); - - assertEquals(2, assocs.size()); - - for (Association assoc : assocs) { - checkAssociation(assoc); - } - }); - } - - private void checkAssociation(Association association) { - if (association.getTarget().equals("oa1")) { - assertEquals(new AccessRightSet("read"), association.getAccessRightSet()); - } else if (association.getTarget().equals("oa2")) { - assertEquals(new AccessRightSet("read", "write"), association.getAccessRightSet()); - } - } - } - - @Nested - class GetAssociationsWithTargetTest { - - @Test - void NodeDoesNotExist() throws PMException { - runTest(pap -> assertThrows(NodeDoesNotExistException.class, - () -> pap.graph().getAssociationsWithTarget("oa1"))); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createUserAttribute("ua2", "pc1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - pap.graph().associate("ua2", "oa1", new AccessRightSet("read", "write")); - - List assocs = pap.graph().getAssociationsWithTarget("oa1"); - - assertEquals(3, assocs.size()); - - for (Association assoc : assocs) { - checkAssociation(assoc); - } - }); - } - - private void checkAssociation(Association association) { - if (association.getSource().equals("ua1")) { - assertEquals(new AccessRightSet("read"), association.getAccessRightSet()); - } else if (association.getSource().equals("ua2")) { - assertEquals(new AccessRightSet("read", "write"), association.getAccessRightSet()); - } else if (association.getSource().equals(SUPER_UA)) { - assertEquals(allAccessRights(), association.getAccessRightSet()); - } - } - } - - @Nested - class CreateProhibitionTest { - - @Test - void ProhibitionExists() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet(), false); - - assertThrows(ProhibitionExistsException.class, - () -> pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet(), false)); - }); - } - - @Test - void InvalidAccessRights() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - - assertThrows(UnknownAccessRightException.class, - () -> pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), false)); - }); - } - - @Test - void ContainerDoesNotExist() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - assertThrows(ProhibitionContainerDoesNotExistException.class, - () -> pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), false, new ContainerCondition("oa1", true))); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - - Prohibition p = pap.prohibitions().get("label"); - assertEquals("label", p.getLabel()); - assertEquals("subject", p.getSubject().getName()); - assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); - assertTrue(p.isIntersection()); - assertEquals(2, p.getContainers().size()); - assertEquals(List.of( - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false) - ), p.getContainers()); - }); - } - } - - @Nested - class UpdateProhibitionTest { - - @Test - void InvalidAccessRights() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true)); - - assertThrows(UnknownAccessRightException.class, - () -> pap.prohibitions().update("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("test"), false)); - }); - } - - @Test - void SubjectDoesNotExist() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true)); - - assertThrows(ProhibitionSubjectDoesNotExistException.class, - () -> pap.prohibitions().update("label", ProhibitionSubject.userAttribute("test"), new AccessRightSet("read"), false)); - assertDoesNotThrow(() -> pap.prohibitions().update("label", ProhibitionSubject.process("subject"), new AccessRightSet("read"), false)); - }); - } - - @Test - void ContainerDoesNotExist() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true)); - - assertThrows(ProhibitionContainerDoesNotExistException.class, - () -> pap.prohibitions().update("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), false, new ContainerCondition("oa3", true))); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createUserAttribute("subject2", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - pap.prohibitions().update("label", ProhibitionSubject.userAttribute("subject2"), new AccessRightSet("read", "write"), true, - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", true)); - - Prohibition p = pap.prohibitions().get("label"); - assertEquals("label", p.getLabel()); - assertEquals("subject2", p.getSubject().getName()); - assertEquals(new AccessRightSet("read", "write"), p.getAccessRightSet()); - assertTrue(p.isIntersection()); - assertEquals(2, p.getContainers().size()); - assertEquals(List.of( - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", true) - ), p.getContainers()); - }); - } - - @Nested - class DeleteProhibitionTest { - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - - pap.prohibitions().delete("label"); - - assertThrows(ProhibitionDoesNotExistException.class, - () -> pap.prohibitions().get("label")); - }); - } - } - } - - @Nested - class GetProhibitionsTest { - - @Test - void GetProhibitions() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - pap.graph().createObjectAttribute("oa4", "pc1"); - - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - pap.prohibitions().create("label2", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa3", true), - new ContainerCondition("oa4", false)); + void testExecutePML() throws PMException { + try { + SamplePolicy.loadSamplePolicyFromPML(pap); - Map> prohibitions = pap.prohibitions().getAll(); - assertEquals(1, prohibitions.size()); - assertEquals(2, prohibitions.get("subject").size()); - checkProhibitions(prohibitions.get("subject")); - }); - } + pap.modify().operations().createAdminOperation(new Operation("testFunc") { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { - private void checkProhibitions(List prohibitions) { - for (Prohibition p : prohibitions) { - if (p.getLabel().equals("label1")) { - assertEquals("label1", p.getLabel()); - assertEquals("subject", p.getSubject().getName()); - assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); - assertTrue(p.isIntersection()); - assertEquals(2, p.getContainers().size()); - assertEquals(List.of( - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false) - ), p.getContainers()); - } else if (p.getLabel().equals("label2")) { - assertEquals("label2", p.getLabel()); - assertEquals("subject", p.getSubject().getName()); - assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); - assertTrue(p.isIntersection()); - assertEquals(2, p.getContainers().size()); - assertEquals(List.of( - new ContainerCondition("oa3", true), - new ContainerCondition("oa4", false) - ), p.getContainers()); - } else { - fail("unexpected prohibition label " + p.getLabel()); } - } - } - - @Test - void GetProhibitionsFor() throws PMException { - runTest(pap -> { - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - pap.graph().createObjectAttribute("oa4", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - pap.prohibitions().create("label2", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa3", true), - new ContainerCondition("oa4", false)); - - List prohibitions = pap.prohibitions().getWithSubject("subject"); - assertEquals(2, prohibitions.size()); - checkProhibitions(prohibitions); - }); - } - - @Test - void GetProhibition() throws PMException { - runTest(pap -> { - assertThrows(ProhibitionDoesNotExistException.class, - () -> pap.prohibitions().get("label")); - - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("subject", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - pap.graph().createObjectAttribute("oa4", "pc1"); - pap.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - - pap.prohibitions().create("label1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false)); - pap.prohibitions().create("label2", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, - new ContainerCondition("oa3", true), - new ContainerCondition("oa4", false)); - - Prohibition p = pap.prohibitions().get("label1"); - assertEquals("label1", p.getLabel()); - assertEquals("subject", p.getSubject().getName()); - assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); - assertTrue(p.isIntersection()); - assertEquals(2, p.getContainers().size()); - assertEquals(List.of( - new ContainerCondition("oa1", true), - new ContainerCondition("oa2", false) - ), p.getContainers()); - }); - } - } - - @Nested - class ObligationTest { - - Obligation obligation1 = new Obligation( - new UserContext(SUPER_USER), - "label", - List.of( - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - new Performs("test_event") - ), - new Response( - new UserContext(SUPER_USER), - new CreatePolicyStatement(new Expression(new VariableReference("test_pc", Type.string()))) - ) - ) - ) - ); - - Obligation obligation2 = new Obligation( - new UserContext(SUPER_USER), - "label2") - .addRule( - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - new Performs("test_event") - ), - new Response( - new UserContext(SUPER_USER), - new CreatePolicyStatement(new Expression(new VariableReference("test_pc", Type.string()))) - ) - ) - ).addRule( - new Rule( - "rule2", - new EventPattern( - EventSubject.anyUser(), - new Performs("test_event") - ), - new Response( - new UserContext(SUPER_USER), - new CreatePolicyStatement(new Expression(new VariableReference("test_pc", Type.string()))) - ) - ) - ); - - - @Nested - class CreateObligation { - - @Test - void AuthorDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create(new UserContext("u1"), obligation1.getLabel(), - obligation1.getRules().toArray(Rule[]::new))); - }); - } - - @Test - void EventSubjectDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.users("u1"), - Performs.events("test_event"), - Target.anyPolicyElement() - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUserWithAttribute("ua1"), - Performs.events("test_event"), - Target.anyPolicyElement() - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - }); - } - - @Test - void EventTargetDoesNotExist() throws PMException { - runTest(pap -> { - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.anyOfSet("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.policyElement("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.anyContainedIn("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - - assertThrows(ObligationExistsException.class, - () -> pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel())); - - Obligation actual = pap.obligations().get(obligation1.getLabel()); - assertEquals(obligation1, actual); - }); - } - } - - @Nested - class UpdateObligation { - - @Test - void AuthorDoesNotExist() throws PMException { - runTest(pap -> { - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update(new UserContext("u1"), obligation1.getLabel(), - obligation1.getRules().toArray(Rule[]::new))); - }); - } - - @Test - void EventSubjectDoesNotExist() throws PMException { - runTest(pap -> { - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update( - new UserContext(SUPER_USER), - obligation1.getLabel(), - new Rule( - "rule1", - new EventPattern( - EventSubject.users("u1"), - Performs.events("test_event"), - Target.anyPolicyElement() - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update( - new UserContext(SUPER_USER), - obligation1.getLabel(), - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUserWithAttribute("ua1"), - Performs.events("test_event"), - Target.anyPolicyElement() - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - }); - } - - @Test - void EventTargetDoesNotExist() throws PMException { - runTest(pap -> { - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update( - new UserContext(SUPER_USER), - obligation1.getLabel(), - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.anyOfSet("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update( - new UserContext(SUPER_USER), - obligation1.getLabel(), - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.policyElement("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - assertThrows(NodeDoesNotExistException.class, - () -> pap.obligations().update( - new UserContext(SUPER_USER), - obligation1.getLabel(), - new Rule( - "rule1", - new EventPattern( - EventSubject.users(SUPER_USER), - Performs.events("test_event"), - Target.anyContainedIn("oa1") - ), - new Response(new UserContext(SUPER_USER)) - ) - )); - }); - } - - @Test - void Success() throws PMException { - runTest(pap -> { - assertThrows(ObligationDoesNotExistException.class, - () -> pap.obligations().update(new UserContext(SUPER_USER), obligation1.getLabel())); - - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - - pap.obligations().update(new UserContext(SUPER_USER), obligation1.getLabel(), - obligation2.getRules().toArray(Rule[]::new)); - - Obligation expected = new Obligation(obligation1); - expected.setRules(obligation2.getRules()); - Obligation actual = pap.obligations().get(obligation1.getLabel()); - assertEquals(expected, actual); - }); - } - - } - - @Test - void DeleteObligation() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.obligations().delete(obligation1.getLabel())); - - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - pap.obligations().create(obligation2.getAuthor(), obligation2.getLabel(), obligation2.getRules().toArray(Rule[]::new)); - - pap.obligations().delete(obligation1.getLabel()); - - assertThrows(ObligationDoesNotExistException.class, - () -> pap.obligations().get(obligation1.getLabel())); - }); - } - - @Test - void GetObligations() throws PMException { - runTest(pap -> { - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - pap.obligations().create(obligation2.getAuthor(), obligation2.getLabel(), obligation2.getRules().toArray(Rule[]::new)); - - List obligations = pap.obligations().getAll(); - assertEquals(2, obligations.size()); - for (Obligation obligation : obligations) { - if (obligation.getLabel().equals(obligation1.getLabel())) { - assertEquals(obligation1, obligation); - } else { - assertEquals(obligation2, obligation); - } + @Override + public Value execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass("pc3"); + return new VoidValue(); } }); - } - - @Test - void GetObligation() throws PMException { - runTest(pap -> { - assertThrows(ObligationDoesNotExistException.class, - () -> pap.obligations().get(obligation1.getLabel())); - - pap.obligations().create(obligation1.getAuthor(), obligation1.getLabel(), obligation1.getRules().toArray(Rule[]::new)); - pap.obligations().create(obligation2.getAuthor(), obligation2.getLabel(), obligation2.getRules().toArray(Rule[]::new)); - - Obligation obligation = pap.obligations().get(obligation1.getLabel()); - assertEquals(obligation1, obligation); - }); - } - - } - - @Test - void testTx() throws PMException { - runTest(pap -> { - pap.beginTx(); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet()); - pap.commit(); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("oa1")); - assertTrue(pap.graph().nodeExists("ua1")); - assertTrue(pap.graph().getAssociationsWithSource("ua1").contains(new Association("ua1", "oa1"))); - - pap.beginTx(); - pap.graph().deleteNode("ua1"); - pap.rollback(); - assertTrue(pap.graph().nodeExists("ua1")); - }); - } - - @Nested - class addFunction { - - FunctionDefinitionStatement testFunc = new FunctionDefinitionStatement( - "testFunc", - Type.string(), - Arrays.asList( - new FormalArgument("arg1", Type.string()), - new FormalArgument("arg2", Type.array(Type.string())) - ), - Arrays.asList( - new CreatePolicyStatement(new Expression(new VariableReference("pc1", Type.string()))), - new CreateAttrStatement( - new Expression(new VariableReference("ua1", Type.string())), - UA, - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new VariableReference("pc1", Type.string()))}, Type.string()))) - ), - new CreateAttrStatement( - new Expression(new VariableReference("oa1", Type.string())), - OA, - new Expression(new Literal(new ArrayLiteral(new Expression[]{new Expression(new VariableReference("pc1", Type.string()))}, Type.string()))) - ) - ) - ); - - @Test - void functionAlreadyDefined() throws PMException { - runTest(pap -> { - pap.userDefinedPML().createFunction(testFunc); - assertThrows(FunctionAlreadyDefinedException.class, () -> pap.userDefinedPML().createFunction(testFunc)); - }); - } - - @Test - void success() throws PMException { - runTest(pap -> { - pap.userDefinedPML().createFunction(testFunc); - assertTrue(pap.userDefinedPML().getFunctions().containsKey(testFunc.getFunctionName())); - FunctionDefinitionStatement actual = pap.userDefinedPML().getFunctions().get(testFunc.getFunctionName()); - assertEquals(testFunc, actual); - }); - } - } - - @Nested - class RemoveFunction { - - @Test - void functionDoesNotExistNoException() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.userDefinedPML().deleteFunction("func")); - }); - } - - @Test - void success() throws PMException { - runTest(pap -> { - pap.userDefinedPML().createFunction(new FunctionDefinitionStatement("testFunc", Type.voidType(), List.of(), List.of())); - assertTrue(pap.userDefinedPML().getFunctions().containsKey("testFunc")); - pap.userDefinedPML().deleteFunction("testFunc"); - assertFalse(pap.userDefinedPML().getFunctions().containsKey("testFunc")); - }); - } - } - - @Nested - class GetFunctions { - - @Test - void success() throws PMException { - FunctionDefinitionStatement testFunc1 = new FunctionDefinitionStatement("testFunc1", Type.voidType(), List.of(), List.of()); - FunctionDefinitionStatement testFunc2 = new FunctionDefinitionStatement("testFunc2", Type.voidType(), List.of(), List.of()); - - runTest(pap -> { - pap.userDefinedPML().createFunction(testFunc1); - pap.userDefinedPML().createFunction(testFunc2); - - Map functions = pap.userDefinedPML().getFunctions(); - assertTrue(functions.containsKey("testFunc1")); - FunctionDefinitionStatement actual = functions.get("testFunc1"); - assertEquals(testFunc1, actual); - - assertTrue(functions.containsKey("testFunc2")); - actual = functions.get("testFunc2"); - assertEquals(testFunc2, actual); - }); - } - - } - - @Nested - class AddConstant { - - @Test - void constantAlreadyDefined() throws PMException { - runTest(pap -> { - pap.userDefinedPML().createConstant("const1", new Value("test")); - assertThrows(ConstantAlreadyDefinedException.class, () -> pap.userDefinedPML().createConstant("const1", new Value("test"))); - }); - } - - @Test - void success() throws PMException { - Value expected = new Value("test"); - - runTest(pap -> { - pap.userDefinedPML().createConstant("const1", expected); - assertTrue(pap.userDefinedPML().getConstants().containsKey("const1")); - Value actual = pap.userDefinedPML().getConstants().get("const1"); - assertEquals(expected, actual); - }); - } - } - - @Nested - class RemoveConstant { - - @Test - void constantDoesNotExistNoException() throws PMException { - runTest(pap -> { - assertDoesNotThrow(() -> pap.userDefinedPML().deleteConstant("const1")); - }); - } - @Test - void success() throws PMException { - runTest(pap -> { - pap.userDefinedPML().createConstant("const1", new Value("test")); - assertTrue(pap.userDefinedPML().getConstants().containsKey("const1")); - pap.userDefinedPML().deleteConstant("const1"); - assertFalse(pap.userDefinedPML().getConstants().containsKey("const1")); - }); - } - } - - @Nested - class GetConstants { - - @Test - void success() throws PMException { - Value const1 = new Value("test1"); - Value const2 = new Value("test2"); - - runTest(pap -> { - pap.userDefinedPML().createConstant("const1", const1); - pap.userDefinedPML().createConstant("const2", const2); - - Map constants = pap.userDefinedPML().getConstants(); - assertTrue(constants.containsKey("const1")); - Value actual = constants.get("const1"); - assertEquals(const1, actual); - - assertTrue(constants.containsKey("const2")); - actual = constants.get("const2"); - assertEquals(const2, actual); - }); + pap.executePML(new UserContext("u1"), "create ua \"ua4\" in [\"Location\"]\ntestFunc()"); + assertTrue(pap.query().graph().nodeExists("ua4")); + assertTrue(pap.query().graph().nodeExists("pc3")); + } catch (IOException e) { + throw new RuntimeException(e); } } - private static final String input = """ - set resource access rights ['read', 'write', 'execute'] - create policy class 'pc1' - set properties of 'pc1' to {'k':'v'} - create oa 'oa1' in ['pc1'] - set properties of 'oa1' to {'k1':'v1'} - create ua 'ua1' in ['pc1'] - associate 'ua1' and 'oa1' with ['read', 'write'] - create prohibition 'p1' deny user attribute 'ua1' access rights ['read'] on union of [!'oa1'] - create obligation 'obl1' { - create rule 'rule1' - when any user - performs ['event1', 'event2'] - do(evtCtx) { - let event = evtCtx['event'] - if equals(event, 'event1') { - create policy class 'e1' - } else if equals(event, 'event2') { - create policy class 'e2' - } - } - } - const testConst = "hello world" - function testFunc() void { - create pc "pc1" - } - """; - private static final String expected = """ - const testConst = 'hello world' - function testFunc() void {create policy class 'pc1'} - set resource access rights ['read', 'write', 'execute'] - create policy class 'super_policy' - create user attribute 'super_ua' in ['super_policy'] - create user attribute 'super_ua1' in ['super_policy'] - associate 'super_ua1' and 'super_ua' with ['*'] - create object attribute 'super_oa' in ['super_policy'] - associate 'super_ua' and 'super_oa' with ['*'] - create user 'super' in ['super_ua'] - assign 'super' to ['super_ua1'] - create object attribute 'super_policy_pc_rep' in ['super_oa'] - create object attribute 'pc1_pc_rep' in ['super_oa'] - create policy class 'pc1' - set properties of 'pc1' to {'k': 'v'} - create object attribute 'oa1' in ['pc1'] - set properties of 'oa1' to {'k1': 'v1'} - associate 'super_ua' and 'oa1' with ['*'] - create user attribute 'ua1' in ['pc1'] - associate 'super_ua' and 'ua1' with ['*'] - associate 'ua1' and 'oa1' with ['read', 'write'] - create prohibition 'p1' deny user attribute 'ua1' access rights ['read'] on union of [!'oa1'] - create obligation 'obl1' {create rule 'rule1' when any user performs ['event1', 'event2'] on any policy element do (evtCtx) {let event = evtCtx['event']if equals(event, 'event1') {create policy class 'e1'} else if equals(event, 'event2') {create policy class 'e2'} }} - """.trim(); @Test - void testSerialize() throws PMException { - runTest(pap -> { - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - String actual = pap.serialize().toPML(); - assertEquals(new ArrayList<>(), pmlEqual(expected, actual)); - - pap.deserialize().fromPML(new UserContext(SUPER_USER), actual); - actual = pap.serialize().toPML(); - assertEquals(new ArrayList<>(), pmlEqual(expected, actual)); - - String json = pap.serialize().toJSON(); - MemoryPolicyStore memoryPolicyStore = new MemoryPolicyStore(); - memoryPolicyStore.deserialize().fromJSON(json); - pap.deserialize().fromJSON(json); - PolicyEquals.check(pap, memoryPolicyStore); - }); - } - - private List pmlEqual(String expected, String actual) { - List expectedLines = sortLines(expected); - List actualLines = sortLines(actual); - expectedLines.removeIf(line -> actualLines.contains(line)); - return expectedLines; - } - - private List sortLines(String pml) { - List lines = new ArrayList<>(); - Scanner sc = new Scanner(pml); - while (sc.hasNextLine()) { - lines.add(sc.nextLine()); - } - - Collections.sort(lines); - return lines; + void testAdminPolicyCreatedInConstructor() throws PMException { + testAdminPolicy(pap, 1); } @Test - void testExecutePML() throws PMException { - runTest(pap -> { - try { - SamplePolicy.loadSamplePolicyFromPML(pap); + void testResetInitializesAdminPolicy() throws PMException { + pap.reset(); - FunctionDefinitionStatement functionDefinitionStatement = new FunctionDefinitionStatement( - "testfunc", - Type.voidType(), - List.of(), - (ctx, policy) -> { - policy.graph().createPolicyClass("pc3"); - return new Value(); - } - ); - - pap.executePML(new UserContext(SUPER_USER), "create ua 'ua3' in ['pc2']\ntestfunc()", functionDefinitionStatement); - assertTrue(pap.graph().nodeExists("ua3")); - assertTrue(pap.graph().nodeExists("pc3")); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); + testAdminPolicy(pap, 1); } - @Test - void testAssignAll() throws PMException { - runTest(pap -> { - String pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - create oa 'oa2' in ['pc1'] - create ua 'ua1' in ['pc1'] - - for i in range [1, 10] { - let name = concat(["o", numToStr(i)]) - create object name in ['oa1'] - } - """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - - List children = pap.graph().getChildren("oa1"); - pap.graph().assignAll(children, "oa2"); - - assertEquals(10, pap.graph().getChildren("oa2").size()); - - assertDoesNotThrow(() -> { - pap.graph().assignAll(children, "oa2"); - }); - - // reset policy - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - - // test with illegal assignment - children.add("ua1"); - assertThrows(PMException.class, () -> { - pap.graph().assignAll(children, "oa2"); - }); - assertTrue(pap.graph().getChildren("oa2").isEmpty()); + public static void testAdminPolicy(PAP pap, int numExpectedPolicyClasses) throws PMException { + assertTrue(pap.query().graph().nodeExists(AdminPolicyNode.ADMIN_POLICY.nodeName())); + Collection ascendants = pap.query().graph().getAdjacentAscendants(AdminPolicyNode.ADMIN_POLICY.nodeName()); + assertEquals(1, ascendants.size()); + assertTrue(ascendants.contains(AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName())); - // test non existing target - assertThrows(PMException.class, () -> { - pap.graph().assignAll(children, "oa3"); - }); - - // test non existing child - assertThrows(PMException.class, () -> { - children.remove("ua1"); - children.add("oDNE"); - pap.graph().assignAll(children, "oa2"); - }); - }); + assertTrue(pap.query().graph().nodeExists(AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName())); + Collection descendants = pap.query().graph().getAdjacentDescendants(AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName()); + assertEquals(1, descendants.size()); + assertTrue(descendants.contains(AdminPolicyNode.ADMIN_POLICY.nodeName())); } @Test - void testDeassignAll() throws PMException { - runTest(pap -> { - String pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - create oa 'oa2' in ['pc1'] - create ua 'ua1' in ['pc1'] - - for i in range [1, 10] { - let name = concat(["o", numToStr(i)]) - create object name in ['oa1'] + void testRecursiveOperation() throws PMException { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create u "u1" in ["ua1"] + + associate "ua1" and ADMIN_POLICY_OBJECT with ["assign"] + associate "ua1" and "ua2" with ["assign"] + + operation op1(nodeop string a) { + check "assign" on a + } { + if a == ADMIN_POLICY_OBJECT { + op1("ua2") } - for i in range [1, 5] { - let name = concat(["o", numToStr(i)]) - assign name to ['oa2'] - } - """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - - List toDelete = new ArrayList<>(List.of("o1", "o2", "o3", "o4", "o5")); - pap.graph().deassignAll(toDelete, "oa1"); - assertEquals(5, pap.graph().getChildren("oa1").size()); - - toDelete.clear(); - toDelete.add("oDNE"); - assertThrows(PMException.class, () -> { - pap.graph().deassignAll(toDelete, "oa2"); - }); + create pc a + "_PC" + } + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); - toDelete.clear(); - toDelete.add("o9"); - assertDoesNotThrow(() -> { - pap.graph().deassignAll(toDelete, "oa2"); - }); - }); + pap.executePML(new UserContext("u1"), "op1(ADMIN_POLICY_OBJECT)"); + assertTrue(pap.query().graph().nodeExists("ua2_PC")); + assertTrue(pap.query().graph().nodeExists("PM_ADMIN:object_PC")); } @Test - void testDeassignAllAndDelete() throws PMException { - runTest(pap -> { - String pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - create oa 'oa2' in ['pc1'] - create ua 'ua1' in ['pc1'] - - for i in range [1, 10] { - let name = concat(["o", numToStr(i)]) - create object name in ['oa1'] - } - - for i in range [1, 5] { - let name = concat(["o", numToStr(i)]) - assign name to ['oa2'] - } - """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - - assertThrows(PMException.class, () -> { - pap.graph().deassignAllFromAndDelete("oa1"); - }); - - pap.graph().assignAll(pap.graph().getChildren("oa1"), "oa2"); - - pap.graph().deassignAllFromAndDelete("oa1"); - assertFalse(pap.graph().nodeExists("oa1")); - }); + void testExecutePMLCreatesObligationBeforeAuthorUserThrowsException() { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create obligation "o1" { + create rule "r1" + when any user + performs any operation + do(ctx) {} + } + + create u "u1" in ["ua1"] + """; + assertThrows(NodeDoesNotExistException.class, () -> pap.executePML(new UserContext("u1"), pml)); } } \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/PAPTestInitializer.java b/src/test/java/gov/nist/csd/pm/pap/PAPTestInitializer.java new file mode 100644 index 000000000..89d6605de --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/PAPTestInitializer.java @@ -0,0 +1,16 @@ +package gov.nist.csd.pm.pap; + +import gov.nist.csd.pm.pap.exception.PMException; +import org.junit.jupiter.api.BeforeEach; + +public abstract class PAPTestInitializer { + + protected PAP pap; + + public abstract PAP initializePAP() throws PMException; + + @BeforeEach + void setup() throws PMException { + pap = initializePAP(); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/PolicyEventTest.java b/src/test/java/gov/nist/csd/pm/pap/PolicyEventTest.java deleted file mode 100644 index dd64b1660..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/PolicyEventTest.java +++ /dev/null @@ -1,124 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.VariableReference; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.events.PolicyEvent; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import gov.nist.csd.pm.policy.pml.statement.CreatePolicyStatement; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.assertEquals; - -public class PolicyEventTest { - - @Test - void testEvents() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - - List events = new ArrayList<>(); - pap.addEventListener(events::add, false); - - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - assertEquals(1, events.size()); - - pap.graph().createPolicyClass("pc1"); - assertEquals(3, events.size()); - - pap.graph().createObjectAttribute("oa1", "pc1"); - assertEquals(5, events.size()); - - pap.graph().createUserAttribute("ua1", "pc1"); - assertEquals(7, events.size()); - - pap.graph().createUserAttribute("ua2", "pc1"); - assertEquals(9, events.size()); - - pap.graph().createObject("o1", "oa1"); - assertEquals(10, events.size()); - - pap.graph().createUser("u1", "ua1"); - assertEquals(11, events.size()); - - pap.graph().createUser("u2", "ua1"); - assertEquals(12, events.size()); - - pap.graph().setNodeProperties("u1", Map.of("k", "v")); - assertEquals(13, events.size()); - - pap.graph().deleteNode("u1"); - assertEquals(14, events.size()); - - pap.graph().assign("u2", "ua2"); - assertEquals(15, events.size()); - - pap.graph().deassign("u2", "ua2"); - assertEquals(16, events.size()); - - pap.graph().associate("ua1", "oa1", new AccessRightSet()); - assertEquals(17, events.size()); - - pap.graph().dissociate("ua1", "oa1"); - assertEquals(18, events.size()); - - pap.prohibitions().create("label", ProhibitionSubject.user("ua1"), new AccessRightSet("read"), false, new ContainerCondition("oa1", false)); - assertEquals(19, events.size()); - - pap.prohibitions().update("label", ProhibitionSubject.user("ua2"), new AccessRightSet("read"), false, new ContainerCondition("oa1", false)); - assertEquals(20, events.size()); - - pap.prohibitions().delete("label"); - assertEquals(21, events.size()); - - pap.obligations().create( - new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - new Performs("test_event") - ), - new Response( - new UserContext(SUPER_USER), - new CreatePolicyStatement(new Expression(new VariableReference("test_pc", Type.string()))) - ) - ) - ); - assertEquals(22, events.size()); - - pap.obligations().update(new UserContext(SUPER_USER), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - new Performs("test_event") - ), - new Response( - new UserContext(SUPER_USER), - new CreatePolicyStatement(new Expression(new VariableReference("test_pc2", Type.string()))) - ) - )); - assertEquals(23, events.size()); - - pap.obligations().delete("label"); - assertEquals(24, events.size()); - } - -} diff --git a/src/test/java/gov/nist/csd/pm/pap/SuperPolicyTest.java b/src/test/java/gov/nist/csd/pm/pap/SuperPolicyTest.java deleted file mode 100644 index ec72452a8..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/SuperPolicyTest.java +++ /dev/null @@ -1,227 +0,0 @@ -package gov.nist.csd.pm.pap; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.memory.MemoryPolicyReviewer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.*; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.allAccessRights; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.allAdminAccessRights; -import static org.junit.jupiter.api.Assertions.*; - -class SuperPolicyTest { - - static PAP pap; - @BeforeAll - static void init() throws PMException { - pap = new PAP(new MemoryPolicyStore()); - SuperPolicy.verifySuperPolicy(pap.policyStore); - } - - @Test - void verifySuperPC() throws PMException { - assertTrue(pap.graph().nodeExists(SUPER_PC)); - - List expected = List.of(SUPER_UA, SUPER_UA1, SUPER_OA); - List actual = pap.graph().getChildren(SUPER_PC); - assertTrue(expected.containsAll(actual)); - assertTrue(actual.containsAll(expected)); - - assertTrue(pap.graph().nodeExists(SUPER_PC_REP)); - - expected = List.of(SUPER_OA); - assertEquals(expected, pap.graph().getParents(SUPER_PC_REP)); - } - - @Test - void verifySuperUA() throws PMException { - assertTrue(pap.graph().nodeExists(SUPER_UA)); - - List actual = pap.graph().getParents(SUPER_UA); - List expected = List.of(SUPER_PC); - assertEquals(expected, actual); - - actual = pap.graph().getChildren(SUPER_UA); - expected = List.of(SUPER_USER); - assertEquals(expected, actual); - - List expectedAssocs = List.of( - new Association(SUPER_UA, SUPER_OA, allAccessRights()) - ); - List actualAssocs = pap.graph().getAssociationsWithSource(SUPER_UA); - assertEquals(expectedAssocs, actualAssocs); - - expectedAssocs = List.of(new Association(SUPER_UA, SUPER_OA, allAccessRights())); - actualAssocs = pap.graph().getAssociationsWithTarget(SUPER_OA); - assertEquals(expectedAssocs, actualAssocs); - } - - @Test - void verifySuperUA1() throws PMException { - assertTrue(pap.graph().nodeExists(SUPER_UA1)); - - List actual = pap.graph().getParents(SUPER_UA1); - List expected = List.of(SUPER_PC); - assertEquals(expected, actual); - - actual = pap.graph().getChildren(SUPER_UA1); - expected = List.of(SUPER_USER); - assertEquals(expected, actual); - - List expectedAssocs = List.of(new Association(SUPER_UA1, SUPER_UA, allAccessRights())); - List actualAssocs = pap.graph().getAssociationsWithSource(SUPER_UA1); - assertEquals(expectedAssocs, actualAssocs); - - expectedAssocs = List.of(new Association(SUPER_UA1, SUPER_UA, allAccessRights())); - actualAssocs = pap.graph().getAssociationsWithTarget(SUPER_UA); - assertEquals(expectedAssocs, actualAssocs); - } - - @Test - void verifySuperOA() throws PMException { - assertTrue(pap.graph().nodeExists(SUPER_OA)); - - List actual = pap.graph().getParents(SUPER_OA); - List expected = List.of(SUPER_PC); - assertEquals(expected, actual); - - actual = pap.graph().getChildren(SUPER_OA); - expected = List.of(SUPER_PC_REP); - assertEquals(expected, actual); - - List expectedAssocs = List.of(new Association(SUPER_UA, SUPER_OA, allAccessRights())); - List actualAssocs = pap.graph().getAssociationsWithTarget(SUPER_OA); - assertEquals(expectedAssocs, actualAssocs); - } - - @Test - void verifySuperUser() throws PMException { - assertTrue(pap.graph().nodeExists(SUPER_USER)); - - List actual = pap.graph().getParents(SUPER_USER); - List expected = List.of(SUPER_UA, SUPER_UA1); - assertEquals(expected, actual); - } - - @Nested - class FixSuperPolicy { - - @Test - void testNodes() throws PMException { - MemoryPolicyStore policy = new MemoryPolicyStore(); - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - assertTrue(pap.graph().nodeExists(SUPER_PC)); - assertTrue(pap.graph().nodeExists(SUPER_UA)); - assertTrue(pap.graph().nodeExists(SUPER_UA1)); - assertTrue(pap.graph().nodeExists(SUPER_OA)); - assertTrue(pap.graph().nodeExists(SUPER_PC_REP)); - assertTrue(pap.graph().nodeExists(SUPER_USER)); - } - - @Test - void testSuperUARelations() throws PMException { - PolicyStore policy = new MemoryPolicyStore(); - policy.graph().createPolicyClass(SUPER_PC); - policy.graph().createUserAttribute("test", SUPER_PC); - policy.graph().createUserAttribute(SUPER_UA, "test"); - - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getParents(SUPER_UA).contains(SUPER_PC)); - assertTrue(pap.graph().getAssociationsWithTarget(SUPER_UA).contains(new Association(SUPER_UA1, SUPER_UA))); - } - - @Test - void testSuperUA1Relations() throws PMException { - PolicyStore policy = new MemoryPolicyStore(); - policy.graph().createPolicyClass(SUPER_PC); - policy.graph().createUserAttribute("test", SUPER_PC); - policy.graph().createUserAttribute(SUPER_UA1, "test"); - - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getParents(SUPER_UA1).contains(SUPER_PC)); - } - - @Test - void testSuperOARelations() throws PMException { - PolicyStore policy = new MemoryPolicyStore(); - policy.graph().createPolicyClass(SUPER_PC); - policy.graph().createObjectAttribute("test", SUPER_PC); - policy.graph().createObjectAttribute(SUPER_OA, "test"); - - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getParents(SUPER_OA).contains(SUPER_PC)); - assertTrue(pap.graph().getAssociationsWithTarget(SUPER_OA).contains(new Association(SUPER_UA, SUPER_OA, allAccessRights()))); - } - - @Test - void testSuperUserAssignments() throws PMException { - MemoryPolicyStore policy = new MemoryPolicyStore(); - - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getParents(SUPER_USER).containsAll(List.of(SUPER_UA, SUPER_UA1))); - } - - @Test - void testSuperPCRepAssignments() throws PMException { - MemoryPolicyStore policy = new MemoryPolicyStore(); - - PAP pap = new PAP(policy); - verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getParents(SUPER_PC_REP).contains(SUPER_OA)); - } - - } - - @Test - void testExistingPCs() throws PMException { - PolicyStore store = new MemoryPolicyStore(); - store.graph().createPolicyClass("pc1"); - store.graph().createUserAttribute("ua1", "pc1"); - store.graph().createObjectAttribute("oa1", "pc1"); - - PAP pap = new PAP(store); - SuperPolicy.verifySuperPolicy(pap.policyStore); - - assertTrue(pap.graph().getAssociationsWithSource(SUPER_UA).containsAll(List.of( - new Association(SUPER_UA, "ua1", allAccessRights()), - new Association(SUPER_UA, "oa1", allAccessRights()) - ))); - } - - @Test - void testApplySuperPolicy() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - MemoryPolicyReviewer reviewer = new MemoryPolicyReviewer(pap); - UserContext userContext = new UserContext(SUPER_USER); - AccessRightSet accessRights = reviewer.getAccessRights(userContext, SUPER_USER); - assertTrue(accessRights.containsAll(allAdminAccessRights())); - accessRights = reviewer.getAccessRights(userContext, SUPER_UA); - assertTrue(accessRights.containsAll(allAdminAccessRights())); - accessRights = reviewer.getAccessRights(userContext, SUPER_PC); - assertFalse(accessRights.containsAll(allAdminAccessRights())); - accessRights = reviewer.getAccessRights(userContext, SUPER_PC_REP); - assertTrue(accessRights.containsAll(allAdminAccessRights())); - - pap.graph().createPolicyClass("pc1"); - accessRights = reviewer.getAccessRights(userContext, SuperPolicy.pcRepObjectAttribute("pc1")); - assertTrue(accessRights.containsAll(allAdminAccessRights())); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPAPTest.java b/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPAPTest.java deleted file mode 100644 index d72a199f0..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPAPTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class MemoryPAPTest { - - @Test - void testTx() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - pap.beginTx(); - pap.graph().createPolicyClass("pc1"); - pap.rollback(); - assertFalse(pap.graph().nodeExists("pc1")); - - pap.beginTx(); - pap.graph().createPolicyClass("pc1"); - pap.commit(); - assertTrue(pap.graph().nodeExists("pc1")); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializerTest.java b/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializerTest.java deleted file mode 100644 index c68670759..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyDeserializerTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.SamplePolicy; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.PolicyEquals; -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.junit.jupiter.api.Test; - -import java.io.IOException; - -import static org.junit.jupiter.api.Assertions.*; - -class MemoryPolicyDeserializerTest { - - @Test - void testDeserialize() throws PMException, IOException { - MemoryPolicyStore memoryPolicyStore = new MemoryPolicyStore(); - SamplePolicy.loadSamplePolicyFromPML(memoryPolicyStore); - - String json = memoryPolicyStore.serialize().toJSON(); - - MemoryPolicyStore actual = new MemoryPolicyStore(); - new MemoryPolicyDeserializer(actual).fromJSON(json); - - PolicyEquals.check(memoryPolicyStore, actual); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreTest.java b/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreTest.java deleted file mode 100644 index 04e744e39..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/memory/MemoryPolicyStoreTest.java +++ /dev/null @@ -1,243 +0,0 @@ -package gov.nist.csd.pm.pap.memory; - -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static gov.nist.csd.pm.policy.tx.TxRunner.runTx; -import static org.junit.jupiter.api.Assertions.*; - -class MemoryPolicyStoreTest { - - MemoryPolicyStore memoryPolicyStore; - - @BeforeEach - void setUp() { - memoryPolicyStore = new MemoryPolicyStore(); - } - - @Test - void getResourceAccessRights() throws PMException { - memoryPolicyStore.graph().setResourceAccessRights(new AccessRightSet("read", "write")); - AccessRightSet resourceAccessRights = memoryPolicyStore.graph().getResourceAccessRights(); - resourceAccessRights.add("test"); - - assertFalse(memoryPolicyStore.graph().getResourceAccessRights().contains("test")); - } - - @Test - void getNode() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", NO_PROPERTIES); - Node pc1 = memoryPolicyStore.graph().getNode("pc1"); - pc1.getProperties().put("test", "test"); - - assertFalse(memoryPolicyStore.graph().getNode("pc1").getProperties().containsKey("test")); - } - - @Test - void getPolicyClasses() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createPolicyClass("pc2", null); - List policyClasses = memoryPolicyStore.graph().getPolicyClasses(); - policyClasses.add("test"); - assertFalse(memoryPolicyStore.graph().getPolicyClasses().contains("test")); - } - - @Test - void getChildren() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa2", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa3", "pc1"); - List children = memoryPolicyStore.graph().getChildren("pc1"); - children.add("test"); - assertFalse(memoryPolicyStore.graph().getChildren("pc1").contains("test")); - } - - @Test - void getParents() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa2", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa3", "pc1"); - memoryPolicyStore.graph().createObject("o1", "oa1", "oa2", "oa3"); - List parents = memoryPolicyStore.graph().getParents("o1"); - parents.add("test"); - assertFalse(memoryPolicyStore.graph().getParents("o1").contains("test")); - } - - @Test - void getAssociationsWithSource() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createUserAttribute("ua1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.graph().associate("ua1", "oa1", new AccessRightSet()); - List assocs = memoryPolicyStore.graph().getAssociationsWithSource("ua1"); - assocs.clear(); - assertFalse(memoryPolicyStore.graph().getAssociationsWithSource("ua1").isEmpty()); - } - - @Test - void getAssociationsWithTarget() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createUserAttribute("ua1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.graph().associate("ua1", "oa1", new AccessRightSet()); - List assocs = memoryPolicyStore.graph().getAssociationsWithTarget("oa1"); - assocs.clear(); - assertFalse(memoryPolicyStore.graph().getAssociationsWithTarget("oa1").isEmpty()); - } - - @Test - void getProhibitions() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createUserAttribute("ua1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.prohibitions().create("label", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet(), true, new ContainerCondition("oa1", false)); - Map> prohibitions = memoryPolicyStore.prohibitions().getAll(); - prohibitions.clear(); - assertEquals(1, memoryPolicyStore.prohibitions().getAll().size()); - prohibitions = memoryPolicyStore.prohibitions().getAll(); - Prohibition p = prohibitions.get("ua1").get(0); - p = new Prohibition("test", ProhibitionSubject.userAttribute("ua2"), new AccessRightSet("read"), false, Collections.singletonList(new ContainerCondition("oa2", true))); - Prohibition actual = memoryPolicyStore.prohibitions().getWithSubject("ua1").get(0); - assertEquals("label", actual.getLabel()); - assertEquals("ua1", actual.getSubject().getName()); - assertEquals(ProhibitionSubject.Type.USER_ATTRIBUTE, actual.getSubject().getType()); - assertEquals(new AccessRightSet(), actual.getAccessRightSet()); - assertTrue(actual.isIntersection()); - assertEquals(1, actual.getContainers().size()); - assertEquals(new ContainerCondition("oa1", false), actual.getContainers().get(0)); - } - - @Test - void getProhibitionsFor() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createUserAttribute("ua1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.prohibitions().create("label", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet(), true, new ContainerCondition("oa1", false)); - List prohibitions = memoryPolicyStore.prohibitions().getWithSubject("ua1"); - prohibitions.clear(); - assertEquals(1, memoryPolicyStore.prohibitions().getAll().size()); - prohibitions = memoryPolicyStore.prohibitions().getWithSubject("ua1"); - Prohibition p = prohibitions.get(0); - p = new Prohibition("test", ProhibitionSubject.userAttribute("ua2"), new AccessRightSet("read"), false, Collections.singletonList(new ContainerCondition("oa2", true))); - Prohibition actual = memoryPolicyStore.prohibitions().getWithSubject("ua1").get(0); - assertEquals("label", actual.getLabel()); - assertEquals("ua1", actual.getSubject().getName()); - assertEquals(ProhibitionSubject.Type.USER_ATTRIBUTE, actual.getSubject().getType()); - assertEquals(new AccessRightSet(), actual.getAccessRightSet()); - assertTrue(actual.isIntersection()); - assertEquals(1, actual.getContainers().size()); - assertEquals(new ContainerCondition("oa1", false), actual.getContainers().get(0)); - } - - @Test - void getProhibition() throws PMException { - memoryPolicyStore.graph().createPolicyClass("pc1", null); - memoryPolicyStore.graph().createUserAttribute("ua1", "pc1"); - memoryPolicyStore.graph().createObjectAttribute("oa1", "pc1"); - memoryPolicyStore.prohibitions().create("label", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet(), true, new ContainerCondition("oa1", false)); - Prohibition p = memoryPolicyStore.prohibitions().get("label"); - p = new Prohibition("test", ProhibitionSubject.userAttribute("ua2"), new AccessRightSet("read"), false, Collections.singletonList(new ContainerCondition("oa2", true))); - Prohibition actual = memoryPolicyStore.prohibitions().get("label"); - assertEquals("label", actual.getLabel()); - assertEquals("ua1", actual.getSubject().getName()); - assertEquals(ProhibitionSubject.Type.USER_ATTRIBUTE, actual.getSubject().getType()); - assertEquals(new AccessRightSet(), actual.getAccessRightSet()); - assertTrue(actual.isIntersection()); - assertEquals(1, actual.getContainers().size()); - assertEquals(new ContainerCondition("oa1", false), actual.getContainers().get(0)); - } - - @Test - void getObligations() throws PMException { - memoryPolicyStore.obligations().create( - new UserContext("test"), - "label", - new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - Performs.events("test_event") - ), - new Response( - new UserContext("test") - ) - ) - ); - List obligations = memoryPolicyStore.obligations().getAll(); - obligations.clear(); - assertEquals(1, memoryPolicyStore.obligations().getAll().size()); - } - - @Test - void getObligation() throws PMException { - Rule rule1 = new Rule( - "rule1", - new EventPattern( - EventSubject.anyUser(), - Performs.events("test_event") - ), - new Response( - new UserContext("test") - ) - ); - - memoryPolicyStore.obligations().create( - new UserContext("test"), - "label", - rule1 - ); - - Obligation obligation = memoryPolicyStore.obligations().get("label"); - assertEquals("label", obligation.getLabel()); - assertEquals(new UserContext("test"), obligation.getAuthor()); - assertEquals(1, obligation.getRules().size()); - assertEquals(rule1, obligation.getRules().get(0)); - } - - @Test - void testTx() throws PMException { - MemoryPolicyStore store = new MemoryPolicyStore(); - store.graph().createPolicyClass("pc1"); - try { - runTx(store, () -> { - store.graph().createObjectAttribute("oa1", "pc1"); - throw new PMException("test"); - }); - } catch (PMException e) { } - assertFalse(store.graph().nodeExists("oa1")); - } - - @Test - void testTx2() throws PMException { - MemoryPolicyStore store = new MemoryPolicyStore(); - store.graph().createPolicyClass("pc1"); - store.beginTx(); - store.graph().createObjectAttribute("oa1", "pc1"); - assertTrue(store.graph().nodeExists("oa1")); - store.rollback(); - assertFalse(store.graph().nodeExists("oa1")); - store.commit(); - assertFalse(store.graph().nodeExists("oa1")); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalkerTest.java b/src/test/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalkerTest.java deleted file mode 100644 index 79775e243..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/memory/dag/BreadthFirstGraphWalkerTest.java +++ /dev/null @@ -1,99 +0,0 @@ -package gov.nist.csd.pm.pap.memory.dag; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class BreadthFirstGraphWalkerTest { - - static PAP pap; - - @BeforeAll - static void setup() throws PMException { - pap = new PAP(new MemoryPolicyStore()); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - pap.graph().createObjectAttribute("oa1-1", "oa1"); - pap.graph().createObjectAttribute("oa1-1-1", "oa1-1"); - pap.graph().createObjectAttribute("oa1-1-2", "oa1-1"); - pap.graph().createObjectAttribute("oa1-1-3", "oa1-1"); - - pap.graph().createObjectAttribute("oa1-2", "oa1"); - pap.graph().createObjectAttribute("oa1-2-1", "oa1-2"); - pap.graph().createObjectAttribute("oa1-2-2", "oa1-2"); - pap.graph().createObjectAttribute("oa1-2-3", "oa1-2"); - } - - @Test - void testWalk() throws PMException { - List visited = new ArrayList<>(); - BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(node -> { - visited.add(node); - }); - bfs.walk("pc1"); - List expected = List.of( - "pc1", - "oa1", - "oa1-1", - "oa1-2", - "oa1-1-1", - "oa1-1-2", - "oa1-1-3", - "oa1-2-1", - "oa1-2-2", - "oa1-2-3" - ); - - assertEquals(expected, visited); - } - - @Test - void testAllPathsShortCircuit() throws PMException { - List visited = new ArrayList<>(); - BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(node -> { - visited.add(node); - }) - .withAllPathShortCircuit(node -> node.equals("oa1-2")); - - bfs.walk("pc1"); - List expected = List.of("pc1", "oa1", "oa1-1", "oa1-2"); - assertEquals(expected, visited); - - visited.clear(); - bfs = new BreadthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(visited::add) - .withAllPathShortCircuit(node -> node.equals("oa1-1-1")); - - bfs.walk("pc1"); - expected = List.of("pc1", "oa1", "oa1-1", "oa1-2", "oa1-1-1"); - assertEquals(expected, visited); - } - - @Test - void testSinglePathShortCircuit() throws PMException { - List visited = new ArrayList<>(); - BreadthFirstGraphWalker bfs = new BreadthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(visited::add) - .withSinglePathShortCircuit(node -> node.equals("oa1-1-1")); - - bfs.walk("pc1"); - List expected = List.of("pc1", "oa1", "oa1-1", "oa1-2", "oa1-1-1", - "oa1-2-1", "oa1-2-2", "oa1-2-3"); - assertEquals(expected, visited); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalkerTest.java b/src/test/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalkerTest.java deleted file mode 100644 index 424f1347d..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/memory/dag/DepthFirstGraphWalkerTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package gov.nist.csd.pm.pap.memory.dag; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.dag.walker.Direction; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class DepthFirstGraphWalkerTest { - - static PAP pap; - - @BeforeAll - static void setup() throws PMException { - pap = new PAP(new MemoryPolicyStore()); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - pap.graph().createObjectAttribute("oa1-1", "oa1"); - pap.graph().createObjectAttribute("oa1-1-1", "oa1-1"); - pap.graph().createObjectAttribute("oa1-1-2", "oa1-1"); - pap.graph().createObjectAttribute("oa1-1-3", "oa1-1"); - - pap.graph().createObjectAttribute("oa1-2", "oa1"); - pap.graph().createObjectAttribute("oa1-2-1", "oa1-2"); - pap.graph().createObjectAttribute("oa1-2-2", "oa1-2"); - pap.graph().createObjectAttribute("oa1-2-3", "oa1-2"); - } - - @Test - void testWalk() throws PMException { - List visited = new ArrayList<>(); - DepthFirstGraphWalker bfs = new DepthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor((node) -> { - visited.add(node); - }); - bfs.walk("pc1"); - List expected = List.of( - "oa1-1-1", "oa1-1-2", "oa1-1-3", "oa1-1", "oa1-2-1", "oa1-2-2", "oa1-2-3", "oa1-2", "oa1", "pc1" - ); - - assertEquals(expected, visited); - } - - @Test - void testAllPathsShortCircuit() throws PMException { - List visited = new ArrayList<>(); - DepthFirstGraphWalker dfs = new DepthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(node -> { - visited.add(node); - }) - .withAllPathShortCircuit(node -> node.equals("oa1-2-1")); - - dfs.walk("pc1"); - - List expected = List.of("oa1-1-1", "oa1-1-2", "oa1-1-3", "oa1-1", "oa1-2-1", "oa1-2", "oa1", "pc1"); - assertEquals(expected, visited); - } - - @Test - void testSinglePathShortCircuit() throws PMException { - List visited = new ArrayList<>(); - DepthFirstGraphWalker dfs = new DepthFirstGraphWalker(pap.graph()) - .withDirection(Direction.CHILDREN) - .withVisitor(node -> { - visited.add(node); - }) - .withSinglePathShortCircuit(node -> node.equals("oa1-1")); - - dfs.walk("pc1"); - - List expected = List.of("oa1-1", "oa1-2-1", "oa1-2-2", "oa1-2-3", "oa1-2", "oa1", "pc1"); - assertEquals(expected, visited); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/modification/GraphModifierTest.java b/src/test/java/gov/nist/csd/pm/pap/modification/GraphModifierTest.java new file mode 100644 index 000000000..b9e8282c2 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/modification/GraphModifierTest.java @@ -0,0 +1,882 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.graph.relationship.InvalidAssignmentException; +import gov.nist.csd.pm.pap.graph.relationship.InvalidAssociationException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.*; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.InSubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; +import static gov.nist.csd.pm.pap.graph.node.Properties.toProperties; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.ALL_ADMIN_ACCESS_RIGHTS; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class GraphModifierTest extends PAPTestInitializer { + + @Nested + class CreatePolicyClassTest { + @Test + void testNodeNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + assertDoesNotThrow(() -> pap.modify().graph().createPolicyClass("pc2")); + assertThrows(NodeNameExistsException.class, () -> pap.modify().graph().createPolicyClass("pc1")); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + assertTrue(pap.query().graph().nodeExists("pc1")); + } + + @Test + void testTx() throws PMException { + pap.runTx(tx -> { + PolicyModifier modify = pap.modify(); + modify.graph().createPolicyClass("pc1"); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + PolicyModifier modify = pap.modify(); + modify.graph().createPolicyClass("pc2"); + modify.graph().createPolicyClass("pc3"); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + assertFalse(pap.query().graph().nodeExists("pc3")); + } + } + + @Nested + class CreateObjectAttribute { + + @Test + void testNodeNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + assertThrows(NodeNameExistsException.class, + () -> pap.modify().graph().createObjectAttribute("oa1", List.of("pc1"))); + } + + @Test + void testNodeDoesNotExistException() throws PMException { + assertThrows( + NodeDoesNotExistException.class, + () -> pap.modify().graph().createObjectAttribute("oa1", List.of("pc1"))); + + pap.modify().graph().createPolicyClass("pc1"); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createObjectAttribute("oa1", List.of("pc1", "pc2"))); + } + + @Test + void testInvalidAssignmentException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows( + InvalidAssignmentException.class, + () -> pap.modify().graph().createObjectAttribute("oa1", List.of("ua1"))); + } + + @Test + void testAssignmentCausesLoopException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("oa1")); + + assertThrows( + AssignmentCausesLoopException.class, + () -> pap.modify().graph().createObjectAttribute("oa3", List.of("oa3"))); + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createObjectAttribute("oa3", List.of("oa2", "oa3"))); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("oa1")); + pap.modify().graph().setNodeProperties("oa2", toProperties("k", "v")); + + assertTrue(pap.query().graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("oa2")); + assertEquals("v", pap.query().graph().getNode("oa2").getProperties().get("k")); + + assertTrue(pap.query().graph().getAdjacentAscendants("pc1").contains("oa1")); + assertTrue(pap.query().graph().getAdjacentAscendants("oa1").contains("oa2")); + + assertTrue(pap.query().graph().getAdjacentDescendants("oa1").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa2").contains("oa1")); + } + + @Test + void testNoAssignments() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + assertThrows(DisconnectedNodeException.class, () -> pap.modify().graph().createObjectAttribute("oa1", List.of())); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.runTx(tx -> { + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + PolicyModifier modify = pap.modify(); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertFalse(pap.query().graph().nodeExists("oa2")); + assertFalse(pap.query().graph().nodeExists("oa3")); + } + } + + @Nested + class CreateUserAttributeTest { + + @Test + void testNodeNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + assertThrows(NodeNameExistsException.class, + () -> pap.modify().graph().createObjectAttribute("ua1", List.of("pc1"))); + } + + @Test + void testNodeDoesNotExistException() throws PMException { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createUserAttribute("ua1", List.of("pc1"))); + + pap.modify().graph().createPolicyClass("pc1"); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createUserAttribute("ua1", List.of("pc1", "pc2"))); + } + + @Test + void testInvalidAssignmentException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(InvalidAssignmentException.class, + () -> pap.modify().graph().createUserAttribute("ua1", List.of("oa1"))); + } + + @Test + void testAssignmentCausesLoopException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("ua1")); + + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createUserAttribute("ua3", List.of("ua3"))); + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createUserAttribute("ua3", List.of("ua2", "ua3"))); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("ua1")); + pap.modify().graph().setNodeProperties("ua2", toProperties("k", "v")); + + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().nodeExists("ua2")); + assertEquals("v", pap.query().graph().getNode("ua2").getProperties().get("k")); + + assertTrue(pap.query().graph().getAdjacentAscendants("pc1").contains("ua1")); + assertTrue(pap.query().graph().getAdjacentDescendants("ua1").contains("pc1")); + + assertTrue(pap.query().graph().getAdjacentAscendants("ua1").contains("ua2")); + assertTrue(pap.query().graph().getAdjacentDescendants("ua2").contains("ua1")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.runTx(tx -> { + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertFalse(pap.query().graph().nodeExists("ua2")); + assertFalse(pap.query().graph().nodeExists("ua3")); + } + } + + @Nested + class CreateObjectTest { + + @Test + void testNodeNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObject("o1", List.of("oa1")); + assertThrows(NodeNameExistsException.class, + () -> pap.modify().graph().createObject("o1", List.of("oa1"))); + } + + @Test + void testNodeDoesNotExistException() throws PMException { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createObject("o1", List.of("oa1"))); + + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createObjectAttribute("o1", List.of("oa1", "oa2"))); + } + + @Test + void testInvalidAssignmentException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(InvalidAssignmentException.class, + () -> pap.modify().graph().createObjectAttribute("o1", List.of("ua1"))); + } + + @Test + void testAssignmentCausesLoopException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createObject("o1", List.of("o1"))); + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createObject("o1", List.of("oa1", "o1"))); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().graph().createObject("o1", List.of("oa1")); + pap.modify().graph().setNodeProperties("o1", toProperties("k", "v")); + + assertTrue(pap.query().graph().nodeExists("o1")); + assertEquals("v", pap.query().graph().getNode("o1").getProperties().get("k")); + + assertTrue(pap.query().graph().getAdjacentAscendants("oa1").contains("o1")); + assertTrue(pap.query().graph().getAdjacentDescendants("o1").contains("oa1")); + assertTrue(pap.query().graph().getAdjacentAscendants("oa1").contains("o1")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.runTx(tx -> { + pap.modify().graph().createObject("o1", List.of("oa1")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().createUserAttribute("o2", List.of("oa1")); + pap.modify().graph().createUserAttribute("o3", List.of("oa1")); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("o1")); + assertFalse(pap.query().graph().nodeExists("o2")); + assertFalse(pap.query().graph().nodeExists("o3")); + } + } + + @Nested + class CreateUserTest { + + @Test + void testNodeNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + assertThrows(NodeNameExistsException.class, + () -> pap.modify().graph().createUser("u1", List.of("ua1"))); + } + + @Test + void testNodeDoesNotExistException() throws PMException { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createUser("u1", List.of("ua1"))); + + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().createUser("u1", List.of("ua1", "ua2"))); + } + + @Test + void testInvalidAssignmentException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(InvalidAssignmentException.class, + () -> pap.modify().graph().createUser("u1", List.of("oa1"))); + } + + @Test + void testAssignmentCausesLoopException() + throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createUser("u1", List.of("u1"))); + assertThrows(AssignmentCausesLoopException.class, + () -> pap.modify().graph().createUser("u1", List.of("ua1", "u1"))); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().setNodeProperties("u1", toProperties("k", "v")); + + assertTrue(pap.query().graph().nodeExists("u1")); + assertEquals("v", pap.query().graph().getNode("u1").getProperties().get("k")); + + assertTrue(pap.query().graph().getAdjacentAscendants("ua1").contains("u1")); + assertTrue(pap.query().graph().getAdjacentDescendants("u1").contains("ua1")); + assertTrue(pap.query().graph().getAdjacentAscendants("ua1").contains("u1")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.runTx(tx -> { + pap.modify().graph().createUser("u1", List.of("ua1")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().createUser("u2", List.of("ua1")); + pap.modify().graph().createUser("u3", List.of("ua1")); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("u1")); + assertFalse(pap.query().graph().nodeExists("u2")); + assertFalse(pap.query().graph().nodeExists("u3")); + } + } + + @Nested + class SetNodePropertiesTest { + + @Test + void testNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().setNodeProperties("oa1", NO_PROPERTIES)); + } + + @Test + void testSuccessEmptyProperties() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().setNodeProperties("pc1", NO_PROPERTIES); + + assertTrue(pap.query().graph().getNode("pc1").getProperties().isEmpty()); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().setNodeProperties("pc1", toProperties("k", "v")); + + assertEquals("v", pap.query().graph().getNode("pc1").getProperties().get("k")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.runTx(tx -> { + pap.modify().graph().createUser("u1", List.of("ua1")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().createUser("u2", List.of("ua1")); + pap.modify().graph().createUser("u3", List.of("ua1")); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("u1")); + assertFalse(pap.query().graph().nodeExists("u2")); + assertFalse(pap.query().graph().nodeExists("u3")); + } + } + + @Nested + class DeleteNodeTest { + + @Test + void testNodeDoesNotExistDoesNotThrowException() { + assertDoesNotThrow(() -> pap.modify().graph().deleteNode("pc1")); + } + + @Test + void testNodeHasAscendantsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows( + NodeHasAscendantsException.class, + () -> pap.modify().graph().deleteNode("pc1")); + } + + @Test + void DeleteNodeWithProhibitionsAndObligations() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua2")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("ua1"), + new AccessRightSet(), true, Collections.singleton(new ContainerCondition("oa1", true)) + ); + + assertThrows(NodeReferencedInProhibitionException.class, + () -> pap.modify().graph().deleteNode("ua1")); + assertThrows(NodeReferencedInProhibitionException.class, + () -> pap.modify().graph().deleteNode("oa1")); + + pap.modify().prohibitions().deleteProhibition("pro1"); + pap.modify().obligations().createObligation("u1", "oblLabel", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new InSubjectPattern("ua1")), + new OperationPattern("event1") + ), + new Response("evtCtx", List.of()) + ), + new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new InSubjectPattern("ua1")), + new OperationPattern("event1") + ), + new Response("evtCtx", List.of()) + )) + ); + + assertThrows(NodeReferencedInObligationException.class, + () -> pap.modify().graph().deleteNode("ua1")); + } + + @Test + void testSuccessPolicyClass() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().deleteNode("pc1"); + assertFalse(pap.query().graph().nodeExists("pc1")); + } + + @Test + void testSuccessObjectAttribute() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().graph().deleteNode("oa1"); + + assertFalse(pap.query().graph().nodeExists("oa1")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().associate("ua2", "oa1", new AccessRightSet("*")); + + pap.runTx(tx -> { + pap.modify().graph().deleteNode("ua1"); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().deleteNode("ua2"); + throw new PMException(""); + })); + assertTrue(pap.query().graph().nodeExists("ua2")); + assertTrue(pap.query().graph().isAscendant("ua2", "pc1")); + assertTrue(pap.query().graph().getAssociationsWithSource("ua2").contains(new Association("ua2", "oa1", new AccessRightSet("*")))); + assertFalse(pap.query().graph().nodeExists("ua1")); + } + } + + @Nested + class AssignTest { + + @Test + void testAscNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().assign("oa1", List.of("pc1"))); + } + + @Test + void testDescNodeDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().assign("oa1", List.of("oa2"))); + } + + @Test + void testAssignmentExistsDoesNothing() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + assertDoesNotThrow(() -> pap.modify().graph().assign("oa1", List.of("pc1"))); + } + + @Test + void testInvalidAssignmentException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(InvalidAssignmentException.class, + () -> pap.modify().graph().assign("ua1", List.of("oa1"))); + } + + @Test + void testAssignmentCausesLoopException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("oa1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("oa2")); + + assertThrows(AssignmentCausesLoopException.class, () -> + pap.modify().graph().assign("oa1", List.of("oa2"))); + assertThrows(AssignmentCausesLoopException.class, () -> + pap.modify().graph().assign("oa1", List.of("oa1"))); + assertThrows(AssignmentCausesLoopException.class, () -> + pap.modify().graph().assign("oa1", List.of("oa3"))); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().assign("oa2", List.of("oa1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa2").contains("oa1")); + assertTrue(pap.query().graph().getAdjacentAscendants("oa1").contains("oa2")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua4", List.of("pc1")); + + pap.runTx(tx -> { + pap.modify().graph().assign("ua4", Collections.singleton("ua1")); + pap.modify().graph().assign("ua4", Collections.singleton("ua2")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().assign("ua4", Collections.singleton("ua3")); + throw new PMException(""); + })); + + assertTrue(pap.query().graph().isAscendant("ua4", "ua1")); + assertTrue(pap.query().graph().isAscendant("ua4", "ua2")); + assertFalse(pap.query().graph().isAscendant("ua4", "ua3")); + } + } + + @Nested + class DeassignTest { + + @Test + void testAscNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, () -> + pap.modify().graph().deassign("oa1", List.of("pc1"))); + } + + @Test + void testDescNodeDoesNotExistException() throws PMException{ + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(NodeDoesNotExistException.class, () -> + pap.modify().graph().deassign("oa1", List.of("oa2"))); + } + + @Test + void AssignmentDoesNotExistDoesNothing() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().deassign("oa1", List.of("oa2")); + } + + @Test + void testDisconnectedNode() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + assertThrows(DisconnectedNodeException.class, + () -> pap.modify().graph().deassign("oa1", List.of("pc1"))); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createPolicyClass("pc2"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1", "pc2")); + pap.modify().graph().deassign("oa1", List.of("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa1").contains("pc2")); + assertFalse(pap.query().graph().getAdjacentDescendants("oa1").contains("pc1")); + assertFalse(pap.query().graph().getAdjacentAscendants("pc1").contains("oa1")); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua4", List.of("ua1", "ua2", "ua3")); + + pap.runTx(tx -> { + pap.modify().graph().deassign("ua4", Collections.singleton("ua1")); + pap.modify().graph().deassign("ua4", Collections.singleton("ua2")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().deassign("ua4", Collections.singleton("ua3")); + throw new PMException(""); + })); + + assertFalse(pap.query().graph().isAscendant("ua4", "ua1")); + assertFalse(pap.query().graph().isAscendant("ua4", "ua2")); + assertTrue(pap.query().graph().isAscendant("ua4", "ua3")); + } + + } + + @Nested + class AssociateTest { + + @Test + void testUANodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet())); + } + + @Test + void testTargetNodeDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet())); + } + + @Test + void testAssignmentExistsDoesNotThrowException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("ua1")); + assertDoesNotThrow(() -> pap.modify().graph().associate("ua2", "ua1", new AccessRightSet())); + } + + @Test + void testUnknownAccessRightException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + assertThrows(UnknownAccessRightException.class, + () -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read"))); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + assertThrows(UnknownAccessRightException.class, + () -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("write"))); + assertDoesNotThrow(() -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read"))); + assertDoesNotThrow(() -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet(ALL_ACCESS_RIGHTS))); + assertDoesNotThrow(() -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS))); + assertDoesNotThrow(() -> pap.modify().graph().associate("ua1", "oa1", new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS))); + } + + @Test + void testInvalidAssociationException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("ua1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + + assertThrows( + InvalidAssociationException.class, + () -> pap.modify().graph().associate("ua2", "pc1", new AccessRightSet())); + assertThrows(InvalidAssociationException.class, + () -> pap.modify().graph().associate("oa1", "oa2", new AccessRightSet())); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + + assertEquals( + new Association("ua1", "oa1", new AccessRightSet("read")), + pap.query().graph().getAssociationsWithSource("ua1").iterator().next() + ); + assertEquals( + new Association("ua1", "oa1", new AccessRightSet("read")), + pap.query().graph().getAssociationsWithTarget("oa1").iterator().next() + ); + } + + @Test + void testOverwriteSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + + Collection assocs = pap.query().graph().getAssociationsWithSource("ua1"); + Association assoc = assocs.iterator().next(); + assertEquals("ua1", assoc.getSource()); + assertEquals("oa1", assoc.getTarget()); + assertEquals(new AccessRightSet("read"), assoc.getAccessRightSet()); + + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read", "write")); + + assocs = pap.query().graph().getAssociationsWithSource("ua1"); + assoc = assocs.iterator().next(); + assertEquals("ua1", assoc.getSource()); + assertEquals("oa1", assoc.getTarget()); + assertEquals(new AccessRightSet("read", "write"), assoc.getAccessRightSet()); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua4", List.of("ua1", "ua2", "ua3")); + + pap.runTx(tx -> { + pap.modify().graph().associate("ua4", "ua1", new AccessRightSet("*")); + pap.modify().graph().associate("ua4", "ua2", new AccessRightSet("*")); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().associate("ua4", "ua3", new AccessRightSet("*")); + throw new PMException(""); + })); + + assertTrue(pap.query().graph().getAssociationsWithSource("ua4").containsAll(List.of( + new Association("ua4", "ua1", new AccessRightSet("*")), + new Association("ua4", "ua2", new AccessRightSet("*")) + ))); + assertFalse(pap.query().graph().getAssociationsWithSource("ua4").contains( + new Association("ua4", "ua3", new AccessRightSet("*")) + )); + } + } + + @Nested + class DissociateTest { + + @Test + void testUANodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, () -> pap.modify().graph().dissociate("ua1", "oa1")); + } + + @Test + void testTargetNodeDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertThrows(NodeDoesNotExistException.class, () -> pap.modify().graph().dissociate("ua1", "oa2")); + } + + @Test + void testAssociationDoesNotExistDoesNotThrowException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + + assertDoesNotThrow(() -> pap.modify().graph().dissociate("ua1", "oa1")); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet()); + + pap.modify().graph().dissociate("ua1", "oa1"); + + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").isEmpty()); + assertTrue(pap.query().graph().getAssociationsWithTarget("oa1").isEmpty()); + } + + @Test + void testTx() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua4", List.of("ua1", "ua2", "ua3")); + + pap.modify().graph().associate("ua4", "ua1", new AccessRightSet("*")); + pap.modify().graph().associate("ua4", "ua2", new AccessRightSet("*")); + pap.modify().graph().associate("ua4", "ua3", new AccessRightSet("*")); + + pap.runTx(tx -> { + pap.modify().graph().dissociate("ua4", "ua1"); + pap.modify().graph().dissociate("ua4", "ua2"); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().graph().dissociate("ua4", "ua3"); + throw new PMException(""); + })); + + assertFalse(pap.query().graph().getAssociationsWithSource("ua4").containsAll(List.of( + new Association("ua4", "ua1", new AccessRightSet("*")), + new Association("ua4", "ua2", new AccessRightSet("*")) + ))); + assertTrue(pap.query().graph().getAssociationsWithSource("ua4").contains( + new Association("ua4", "ua3", new AccessRightSet("*")) + )); + } + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/modification/ObligationsModifierTest.java b/src/test/java/gov/nist/csd/pm/pap/modification/ObligationsModifierTest.java new file mode 100644 index 000000000..1be2ee510 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/modification/ObligationsModifierTest.java @@ -0,0 +1,323 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.exception.ObligationDoesNotExistException; +import gov.nist.csd.pm.pap.exception.ObligationNameExistsException; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.InOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.NodeOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.InSubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.UsernamePattern; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.util.SamplePolicy.loadSamplePolicyFromPML; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class ObligationsModifierTest extends PAPTestInitializer { + + public static Obligation obligation1 = new Obligation( + "u1", + "obl1", + List.of( + new Rule( + "rule1", + new EventPattern( + new SubjectPattern(), + new OperationPattern("test_event") + ), + new Response("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("test_pc")) + )) + ) + ) + ); + + public static Obligation obligation2 = new Obligation( + "u1", + "label2") + .addRule( + new Rule( + "rule1", + new EventPattern( + new SubjectPattern(), + new OperationPattern("test_event") + ), + new Response("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("test_pc")) + )) + ) + ).addRule( + new Rule( + "rule2", + new EventPattern( + new SubjectPattern(), + new OperationPattern("test_event") + ), + new Response("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("test_pc")) + )) + ) + ); + + + @Nested + class CreateObligation { + + @Test + void testObligationNameExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules()); + + assertThrows(ObligationNameExistsException.class, () -> pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules())); + } + + @Test + void testAuthorNodeDoestNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation("u1", obligation1.getName(), + obligation1.getRules())); + } + + @Test + void testEventSubjectNodeDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation( + "u1", + "obl1", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new InSubjectPattern("ua2")), + new OperationPattern("test_event") + ), + new Response("evtCtx", List.of()) + )) + )); + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation( + "u1", + "obl1", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new InSubjectPattern("ua3")), + new OperationPattern("test_event") + ), + new Response("evtCtx", List.of()) + )) + )); + } + + @Test + void testEventTargetNodeDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation( + "u1", + "obl1", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("test_event"), + Map.of("", List.of(new NodeOperandPattern("oa1"))) + ), + new Response("evtCtx", List.of()) + )) + )); + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation( + "u1", + "obl1", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("test_event"), + Map.of("", List.of(new NodeOperandPattern("oa1"))) + ), + new Response("evtCtx", List.of()) + )) + )); + assertThrows(NodeDoesNotExistException.class, + () -> pap.modify().obligations().createObligation( + "u1", + "obl1", + List.of(new Rule( + "rule1", + new EventPattern( + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("test_event"), + Map.of("", List.of(new InOperandPattern("oa1"))) + ), + new Response("evtCtx", List.of()) + )) + )); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules()); + + assertThrows(ObligationNameExistsException.class, + () -> pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), List.of())); + + Obligation actual = pap.query().obligations().getObligation(obligation1.getName()); + assertEquals(obligation1, actual); + } + + @Test + void testTx() throws PMException, IOException { + loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + pap.executePML(new UserContext("u1"), """ + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + + create obligation "ob2" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.executePML(new UserContext("u1"), """ + create obligation "ob3" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + + create obligation "ob4" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """); + throw new PMException(""); + })); + + assertDoesNotThrow(() -> pap.query().obligations().getObligation("ob1")); + assertDoesNotThrow(() -> pap.query().obligations().getObligation("ob2")); + assertThrows(ObligationDoesNotExistException.class, () -> pap.query().obligations().getObligation("ob3")); + assertThrows(ObligationDoesNotExistException.class, () -> pap.query().obligations().getObligation("ob4")); + } + } + + @Nested + class DeleteObligation { + @Test + public void testSuccess() throws PMException, IOException { + loadSamplePolicyFromPML(pap); + + pap.executePML(new UserContext("u1"), """ + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """); + + pap.modify().obligations().deleteObligation("ob1"); + + assertThrows(ObligationDoesNotExistException.class, () -> pap.query().obligations().getObligation("ob1")); + } + + @Test + void testTx() throws PMException, IOException { + loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + pap.executePML(new UserContext("u1"), """ + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + + create obligation "ob2" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """); + }); + assertThrows(PMException.class, () -> pap.runTx(tx -> { + pap.modify().obligations().deleteObligation("ob1"); + pap.modify().obligations().deleteObligation("ob2"); + throw new PMException(""); + })); + + assertDoesNotThrow(() -> pap.query().obligations().getObligation("ob1")); + assertDoesNotThrow(() -> pap.query().obligations().getObligation("ob2")); + } + } + + @Nested + class DeleteNode { + + @Test + void testDeleteNonExistingObligationDoesNOtThrowExcpetion() { + assertDoesNotThrow(() -> pap.modify().obligations().deleteObligation(obligation1.getName())); + } + + @Test + void testDeleteObligation() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules()); + pap.modify().obligations().createObligation(obligation2.getAuthor(), obligation2.getName(), obligation2.getRules()); + + pap.modify().obligations().deleteObligation(obligation1.getName()); + + assertThrows(ObligationDoesNotExistException.class, + () -> pap.query().obligations().getObligation(obligation1.getName())); + } + } + + + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/modification/OperationsModifierTest.java b/src/test/java/gov/nist/csd/pm/pap/modification/OperationsModifierTest.java new file mode 100644 index 000000000..7c3ac92bc --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/modification/OperationsModifierTest.java @@ -0,0 +1,91 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.AdminAccessRightExistsException; +import gov.nist.csd.pm.pap.exception.OperationExistsException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.graph.AssignOp; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_POLICY_CLASS; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class OperationsModifierTest extends PAPTestInitializer { + + Operation testOp = new Operation<>("test", List.of()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + @Nested + class SetResourceOperations { + @Test + void testAdminAccessRightExistsException() { + assertThrows(AdminAccessRightExistsException.class, () -> + pap.modify().operations().setResourceOperations(new AccessRightSet(CREATE_POLICY_CLASS))); + } + + @Test + void testSuccess() throws PMException { + AccessRightSet arset = new AccessRightSet("read", "write"); + pap.modify().operations().setResourceOperations(arset); + assertEquals(arset, pap.query().operations().getResourceOperations()); + } + } + + @Nested + class CreateAdminOperation { + + @Test + void testSuccess() throws PMException { + pap.modify().operations().createAdminOperation(testOp); + + assertDoesNotThrow(() -> pap.query().operations().getAdminOperation("assign")); + } + + @Test + void testOperationExists() throws PMException { + pap.modify().operations().createAdminOperation(testOp); + + assertThrows(OperationExistsException.class, + () -> pap.modify().operations().createAdminOperation(new AssignOp())); + assertThrows(OperationExistsException.class, + () -> pap.modify().operations().createAdminOperation(testOp)); + + } + + } + + @Nested + class DeleteAdminOperation { + + @Test + void testSuccess() throws PMException { + pap.modify().operations().createAdminOperation(testOp); + pap.modify().operations().deleteAdminOperation("test"); + assertDoesNotThrow(() -> pap.modify().operations().deleteAdminOperation("assign")); + } + + @Test + void testCannotDeleteBuiltinOperation() { + assertDoesNotThrow(() -> pap.modify().operations().deleteAdminOperation("assign")); + assertDoesNotThrow(() -> pap.query().operations().getAdminOperation("assign")); + } + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifierTest.java b/src/test/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifierTest.java new file mode 100644 index 000000000..f03f9d927 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/modification/ProhibitionsModifierTest.java @@ -0,0 +1,198 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.*; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.*; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.ALL_ADMIN_ACCESS_RIGHTS; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class ProhibitionsModifierTest extends PAPTestInitializer { + + @Nested + class CreateProhibitionTest { + + @Test + void testProhibitionExistsException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + + pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet(), false, List.of()); + + assertThrows( + ProhibitionExistsException.class, + () -> pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet(), false, List.of())); + } + + @Test + void testProhibitionSubjectDoesNotExistException() { + assertThrows( + ProhibitionSubjectDoesNotExistException.class, + () -> pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet(ALL_ADMIN_ACCESS_RIGHTS), false, List.of())); + } + + + @Test + void testUnknownAccessRightException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + + assertThrows( + UnknownAccessRightException.class, + () -> pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), false, List.of())); + } + + @Test + void testProhibitionContainerDoesNotExistException() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + assertThrows( + ProhibitionContainerDoesNotExistException.class, + () -> pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), false, + Collections.singleton(new ContainerCondition("oa1", true)) + )); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false) + ) + ); + + Prohibition p = pap.query().prohibitions().getProhibition("pro1"); + assertEquals("pro1", p.getName()); + assertEquals("subject", p.getSubject().getName()); + assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); + assertTrue(p.isIntersection()); + assertEquals(2, p.getContainers().size()); + List expected = List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false) + ); + assertTrue(expected.containsAll(p.getContainers()) && p.getContainers().containsAll(expected)); + } + + @Test + void testTx() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + tx.executePML(new UserContext("u1"), """ + create prohibition "p1" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + + create prohibition "p2" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + """); + }); + + assertThrows(PMException.class, () -> pap.runTx(tx -> { + tx.executePML(new UserContext("u1"), """ + create prohibition "p3" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + + create prohibition "p4" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + """); + throw new PMException(""); + })); + + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("p1")); + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("p2")); + assertThrows(ProhibitionDoesNotExistException.class, + () -> pap.query().prohibitions().getProhibition("p3")); + assertThrows(ProhibitionDoesNotExistException.class, + () -> pap.query().prohibitions().getProhibition("p4")); + + } + } + + @Nested + class DeleteProhibitionTest { + + @Test + void testNonExistingProhibitionDoesNotThrowException() { + assertDoesNotThrow(() -> pap.modify().prohibitions().deleteProhibition("pro1")); + } + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("pro1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false))); + + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("pro1")); + + pap.modify().prohibitions().deleteProhibition("pro1"); + + assertThrows(ProhibitionDoesNotExistException.class, + () -> pap.query().prohibitions().getProhibition("pro1")); + } + + @Test + void testTx() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + tx.executePML(new UserContext("u1"), """ + create prohibition "p1" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + + create prohibition "p2" + deny user attribute "ua1" + access rights ["read"] + on union of ["US project"] + """); + }); + + assertThrows(PMException.class, () -> pap.runTx(tx -> { + tx.executePML(new UserContext("u1"), """ + delete prohibition "p1" + delete prohibition "p2" + """); + throw new PMException(""); + })); + + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("p1")); + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("p2")); + } + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/modification/RoutinesModifierTest.java b/src/test/java/gov/nist/csd/pm/pap/modification/RoutinesModifierTest.java new file mode 100644 index 000000000..4f3489711 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/modification/RoutinesModifierTest.java @@ -0,0 +1,177 @@ +package gov.nist.csd.pm.pap.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.RoutineExistsException; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +public abstract class RoutinesModifierTest extends PAPTestInitializer { + + @Nested + class CreateAdminRoutine { + + @Test + void testSuccess() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + assertTrue(pap.query().routines().getAdminRoutineNames().contains("routine1")); + } + + @Test + void testRoutineExists() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + assertThrows(RoutineExistsException.class, () -> { + pap.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + }); + } + + @Test + void testTx() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + tx.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + tx.modify().routines().createAdminRoutine(new Routine( + "routine2", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + }); + + assertThrows(PMException.class, () -> pap.runTx(tx -> { + tx.modify().routines().createAdminRoutine(new Routine( + "routine3", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + tx.modify().routines().createAdminRoutine(new Routine( + "routine4", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + throw new PMException(""); + })); + + assertTrue(pap.query().routines().getAdminRoutineNames().containsAll(List.of("routine1", "routine2"))); + assertFalse(pap.query().routines().getAdminRoutineNames().containsAll(List.of("routine3", "routine4"))); + } + } + + @Nested + class DeleteAdminRoutine { + + @Test + void testSuccess() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + pap.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + pap.modify().routines().deleteAdminRoutine("routine1"); + pap.modify().routines().deleteAdminRoutine("routine1"); + assertFalse(pap.query().routines().getAdminRoutineNames().contains("routine1")); + } + + @Test + void testTx() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.runTx(tx -> { + tx.modify().routines().createAdminRoutine(new Routine( + "routine1", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + tx.modify().routines().createAdminRoutine(new Routine( + "routine2", + List.of("a", "b") + ) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + }); + + assertThrows(PMException.class, () -> pap.runTx(tx -> { + tx.modify().routines().deleteAdminRoutine("routine1"); + tx.modify().routines().deleteAdminRoutine("routine2"); + + throw new PMException(""); + })); + + assertTrue(pap.query().routines().getAdminRoutineNames().containsAll(List.of("routine1", "routine2"))); + } + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPAPTest.java b/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPAPTest.java deleted file mode 100644 index b2e946c96..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPAPTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.ProhibitionDoesNotExistException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.sql.*; - -import static org.junit.jupiter.api.Assertions.*; - -class MysqlPAPTest { - - static MysqlTestEnv testEnv; - - @BeforeAll - static void start() throws PMException, IOException { - testEnv = new MysqlTestEnv(); - testEnv.start(); - } - - @AfterAll - static void stop() { - testEnv.stop(); - } - - @AfterEach - void reset() throws SQLException { - testEnv.reset(); - } - - @Test - void testTx() throws SQLException, PMException { - try (Connection connection = DriverManager.getConnection(testEnv.getConnectionUrl(), testEnv.getUser(), testEnv.getPassword()); - Connection connection2 = DriverManager.getConnection(testEnv.getConnectionUrl(), testEnv.getUser(), testEnv.getPassword())) { - - PAP pap = new PAP(new MysqlPolicyStore(connection)); - pap.beginTx(); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.commit(); - - - PAP pap2 = new PAP(new MysqlPolicyStore(connection2)); - assertTrue(pap2.graph().nodeExists("pc1")); - assertTrue(pap2.graph().nodeExists("oa1")); - } - } - - @Test - void testRollbackProhibitionTx() throws PMException, IOException, SQLException { - Connection connection - = DriverManager.getConnection(testEnv.getConnectionUrl(), testEnv.getUser(), testEnv.getPassword()); - MysqlPolicyStore mysqlPolicyStore = new MysqlPolicyStore(connection); - - PAP pap = new PAP(mysqlPolicyStore); - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - try(Statement stmt = connection.createStatement()) { - stmt.executeUpdate("SET FOREIGN_KEY_CHECKS=0"); - stmt.executeUpdate("insert into prohibition_container values (1, (select id from node where name = 'oa1'), 1)"); - stmt.executeUpdate("SET FOREIGN_KEY_CHECKS=1"); - } - - assertThrows(MysqlPolicyException.class, () -> - pap.prohibitions().create("label", ProhibitionSubject.userAttribute("ua1"), - new AccessRightSet(), false, new ContainerCondition("oa1", true))); - assertThrows(ProhibitionDoesNotExistException.class, () -> pap.prohibitions().get("label")); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializerTest.java b/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializerTest.java deleted file mode 100644 index eda1ba103..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlPolicyDeserializerTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.SamplePolicy; -import gov.nist.csd.pm.pap.memory.MemoryPolicyDeserializer; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.PolicyEquals; -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -import static org.junit.jupiter.api.Assertions.*; - -class MysqlPolicyDeserializerTest { - - static MysqlTestEnv testEnv; - - @BeforeAll - static void start() throws PMException, IOException { - testEnv = new MysqlTestEnv(); - testEnv.start(); - } - - @AfterAll - static void stop() { - testEnv.stop(); - } - - @AfterEach - void reset() throws SQLException { - testEnv.reset(); - } - - @Test - void testDeserialize() throws PMException, IOException, SQLException { - try (Connection connection = DriverManager.getConnection(testEnv.getConnectionUrl(), testEnv.getUser(), testEnv.getPassword())) { - MysqlPolicyStore mysqlPolicyStore = new MysqlPolicyStore(connection); - SamplePolicy.loadSamplePolicyFromPML(mysqlPolicyStore); - - String json = mysqlPolicyStore.serialize().toJSON(); - - MemoryPolicyStore actual = new MemoryPolicyStore(); - new MemoryPolicyDeserializer(actual).fromJSON(json); - - PolicyEquals.check(mysqlPolicyStore, actual); - } - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlTestEnv.java b/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlTestEnv.java deleted file mode 100644 index 0366d9ec7..000000000 --- a/src/test/java/gov/nist/csd/pm/pap/mysql/MysqlTestEnv.java +++ /dev/null @@ -1,127 +0,0 @@ -package gov.nist.csd.pm.pap.mysql; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.testcontainers.containers.MySQLContainer; -import org.testcontainers.junit.jupiter.Container; -import org.testcontainers.utility.DockerImageName; - -import java.io.IOException; -import java.io.InputStream; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Properties; - -public class MysqlTestEnv { - - public static final String EXECUTION_PROPERTY = "execution"; - public static final String CONNECTION_PROPERTY = "connectionUrl"; - public static final String USER_PROPERTY = "user"; - public static final String PASSWORD_PROPERTY = "password"; - public static final String EXTERNAL_EXECUTION = "external"; - public static final String CONTAINER_EXECUTION = "container"; - public static final DockerImageName MYSQL_8_IMAGE = DockerImageName.parse("mysql:8.0.24"); - - @Container - private MySQLContainer container; - - private String connectionUrl; - private String user; - private String password; - - public MysqlTestEnv() throws IOException, PMException { - Properties properties = new Properties(); - try(InputStream is = getClass().getResourceAsStream("/sql/db.properties")) { - properties.load(is); - } - - if (!properties.containsKey(EXECUTION_PROPERTY) - || !(properties.get(EXECUTION_PROPERTY).equals(EXTERNAL_EXECUTION) - || properties.get(EXECUTION_PROPERTY).equals(CONTAINER_EXECUTION))) { - throw new PMException("mysql tests expect the 'execution' property to be set " + - "in /resources/sql/db/properties to 'external' or 'container'"); - } - - if (properties.get(EXECUTION_PROPERTY).equals(EXTERNAL_EXECUTION)) { - if (!(properties.containsKey(CONNECTION_PROPERTY) - && properties.containsKey(USER_PROPERTY) - && properties.containsKey(PASSWORD_PROPERTY))) { - throw new PMException("using an external database for mysql tests expects " + - "the 'connectionUrl', 'user', and 'password' properties to be set in " + - "/resources/sql/db/properties"); - } - - this.connectionUrl = properties.getProperty(CONNECTION_PROPERTY); - this.user = properties.getProperty(USER_PROPERTY); - this.password = properties.getProperty(PASSWORD_PROPERTY); - } else { - this.container = new MySQLContainer<>(MYSQL_8_IMAGE) - .withDatabaseName("pm_core") - .withUsername("test") - .withPassword("test") - .withEnv("MYSQL_ROOT_PASSWORD", "test"); - } - } - - public synchronized Connection getConnection() throws SQLException { - if (container == null) { - return DriverManager.getConnection(connectionUrl, user, password); - } else { - return DriverManager.getConnection(container.getJdbcUrl(), container.getUsername(), container.getPassword()); - } - } - - public synchronized void start() { - if (container != null) { - container.start(); - } - - try(InputStream is = getClass().getResourceAsStream("/sql/pm_core.sql")) { - String sql = new String(is.readAllBytes()); - String[] split = sql.split(";"); - Connection conn = getConnection(); - Statement stmt = conn.createStatement(); - for (String s : split) { - stmt.execute(s); - } - - conn.close(); - } catch (SQLException | IOException e) { - throw new RuntimeException(e); - } - } - - public synchronized void stop() { - if (container == null) { - return; - } - - container.stop(); - } - - public synchronized void reset() throws SQLException { - Connection connection = getConnection(); - List sequence = PolicyResetSequence.getSequence(); - try (Statement stmt = connection.createStatement()) { - for (String s : sequence) { - stmt.executeUpdate(s); - } - } - connection.close(); - } - - public String getConnectionUrl() { - return container == null ? connectionUrl : container.getJdbcUrl(); - } - - public String getUser() { - return container == null ? user : container.getUsername(); - } - - public String getPassword() { - return container == null ? password : container.getPassword(); - } - -} diff --git a/src/test/java/gov/nist/csd/pm/pap/op/OperationTest.java b/src/test/java/gov/nist/csd/pm/pap/op/OperationTest.java new file mode 100644 index 000000000..a16749fbd --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/op/OperationTest.java @@ -0,0 +1,35 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.exception.OperandsDoNotMatchException; +import gov.nist.csd.pm.pap.op.graph.AssignOp; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.ASCENDANT_OPERAND; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; +import static org.junit.jupiter.api.Assertions.*; + +class OperationTest { + + @Test + void testValidateOperands() { + AssignOp assignOp = new AssignOp(); + assertThrows(OperandsDoNotMatchException.class, + () -> assignOp.validateOperands(Map.of("a", "a", "b", "b", "c", "c"))); + assertThrows(OperandsDoNotMatchException.class, + () -> assignOp.validateOperands(Map.of(ASCENDANT_OPERAND, "a", + DESCENDANTS_OPERAND, List.of("b"), "c", "c"))); + + } + + @Test + void testIllegalOperandValueException() throws OperandsDoNotMatchException { + AssignOp assignOp = new AssignOp(); + assertDoesNotThrow(() -> assignOp.withOperands(Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, List.of("b")))); + + assertThrows(IllegalArgumentException.class, () -> assignOp.withOperands(Map.of(ASCENDANT_OPERAND, "a", DESCENDANTS_OPERAND, Map.of("a", "b")))); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/op/PreparedOperationTest.java b/src/test/java/gov/nist/csd/pm/pap/op/PreparedOperationTest.java new file mode 100644 index 000000000..4793507f7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/op/PreparedOperationTest.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.op; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.graph.GraphOp.ASCENDANT_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; +import static org.junit.jupiter.api.Assertions.*; + +class PreparedOperationTest { + + @Test + void testExecute() throws PMException { + Operation op1 = new Operation<>("op1", List.of("a", "b", "c", "d"), List.of("c", "d")) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass("ok"); + + return null; + } + }; + + PreparedOperation preparedOperation = new PreparedOperation<>( + op1, Map.of( + ASCENDANT_OPERAND, "c", + DESCENDANTS_OPERAND, List.of("a", "b") + ) + ); + + EventContext execute = preparedOperation.execute(new MemoryPAP(), new UserContext("u1")); + assertEquals(execute, new EventContext("u1", "", op1, + Map.of(ASCENDANT_OPERAND, "c", DESCENDANTS_OPERAND, List.of("a", "b")))); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/op/obligation/ObligationOpTest.java b/src/test/java/gov/nist/csd/pm/pap/op/obligation/ObligationOpTest.java new file mode 100644 index 000000000..6288c44c8 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/op/obligation/ObligationOpTest.java @@ -0,0 +1,51 @@ +package gov.nist.csd.pm.pap.op.obligation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.pattern.operand.InOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.NodeOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.LogicalSubjectPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBLIGATION; +import static gov.nist.csd.pm.pap.op.obligation.ObligationOp.checkPatternPrivileges; +import static org.junit.jupiter.api.Assertions.*; + +class ObligationOpTest { + + @Test + void testCheckPatternPrivileges() throws PMException { + MemoryPAP pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and "oa2" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + checkPatternPrivileges(pap, new UserContext("u1"), new SubjectPattern(), CREATE_OBLIGATION); + assertThrows(UnauthorizedException.class, + () -> checkPatternPrivileges(pap, new UserContext("u2"), new SubjectPattern(), CREATE_OBLIGATION)); + + checkPatternPrivileges(pap, new UserContext("u1"), new LogicalSubjectPatternExpression( + new NodeOperandPattern("oa1"), + new InOperandPattern("oa2"), + true + ), CREATE_OBLIGATION); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/ExecutionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/ExecutionTest.java new file mode 100644 index 000000000..56e14353d --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/ExecutionTest.java @@ -0,0 +1,479 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +public class ExecutionTest { + + static UserContext superUser = new UserContext("u1"); + + @Test + void testGraphPML() throws PMException { + PAP pap = new MemoryPAP(); + + String input = + """ + set resource operations ["read", "write"] + + create policy class "pc1" + + set properties of "pc1" to {"k": "v"} + + create object attribute "oa1" in ["pc1"] + create object attribute "oa2" in ["pc1"] + create object attribute "oa3" in ["pc1"] + + var descendants = ["oa1", "oa2", "oa3"] + create object "o1" in descendants + + create user attribute "ua1" in ["pc1"] + create user attribute "ua2" in ["pc1"] + create user attribute "ua3" in ["pc1"] + + var username = "u1" + create user username in ["ua1"] + assign username to ["ua2", "ua3"] + + associate "ua1" and "oa1" with ["read", "write"] + associate "ua2" and "oa2" with ["read", "write"] + associate "ua3" and "oa3" with ["read", "write"] + """; + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("oa2")); + assertTrue(pap.query().graph().nodeExists("oa3")); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().nodeExists("ua2")); + assertTrue(pap.query().graph().nodeExists("ua3")); + assertTrue(pap.query().graph().nodeExists("o1")); + assertTrue(pap.query().graph().nodeExists("u1")); + + assertEquals("v", pap.query().graph().getNode("pc1").getProperties().get("k")); + + Collection ascendants = pap.query().graph().getAdjacentAscendants("pc1"); + assertTrue(ascendants.containsAll(Arrays.asList("ua1", "ua2", "ua3"))); + ascendants = pap.query().graph().getAdjacentAscendants("pc1"); + assertTrue(ascendants.containsAll(Arrays.asList("oa1", "oa2", "oa3"))); + + assertTrue(pap.query().graph().getAdjacentDescendants("ua1").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("ua2").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("ua3").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa1").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa2").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa3").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("u1").containsAll(Arrays.asList("ua1", "ua2", "ua3"))); + assertTrue(pap.query().graph().getAdjacentDescendants("o1").containsAll(Arrays.asList("oa1", "oa2", "oa3"))); + + assertEquals(new Association("ua1", "oa1", new AccessRightSet("read", "write")), + pap.query().graph().getAssociationsWithSource("ua1").iterator().next()); + assertEquals(new Association("ua2", "oa2", new AccessRightSet("read", "write")), + pap.query().graph().getAssociationsWithSource("ua2").iterator().next()); + assertEquals(new Association("ua3", "oa3", new AccessRightSet("read", "write")), + pap.query().graph().getAssociationsWithSource("ua3").iterator().next()); + + input = """ + dissociate "ua1" and "oa1" + """; + pap.executePML(superUser, input); + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").isEmpty()); + + input = + """ + deassign "u1" from ["ua1", "ua2"] + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().getAdjacentDescendants("u1").containsAll(Arrays.asList("ua1", "ua2"))); + assertFalse(pap.query().graph().getAdjacentAscendants("ua1").contains("u1")); + assertFalse(pap.query().graph().getAdjacentAscendants("ua2").contains("u1")); + + input = + """ + delete user "u1" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().nodeExists("u1")); + + input = + """ + deassign "o1" from ["oa1"] + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().getAdjacentDescendants("oa1").contains("oa1")); + assertFalse(pap.query().graph().getAdjacentAscendants("oa1").contains("o1")); + + input = + """ + delete object "o1" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().nodeExists("o1")); + + input = + """ + delete user attribute "ua1" + delete user attribute "ua2" + delete user attribute "ua3" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().nodeExists("ua1")); + assertFalse(pap.query().graph().nodeExists("ua2")); + assertFalse(pap.query().graph().nodeExists("ua3")); + + + input = + """ + delete object attribute "oa1" + delete object attribute "oa2" + delete object attribute "oa3" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().nodeExists("oa1")); + assertFalse(pap.query().graph().nodeExists("oa2")); + assertFalse(pap.query().graph().nodeExists("oa3")); + + input = + """ + delete policy class "pc1" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().graph().nodeExists("pc1")); + } + + @Test + void testIf() throws PMException { + PAP pap = new MemoryPAP(); + String input = """ + var x = "test" + var y = "test" + if equals(x, y) { + create policy class "pc1" + } + """; + pap.executePML(superUser, input); + assertTrue(pap.query().graph().nodeExists("pc1")); + + input = """ + var x = "test" + var y = "test" + var z = "test1" + if equals(x, z) { + create policy class "pc1" + } else if equals(x, y) { + create policy class "pc2" + } + """; + pap = new MemoryPAP(); + pap.executePML(superUser, input); + + assertFalse(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + + input = """ + var x = "test" + var y = "test1" + var z = "test2" + if equals(x, z) { + create policy class "pc1" + } else if equals(x, y) { + create policy class "pc2" + } else { + create policy class "pc3" + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertFalse(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + + input = """ + var x = "test" + var y = "test1" + var z = "test2" + if equals(x, y) { + create policy class "pc1" + } else { + create policy class "pc2" + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertFalse(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + + input = """ + var x = "test" + var y = "test1" + var z = "test2" + if !equals(x, y) { + create policy class "pc1" + } else { + create policy class "pc2" + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + } + + @Test + void testForeach() throws PMException { + PAP pap = new MemoryPAP(); + + String input = """ + foreach x in ["pc1", "pc2", "pc3"] { + create policy class x + } + """; + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + + input = """ + var m = {"k1": "pc1", "k2": "pc2", "k3": "pc3"} + foreach x, y in m { + create policy class y + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + + input = """ + foreach x, y in {"k1": ["pc1", "pc2"], "k2": ["pc3"]} { + foreach z in y { + create policy class z + } + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + + input = """ + foreach x, y in {"k1": ["pc1", "pc2"], "k2": ["pc3"]} { + foreach z in y { + create policy class z + break + } + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + + input = """ + foreach x, y in {"k1": ["pc1", "pc2"], "k2": ["pc3"]} { + foreach z in y { + continue + create policy class z + } + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertFalse(pap.query().graph().nodeExists("pc1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + assertFalse(pap.query().graph().nodeExists("pc3")); + + input = """ + var a = "test" + var b = "test" + foreach x in ["pc1", "pc2", "pc3"] { + if equals(a, b) { + a = "test2" + continue + } + + create policy class x + } + """; + pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertFalse(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("pc2")); + assertTrue(pap.query().graph().nodeExists("pc3")); + } + + @Test + void testFunction() throws PMException { + String input = """ + operation testFunc(any x) { + create policy class x + } + + testFunc("pc1") + """; + PAP pap = new MemoryPAP(); + + pap.executePML(superUser, input); + + assertTrue(pap.query().graph().nodeExists("pc1")); + + String input1 = """ + operation testFunc(any x) { + create policy class x + } + + testFunc(["pc1"]) + """; + + + PAP pap1 = new MemoryPAP(); + assertThrows(ClassCastException.class, () -> pap1.executePML(superUser, input1)); + + PAP pap2 = new MemoryPAP(); + String input2 = """ + x := "hello" + operation testFunc() { + create policy class x + " world" + } + + testFunc() + """; + + PMLCompilationException e = assertThrows( + PMLCompilationException.class, + () -> pap2.executePML(superUser, input2) + ); + assertEquals(1, e.getErrors().size()); + assertEquals("unknown variable 'x' in scope", e.getErrors().get(0).errorMessage()); + } + + @Test + void testMaps() throws PMException { + String input = """ + var m = {"k1": {"k1-1": {"k1-1-1": "v1"}}} + var x = m["k1"]["k1-1"]["k1-1-1"] + create policy class x + """; + PAP pap = new MemoryPAP(); + + pap.executePML(superUser, input); + assertTrue(pap.query().graph().getPolicyClasses().contains("v1")); + } + + @Test + void testArrayWithLiteral() throws PMException { + String input = """ + set resource operations ["read", "write"] + """; + PAP pap = new MemoryPAP(); + + pap.executePML(superUser, input); + assertTrue(pap.query().operations().getResourceOperations().contains("read")); + + String input1 = """ + set resource operations [["read", "write"], ["exec"]] + """; + assertThrows(PMException.class, () -> pap.executePML(superUser, input1)); + } + + @Test + void testDeleteNonExistentNode() throws PMException { + String input = """ + delete pc "pc1" + """; + PAP pap = new MemoryPAP(); + + assertDoesNotThrow(() -> pap.executePML(superUser, input)); + } + + @Test + void testDeleteProhibition() throws PMException { + PAP pap = new MemoryPAP(); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + String input = """ + create prohibition "p1" + deny user attribute "ua1" + access rights ["read"] + on union of ["oa1"] + """; + pap.executePML(superUser, input); + + input = """ + delete prohibition "p1" + """; + pap.executePML(superUser, input); + assertFalse(pap.query().prohibitions().getProhibitions().containsKey("p1")); + } + + @Test + void testReturnValue() throws PMException { + String pml = """ + operation testFunc(string s) string { + return s + } + + create policy class testFunc("test") + """; + + PAP pap = new MemoryPAP(); + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + assertTrue(pap.query().graph().nodeExists("test")); + } + + @Test + void testOverwriteFunctionArg() throws PMException { + String pml = """ + operation testFunc(string s) string { + s = "test2" + return s + } + + create policy class testFunc("test") + """; + + PAP pap = new MemoryPAP(); + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + assertFalse(pap.query().graph().nodeExists("test")); + assertTrue(pap.query().graph().nodeExists("test2")); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/FunctionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/FunctionTest.java new file mode 100644 index 000000000..3dcefef2e --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/FunctionTest.java @@ -0,0 +1,70 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +public class FunctionTest { + + @Test + void testElseIfNotAllPathsReturn() { + String pml = """ + operation fun(string a) string { + if equals(a, "a") { + return "a" + } else if equals(a, "b") { + return "b" + } + } + """; + + PMLCompilationException e = assertThrows(PMLCompilationException.class, () -> { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + }); + assertEquals("not all conditional paths return", e.getErrors().get(0).errorMessage()); + } + + @Test + void testElseAllPathsReturn() { + String pml2 = """ + operation fun(string a) string { + if equals(a, "a") { + return "a" + } else if equals(a, "b") { + return "b" + } else { + return "c" + } + } + """; + + assertDoesNotThrow(() -> { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml2); + }); + } + + @Test + void testElseWithNoElseIfAllPathsReturn() { + String pml2 = """ + operation fun(string a) string { + if equals(a, "a") { + return "a" + } else { + return "b" + } + } + """; + + assertDoesNotThrow(() -> { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml2); + }); + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/PMLContextVisitor.java b/src/test/java/gov/nist/csd/pm/pap/pml/PMLContextVisitor.java new file mode 100644 index 000000000..c6058aec5 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/PMLContextVisitor.java @@ -0,0 +1,228 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.pml.antlr.PMLLexer; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.antlr.PMLParserBaseVisitor; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RuleContext; + +public class PMLContextVisitor extends PMLParserBaseVisitor { + + public static T toCtx(String input, Class t) { + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + RuleContext ruleContext = new PMLContextVisitor().visitPml(parser.pml()); + + return t.cast(ruleContext); + } + + public static PMLParser.StatementBlockContext toStatementBlockCtx(String input) { + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + return parser.statementBlock(); + } + + public static T toExpressionCtx(String input, Class t) { + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + PMLParser.ExpressionContext expr = parser.expression(); + + return t.cast(expr); + } + + public static T toLiteralCtx(String input, Class t) { + PMLErrorHandler pmlErrorHandler = new PMLErrorHandler(); + + PMLLexer lexer = new PMLLexer(CharStreams.fromString(input)); + lexer.removeErrorListeners(); + lexer.addErrorListener(pmlErrorHandler); + + CommonTokenStream tokens = new CommonTokenStream(lexer); + PMLParser parser = new PMLParser(tokens); + parser.removeErrorListeners(); + parser.addErrorListener(pmlErrorHandler); + + PMLParser.LiteralContext expr = parser.literal(); + + return t.cast(expr); + } + + @Override + public RuleContext visitPml(PMLParser.PmlContext ctx) { + PMLParser.StatementContext statement = ctx.statement(0); + return visitStatement(statement); + } + + @Override + public RuleContext visitCreatePolicyStatement(PMLParser.CreatePolicyStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitCreateNonPCStatement(PMLParser.CreateNonPCStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitCreateObligationStatement(PMLParser.CreateObligationStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitCreateProhibitionStatement(PMLParser.CreateProhibitionStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitSetNodePropertiesStatement(PMLParser.SetNodePropertiesStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitAssignStatement(PMLParser.AssignStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitDeassignStatement(PMLParser.DeassignStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitAssociateStatement(PMLParser.AssociateStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitDissociateStatement(PMLParser.DissociateStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitSetResourceOperationsStatement(PMLParser.SetResourceOperationsStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitDeleteStatement(PMLParser.DeleteStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitDeleteRuleStatement(PMLParser.DeleteRuleStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitVarDeclaration(PMLParser.VarDeclarationContext ctx) { + return ctx; + } + + @Override + public RuleContext visitShortDeclaration(PMLParser.ShortDeclarationContext ctx) { + return ctx; + } + + @Override + public RuleContext visitVariableAssignmentStatement(PMLParser.VariableAssignmentStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitFunctionDefinitionStatement(PMLParser.FunctionDefinitionStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitReturnStatement(PMLParser.ReturnStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitFunctionInvokeStatement(PMLParser.FunctionInvokeStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitForeachStatement(PMLParser.ForeachStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitBreakStatement(PMLParser.BreakStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitContinueStatement(PMLParser.ContinueStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitIfStatement(PMLParser.IfStatementContext ctx) { + return ctx; + } + + @Override + public RuleContext visitNegateExpression(PMLParser.NegateExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitLogicalExpression(PMLParser.LogicalExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitPlusExpression(PMLParser.PlusExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitFunctionInvokeExpression(PMLParser.FunctionInvokeExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitVariableReferenceExpression(PMLParser.VariableReferenceExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitLiteralExpression(PMLParser.LiteralExpressionContext ctx) { + return ctx; + } + + @Override + public RuleContext visitEqualsExpression(PMLParser.EqualsExpressionContext ctx) { + return ctx; + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/PMLTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/PMLTest.java new file mode 100644 index 000000000..5f52d4ba5 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/PMLTest.java @@ -0,0 +1,179 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pdp.AdminAdjudicationResponse; +import gov.nist.csd.pm.pdp.OperationRequest; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pdp.Decision.DENY; +import static gov.nist.csd.pm.pdp.Decision.GRANT; +import static org.junit.jupiter.api.Assertions.*; + +public class PMLTest { + + @Test + void testCallingNonPMLOperationAndRoutineFromPMLWithOperandsAndReturnValue() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua1"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["assign"] + + create prohibition "pro1" + deny user "u2" + access rights ["assign"] + on union of [ADMIN_POLICY_OBJECT] + """); + + Operation op1 = new Operation<>("op1", List.of("a", "b", "c")) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), "assign"); + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + String a = (String) operands.get("a"); + List b = (List) operands.get("b"); + Map c = (Map) operands.get("c"); + + pap.modify().graph().createPolicyClass("1" + a); + + for (String b1 : b) { + pap.modify().graph().createPolicyClass("1" + b1); + } + + for (Map.Entry c1 : c.entrySet()) { + pap.modify().graph().createPolicyClass("1" + c1.getKey()); + pap.modify().graph().createPolicyClass("1" + c1.getValue()); + } + + return null; + } + }; + pap.modify().operations().createAdminOperation(op1); + + pap.modify().routines().createAdminRoutine(new Routine<>("routine1", List.of("a", "b", "c")) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.executeAdminExecutable(op1, operands); + + return null; + } + }); + + PDP pdp = new PDP(pap); + pdp.executePML(new UserContext("u1"), """ + op1("a", ["b", "c"], {"d": "e", "f": "g"}) + """); + assertTrue(pap.query().graph().nodeExists("1a")); + assertTrue(pap.query().graph().nodeExists("1b")); + assertTrue(pap.query().graph().nodeExists("1c")); + assertTrue(pap.query().graph().nodeExists("1d")); + assertTrue(pap.query().graph().nodeExists("1e")); + assertTrue(pap.query().graph().nodeExists("1f")); + assertTrue(pap.query().graph().nodeExists("1g")); + + assertThrows(UnauthorizedException.class, () -> pdp.executePML(new UserContext("u2"), """ + op1("a", ["b", "c"], {"d": "e", "f": "g"}) + """)); + + pdp.executePML(new UserContext("u1"), """ + routine1("1", ["2", "3"], {"4": "5", "6": "7"}) + """); + assertTrue(pap.query().graph().nodeExists("11")); + assertTrue(pap.query().graph().nodeExists("12")); + assertTrue(pap.query().graph().nodeExists("13")); + assertTrue(pap.query().graph().nodeExists("14")); + assertTrue(pap.query().graph().nodeExists("15")); + assertTrue(pap.query().graph().nodeExists("16")); + assertTrue(pap.query().graph().nodeExists("17")); + + assertThrows(UnauthorizedException.class, () -> pdp.executePML(new UserContext("u2"), """ + routine1("1", ["2", "3"], {"4": "5", "6": "7"}) + """)); + } + + @Test + void testCallPMLOperationAndRoutineFromNonPML() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua1"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["assign"] + + create prohibition "pro1" + deny user "u2" + access rights ["assign"] + on union of [ADMIN_POLICY_OBJECT] + + operation op1(string a, []string b, map[string]string c) { + check "assign" on ADMIN_POLICY_OBJECT + } { + create pc "1" + a + + foreach x in b { + create pc "1" + x + } + + foreach x, y in c { + create pc "1" + x + create pc "1" + y + } + } + + routine routine1(string a, []string b, map[string]string c) { + op1(a, b, c) + } + """); + + PDP pdp = new PDP(pap); + AdminAdjudicationResponse response = pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", + Map.of("a", "a", "b", List.of("b", "c"), "c", Map.of("d", "e", "f", "g"))))); + assertEquals(GRANT, response.getDecision()); + assertTrue(pap.query().graph().nodeExists("1a")); + assertTrue(pap.query().graph().nodeExists("1b")); + assertTrue(pap.query().graph().nodeExists("1c")); + assertTrue(pap.query().graph().nodeExists("1d")); + assertTrue(pap.query().graph().nodeExists("1e")); + assertTrue(pap.query().graph().nodeExists("1f")); + assertTrue(pap.query().graph().nodeExists("1g")); + + + response = pdp.adjudicateAdminOperations(new UserContext("u2"), List.of(new OperationRequest("op1", + Map.of("a", "a", "b", List.of("b", "c"), "c", Map.of("d", "e", "f", "g"))))); + assertEquals(DENY, response.getDecision()); + + response = pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", + Map.of("a", "1", "b", List.of("2", "3"), "c", Map.of("4", "5", "6", "7"))))); + assertEquals(GRANT, response.getDecision()); + assertTrue(pap.query().graph().nodeExists("11")); + assertTrue(pap.query().graph().nodeExists("12")); + assertTrue(pap.query().graph().nodeExists("13")); + assertTrue(pap.query().graph().nodeExists("14")); + assertTrue(pap.query().graph().nodeExists("15")); + assertTrue(pap.query().graph().nodeExists("16")); + assertTrue(pap.query().graph().nodeExists("17")); + + response = pdp.adjudicateAdminOperations(new UserContext("u2"), List.of(new OperationRequest("op1", + Map.of("a", "1", "b", List.of("2", "3"), "c", Map.of("4", "5", "6", "7"))))); + assertEquals(DENY, response.getDecision()); + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/PMLUtil.java b/src/test/java/gov/nist/csd/pm/pap/pml/PMLUtil.java new file mode 100644 index 000000000..47055b90c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/PMLUtil.java @@ -0,0 +1,32 @@ +package gov.nist.csd.pm.pap.pml; + +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.MapLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.type.Type; + +import java.util.*; + +public class PMLUtil { + + public static ArrayLiteral buildArrayLiteral(String ... arr) { + List l = new ArrayList<>(); + for (String s : arr) { + l.add(new StringLiteral(s)); + } + + return new ArrayLiteral(l, Type.string()); + } + + public static MapLiteral buildMapLiteral(String ... arr) { + Map mapExpr = new HashMap<>(); + + for (int i = 0; i < arr.length; i+=2) { + Expression expression = new StringLiteral(arr[i]); + mapExpr.put(expression, new StringLiteral(arr[i+1])); + } + + return new MapLiteral(mapExpr, Type.string(), Type.string()); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitorTest.java new file mode 100644 index 000000000..1a0e6ac92 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssignStmtVisitorTest.java @@ -0,0 +1,54 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.AssignStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AssignStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.AssignStatementContext ctx = PMLContextVisitor.toCtx( + """ + assign "a" to ["b", "c"] + """, + PMLParser.AssignStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new AssignStmtVisitor(visitorCtx).visitAssignStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new AssignStatement(new StringLiteral("a"), buildArrayLiteral("b", "c")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + assign "a" to "b" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + + testCompilationError( + """ + assign ["a"] to "b" + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitorTest.java new file mode 100644 index 000000000..1eab3149b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/AssociateStmtVisitorTest.java @@ -0,0 +1,63 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.AssociateStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class AssociateStmtVisitorTest { + + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + AssociateStmtVisitorTest() throws PMException { + } + + @Test + void testSuccess() throws PMException { + PMLParser.AssociateStatementContext ctx = PMLContextVisitor.toCtx( + """ + associate "a" and "b" with ["c", "d"] + """, + PMLParser.AssociateStatementContext.class); + PMLStatement stmt = new AssociateStmtVisitor(visitorCtx).visitAssociateStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new AssociateStatement(new StringLiteral("a"), new StringLiteral("b"), buildArrayLiteral("c", "d")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + testCompilationError( + """ + associate ["a"] and "b" with ["c", "d"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + associate "a" and ["b"] with ["c", "d"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + associate "a" and "b" with "c" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitorTest.java new file mode 100644 index 000000000..87c929bd8 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/BreakStmtVisitorTest.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.BreakStatement; +import gov.nist.csd.pm.pap.pml.statement.ForeachStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class BreakStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.ForeachStatementContext ctx = PMLContextVisitor.toCtx( + """ + foreach x in ["a"] { + break + } + """, + PMLParser.ForeachStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new ForeachStmtVisitor(visitorCtx).visitForeachStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new ForeachStatement("x", null, buildArrayLiteral("a"), List.of( + new BreakStatement() + )), + stmt + ); + } + + @Test + void testNotInForLoop() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + break + """, visitorCtx, 1, + "break statement not in foreach" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CompilerTestUtil.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CompilerTestUtil.java new file mode 100644 index 000000000..140cfad88 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CompilerTestUtil.java @@ -0,0 +1,30 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import org.antlr.v4.runtime.ParserRuleContext; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +public class CompilerTestUtil { + + public static void testCompilationError(String input, VisitorContext visitorContext, + int numExpectedErrors, String ... expectedError) { + ParserRuleContext ctx = PMLContextVisitor.toCtx(input, ParserRuleContext.class); + StatementVisitor statementVisitor = new StatementVisitor(visitorContext); + + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> statementVisitor.visit(ctx) + ); + + assertEquals(numExpectedErrors, e.getErrors().size()); + + for (int i = 0; i < expectedError.length; i++) { + assertEquals(expectedError[i], e.getErrors().get(i).errorMessage()); + } + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitorTest.java new file mode 100644 index 000000000..a92cd0494 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ContinueStmtVisitorTest.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.ContinueStatement; +import gov.nist.csd.pm.pap.pml.statement.ForeachStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ContinueStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.ForeachStatementContext ctx = PMLContextVisitor.toCtx( + """ + foreach x in ["a"] { + continue + } + """, + PMLParser.ForeachStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new ForeachStmtVisitor(visitorCtx).visitForeachStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new ForeachStatement("x", null, buildArrayLiteral("a"), List.of( + new ContinueStatement() + )), + stmt + ); + } + + @Test + void testNotInForLoop() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + continue + """, visitorCtx, 1, + "continue statement not in foreach" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitorTest.java new file mode 100644 index 000000000..67a569168 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateNonPCStmtVisitorTest.java @@ -0,0 +1,66 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.operation.builtin.Equals; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateNonPCStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CreateNonPCStmtVisitorTest { + + private static CompileGlobalScope testGlobalScope; + + @BeforeAll + static void setup() throws PMException { + testGlobalScope = new CompileGlobalScope(); + testGlobalScope.addExecutables(Map.of("equals", new Equals().getSignature())); + } + + @Test + void testSuccess() { + PMLParser.CreateNonPCStatementContext ctx = PMLContextVisitor.toCtx( + """ + create user attribute "ua1" in ["a"] + """, + PMLParser.CreateNonPCStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + PMLStatement stmt = new CreateNonPCStmtVisitor(visitorCtx).visitCreateNonPCStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new CreateNonPCStatement(new StringLiteral("ua1"), NodeType.UA, buildArrayLiteral("a")), + stmt + ); + } + + @Test + void testInvalidExpressions() { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + testCompilationError( + """ + create user attribute ["ua1"] in ["a"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + create user attribute "ua1" in "a" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitorTest.java new file mode 100644 index 000000000..aba3fd2ea --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateObligationStmtVisitorTest.java @@ -0,0 +1,49 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateObligationStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CreateObligationStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.CreateObligationStatementContext ctx = PMLContextVisitor.toCtx( + """ + create obligation "test" {} + """, + PMLParser.CreateObligationStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new CreateObligationStmtVisitor(visitorCtx).visitCreateObligationStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new CreateObligationStatement(new StringLiteral("test"), List.of()), + stmt + ); + } + + @Test + void testInvalidNameExpression() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + create obligation ["test"] {} + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitorTest.java new file mode 100644 index 000000000..f31a5d7f4 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreatePolicyStmtVisitorTest.java @@ -0,0 +1,62 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.*; + +class CreatePolicyStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.CreatePolicyStatementContext ctx = PMLContextVisitor.toCtx( + """ + create policy class "test" + """, + PMLParser.CreatePolicyStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new CreatePolicyStmtVisitor(visitorCtx).visitCreatePolicyStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new CreatePolicyStatement(new StringLiteral("test")), + stmt + ); + } + + + @Test + void testSuccessWithProperties() throws PMException { + PMLParser.CreatePolicyStatementContext ctx = PMLContextVisitor.toCtx( + """ + create policy class "test" + """, + PMLParser.CreatePolicyStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new CreatePolicyStmtVisitor(visitorCtx).visitCreatePolicyStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new CreatePolicyStatement(new StringLiteral("test")), + stmt + ); + } + + @Test + void testInvalidNameExpression() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + create policy class ["test"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitorTest.java new file mode 100644 index 000000000..4440d39fd --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateProhibitionStmtVisitorTest.java @@ -0,0 +1,97 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.NegatedExpression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateProhibitionStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CreateProhibitionStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.CreateProhibitionStatementContext ctx = PMLContextVisitor.toCtx( + """ + create prohibition "test" + deny user "u1" + ["read"] + on union of [!"oa1"] + """, + PMLParser.CreateProhibitionStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new CreateProhibitionStmtVisitor(visitorCtx).visitCreateProhibitionStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new CreateProhibitionStatement( + new StringLiteral("test"), + new StringLiteral("u1"), + ProhibitionSubject.Type.USER, + buildArrayLiteral("read"), + false, + new ArrayLiteral(List.of(new NegatedExpression(new StringLiteral("oa1"))), Type.string()) + ), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + create prohibition ["test"] + deny user "u1" + ["read"] + on union of [!"oa1"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + create prohibition "test" + deny user ["u1"] + ["read"] + on union of [!"oa1"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + create prohibition "test" + deny user "u1" + "read" + on union of [!"oa1"] + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + + testCompilationError( + """ + create prohibition "test" + deny user "u1" + ["read"] + on union of !"oa1" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitorTest.java new file mode 100644 index 000000000..061e62882 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/CreateRuleStmtVisitorTest.java @@ -0,0 +1,257 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLCompiler; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.AnyOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.LogicalSubjectPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.UsernamePattern; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateObligationStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class CreateRuleStmtVisitorTest { + + PMLCompiler pmlCompiler = new PMLCompiler(); + + @Test + void testSubjectClause() throws PMException { + String pml = """ + create obligation "obligation1" { + create rule "any user" + when any user + performs "test_event" + do(ctx) {} + + create rule "users" + when user "u1" + performs "test_event" + do(ctx) {} + + create rule "users list" + when user "u1" || "u2" + performs "test_event" + do(ctx) {} + } + """; + List stmts = pmlCompiler.compilePML(pml); + assertEquals(1, stmts.size()); + + CreateObligationStatement stmt = (CreateObligationStatement)stmts.get(0); + assertEquals( + new CreateObligationStatement( + new StringLiteral("obligation1"), + List.of( + new CreateRuleStatement( + new StringLiteral("any user"), + new SubjectPattern(), + new OperationPattern("test_event"), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ), + new CreateRuleStatement( + new StringLiteral("users"), + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("test_event"), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ), + new CreateRuleStatement( + new StringLiteral("users list"), + new SubjectPattern(new LogicalSubjectPatternExpression(new UsernamePattern("u1"), new UsernamePattern("u2"), false)), + new OperationPattern("test_event"), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ) + ) + ), + stmt + ); + } + + @Test + void testPerformsClause() throws PMException { + String pml = """ + create obligation "obligation1" { + create rule "r1" + when any user + performs any operation + do(ctx) {} + } + """; + List stmts = pmlCompiler.compilePML(pml); + assertEquals(1, stmts.size()); + + CreateObligationStatement stmt = (CreateObligationStatement)stmts.get(0); + CreateObligationStatement expected = new CreateObligationStatement( + new StringLiteral("obligation1"), + List.of( + new CreateRuleStatement( + new StringLiteral("r1"), + new SubjectPattern(), + new OperationPattern(), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ) + ) + ); + assertEquals(expected, stmt); + + String pml2 = """ + create obligation "obligation1" { + create rule "r1" + when any user + do(ctx) {} + } + """; + PMLCompilationException e = assertThrows( + PMLCompilationException.class, + () -> pmlCompiler.compilePML(pml2) + ); + assertEquals(1, e.getErrors().size()); + assertEquals("mismatched input 'do' expecting 'performs'", e.getErrors().getFirst().errorMessage()); + } + + @Test + void testOnClause() throws PMException { + String pml = """ + create obligation "obligation1" { + create rule "any operand" + when any user + performs any operation + do(ctx) {} + + create rule "any operand with on" + when any user + performs any operation + on {} + do(ctx) {} + + create rule "an operand" + when any user + performs "assign" + on { + ascendant: any + } + do(ctx) {} + } + """; + List stmts = pmlCompiler.compilePML(pml); + assertEquals(1, stmts.size()); + + CreateObligationStatement stmt = (CreateObligationStatement)stmts.get(0); + CreateObligationStatement expected = new CreateObligationStatement( + new StringLiteral("obligation1"), + List.of( + new CreateRuleStatement( + new StringLiteral("any operand"), + new SubjectPattern(), + new OperationPattern(), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ), + new CreateRuleStatement( + new StringLiteral("any operand with on"), + new SubjectPattern(), + new OperationPattern(), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ), + new CreateRuleStatement( + new StringLiteral("an operand"), + new SubjectPattern(), + new OperationPattern("assign"), + Map.of( + "ascendant", List.of(new AnyOperandPattern()) + ), + new CreateRuleStatement.ResponseBlock("ctx", new ArrayList<>()) + ) + ) + ); + + assertEquals(expected, stmt); + } + + @Test + void testResponse() throws PMException { + String pml = """ + create obligation "obligation1" { + create rule "r1" + when any user + performs any operation + do(ctx) { + create policy class "pc1" + create policy class "pc2" + } + } + """; + List stmts = pmlCompiler.compilePML(pml); + assertEquals(1, stmts.size()); + + CreateObligationStatement stmt = (CreateObligationStatement)stmts.getFirst(); + CreateObligationStatement expected = new CreateObligationStatement( + new StringLiteral("obligation1"), + List.of( + new CreateRuleStatement( + new StringLiteral("r1"), + new SubjectPattern(), + new OperationPattern(), + Map.of(), + new CreateRuleStatement.ResponseBlock("ctx", List.of( + new CreatePolicyStatement(new StringLiteral("pc1")), + new CreatePolicyStatement(new StringLiteral("pc2")) + )) + ) + ) + ); + assertEquals(expected, stmt); + } + + @Test + void testFunctionInResponseReturnsError() throws PMException { + String pml = """ + create obligation "obligation1" { + create rule "e1 and e2" + when any user + performs any operation + do(ctx) { + operation f1() {} + } + } + """; + PMLCompilationException e = assertThrows( + PMLCompilationException.class, + () -> pmlCompiler.compilePML(pml) + ); + assertEquals( + "operations/routines are not allowed inside response blocks", + e.getErrors().getFirst().errorMessage() + ); + } + + @Test + void testReturnValueInResponseThrowsException() { + String pml = """ + create obligation "obligation1" { + create rule "any user" + when subject => pAny() + performs op => pEquals(op, "test_event") + do(ctx) { + return "test" + } + } + """; + assertThrows(PMLCompilationException.class, () -> pmlCompiler.compilePML(pml)); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitorTest.java new file mode 100644 index 000000000..0127f166e --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeassignStmtVisitorTest.java @@ -0,0 +1,54 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.DeassignStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DeassignStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.DeassignStatementContext ctx = PMLContextVisitor.toCtx( + """ + deassign "a" from ["b", "c"] + """, + PMLParser.DeassignStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DeassignStmtVisitor(visitorCtx).visitDeassignStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DeassignStatement(new StringLiteral("a"), buildArrayLiteral("b", "c")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + deassign "a" from "c" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + + testCompilationError( + """ + deassign ["a"] from ["b", "c"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitorTest.java new file mode 100644 index 000000000..e0b301c04 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteRuleStmtVisitorTest.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.DeleteRuleStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DeleteRuleStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.DeleteRuleStatementContext ctx = PMLContextVisitor.toCtx( + """ + delete rule "rule1" from obligation "obl1" + """, + PMLParser.DeleteRuleStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DeleteRuleStmtVisitor(visitorCtx).visitDeleteRuleStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DeleteRuleStatement(new StringLiteral("rule1"), new StringLiteral("obl1")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + delete rule ["rule1"] from obligation "obl1" + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + delete rule "rule1" from obligation ["obl1"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitorTest.java new file mode 100644 index 000000000..1c30ab86a --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DeleteStmtVisitorTest.java @@ -0,0 +1,77 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.DeleteStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DeleteStmtVisitorTest { + + @Test + void testDeleteNode() throws PMException { + PMLParser.DeleteStatementContext ctx = PMLContextVisitor.toCtx( + """ + delete object attribute "oa1" + """, + PMLParser.DeleteStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DeleteStmtVisitor(visitorCtx).visitDeleteStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DeleteStatement(DeleteStatement.Type.OBJECT_ATTRIBUTE, new StringLiteral("oa1")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + delete object attribute ["oa1"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + + @Test + void testDeleteObligation() throws PMException { + PMLParser.DeleteStatementContext ctx = PMLContextVisitor.toCtx( + """ + delete obligation "test" + """, + PMLParser.DeleteStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DeleteStmtVisitor(visitorCtx).visitDeleteStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DeleteStatement(DeleteStatement.Type.OBLIGATION, new StringLiteral("test")), + stmt + ); + } + + @Test + void testDeleteProhibition() throws PMException { + PMLParser.DeleteStatementContext ctx = PMLContextVisitor.toCtx( + """ + delete prohibition "test" + """, + PMLParser.DeleteStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DeleteStmtVisitor(visitorCtx).visitDeleteStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DeleteStatement(DeleteStatement.Type.PROHIBITION, new StringLiteral("test")), + stmt + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitorTest.java new file mode 100644 index 000000000..53055f108 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/DissociateStmtVisitorTest.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.operation.DissociateStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class DissociateStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.DissociateStatementContext ctx = PMLContextVisitor.toCtx( + """ + dissociate "a" and "b" + """, + PMLParser.DissociateStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new DissociateStmtVisitor(visitorCtx).visitDissociateStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new DissociateStatement(new StringLiteral("a"), new StringLiteral("b")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + dissociate ["a"] and "b" + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + dissociate "a" and ["b"] + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitorTest.java new file mode 100644 index 000000000..80cd3f0e5 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/ForeachStmtVisitorTest.java @@ -0,0 +1,164 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.builtin.Equals; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.scope.VariableAlreadyDefinedInScopeException; +import gov.nist.csd.pm.pap.pml.statement.ForeachStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ForeachStmtVisitorTest { + + private static GlobalScope testGlobalScope; + + @BeforeAll + static void setup() throws PMException { + testGlobalScope = new CompileGlobalScope(); + testGlobalScope.addExecutables(Map.of("equals", new Equals().getSignature())); + } + + @Test + void testSuccess() { + PMLParser.ForeachStatementContext ctx = PMLContextVisitor.toCtx( + """ + foreach x in ["a", "b"] {} + """, + PMLParser.ForeachStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + PMLStatement stmt = new ForeachStmtVisitor(visitorCtx).visitForeachStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new ForeachStatement("x", null, buildArrayLiteral("a", "b"), List.of()), + stmt + ); + + ctx = PMLContextVisitor.toCtx( + """ + foreach x, y in {"a": "b"} {} + """, + PMLParser.ForeachStatementContext.class); + visitorCtx = new VisitorContext(testGlobalScope); + stmt = new ForeachStmtVisitor(visitorCtx).visitForeachStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new ForeachStatement("x", "y", buildMapLiteral("a", "b"), List.of()), + stmt + ); + } + + @Test + void testInvalidExpressions() { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + foreach x in "a" {} + """, visitorCtx, 1, + "expected expression type(s) [[]any], got string" + + ); + + testCompilationError( + """ + foreach x in {"a": "b"} {} + """, visitorCtx, 1, + "expected expression type(s) [[]any], got map[string]string" + + ); + } + + @Test + void testKeyValueOnArray() { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + foreach x, y in ["a"] {} + """, visitorCtx, 1, + "expected expression type(s) [map[any]any], got []string" + + ); + } + + @Test + void testIterVarDoesNotExists() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + foreach x in arr {} + """, visitorCtx, 1, + "unknown variable 'arr' in scope" + + ); + } + + @Test + void testKeyValueVarsAlreadyExist() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), false)); + + testCompilationError( + """ + foreach x in ["a"] {} + """, visitorCtx, 1, + "variable 'x' already defined in scope" + + ); + + visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("y", new Variable("y", Type.string(), false)); + + testCompilationError( + """ + foreach x, y in {"a": "b"} {} + """, visitorCtx, 1, + "variable 'y' already defined in scope" + + ); + } + + @Test + void testKeyOnlyOnMapReturnsError() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + foreach x in {"a": "b"} {} + """, visitorCtx, 1, + "expected expression type(s) [[]any], got map[string]string" + + ); + } + + @Test + void testKeyValueOnArrayReturnsError() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + foreach x, y in ["a": "b"] {} + """, visitorCtx, 1, + "expected expression type(s) [map[any]any], got []string" + + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitorTest.java new file mode 100644 index 000000000..c208548da --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/FunctionInvokeStmtVisitorTest.java @@ -0,0 +1,138 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.FunctionInvokeExpression; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class FunctionInvokeStmtVisitorTest { + + PMLExecutableSignature signature = new PMLExecutableSignature( + "func1", + Type.string(), + List.of("a", "b", "c"), + Map.of( + "a", Type.string(), + "b", Type.string(), + "c", Type.array(Type.string()) + ) + ); + + FunctionInvokeExpression expected = new FunctionInvokeExpression( + signature, + Map.of( + "a", new StringLiteral("a"), + "b", new StringLiteral("b"), + "c", buildArrayLiteral("c", "d") + ) + ); + + @Test + void testSuccess() throws PMException { + PMLParser.FunctionInvokeStatementContext ctx = PMLContextVisitor.toCtx( + """ + func1("a", "b", ["c", "d"]) + """, + PMLParser.FunctionInvokeStatementContext.class); + + + + CompileGlobalScope compileGlobalScope = new CompileGlobalScope(); + compileGlobalScope.addExecutable("func1", signature); + + VisitorContext visitorCtx = new VisitorContext(compileGlobalScope); + + PMLStatement stmt = new FunctionInvokeStmtVisitor(visitorCtx) + .visitFunctionInvokeStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + + assertEquals(expected, stmt); + } + + @Test + void testFunctionDoesNotExist() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + func1("a", "b", ["c", "d"]) + """, visitorCtx, 1, + "unknown function 'func1' in scope" + ); + } + + @Test + void testWrongNumberOfArgs() throws PMException { + CompileGlobalScope compileGlobalScope = new CompileGlobalScope(); + compileGlobalScope.addExecutable("func1", signature); + + VisitorContext visitorCtx = new VisitorContext(compileGlobalScope); + + testCompilationError( + """ + func1("a", "b") + """, visitorCtx, 1, + "wrong number of args for function call func1: expected 3, got 2" + ); + } + + @Test + void testWrongArgType() throws PMException { + CompileGlobalScope compileGlobalScope = new CompileGlobalScope(); + compileGlobalScope.addExecutable("func1", signature); + VisitorContext visitorCtx = new VisitorContext(compileGlobalScope); + + testCompilationError( + """ + func1("a", "b", true) + """, visitorCtx, 1, + "invalid argument type: expected []string, got bool at arg 2" + ); + } + + @Test + void testNoArgs() throws PMException { + PMLParser.FunctionInvokeStatementContext ctx = PMLContextVisitor.toCtx( + """ + func1() + """, + PMLParser.FunctionInvokeStatementContext.class); + + PMLExecutableSignature signature = new PMLExecutableSignature( + "func1", + Type.string(), + List.of(), + Map.of() + ); + + CompileGlobalScope compileGlobalScope = new CompileGlobalScope(); + compileGlobalScope.addExecutable("func1", signature); + + VisitorContext visitorCtx = new VisitorContext(compileGlobalScope); + PMLStatement stmt = new FunctionInvokeStmtVisitor(visitorCtx) + .visitFunctionInvokeStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + + FunctionInvokeExpression expected = new FunctionInvokeExpression( + signature, + Map.of() + ); + + assertEquals(expected, stmt); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitorTest.java new file mode 100644 index 000000000..6a6fafa8b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/IfStmtVisitorTest.java @@ -0,0 +1,89 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.IfStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.ShortDeclarationStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.BoolLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.*; + +class IfStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.IfStatementContext ctx = PMLContextVisitor.toCtx( + """ + if true { + x := "a" + } else if false { + x := "b" + } else { + x := "c" + } + """, + PMLParser.IfStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new IfStmtVisitor(visitorCtx) + .visitIfStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new IfStatement( + new IfStatement.ConditionalBlock(new BoolLiteral(true), new PMLStatementBlock(List.of(new ShortDeclarationStatement("x", new StringLiteral("a"))))), + List.of(new IfStatement.ConditionalBlock(new BoolLiteral(false), new PMLStatementBlock(List.of(new ShortDeclarationStatement("x", new StringLiteral("b")))))), + new PMLStatementBlock(List.of(new ShortDeclarationStatement("x", new StringLiteral("c")))) + ), + stmt + ); + } + + @Test + void testConditionExpressionsNotBool() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + if "a" { + x := "a" + } else if "b" { + x := "b" + } else { + x := "c" + } + """, visitorCtx, 1, + "expected expression type(s) [bool], got string" + ); + } + + @Test + void testReturnVoidInIf() throws PMException { + String pml = """ + operation f1() { + if true { + return + } + + create policy class "pc1" + } + + f1() + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + assertFalse(pap.query().graph().nodeExists("pc1")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitorTest.java new file mode 100644 index 000000000..cb7107cef --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetNodePropertiesStmtVisitorTest.java @@ -0,0 +1,55 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.SetNodePropertiesStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SetNodePropertiesStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.SetNodePropertiesStatementContext ctx = PMLContextVisitor.toCtx( + """ + set properties of "o1" to {"a": "b"} + """, + PMLParser.SetNodePropertiesStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new SetNodePropertiesStmtVisitor(visitorCtx) + .visitSetNodePropertiesStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new SetNodePropertiesStatement(new StringLiteral("o1"), buildMapLiteral("a", "b")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + set properties of ["o1"] to {"a": "b"} + """, visitorCtx, 1, + "expected expression type(s) [string], got []string" + ); + + testCompilationError( + """ + set properties of "o1" to ["a", "b"] + """, visitorCtx, 1, + "expected expression type(s) [map[string]string], got []string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitorTest.java new file mode 100644 index 000000000..9ddcd1b0c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/SetResourceOperationsStmtVisitorTest.java @@ -0,0 +1,47 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.SetResourceOperationsStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class SetResourceOperationsStmtVisitorTest { + + @Test + void testSuccess() throws PMException { + PMLParser.SetResourceOperationsStatementContext ctx = PMLContextVisitor.toCtx( + """ + set resource operations ["a", "b"] + """, + PMLParser.SetResourceOperationsStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + PMLStatement stmt = new SetResourceOperationsStmtVisitor(visitorCtx) + .visitSetResourceOperationsStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertEquals( + new SetResourceOperationsStatement(buildArrayLiteral("a", "b")), + stmt + ); + } + + @Test + void testInvalidExpressions() throws PMException { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + set resource operations "a" + """, visitorCtx, 1, + "expected expression type(s) [[]string], got string" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitorTest.java new file mode 100644 index 000000000..7eaf97671 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/StatementBlockVisitorTest.java @@ -0,0 +1,50 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.builtin.Equals; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLContextVisitor.toStatementBlockCtx; +import static org.junit.jupiter.api.Assertions.*; + +class StatementBlockVisitorTest { + + private static GlobalScope testGlobalScope; + + @BeforeAll + static void setup() throws PMException { + testGlobalScope = new CompileGlobalScope(); + testGlobalScope.addExecutable("equals", new Equals().getSignature()); + } + + @Test + void testFunctionInBlock() { + PMLParser.StatementBlockContext ctx = toStatementBlockCtx( + """ + { + operation f1() {} + } + """ + ); + VisitorContext visitorContext = new VisitorContext(testGlobalScope); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> new StatementBlockVisitor(visitorContext, Type.string()) + .visitStatementBlock(ctx) + ); + assertEquals(1, e.getErrors().size(), visitorContext.errorLog().toString()); + assertEquals("operations are not allowed inside statement blocks", + e.getErrors().get(0).errorMessage()); + } + + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitorTest.java new file mode 100644 index 000000000..623e4ea0c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/compiler/visitor/VarStmtVisitorTest.java @@ -0,0 +1,183 @@ +package gov.nist.csd.pm.pap.pml.compiler.visitor; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.executable.operation.builtin.Equals; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.scope.UnknownVariableInScopeException; +import gov.nist.csd.pm.pap.pml.scope.VariableAlreadyDefinedInScopeException; +import gov.nist.csd.pm.pap.pml.statement.VariableAssignmentStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.*; + +class VarStmtVisitorTest { + + private static GlobalScope testGlobalScope; + + @BeforeAll + static void setup() throws PMException { + testGlobalScope = new CompileGlobalScope(); + testGlobalScope.addExecutable("equals", new Equals().getSignature()); + } + + @Nested + class VarDeclarationTest { + + @Test + void testSuccess() throws UnknownVariableInScopeException { + PMLParser.VarDeclarationContext ctx = PMLContextVisitor.toCtx( + """ + var x = "a" + """, PMLParser.VarDeclarationContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + new VarStmtVisitor(visitorCtx) + .visitVarDeclaration(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertTrue(visitorCtx.scope().variableExists("x")); + assertFalse(visitorCtx.scope().getVariable("x").isConst()); + } + + @Test + void testReassign() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), false)); + testCompilationError( + """ + var x = "a" + """, visitorCtx, 1, + "variable 'x' already defined in scope" + ); + } + + @Test + void testReassignConstant() throws VariableAlreadyDefinedInScopeException { + PMLParser.VarDeclarationContext ctx = PMLContextVisitor.toCtx( + """ + var x = "a" + """, PMLParser.VarDeclarationContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), true)); + + testCompilationError( + """ + var x = "a" + """, visitorCtx, 1, + "variable 'x' already defined in scope" + ); + } + + @Test + void testReassignInBlock() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), true)); + + testCompilationError( + """ + var ( + x = "a" + x = "b" + ) + """, visitorCtx, 1, + "variable 'x' already defined in scope" + ); + } + + } + + @Nested + class ShortDeclarationTest { + @Test + void testSuccess() throws UnknownVariableInScopeException { + PMLParser.ShortDeclarationContext ctx = PMLContextVisitor.toCtx( + """ + x := "a" + """, PMLParser.ShortDeclarationContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + new VarStmtVisitor(visitorCtx) + .visitShortDeclaration(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertTrue(visitorCtx.scope().variableExists("x")); + assertFalse(visitorCtx.scope().getVariable("x").isConst()); + } + + @Test + void testReassign() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), true)); + testCompilationError( + """ + x := "a" + """, visitorCtx, 1, + "variable x already exists" + ); + } + } + + @Nested + class VariableAssignmentTest { + @Test + void testSuccess() throws UnknownVariableInScopeException, VariableAlreadyDefinedInScopeException { + PMLParser.VariableAssignmentStatementContext ctx = PMLContextVisitor.toCtx( + """ + x = "a" + """, PMLParser.VariableAssignmentStatementContext.class); + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), false)); + VariableAssignmentStatement stmt = + (VariableAssignmentStatement) new VarStmtVisitor(visitorCtx) + .visitVariableAssignmentStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertTrue(visitorCtx.scope().variableExists("x")); + assertFalse(visitorCtx.scope().getVariable("x").isConst()); + assertFalse(stmt.isPlus()); + + ctx = PMLContextVisitor.toCtx( + """ + x += "a" + """, PMLParser.VariableAssignmentStatementContext.class); + visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), false)); + stmt = (VariableAssignmentStatement) new VarStmtVisitor(visitorCtx) + .visitVariableAssignmentStatement(ctx); + assertEquals(0, visitorCtx.errorLog().getErrors().size()); + assertTrue(visitorCtx.scope().variableExists("x")); + assertFalse(visitorCtx.scope().getVariable("x").isConst()); + assertTrue(stmt.isPlus()); + } + + @Test + void testVariableDoesNotExist() { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + + testCompilationError( + """ + x = "a" + """, visitorCtx, 1, + "unknown variable 'x' in scope" + ); + } + + @Test + void testVariableIsConstant() throws VariableAlreadyDefinedInScopeException { + VisitorContext visitorCtx = new VisitorContext(testGlobalScope); + visitorCtx.scope().addVariable("x", new Variable("x", Type.string(), true)); + + testCompilationError( + """ + x = "a" + """, visitorCtx, 1, + "cannot reassign const variable" + ); + } + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignatureTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignatureTest.java new file mode 100644 index 000000000..9c90a1e35 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationSignatureTest.java @@ -0,0 +1,30 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PMLOperationSignatureTest { + + @Test + void testToFormattedString() { + PMLOperationSignature signature = new PMLOperationSignature( + "op1", + Type.array(Type.string()), + List.of("a", "b", "c"), + List.of("a"), + Map.of("a", Type.string(), "b", Type.string(), "c", Type.string()) + ); + + String actual = signature.toFormattedString(0); + assertEquals( + "operation op1(nodeop string a, string b, string c) []string ", + actual + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapperTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapperTest.java new file mode 100644 index 000000000..592ee00aa --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLOperationWrapperTest.java @@ -0,0 +1,108 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.OperationRequest; +import gov.nist.csd.pm.pdp.PDP; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PMLOperationWrapperTest { + + @Test + void testConstructor() { + Operation op = new Operation<>("op1", List.of("a", "b", "c"), List.of("a")) { + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + }; + + PMLOperationWrapper pmlOperationWrapper = new PMLOperationWrapper(op); + assertEquals( + pmlOperationWrapper.getSignature(), + new PMLExecutableSignature("op1", Type.any(), List.of("a", "b", "c"), + Map.of("a", Type.any(), "b", Type.any(), "c", Type.any())) + ); + } + + @Test + void testExecuteWithPDP() throws PMException { + Operation op = new Operation<>("op1", List.of("a", "b", "c"), List.of("a")) { + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass((String) operands.get("b")); + return null; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get("a"), "assign"); + } + }; + + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["assign"] + create u "u1" in ["ua1"] + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + pap.modify().operations().createAdminOperation(new PMLOperationWrapper(op)); + + PDP pdp = new PDP(pap); + pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", + Map.of("a", "oa1", "b", "b", "c", "c")))); + assertTrue(pap.query().graph().nodeExists("b")); + + // try again using pml + pap = new MemoryPAP(); + pdp = new PDP(pap); + pap.executePML(new UserContext("u1"), pml); + pap.modify().operations().createAdminOperation(new PMLOperationWrapper(op)); + pdp.runTx(new UserContext("u1"), tx -> tx.executePML(new UserContext("u1"), "op1(\"oa1\", \"b\", \"c\")")); + assertTrue(pap.query().graph().nodeExists("b")); + } + + @Test + void testPMLOperationWrapperWithReturnValue() throws PMException { + Operation op = new Operation<>("op1", List.of(), List.of()) { + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return "test"; + } + + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + PrivilegeChecker.check(pap, userCtx, (String) operands.get("a"), "assign"); + } + }; + + MemoryPAP pap = new MemoryPAP(); + + pap.modify().operations().createAdminOperation(new PMLOperationWrapper(op)); + pap.executePML(new UserContext("u1"), "create policy class op1()"); + assertTrue(pap.query().graph().nodeExists("test")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignatureTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignatureTest.java new file mode 100644 index 000000000..507db14a0 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/executable/operation/PMLStmtsOperationSignatureTest.java @@ -0,0 +1,33 @@ +package gov.nist.csd.pm.pap.pml.executable.operation; + +import gov.nist.csd.pm.pap.pml.statement.ForeachStatement; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.operation.CheckStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PMLStmtsOperationSignatureTest { + + @Test + void testToFormattedString() { + PMLStmtsOperationSignature pmlStmtsOperationSignature = new PMLStmtsOperationSignature( + "op1", + Type.string(), + List.of("a", "b", "c"), + List.of("a"), + Map.of("a", Type.array(Type.string()), "b", Type.string(), "c", Type.string()), + new PMLStatementBlock() + ); + + assertEquals( + "operation op1(nodeop []string a, string b, string c) string ", + pmlStmtsOperationSignature.toFormattedString(0) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapperTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapperTest.java new file mode 100644 index 000000000..25ac6a6e1 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/executable/routine/PMLRoutineWrapperTest.java @@ -0,0 +1,100 @@ +package gov.nist.csd.pm.pap.pml.executable.routine; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pdp.RoutineRequest; +import gov.nist.csd.pm.pdp.PDP; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class PMLRoutineWrapperTest { + + @Test + void testConstructor() { + Routine op = new Routine<>("routine1", List.of("a", "b", "c")) { + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + PMLRoutine pmlRoutineWrapper = new PMLRoutineWrapper(op); + assertEquals( + pmlRoutineWrapper.getSignature(), + new PMLExecutableSignature("routine1", Type.any(), List.of("a", "b", "c"), + Map.of("a", Type.any(), "b", Type.any(), "c", Type.any())) + ); + } + + @Test + void testExecuteWithPDP() throws PMException { + Routine op = new Routine("routine1", List.of("a", "b", "c")) { + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createObjectAttribute((String) operands.get("a"), List.of("pc1")); + pap.modify().graph().createObjectAttribute((String) operands.get("b"), List.of("pc1")); + pap.modify().graph().createObjectAttribute((String) operands.get("c"), List.of("pc1")); + return null; + } + }; + + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["assign"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + create u "u1" in ["ua1"] + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + pap.modify().routines().createAdminRoutine(new PMLRoutineWrapper(op)); + + PDP pdp = new PDP(pap); + pdp.adjudicateAdminRoutine(new UserContext("u1"), new RoutineRequest("routine1", + Map.of("a", "a", "b", "b", "c", "c"))); + assertTrue(pap.query().graph().nodeExists("a")); + assertTrue(pap.query().graph().nodeExists("b")); + assertTrue(pap.query().graph().nodeExists("c")); + + // try again using pml + pap = new MemoryPAP(); + pdp = new PDP(pap); + pap.executePML(new UserContext("u1"), pml); + pap.modify().routines().createAdminRoutine(new PMLRoutineWrapper(op)); + pdp.runTx(new UserContext("u1"), tx -> tx.executePML(new UserContext("u1"), "routine1(\"a\", \"b\", \"c\")")); + assertTrue(pap.query().graph().nodeExists("a")); + assertTrue(pap.query().graph().nodeExists("b")); + assertTrue(pap.query().graph().nodeExists("c")); + } + + @Test + void testPMLRoutineWrapperWithReturnValue() throws PMException { + Routine op = new Routine<>("routine1", List.of()) { + + @Override + public String execute(PAP pap, Map operands) throws PMException { + return "test"; + } + }; + + MemoryPAP pap = new MemoryPAP(); + + pap.modify().routines().createAdminRoutine(new PMLRoutineWrapper(op)); + pap.executePML(new UserContext("u1"), "create policy class routine1()"); + assertTrue(pap.query().graph().nodeExists("test")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpressionTest.java new file mode 100644 index 000000000..7856efa09 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/EqualsExpressionTest.java @@ -0,0 +1,374 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.BoolLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static org.junit.jupiter.api.Assertions.assertEquals; + +class EqualsExpressionTest { + + @Test + void testEqualsString() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "a" == "a" + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(new StringLiteral("a"), new StringLiteral("a"), true), + equalsExpression + ); + + MemoryPAP pap = new MemoryPAP(); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), pap), pap); + assertEquals( + new BoolValue(true), + value + ); + } + + @Test + void testNotEqualsString() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "a" != "a" + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(new StringLiteral("a"), new StringLiteral("a"), false), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testEqualsArray() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ["a", "b"] == ["a", "b"] + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildArrayLiteral("a", "b"), buildArrayLiteral("a", "b"), true), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + value + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + ["a", "b"] == ["b", "a"] + """, + PMLParser.EqualsExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildArrayLiteral("a", "b"), buildArrayLiteral("b", "a"), true), + equalsExpression + ); + + value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testNotEqualsArray() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ["a", "b"] != ["a", "b"] + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildArrayLiteral("a", "b"), buildArrayLiteral("a", "b"), false), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testEqualsBool() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true == true + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(new BoolLiteral(true), new BoolLiteral(true), true), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + value + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + true == false + """, + PMLParser.EqualsExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(new BoolLiteral(true), new BoolLiteral(false), true), + equalsExpression + ); + + value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testNotEqualsBool() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true != true + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(new BoolLiteral(true), new BoolLiteral(true), false), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testEqualsMap() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + {"a": "a", "b": "b"} == {"a": "a", "b": "b"} + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildMapLiteral("a", "a", "b", "b"), buildMapLiteral("a", "a", "b", "b"), true), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + value + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + {"a": "a", "b": "b"} == {"a": "a", "b": "c"} + """, + PMLParser.EqualsExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildMapLiteral("a", "a", "b", "b"), buildMapLiteral("a", "a", "b", "c"), true), + equalsExpression + ); + + value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testNotEqualsMap() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + {"a": "a", "b": "b"} != {"a": "a", "b": "b"} + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression(buildMapLiteral("a", "a", "b", "b"), buildMapLiteral("a", "a", "b", "b"), false), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testEqualsWithParens() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ("a" + "b") == ("a" + "b") + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression( + new ParenExpression( + new PlusExpression(new StringLiteral("a"), new StringLiteral("b")) + ), + new ParenExpression( + new PlusExpression(new StringLiteral("a"), new StringLiteral("b")) + ), + true + ), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + value + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + ("a" + "b") == ("a" + "c") + """, + PMLParser.EqualsExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression( + new ParenExpression( + new PlusExpression(new StringLiteral("a"), new StringLiteral("b")) + ), + new ParenExpression( + new PlusExpression(new StringLiteral("a"), new StringLiteral("c")) + ), + true + ), + equalsExpression + ); + + value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + } + + @Test + void testNotEqualsDifferentTypes() throws PMException { + PMLParser.EqualsExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ("a" + "b") == (true) + """, + PMLParser.EqualsExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = EqualsExpression.compileEqualsExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + EqualsExpression equalsExpression = (EqualsExpression) expression; + assertEquals( + new EqualsExpression( + new ParenExpression( + new PlusExpression(new StringLiteral("a"), new StringLiteral("b")) + ), + new ParenExpression( + new BoolLiteral(true) + ), + true + ), + equalsExpression + ); + + Value value = equalsExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + value + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/ExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ExpressionTest.java new file mode 100644 index 000000000..8418d908d --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ExpressionTest.java @@ -0,0 +1,125 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class ExpressionTest { + + @Test + void testAllowedTypes() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.string(), false)); + Expression actual = Expression.compile(visitorContext, ctx, Type.string()); + assertEquals( + new ReferenceByID("a"), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + a + """, PMLParser.VariableReferenceExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.array(Type.string()), false)); + actual = Expression.compile(visitorContext, ctx, Type.array(Type.string())); + assertEquals( + new ReferenceByID("a"), + actual + ); + } + + @Test + void testDisallowedTypes() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.string(), false)); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> Expression.compile(visitorContext, ctx, Type.array(Type.string())) + ); + assertEquals(1, e.getErrors().size()); + assertEquals( + "expected expression type(s) [[]string], got string", + e.getErrors().get(0).errorMessage() + ); + } + + + @Test + void testCompileStringExpression_Literal() throws PMException { + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = Expression.fromString(visitorContext, "\"test\"", Type.string()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals(new StringLiteral("test"), expression); + } + + @Test + void testCompileStringExpression_VarRef() throws PMException { + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("test", new Variable("test", Type.string(), true)); + Expression expression = Expression.fromString(visitorContext, "test", Type.string()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals(new ReferenceByID("test"), expression); + } + + @Test + void testCompileStringExpression_FuncInvoke() throws PMException { + CompileGlobalScope compileGlobalScope = new CompileGlobalScope(); + PMLExecutableSignature signature = new PMLExecutableSignature( + "test", + Type.string(), + List.of(), + Map.of() + ); + compileGlobalScope.addExecutable("test", signature); + VisitorContext visitorContext = new VisitorContext(compileGlobalScope); + + Expression expression = Expression.fromString(visitorContext, "test()", Type.string()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals(new FunctionInvokeExpression(signature, Map.of()), expression); + } + + @Test + void testCompileStringExpression_NonString_Error() throws PMException { + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> Expression.fromString(new VisitorContext(new CompileGlobalScope()), + "\"test\" == \"test\"", + Type.string() + ) + ); + assertEquals(1, e.getErrors().size()); + + e = assertThrows( + PMLCompilationRuntimeException.class, + () -> Expression.fromString(new VisitorContext(new CompileGlobalScope()), + "[\"a\", \"b\"]", + Type.string() + ) + ); + assertEquals(1, e.getErrors().size()); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpressionTest.java new file mode 100644 index 000000000..b50296458 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/FunctionInvokeExpressionTest.java @@ -0,0 +1,240 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.statement.PMLStatementBlock; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.statement.FunctionReturnStatement; +import gov.nist.csd.pm.pap.pml.statement.VariableAssignmentStatement; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.VoidValue; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.compiler.visitor.CompilerTestUtil.testCompilationError; +import static org.junit.jupiter.api.Assertions.*; + +class FunctionInvokeExpressionTest { + + static CompileGlobalScope scope = new CompileGlobalScope(); + + static PMLStmtsOperation voidFunc = new PMLStmtsOperation("voidFunc", Type.voidType(), + List.of("a", "b"), + List.of(), + Map.of("a", Type.string(), "b", Type.string()), + new PMLStatementBlock(), + new PMLStatementBlock(List.of( + new CreatePolicyStatement(new ReferenceByID("a")), + new CreatePolicyStatement(new ReferenceByID("b")) + ))); + static PMLStmtsOperation stringFunc = new PMLStmtsOperation("stringFunc", + Type.string(), + List.of("a", "b"), + List.of(), + Map.of( + "a", Type.string(), + "b", Type.string() + ), + new PMLStatementBlock(), + new PMLStatementBlock(List.of( + new VariableAssignmentStatement("x", false, new StringLiteral("test")), + new FunctionReturnStatement(new StringLiteral("test_ret")) + ))); + + static { + scope.addExecutable(voidFunc.getName(), voidFunc.getSignature()); + scope.addExecutable(stringFunc.getName(), stringFunc.getSignature()); + } + + @Test + void testVoidReturnType() throws PMException { + PMLParser.FunctionInvokeExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + voidFunc("a", "b") + """, PMLParser.FunctionInvokeExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(scope); + + Expression e = FunctionInvokeExpression.compileFunctionInvokeExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().getErrors().toString()); + assertEquals( + new FunctionInvokeExpression(voidFunc.getSignature(), Map.of( + "a", new StringLiteral("a"), + "b", new StringLiteral("b") + )), + e + ); + assertEquals( + Type.voidType(), + e.getType(visitorContext.scope()) + ); + + PAP pap = new MemoryPAP(); + pap.modify().operations().createAdminOperation(voidFunc); + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), pap); + Value value = e.execute(executionContext, new MemoryPAP()); + assertEquals( + new VoidValue(), + value + ); + + assertEquals( + Type.voidType(), + value.getType() + ); + } + + @Test + void testFunctionNotInScope() { + VisitorContext visitorCtx = new VisitorContext(new CompileGlobalScope()); + + testCompilationError( + """ + voidFunc("a", "b") + """, visitorCtx, 1, + "unknown function 'voidFunc' in scope" + ); + } + + @Test + void testWrongNumberOfArgs() throws PMException { + VisitorContext visitorCtx = new VisitorContext(scope); + + testCompilationError( + """ + voidFunc("a") + """, visitorCtx, 1, + "wrong number of args for function call voidFunc: expected 2, got 1" + ); + } + + @Test + void testWrongArgType() throws PMException { + VisitorContext visitorCtx = new VisitorContext(scope); + + testCompilationError( + """ + voidFunc("a", ["b", "c"]) + """, visitorCtx, 1, + "invalid argument type: expected string, got []string at arg 1" + ); + } + + @Test + void testExecuteReturnValue() throws PMException { + PMLParser.FunctionInvokeExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + stringFunc("a", "b") + """, PMLParser.FunctionInvokeExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(scope); + + Expression e = FunctionInvokeExpression.compileFunctionInvokeExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().getErrors().toString()); + assertEquals( + Type.string(), + e.getType(visitorContext.scope()) + ); + } + + @Test + void testExecuteWithFunctionExecutor() throws PMException { + PMLParser.FunctionInvokeExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + stringFunc("a", "b") + """, PMLParser.FunctionInvokeExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(scope); + Expression e = FunctionInvokeExpression.compileFunctionInvokeExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().getErrors().toString()); + + PAP pap = new MemoryPAP(); + pap.modify().operations().createAdminOperation(stringFunc); + ExecutionContext executionContext = + new ExecutionContext( + new UserContext(""), + pap + ); + Value value = e.execute(executionContext, pap); + assertEquals( + new StringValue("test_ret"), + value + ); + assertEquals( + Type.string(), + value.getType() + ); + } + + @Test + void testChainMethodCall() throws PMException { + String pml = """ + a("123") + + operation c(string x) string { + return "c" + x + } + + operation b(string x, string y) { + create policy class c(x) + create policy class c(y) + } + + operation a(string x) { + x = "x" + y := "y" + + b(x, y) + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + assertTrue(pap.query().graph().nodeExists("cx")); + assertTrue(pap.query().graph().nodeExists("cy")); + } + + @Test + void testReassignArgValueInFunctionDoesNotUpdateVariableOutsideOfScope() throws PMException { + String pml = """ + x := "test" + a(x) + create pc x + operation a(string x) { + x = "x" + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + assertFalse(pap.query().graph().nodeExists("x")); + assertTrue(pap.query().graph().nodeExists("test")); + } + + @Test + void testReturnInIf() throws PMException { + String pml = """ + operation a() { + if true { + return + } + + create pc "pc1" + } + + a() + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + assertFalse(pap.query().graph().nodeExists("pc1")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpressionTest.java new file mode 100644 index 000000000..df13628fc --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/LogicalExpressionTest.java @@ -0,0 +1,77 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.BoolLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class LogicalExpressionTest { + + @Test + void testCompile() throws PMException { + PMLParser.LogicalExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true && false + """, + PMLParser.LogicalExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = LogicalExpression.compileLogicalExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + LogicalExpression logicalExpression = (LogicalExpression) expression; + assertEquals( + new LogicalExpression(new BoolLiteral(true), new BoolLiteral(false), true), + logicalExpression + ); + } + + @Test + void testExecute() throws PMException { + PMLParser.LogicalExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true && false + """, + PMLParser.LogicalExpressionContext.class); + PAP pap = new MemoryPAP(); + + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = LogicalExpression.compileLogicalExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), pap); + Value actual = expression.execute(executionContext, pap); + assertEquals( + new BoolValue(false), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + false || true + """, + PMLParser.LogicalExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + expression = LogicalExpression.compileLogicalExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + pap = new MemoryPAP(); + executionContext = new ExecutionContext(new UserContext(""), pap); + actual = expression.execute(executionContext, pap); + assertEquals( + new BoolValue(true), + actual + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/ParenExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ParenExpressionTest.java new file mode 100644 index 000000000..09f69c8e4 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ParenExpressionTest.java @@ -0,0 +1,131 @@ +package gov.nist.csd.pm.pap.pml.expression; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.BoolValue; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ParenExpressionTest { + + private static CompileGlobalScope compileGlobalScope; + + @BeforeAll + static void setup() throws PMException { + compileGlobalScope = new CompileGlobalScope(); + } + + @Test + void testParenExpression() throws PMException { + PMLParser.ExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true && (true || false) + """, PMLParser.ExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(compileGlobalScope); + Expression e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + Value actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + (false || false) && (true || false) + """, PMLParser.ExpressionContext.class); + visitorContext = new VisitorContext(compileGlobalScope); + e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + (false || false) || (true || false) + """, PMLParser.ExpressionContext.class); + visitorContext = new VisitorContext(compileGlobalScope); + e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + !(false || false) && (true || false) + """, PMLParser.ExpressionContext.class); + visitorContext = new VisitorContext(compileGlobalScope); + e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + !(false || false) && (false || false || true) + """, PMLParser.ExpressionContext.class); + visitorContext = new VisitorContext(compileGlobalScope); + e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(true), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + !(false || false) && (false || false || true) && false + """, PMLParser.ExpressionContext.class); + visitorContext = new VisitorContext(compileGlobalScope); + e = Expression.compile(visitorContext, ctx, Type.bool()); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + actual = e.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new BoolValue(false), + actual + ); + } + + @Test + void testComplexParen() throws PMException { + PMLParser.ParenExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ((true || (true && false)) && (false || (false && true))) + """, + PMLParser.ParenExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(compileGlobalScope); + Expression expression = ParenExpression.compileParenExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + PAP pap = new MemoryPAP(); + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), new MemoryPAP()); + Value actual = expression.execute(executionContext, pap); + assertEquals( + new BoolValue(false), + actual + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/PlusExpressionTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/PlusExpressionTest.java new file mode 100644 index 000000000..1ad0b28ee --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/PlusExpressionTest.java @@ -0,0 +1,90 @@ +package gov.nist.csd.pm.pap.pml.expression; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PlusExpressionTest { + + @Test + void testPlus() throws PMException { + PMLParser.PlusExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "a" + "b" + """, + PMLParser.PlusExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = PlusExpression.compilePlusExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + PlusExpression plusExpression = (PlusExpression) expression; + assertEquals( + new PlusExpression(new StringLiteral("a"), new StringLiteral("b")), + plusExpression + ); + + Value value = plusExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new StringValue("ab"), + value + ); + } + + @Test + void testPlus3Expressions() throws PMException { + PMLParser.PlusExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "a" + "b" + "c" + """, + PMLParser.PlusExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = PlusExpression.compilePlusExpression(visitorContext, ctx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + PlusExpression plusExpression = (PlusExpression) expression; + assertEquals( + new PlusExpression(new PlusExpression(new StringLiteral("a"), new StringLiteral("b")), new StringLiteral("c")), + plusExpression + ); + + Value value = plusExpression.execute(new ExecutionContext(new UserContext(""), new MemoryPAP()), new MemoryPAP()); + assertEquals( + new StringValue("abc"), + value + ); + } + + @Test + void testNonStringType() throws PMException { + PMLParser.PlusExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "a" + "b" + ["c"] + """, + PMLParser.PlusExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> PlusExpression.compilePlusExpression(visitorContext, ctx) + ); + assertEquals(1, e.getErrors().size()); + assertEquals( + "expected expression type(s) [string], got []string", + e.getErrors().get(0).errorMessage() + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/ValueTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ValueTest.java new file mode 100644 index 000000000..b5837ce2f --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/ValueTest.java @@ -0,0 +1,87 @@ +package gov.nist.csd.pm.pap.pml.expression; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.op.graph.CreateObjectAttributeOp; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.MapValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.pml.value.Value; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBJECT_ATTRIBUTE; +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.PROPERTIES_OPERAND; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ValueTest { + + @Test + void testStringToValue() throws PMException { + Value value = Value.fromObject("test"); + assertTrue(value.getType().isString()); + assertEquals("test", value.getStringValue()); + } + + @Test + void testArrayToValue() throws PMException { + Value value = Value.fromObject(List.of("hello", "world")); + assertTrue(value.getType().isArray()); + assertEquals(new StringValue("hello"), value.getArrayValue().get(0)); + assertEquals(new StringValue("world"), value.getArrayValue().get(1)); + } + + @Test + void testBooleanToValue() throws PMException { + Value value = Value.fromObject(true); + assertTrue(value.getType().isBoolean()); + assertTrue(value.getBooleanValue()); + } + + @Test + void testListToValue() throws PMException { + Value value = Value.fromObject(Arrays.asList("hello", "world")); + assertTrue(value.getType().isArray()); + assertEquals(new StringValue("hello"), value.getArrayValue().get(0)); + assertEquals(new StringValue("world"), value.getArrayValue().get(1)); + } + + @Test + void testObjectToValue() throws PMException { + EventContext testEventCtx = new EventContext( + "testUser", + "", + new CreateObjectAttributeOp(), + Map.of(NAME_OPERAND, "testOA", PROPERTIES_OPERAND, NO_PROPERTIES, DESCENDANTS_OPERAND, List.of("pc1")) + ); + + Value objectToValue = Value.fromObject(testEventCtx); + assertTrue(objectToValue.getType().isMap()); + + Value key = new StringValue("user"); + Value value = objectToValue.getMapValue().get(key); + assertEquals(new StringValue("testUser"), value); + + key = new StringValue("opName"); + value = objectToValue.getMapValue().get(key); + assertTrue(value.getType().isString()); + assertEquals(CREATE_OBJECT_ATTRIBUTE, value.getStringValue()); + + key = new StringValue("operands"); + value = objectToValue.getMapValue().get(key); + assertTrue(value.getType().isMap()); + assertEquals( + Map.of(new StringValue("name"), new StringValue("testOA"), + new StringValue("properties"), new MapValue(new HashMap<>(), Type.string(), Type.string()), + new StringValue("descendants"), new ArrayValue(List.of(new StringValue("pc1")), Type.string()) + ), + value.getMapValue() + ); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteralTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteralTest.java new file mode 100644 index 000000000..c8988e23a --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/ArrayLiteralTest.java @@ -0,0 +1,41 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class ArrayLiteralTest { + + @Test + void testSuccess() throws PMException { + PMLParser.LiteralExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + ["a", "b", "c"] + """, + PMLParser.LiteralExpressionContext.class); + + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = Literal.compileLiteral(visitorContext, ctx); + assertTrue(expression instanceof ArrayLiteral); + + ArrayLiteral a = (ArrayLiteral) expression; + assertEquals( + buildArrayLiteral("a", "b", "c"), + a + ); + assertEquals( + Type.array(Type.string()), + a.getType() + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteralTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteralTest.java new file mode 100644 index 000000000..d9c95d755 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/BoolLiteralTest.java @@ -0,0 +1,46 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.executable.PMLExecutableSignature; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.GlobalScope; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BoolLiteralTest { + + @Test + void testSuccess() throws PMException { + PMLParser.LiteralExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + true + """, + PMLParser.LiteralExpressionContext.class); + + GlobalScope globalScope = new CompileGlobalScope(); + + VisitorContext visitorContext = new VisitorContext(globalScope); + Expression expression = Literal.compileLiteral(visitorContext, ctx); + assertTrue(expression instanceof BoolLiteral); + + BoolLiteral a = (BoolLiteral) expression; + assertEquals( + new BoolLiteral(true), + a + ); + assertEquals( + Type.bool(), + a.getType(new Scope<>(globalScope)) + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitorTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitorTest.java new file mode 100644 index 000000000..c3f15faaa --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/LiteralVisitorTest.java @@ -0,0 +1,261 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class LiteralVisitorTest { + + @Test + void testVisitStringLiteral() throws PMException { + PMLParser.StringLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + "test" + """, + PMLParser.StringLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + StringLiteral literal = new LiteralVisitor(visitorContext) + .visitStringLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + assertEquals( + new StringLiteral("test"), + literal + ); + assertEquals( + Type.string(), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testVisitBoolLiteral() throws PMException { + PMLParser.BoolLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + true + """, + PMLParser.BoolLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + BoolLiteral literal = new LiteralVisitor(visitorContext) + .visitBoolLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + assertEquals( + new BoolLiteral(true), + literal + ); + assertEquals( + Type.bool(), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testVisitArrayLiteral() throws PMException { + PMLParser.ArrayLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + ["a", ["b"]] + """, + PMLParser.ArrayLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression literal = new LiteralVisitor(visitorContext) + .visitArrayLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + ArrayLiteral arrayLiteral = (ArrayLiteral)literal; + assertEquals( + new ArrayLiteral(List.of(new StringLiteral("a"), new ArrayLiteral(List.of(new StringLiteral("b")), Type.string())), Type.any()), + arrayLiteral + ); + assertEquals( + Type.array(Type.any()), + literal.getType(visitorContext.scope()) + ); + + ctx = PMLContextVisitor.toLiteralCtx( + """ + ["a", "b"] + """, + PMLParser.ArrayLiteralContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + literal = new LiteralVisitor(visitorContext) + .visitArrayLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + arrayLiteral = (ArrayLiteral)literal; + assertEquals( + buildArrayLiteral("a", "b"), + arrayLiteral + ); + assertEquals( + Type.array(Type.string()), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testVisitArrayLiteralScopeException() throws PMException { + PMLParser.ArrayLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + ["a", b] + """, + PMLParser.ArrayLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> new LiteralVisitor(visitorContext) + .visitArrayLiteral(ctx) + ); + + assertEquals(1, e.getErrors().size()); + assertEquals( + "unknown variable 'b' in scope", + e.getErrors().get(0).errorMessage() + ); + } + + @Test + void testVisitMapLiteral() throws PMException { + PMLParser.MapLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + { + "a": "a1", + "b": "b1" + } + """, + PMLParser.MapLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression literal = new LiteralVisitor(visitorContext) + .visitMapLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + MapLiteral mapLiteral = (MapLiteral)literal; + assertEquals( + buildMapLiteral("a", "a1", "b", "b1"), + mapLiteral + ); + assertEquals( + Type.map(Type.string(), Type.string()), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testVisitMapLiteralDifferentValueTypes() throws PMException { + PMLParser.MapLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + { + "a": "a1", + "b": ["b1"] + } + """, + PMLParser.MapLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression literal = new LiteralVisitor(visitorContext) + .visitMapLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + MapLiteral mapLiteral = (MapLiteral)literal; + assertEquals( + new MapLiteral(Map.of( + new StringLiteral("a"), new StringLiteral("a1"), + new StringLiteral("b"), new ArrayLiteral(List.of(new StringLiteral("b1")), Type.string()) + ), Type.string(), Type.any()), + mapLiteral + ); + assertEquals( + Type.map(Type.string(), Type.any()), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testVisitMapLiteralDifferentKeyTypes() throws PMException { + PMLParser.MapLiteralContext ctx = PMLContextVisitor.toLiteralCtx( + """ + { + "a": "a1", + ["b"]: "b1" + } + """, + PMLParser.MapLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression literal = new LiteralVisitor(visitorContext) + .visitMapLiteral(ctx); + + assertEquals(0, visitorContext.errorLog().getErrors().size()); + + MapLiteral mapLiteral = (MapLiteral)literal; + MapLiteral expected = new MapLiteral(new HashMap<>(Map.of( + new StringLiteral("a"), new StringLiteral("a1"), + new ArrayLiteral(List.of(new StringLiteral("b")), Type.string()), new StringLiteral("b1") + )), Type.any(), Type.string()); + + assertEquals(expected, mapLiteral); + assertEquals( + Type.map(Type.any(), Type.string()), + literal.getType(visitorContext.scope()) + ); + } + + @Test + void testEmptyLiterals() throws PMException { + PMLParser.StringLiteralContext stringCtx = PMLContextVisitor.toLiteralCtx( + "\"\"", + PMLParser.StringLiteralContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + StringLiteral literal = new LiteralVisitor(visitorContext) + .visitStringLiteral(stringCtx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals( + new StringLiteral(""), + literal + ); + + PMLParser.ArrayLiteralContext arrayCtx = PMLContextVisitor.toLiteralCtx( + "[]", + PMLParser.ArrayLiteralContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression arrayLiteral = new LiteralVisitor(visitorContext) + .visitArrayLiteral(arrayCtx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals( + new ArrayLiteral(List.of(), Type.any()), + arrayLiteral + ); + + PMLParser.MapLiteralContext mapCtx = PMLContextVisitor.toLiteralCtx( + "{}", + PMLParser.MapLiteralContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression mapLiteral = new LiteralVisitor(visitorContext) + .visitMapLiteral(mapCtx); + assertEquals(0, visitorContext.errorLog().getErrors().size()); + assertEquals( + new MapLiteral(Map.of(), Type.any(), Type.any()), + mapLiteral + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteralTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteralTest.java new file mode 100644 index 000000000..96d92834b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/MapLiteralTest.java @@ -0,0 +1,49 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class MapLiteralTest { + + @Test + void testSuccess() throws PMException { + PMLParser.LiteralExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + { + "a": ["1", "2"], + "b": "c" + } + """, + PMLParser.LiteralExpressionContext.class); + + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = Literal.compileLiteral(visitorContext, ctx); + assertTrue(expression instanceof MapLiteral); + + MapLiteral a = (MapLiteral) expression; + assertEquals( + new MapLiteral(Map.of( + new StringLiteral("a"), buildArrayLiteral("1", "2"), + new StringLiteral("b"), new StringLiteral("c") + ), Type.string(), Type.any()), + a + ); + assertEquals( + Type.map(Type.string(), Type.any()), + a.getType() + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteralTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteralTest.java new file mode 100644 index 000000000..3ba122a59 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/literal/StringLiteralTest.java @@ -0,0 +1,41 @@ +package gov.nist.csd.pm.pap.pml.expression.literal; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.scope.Scope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class StringLiteralTest { + + @Test + void testSuccess() throws PMException { + PMLParser.LiteralExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + "test" + """, + PMLParser.LiteralExpressionContext.class); + + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Expression expression = Literal.compileLiteral(visitorContext, ctx); + assertTrue(expression instanceof StringLiteral); + + StringLiteral a = (StringLiteral) expression; + assertEquals( + new StringLiteral("test"), + a + ); + assertEquals( + Type.string(), + a.getType(new Scope<>(new CompileGlobalScope())) + ); + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndexTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndexTest.java new file mode 100644 index 000000000..a1a6f2833 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByBracketIndexTest.java @@ -0,0 +1,125 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.*; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class ReferenceByBracketIndexTest { + + @Test + void testGetType() throws PMException { + ReferenceByBracketIndex a = new ReferenceByBracketIndex(new ReferenceByID("a"), new StringLiteral("b")); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Type expected = Type.array(Type.string()); + visitorContext.scope().addVariable("a", new Variable("a", Type.map(Type.string(), expected), false)); + + assertEquals( + expected, + a.getType(visitorContext.scope()) + ); + } + + @Test + void testExecute() throws PMException { + ReferenceByBracketIndex a = new ReferenceByBracketIndex(new ReferenceByID("a"), new StringLiteral("b")); + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), new MemoryPAP()); + ArrayValue expected = new ArrayValue(List.of(new StringValue("1"), new StringValue("2")), Type.string()); + MapValue mapValue = new MapValue(Map.of(new StringValue("b"), expected), Type.string(), Type.array(Type.string())); + executionContext.scope().addVariable("a", mapValue); + + PAP pap = new MemoryPAP(); + Value actual = a.execute(executionContext, pap); + assertEquals(expected, actual); + } + + @Test + void testIndexChain() throws PMException { + String pml = """ + a := { + "b": { + "c": { + "d": "e" + } + } + } + + create policy class a["b"]["c"]["d"] + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + assertTrue(pap.query().graph().nodeExists("e")); + } + + @Test + void testWrongKeyType() throws PMException { + String pml = """ + a := { + "b": { + "c": { + "d": "e" + } + } + } + + create policy class a[true]["c"]["d"] + """; + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("u1", List.of("ua1")); + PMLCompilationException e = assertThrows(PMLCompilationException.class, + () -> pap.executePML(new UserContext("u1"), pml)); + assertEquals("expected expression type(s) [string], got bool", e.getErrors().get(0).errorMessage()); + } + + @Test + void testKeyDoesNotExist() throws PMException { + String pml = """ + a := { + "b": { + "c": { + "d": "e" + } + } + } + + create policy class a["z"]["c"]["d"] + """; + PAP pap = new MemoryPAP(); + assertThrows(NullPointerException.class, + () -> pap.executePML(new UserContext("u1"), pml)); + } + + @Test + void testArrayKey() throws PMException { + String pml = """ + a := { + ["a"]: "test" + } + + create policy class a[["a"]] + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + assertTrue(pap.query().graph().nodeExists("test")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndexTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndexTest.java new file mode 100644 index 000000000..d118c31b9 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByDotIndexTest.java @@ -0,0 +1,76 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.ArrayValue; +import gov.nist.csd.pm.pap.pml.value.MapValue; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class ReferenceByDotIndexTest { + + @Test + void testGetType() throws PMException { + ReferenceByDotIndex a = new ReferenceByDotIndex(new ReferenceByID("a"), "b"); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + Type expected = Type.array(Type.string()); + visitorContext.scope().addVariable("a", new Variable("a", Type.map(Type.string(), expected), false)); + + assertEquals( + expected, + a.getType(visitorContext.scope()) + ); + } + + @Test + void testExecute() throws PMException { + ReferenceByDotIndex a = new ReferenceByDotIndex(new ReferenceByID("a"), "b"); + PAP pap = new MemoryPAP(); + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), pap); + ArrayValue expected = new ArrayValue(List.of(new StringValue("1"), new StringValue("2")), Type.string()); + MapValue mapValue = new MapValue( + Map.of(new StringValue("b"), expected), Type.string(), Type.array(Type.string())); + executionContext.scope().addVariable("a", mapValue); + + Value actual = a.execute(executionContext, pap); + assertEquals(expected, actual); + } + + @Test + void testIndexChain() throws PMException { + String pml = """ + a := { + "b": { + "c": { + "d": "e" + } + } + } + + create policy class a.b.c.d + """; + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("u1", List.of("ua1")); + pap.executePML(new UserContext("u1"), pml); + + assertTrue(pap.query().graph().nodeExists("e")); + } + + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIDTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIDTest.java new file mode 100644 index 000000000..f916c0965 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/ReferenceByIDTest.java @@ -0,0 +1,43 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.pml.value.Value; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ReferenceByIDTest { + + @Test + void testGetType() throws PMException { + ReferenceByID a = new ReferenceByID("a"); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.string(), false)); + + assertEquals( + Type.string(), + a.getType(visitorContext.scope()) + ); + } + + @Test + void testExecute() throws PMException { + ReferenceByID a = new ReferenceByID("a"); + ExecutionContext executionContext = new ExecutionContext(new UserContext(""), new MemoryPAP()); + Value expected = new StringValue("test"); + executionContext.scope().addVariable("a", expected); + + Value actual = a.execute(executionContext, new MemoryPAP()); + assertEquals(expected, actual); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReferenceTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReferenceTest.java new file mode 100644 index 000000000..51e52a65b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/expression/reference/VariableReferenceTest.java @@ -0,0 +1,129 @@ +package gov.nist.csd.pm.pap.pml.expression.reference; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLContextVisitor; +import gov.nist.csd.pm.pap.pml.antlr.PMLParser; +import gov.nist.csd.pm.pap.pml.compiler.Variable; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationRuntimeException; +import gov.nist.csd.pm.pap.pml.expression.Expression; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.VisitorContext; +import gov.nist.csd.pm.pap.pml.scope.CompileGlobalScope; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.expression.reference.VariableReference.compileVariableReference; +import static org.junit.jupiter.api.Assertions.*; + +class VariableReferenceTest { + + @Nested + class ReferenceByIDTest { + @Test + void testReferenceById() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.string(), false)); + Expression actual = compileVariableReference(visitorContext, ctx.variableReference()); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().toString()); + assertEquals( + new ReferenceByID("a"), + actual + ); + } + + @Test + void testUnknownVariable() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> compileVariableReference(visitorContext, ctx.variableReference()) + ); + assertEquals(1, e.getErrors().size()); + assertEquals( + "unknown variable 'a' in scope", + e.getErrors().get(0).errorMessage() + ); + } + } + + @Nested + class ReferenceByIndexTest { + @Test + void testSuccess() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a.b.c + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.map(Type.string(), Type.map(Type.string(), Type.string())), false)); + Expression actual = compileVariableReference(visitorContext, ctx.variableReference()); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().toString()); + assertEquals( + new ReferenceByDotIndex(new ReferenceByDotIndex(new ReferenceByID("a"), "b"), "c"), + actual + ); + + ctx = PMLContextVisitor.toExpressionCtx( + """ + a["b"]["c"] + """, PMLParser.VariableReferenceExpressionContext.class); + visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.map(Type.string(), Type.map(Type.string(), Type.string())), false)); + actual = compileVariableReference(visitorContext, ctx.variableReference()); + assertEquals(0, visitorContext.errorLog().getErrors().size(), visitorContext.errorLog().toString()); + assertEquals( + new ReferenceByBracketIndex(new ReferenceByBracketIndex(new ReferenceByID("a"), new StringLiteral("b")), new StringLiteral("c")), + actual + ); + } + + @Test + void testUnknownVariable() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a.b.c + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> compileVariableReference(visitorContext, ctx.variableReference()) + ); + assertEquals(1, e.getErrors().size()); + assertEquals( + "unknown variable 'a' in scope", + e.getErrors().get(0).errorMessage() + ); + } + + @Test + void testVarRefNotAMap() throws PMException { + PMLParser.VariableReferenceExpressionContext ctx = PMLContextVisitor.toExpressionCtx( + """ + a.b.c + """, PMLParser.VariableReferenceExpressionContext.class); + VisitorContext visitorContext = new VisitorContext(new CompileGlobalScope()); + visitorContext.scope().addVariable("a", new Variable("a", Type.map(Type.string(), Type.string()), false)); + PMLCompilationRuntimeException e = assertThrows( + PMLCompilationRuntimeException.class, + () -> compileVariableReference(visitorContext, ctx.variableReference()) + ); + assertEquals(1, e.getErrors().size(), visitorContext.errorLog().toString()); + assertEquals( + "expected type map but got string", + e.getErrors().get(0).errorMessage() + ); + } + } + + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/pattern/OperationPatternTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/OperationPatternTest.java new file mode 100644 index 000000000..857e158ed --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/OperationPatternTest.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.pattern; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.pattern.PatternTestUtil.compileTestCreateRuleStatement; +import static org.junit.jupiter.api.Assertions.*; + +class OperationPatternTest { + + @Test + void testOperationPattern() throws PMException { + OperationPattern pattern = new OperationPattern(); + assertTrue(pattern.matches("test", new MemoryPAP())); + + pattern = new OperationPattern("test"); + assertTrue(pattern.matches("test", new MemoryPAP())); + assertFalse(pattern.matches("test1", new MemoryPAP())); + } + + @Test + void testPML() throws PMException { + String pml = """ + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """; + CreateRuleStatement stmt = compileTestCreateRuleStatement(pml); + assertEquals(new OperationPattern(), stmt.getOperationPattern()); + + pml = """ + create obligation "ob1" { + create rule "r1" + when any user + performs "op1" + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new OperationPattern("op1"), stmt.getOperationPattern()); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/pattern/PatternTestUtil.java b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/PatternTestUtil.java new file mode 100644 index 000000000..0d0035561 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/PatternTestUtil.java @@ -0,0 +1,20 @@ +package gov.nist.csd.pm.pap.pml.pattern; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.PMLCompiler; +import gov.nist.csd.pm.pap.pml.statement.PMLStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateObligationStatement; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; + +import java.util.List; + +public class PatternTestUtil { + + public static CreateRuleStatement compileTestCreateRuleStatement(String pml) throws PMException { + PMLCompiler pmlCompiler = new PMLCompiler(); + List pmlStatements = pmlCompiler.compilePML(pml); + CreateObligationStatement stmt = (CreateObligationStatement)pmlStatements.getFirst(); + return stmt.getRuleStmts().getFirst(); + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternTest.java new file mode 100644 index 000000000..e13d734f7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/operand/OperandPatternTest.java @@ -0,0 +1,165 @@ +package gov.nist.csd.pm.pap.pml.pattern.operand; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.pattern.PatternTestUtil.compileTestCreateRuleStatement; +import static org.junit.jupiter.api.Assertions.*; + +public class OperandPatternTest { + + @Test + void testOperandPattern() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1", "ua2")); + pap.modify().graph().createUser("u2", List.of("ua2")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObject("o1", List.of("oa1")); + pap.modify().graph().createObject("o2", List.of("oa2")); + + String pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" + performs "assign" + on { + ascendant: "o1", + descendants: "oa1" + } + do(ctx) { } + } + """; + CreateRuleStatement stmt = compileTestCreateRuleStatement(pml); + assertEquals( + Map.of( + "ascendant", List.of(new NodeOperandPattern("o1")), + "descendants", List.of(new NodeOperandPattern("oa1")) + ), + stmt.getOperandPattern() + ); + assertTrue(stmt.getOperandPattern().get("ascendant").getFirst().matches("o1", pap)); + assertTrue(stmt.getOperandPattern().get("descendants").getFirst().matches("oa1", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" + performs "assign" + on { + ascendant: ["o1"], + descendants: ["oa1"] + } + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals( + Map.of( + "ascendant", List.of(new NodeOperandPattern("o1")), + "descendants", List.of(new NodeOperandPattern("oa1")) + ), + stmt.getOperandPattern() + ); + assertTrue(stmt.getOperandPattern().get("ascendant").getFirst().matches("o1", pap)); + assertTrue(stmt.getOperandPattern().get("descendants").getFirst().matches("oa1", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" + performs "assign" + on { + ascendant: ["o1", "o2"], + descendants: [!"oa1"] + } + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals( + Map.of( + "ascendant", List.of(new NodeOperandPattern("o1"), new NodeOperandPattern("o2")), + "descendants", List.of(new NegateOperandPatternExpression(new NodeOperandPattern("oa1"))) + ), + stmt.getOperandPattern() + ); + assertTrue(stmt.getOperandPattern().get("ascendant").getFirst().matches("o1", pap)); + assertFalse(stmt.getOperandPattern().get("ascendant").getFirst().matches("o2", pap)); + assertTrue(stmt.getOperandPattern().get("ascendant").get(1).matches("o2", pap)); + assertFalse(stmt.getOperandPattern().get("ascendant").get(1).matches("o3", pap)); + assertFalse(stmt.getOperandPattern().get("descendants").getFirst().matches("oa1", pap)); + assertTrue(stmt.getOperandPattern().get("descendants").getFirst().matches("oa2", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" + performs "assign" + on { + ascendant: ["o1", any], + descendants: [!"oa1", ("oa1" || "oa2")] + } + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals( + Map.of( + "ascendant", List.of(new NodeOperandPattern("o1"), new AnyOperandPattern()), + "descendants", List.of( + new NegateOperandPatternExpression(new NodeOperandPattern("oa1")), + new ParenOperandPatternExpression( + new LogicalOperandPatternExpression( + new NodeOperandPattern("oa1"), + new NodeOperandPattern("oa2"), + false + ) + ) + ) + ), + stmt.getOperandPattern() + ); + assertTrue(stmt.getOperandPattern().get("ascendant").getFirst().matches("o1", pap)); + assertFalse(stmt.getOperandPattern().get("ascendant").getFirst().matches("o2", pap)); + assertTrue(stmt.getOperandPattern().get("ascendant").get(1).matches("o2", pap)); + assertTrue(stmt.getOperandPattern().get("ascendant").get(1).matches("o3", pap)); + assertFalse(stmt.getOperandPattern().get("descendants").getFirst().matches("oa1", pap)); + assertTrue(stmt.getOperandPattern().get("descendants").get(1).matches("oa1", pap)); + assertTrue(stmt.getOperandPattern().get("descendants").get(1).matches("oa2", pap)); + } + + @Test + void testOnlyNodeOpsInEventContext() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + assertThrows(NodeDoesNotExistException.class, () -> pap.executePML(new UserContext("u1"), """ + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + create obligation "ob1" { + create rule "r1" + when user "u1" + performs "create_object_attribute" + on { + name: "oa2", + descendants: any + } + do(ctx) { + create oa "oa2" in ["oa1"] + } + } + """)); + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternTest.java new file mode 100644 index 000000000..08017bcac --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/pattern/subject/SubjectPatternTest.java @@ -0,0 +1,143 @@ +package gov.nist.csd.pm.pap.pml.pattern.subject; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.statement.operation.CreateRuleStatement; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.pattern.PatternTestUtil.compileTestCreateRuleStatement; +import static org.junit.jupiter.api.Assertions.*; + +class SubjectPatternTest { + + @Test + void testSubjectPattern() throws PMException { + MemoryPAP pap = new MemoryPAP(); + SubjectPattern pattern = new SubjectPattern(); + assertTrue(pattern.matches("test", pap)); + + pattern = new SubjectPattern(new UsernamePattern("test")); + assertTrue(pattern.matches("test", pap)); + assertFalse(pattern.matches("test1", pap)); + } + + @Test + void testPML() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1", "ua2")); + pap.modify().graph().createUser("u2", List.of("ua2")); + + String pml = """ + create obligation "ob1" { + create rule "r1" + when any user + performs any operation + do(ctx) { } + } + """; + CreateRuleStatement stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("u1", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new UsernamePattern("u1")), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("u1", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" || "u2" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new LogicalSubjectPatternExpression( + new UsernamePattern("u1"), + new UsernamePattern("u2"), + false + )), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("u1", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user "u1" && in "ua2" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new LogicalSubjectPatternExpression( + new UsernamePattern("u1"), + new InSubjectPattern("ua2"), + true + )), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("u1", pap)); + assertFalse(stmt.getSubjectPattern().matches("u2", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user !in "ua1" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new NegateSubjectPatternExpression( + new InSubjectPattern("ua1") + )), stmt.getSubjectPattern()); + assertFalse(stmt.getSubjectPattern().matches("u1", pap)); + assertTrue(stmt.getSubjectPattern().matches("u2", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user ("u1" && in "ua2") || "u2" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new LogicalSubjectPatternExpression( + new ParenSubjectPatternExpression( + new LogicalSubjectPatternExpression( + new UsernamePattern("u1"), + new InSubjectPattern("ua2"), + true + ) + ), + new UsernamePattern("u2"), + false + )), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("u1", pap)); + assertTrue(stmt.getSubjectPattern().matches("u2", pap)); + + pml = """ + create obligation "ob1" { + create rule "r1" + when user process "p1" + performs any operation + do(ctx) { } + } + """; + stmt = compileTestCreateRuleStatement(pml); + assertEquals(new SubjectPattern(new ProcessSubjectPattern("p1")), stmt.getSubjectPattern()); + assertTrue(stmt.getSubjectPattern().matches("p1", pap)); + assertFalse(stmt.getSubjectPattern().matches("p2", pap)); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/BreakStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/BreakStatementTest.java new file mode 100644 index 000000000..151660937 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/BreakStatementTest.java @@ -0,0 +1,68 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BreakStatementTest { + + @Test + void testSuccess() throws PMException { + String pml = """ + foreach x in ["a", "b", "c"] { + create policy class x + + if x == "b" { + break + } + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("a")); + assertTrue(pap.query().graph().nodeExists("b")); + assertFalse(pap.query().graph().nodeExists("c")); + } + + @Test + void testMultipleLevels() throws PMException { + String pml = """ + foreach x in ["a", "b", "c"] { + create policy class x + + if x == "b" { + if x == "b" { + break + } + } + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("a")); + assertTrue(pap.query().graph().nodeExists("b")); + assertFalse(pap.query().graph().nodeExists("c")); + } + + @Test + void testToFormattedString() { + BreakStatement stmt = new BreakStatement(); + + assertEquals( + "break", + stmt.toFormattedString(0) + ); + assertEquals( + " break", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatementTest.java new file mode 100644 index 000000000..d3ef9c6ca --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ContinueStatementTest.java @@ -0,0 +1,68 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class ContinueStatementTest { + + @Test + void testSuccess() throws PMException { + String pml = """ + foreach x in ["a", "b", "c"] { + if x == "b" { + continue + } + + create policy class x + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("a")); + assertFalse(pap.query().graph().nodeExists("b")); + assertTrue(pap.query().graph().nodeExists("c")); + } + + @Test + void testMultipleLevels() throws PMException { + String pml = """ + foreach x in ["a", "b", "c"] { + if x == "b" { + if x == "b" { + continue + } + } + + create policy class x + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("a")); + assertFalse(pap.query().graph().nodeExists("b")); + assertTrue(pap.query().graph().nodeExists("c")); + } + + @Test + void testToFormattedString() { + ContinueStatement stmt = new ContinueStatement(); + + assertEquals( + "continue", + stmt.toFormattedString(0) + ); + assertEquals( + " continue", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatementTest.java new file mode 100644 index 000000000..16fc62969 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ForeachStatementTest.java @@ -0,0 +1,179 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.scope.UnknownVariableInScopeException; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class ForeachStatementTest { + + @Test + void testSuccess() throws PMException { + // array + ForeachStatement stmt = new ForeachStatement("x", null, buildArrayLiteral("a", "b", "c"), + List.of(new CreatePolicyStatement(new ReferenceByID("x"))) + ); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + UserContext userContext = new UserContext("u1"); + + stmt.execute(new ExecutionContext(userContext, pap), pap); + + assertEquals(5, pap.query().graph().getPolicyClasses().size()); + assertTrue(pap.query().graph().getPolicyClasses().containsAll(List.of("a", "b", "c"))); + + // map with key and value vars + stmt = new ForeachStatement("x", "y", buildMapLiteral("a", "b", "c", "d"), List.of( + new CreatePolicyStatement(new ReferenceByID("x")), + new CreatePolicyStatement(new ReferenceByID("y")) + )); + + pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + stmt.execute(new ExecutionContext(userContext, pap), pap); + + assertEquals(6, pap.query().graph().getPolicyClasses().size()); + assertTrue(pap.query().graph().getPolicyClasses().containsAll(List.of("a", "b", "c", "d"))); + + // map with key only + stmt = new ForeachStatement("x", null, buildMapLiteral("a", "b", "c", "d"), List.of( + new CreatePolicyStatement(new ReferenceByID("x")) + )); + + pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + stmt.execute(new ExecutionContext(userContext, pap), pap); + + assertEquals(4, pap.query().graph().getPolicyClasses().size()); + assertTrue(pap.query().graph().getPolicyClasses().containsAll(List.of("a", "c"))); + } + + @Test + void testOverwriteValues() throws PMException, UnknownVariableInScopeException { + ForeachStatement stmt = new ForeachStatement("x", null, buildArrayLiteral("a", "b", "c"), List.of( + new VariableAssignmentStatement("test", false, new ReferenceByID("x")) + )); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + UserContext userContext = new UserContext("u1"); + + ExecutionContext executionContext = new ExecutionContext(userContext, pap); + executionContext.scope().addVariable("test", new StringValue("test")); + stmt.execute(executionContext, pap); + + assertEquals( + "c", + executionContext.scope().getVariable("test").getStringValue() + ); + } + + @Test + void testArrayToFormattedString() { + ForeachStatement stmt = new ForeachStatement("x", null, buildArrayLiteral("a", "b", "c"), + List.of( + new CreatePolicyStatement(new ReferenceByID("x")) + ) + ); + + assertEquals(""" + foreach x in ["a", "b", "c"] { + create PC x + }""", + stmt.toFormattedString(0)); + + assertEquals(""" + foreach x in ["a", "b", "c"] { + create PC x + } + """, + stmt.toFormattedString(1) + "\n"); + } + + @Test + void testMapToFormattedString() { + ForeachStatement stmt = new ForeachStatement("x", "y", buildMapLiteral("a", "b", "c", "d"), + List.of( + new CreatePolicyStatement(new ReferenceByID("x")) + ) + ); + + assertEquals(""" + foreach x, y in {"a": "b", "c": "d"} { + create PC x + }""", + stmt.toFormattedString(0)); + + assertEquals(""" + foreach x, y in {"a": "b", "c": "d"} { + create PC x + } + """, + stmt.toFormattedString(1) + "\n"); + } + + @Test + void testReturnEndsExecution() throws PMException { + String pml = """ + f1() + + operation f1() { + foreach x in ["1", "2", "3"] { + if x == "2" { + return + } + + create PC x + } + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + + assertTrue(pap.query().graph().nodeExists("1")); + assertFalse(pap.query().graph().nodeExists("2")); + + pml = """ + f1() + + operation f1() { + foreach x, y in {"1": "1", "2": "2"} { + if x == "2" { + return + } + + create PC x + } + } + """; + pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + + assertTrue(pap.query().graph().nodeExists("1")); + assertFalse(pap.query().graph().nodeExists("2")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionDefinitionStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionDefinitionStatementTest.java new file mode 100644 index 000000000..2723b2a3f --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionDefinitionStatementTest.java @@ -0,0 +1,171 @@ +package gov.nist.csd.pm.pap.pml.statement; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.exception.PMLCompilationException; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLStmtsOperation; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLStmtsRoutine; +import gov.nist.csd.pm.pap.pml.expression.reference.ReferenceByID; +import gov.nist.csd.pm.pap.pml.statement.operation.*; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class FunctionDefinitionStatementTest { + + @Test + void testOperationFormattedString() { + CreateFunctionStatement stmt = new CreateOperationStatement(new PMLStmtsOperation( + "op1", + Type.string(), + List.of("a", "b", "c"), + List.of("a"), + Map.of("a", Type.string(), "b", Type.bool(), "c", Type.array(Type.string())), + new PMLStatementBlock( + new CheckStatement(new StringLiteral("ar1"), new ReferenceByID("a")), + new CheckStatement(new StringLiteral("ar2"), new StringLiteral("node")) + ), + new PMLStatementBlock( + List.of( + new FunctionReturnStatement(new StringLiteral("test")) + ) + ) + )); + + assertEquals(""" + operation op1(nodeop string a, bool b, []string c) string { + check "ar1" on a + check "ar2" on "node" + } { + return "test" + }""", + stmt.toFormattedString(0)); + + assertEquals(""" + operation op1(nodeop string a, bool b, []string c) string { + check "ar1" on a + check "ar2" on "node" + } { + return "test" + } + """, + stmt.toFormattedString(1) + "\n"); + } + + @Test + void testRoutineFormattedString() { + CreateFunctionStatement stmt = new CreateRoutineStatement(new PMLStmtsRoutine( + "rou1", + Type.voidType(), + List.of("a", "b", "c"), + Map.of("a", Type.string(), "b", Type.bool(), "c", Type.array(Type.string())), + new PMLStatementBlock( + List.of( + new CreatePolicyStatement(new StringLiteral("test")) + ) + ) + )); + + assertEquals(""" + routine rou1(string a, bool b, []string c) { + create PC "test" + }""", + stmt.toFormattedString(0)); + + assertEquals(""" + routine rou1(string a, bool b, []string c) { + create PC "test" + } + """, + stmt.toFormattedString(1) + "\n"); + } + + @Test + void testToFormattedStringVoidReturn() { + CreateFunctionStatement stmt = new CreateOperationStatement(new PMLStmtsOperation( + "func1", + Type.voidType(), + List.of("a", "b", "c"), + List.of("a"), + Map.of("a", Type.string(), "b", Type.bool(), "c", Type.array(Type.string())), + new PMLStatementBlock( + new CheckStatement(new StringLiteral("ar1"), new ReferenceByID("a")), + new CheckStatement(new StringLiteral("ar2"), new StringLiteral("node")) + ), + new PMLStatementBlock( + List.of( + new FunctionReturnStatement() + ) + ) + )); + + assertEquals(""" + operation func1(nodeop string a, bool b, []string c) { + check "ar1" on a + check "ar2" on "node" + } { + return + }""", + stmt.toFormattedString(0)); + } + + @Test + void testFormalArgOverwritesVariable() + throws PMException { + String pml = """ + var a = "test" + var b = "test2" + func1(a, b) + + operation func1(string a, string b) { + create policy class a + create policy class b + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("test")); + assertTrue(pap.query().graph().nodeExists("test2")); + } + + @Test + void testInvokeFromDefinition() throws PMException { + String pml = """ + operation f1(string a) { + create policy class a + } + + operation f2() { + a := "test" + f1(a) + } + + f2() + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), pml); + + assertTrue(pap.query().graph().nodeExists("test")); + } + + @Test + void testUsingVarInOperationThrowsException() throws PMException { + String pml = """ + x := "x" + + operation func2() { + create policy class x + } + """; + PAP pap = new MemoryPAP(); + assertThrows(PMLCompilationException.class, () -> pap.executePML(new UserContext(""), pml)); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatementTest.java new file mode 100644 index 000000000..e3a542a59 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/FunctionReturnStatementTest.java @@ -0,0 +1,29 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +class FunctionReturnStatementTest { + + @Test + void testReturnValueIsUnwrapped() throws PMException { + String pml = """ + operation f1() string { + return f2() + } + + operation f2() string { + return "test" + } + + create policy class f1() + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(), pml); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/IfStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/IfStatementTest.java new file mode 100644 index 000000000..a268f123b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/IfStatementTest.java @@ -0,0 +1,105 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.statement.operation.CreatePolicyStatement; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.BoolLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class IfStatementTest { + + @Test + void testSuccess() throws PMException { + String pml = """ + operation func1(string s) { + if s == "a" { + create policy class s + + } else if s == "b" { + create policy class s + + } else if s == "c" { + create policy class s + + } else { + create policy class s + + } + } + + func1("a") + func1("b") + func1("c") + func1("d") + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + assertTrue(pap.query().graph().nodeExists("a")); + assertTrue(pap.query().graph().nodeExists("b")); + assertTrue(pap.query().graph().nodeExists("c")); + assertTrue(pap.query().graph().nodeExists("d")); + } + + @Test + void testToFormattedStringVoidReturn() { + IfStatement stmt = new IfStatement( + new IfStatement.ConditionalBlock( + new BoolLiteral(true), + new PMLStatementBlock( + new CreatePolicyStatement(new StringLiteral("a")) + ) + ), + List.of( + new IfStatement.ConditionalBlock( + new BoolLiteral(true), + new PMLStatementBlock( + new CreatePolicyStatement(new StringLiteral("b")) + ) + ), + new IfStatement.ConditionalBlock( + new BoolLiteral(true), + new PMLStatementBlock( + new CreatePolicyStatement(new StringLiteral("c")) + ) + ) + ), + new PMLStatementBlock( + new CreatePolicyStatement(new StringLiteral("d")) + ) + ); + + assertEquals(""" + if true { + create PC "a" + } else if true { + create PC "b" + } else if true { + create PC "c" + } else { + create PC "d" + }""", + stmt.toFormattedString(0)); + + assertEquals(""" + if true { + create PC "a" + } else if true { + create PC "b" + } else if true { + create PC "c" + } else { + create PC "d" + } + """, + stmt.toFormattedString(1) + "\n"); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatementTest.java new file mode 100644 index 000000000..933ea6ac0 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/ShortDeclarationStatementTest.java @@ -0,0 +1,41 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class ShortDeclarationStatementTest { + + @Test + void testSuccess() throws PMException { + ShortDeclarationStatement stmt = new ShortDeclarationStatement( + "a", new StringLiteral("test")); + + ExecutionContext ctx = new ExecutionContext(new UserContext("u1"), new MemoryPAP()); + stmt.execute(ctx, new MemoryPAP()); + + assertEquals(new StringValue("test"), ctx.scope().getVariable("a")); + } + + @Test + void testToFormattedString() { + ShortDeclarationStatement stmt = new ShortDeclarationStatement( + "a", new StringLiteral("test")); + + assertEquals( + "a := \"test\"", + stmt.toFormattedString(0) + ); + assertEquals( + " a := \"test\"", + stmt.toFormattedString(1) + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatementTest.java new file mode 100644 index 000000000..4fd5f226f --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableAssignmentStatementTest.java @@ -0,0 +1,66 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class VariableAssignmentStatementTest { + + @Test + void testSuccess() throws PMException { + VariableAssignmentStatement stmt = new VariableAssignmentStatement( + "a", false, new StringLiteral("test") + ); + + ExecutionContext ctx = new ExecutionContext(new UserContext("u1"), new MemoryPAP()); + ctx.scope().addVariable("a", new StringValue("a")); + stmt.execute(ctx, new MemoryPAP()); + + assertEquals(new StringValue("test"), ctx.scope().getVariable("a")); + + stmt = new VariableAssignmentStatement( + "a", true, new StringLiteral("test") + ); + + stmt.execute(ctx, new MemoryPAP()); + + assertEquals(new StringValue("testtest"), ctx.scope().getVariable("a")); + } + + @Test + void testToFormattedString() { + VariableAssignmentStatement stmt = new VariableAssignmentStatement( + "a", true, new StringLiteral("test") + ); + + assertEquals( + "a += \"test\"", + stmt.toFormattedString(0) + ); + assertEquals( + " a += \"test\"", + stmt.toFormattedString(1) + ); + + stmt = new VariableAssignmentStatement( + "a", false, new StringLiteral("test") + ); + + assertEquals( + "a = \"test\"", + stmt.toFormattedString(0) + ); + assertEquals( + " a = \"test\"", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatementTest.java new file mode 100644 index 000000000..b1cace863 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/VariableDeclarationStatementTest.java @@ -0,0 +1,71 @@ +package gov.nist.csd.pm.pap.pml.statement; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class VariableDeclarationStatementTest { + + @Test + void testSuccess() throws PMException { + VariableDeclarationStatement stmt1 = new VariableDeclarationStatement( + List.of( + new VariableDeclarationStatement.Declaration("a", new StringLiteral("a")), + new VariableDeclarationStatement.Declaration("b", new StringLiteral("b")) + ) + ); + + VariableDeclarationStatement stmt2 = new VariableDeclarationStatement( + List.of( + new VariableDeclarationStatement.Declaration("c", new StringLiteral("c")), + new VariableDeclarationStatement.Declaration("d", new StringLiteral("d")) + ) + ); + + ExecutionContext ctx = new ExecutionContext(new UserContext("u1"), new MemoryPAP()); + ctx.scope().addVariable("c", new StringValue("123")); + stmt1.execute(ctx, new MemoryPAP()); + stmt2.execute(ctx, new MemoryPAP()); + + assertEquals(new StringValue("a"), ctx.scope().getVariable("a")); + assertEquals(new StringValue("b"), ctx.scope().getVariable("b")); + assertEquals(new StringValue("c"), ctx.scope().getVariable("c")); + assertEquals(new StringValue("d"), ctx.scope().getVariable("d")); + } + + @Test + void testToFormattedString() { + VariableDeclarationStatement stmt = new VariableDeclarationStatement( + List.of( + new VariableDeclarationStatement.Declaration("c", new StringLiteral("c")), + new VariableDeclarationStatement.Declaration("d", new StringLiteral("d")) + ) + ); + + String expected = """ + var ( + c = "c" + d = "d" + ) + """; + assertEquals(expected, stmt.toFormattedString(0) + "\n"); + + expected = """ + var ( + c = "c" + d = "d" + ) + """; + assertEquals(expected, stmt.toFormattedString(1) + "\n"); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatementTest.java new file mode 100644 index 000000000..fe8a8a607 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssignStatementTest.java @@ -0,0 +1,48 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class AssignStatementTest { + + @Test + void testSuccess() throws PMException { + AssignStatement stmt = new AssignStatement(new StringLiteral("u1"), buildArrayLiteral("ua2", "ua3")); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + ExecutionContext execCtx = new ExecutionContext(new UserContext("u1"), pap); + stmt.execute(execCtx, pap); + + assertTrue(pap.query().graph().getAdjacentDescendants("u1").containsAll(List.of("ua1", "ua2", "ua3"))); + } + + @Test + void testToFormattedString() { + AssignStatement stmt = new AssignStatement(new StringLiteral("u1"), buildArrayLiteral("ua2", "ua3")); + assertEquals( + "assign \"u1\" to [\"ua2\", \"ua3\"]", + stmt.toFormattedString(0) + ); + assertEquals( + " assign \"u1\" to [\"ua2\", \"ua3\"]", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatementTest.java new file mode 100644 index 000000000..063288647 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/AssociateStatementTest.java @@ -0,0 +1,59 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class AssociateStatementTest { + + @Test + void testSuccess() throws PMException { + AssociateStatement stmt = new AssociateStatement( + new StringLiteral("ua1"), + new StringLiteral("oa1"), + buildArrayLiteral("read") + ); + + PAP pap = new MemoryPAP(); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("u1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + ExecutionContext execCtx = new ExecutionContext(new UserContext("u1"), pap); + stmt.execute(execCtx, pap); + + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").iterator().next().equals(new Association("ua1", "oa1", new AccessRightSet("read")))); + assertTrue(pap.query().graph().getAssociationsWithTarget("oa1").iterator().next().equals(new Association("ua1", "oa1", new AccessRightSet("read")))); + } + + @Test + void testToFormattedString() { + AssociateStatement stmt = new AssociateStatement( + new StringLiteral("ua1"), + new StringLiteral("oa1"), + buildArrayLiteral("read") + ); + assertEquals( + "associate \"ua1\" and \"oa1\" with [\"read\"]", + stmt.toFormattedString(0) + ); + assertEquals( + " associate \"ua1\" and \"oa1\" with [\"read\"]", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatementTest.java new file mode 100644 index 000000000..67ae4a3fd --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CheckStatementTest.java @@ -0,0 +1,92 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.type.Type; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CheckStatementTest { + + @Test + void test() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["assign", "assign_to"] + + create o "o1" in ["oa1"] + create o "o2" in ["oa1"] + create o "o3" in ["oa1"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + """); + + ExecutionContext ctx = new ExecutionContext(new UserContext("u1"), pap); + + testCheck(ctx, pap, new CheckStatement( + new StringLiteral("assign"), + new StringLiteral("o1") + ), false); + + testCheck(ctx, pap, new CheckStatement( + new ArrayLiteral(List.of(new StringLiteral("assign"), new StringLiteral("assign_to")), Type.string()), + new StringLiteral("o1") + ), false); + + testCheck(ctx, pap, new CheckStatement( + new ArrayLiteral(List.of(new StringLiteral("assign"), new StringLiteral("assign_to")), Type.string()), + new ArrayLiteral(List.of(new StringLiteral("o1"), new StringLiteral("o2")), Type.string()) + ), false); + + testCheck(ctx, pap, new CheckStatement( + new StringLiteral("assign"), + new ArrayLiteral(List.of(new StringLiteral("o1"), new StringLiteral("o2")), Type.string()) + ), false); + + ctx = new ExecutionContext(new UserContext("u2"), pap); + testCheck(ctx, pap, new CheckStatement( + new StringLiteral("assign"), + new StringLiteral("o1") + ), true); + + testCheck(ctx, pap, new CheckStatement( + new ArrayLiteral(List.of(new StringLiteral("assign"), new StringLiteral("assign_to")), Type.string()), + new StringLiteral("o1") + ), true); + + testCheck(ctx, pap, new CheckStatement( + new ArrayLiteral(List.of(new StringLiteral("assign"), new StringLiteral("assign_to")), Type.string()), + new ArrayLiteral(List.of(new StringLiteral("o1"), new StringLiteral("o2")), Type.string()) + ), true); + + testCheck(ctx, pap, new CheckStatement( + new StringLiteral("assign"), + new ArrayLiteral(List.of(new StringLiteral("o1"), new StringLiteral("o2")), Type.string()) + ), true); + } + + private void testCheck(ExecutionContext ctx, PAP pap, CheckStatement checkStatement, boolean err) { + if (err) { + assertThrows(UnauthorizedException.class, () -> checkStatement.execute(ctx, pap)); + } else { + assertDoesNotThrow(() -> checkStatement.execute(ctx, pap)); + } + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatementTest.java new file mode 100644 index 000000000..27ec3d566 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateNonPCStatementTest.java @@ -0,0 +1,66 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class CreateNonPCStatementTest { + + @Test + void testSuccess() throws PMException { + CreateNonPCStatement stmt1 = new CreateNonPCStatement(new StringLiteral("ua1"), NodeType.UA, buildArrayLiteral("pc1")); + CreateNonPCStatement stmt2 = new CreateNonPCStatement(new StringLiteral("oa1"), NodeType.OA, buildArrayLiteral("pc1")); + CreateNonPCStatement stmt3 = new CreateNonPCStatement(new StringLiteral("u1"), NodeType.U, buildArrayLiteral("ua1")); + CreateNonPCStatement stmt4 = new CreateNonPCStatement(new StringLiteral("o1"), NodeType.O, buildArrayLiteral("oa1")); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u2", List.of("ua2")); + ExecutionContext execCtx = new ExecutionContext(new UserContext("u2"), pap); + + stmt1.execute(execCtx, pap); + stmt2.execute(execCtx, pap); + stmt3.execute(execCtx, pap); + stmt4.execute(execCtx, pap); + + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("u1")); + assertTrue(pap.query().graph().nodeExists("o1")); + + assertTrue(pap.query().graph().getAdjacentDescendants("ua1").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("oa1").contains("pc1")); + assertTrue(pap.query().graph().getAdjacentDescendants("u1").contains("ua1")); + assertTrue(pap.query().graph().getAdjacentDescendants("o1").contains("oa1")); + } + + @Test + void testToFormattedString() { + CreateNonPCStatement stmt = new CreateNonPCStatement( + new StringLiteral("ua1"), + NodeType.UA, + buildArrayLiteral("ua2") + ); + assertEquals( + "create UA \"ua1\" in [\"ua2\"]", + stmt.toFormattedString(0) + ); + assertEquals( + " create UA \"ua1\" in [\"ua2\"]", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatementTest.java new file mode 100644 index 000000000..c149606ec --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateObligationStatementTest.java @@ -0,0 +1,142 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.LogicalOperandPatternExpression; +import gov.nist.csd.pm.pap.pml.pattern.operand.NodeOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.UsernamePattern; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class CreateObligationStatementTest { + + @Test + void testSuccess() throws PMException, PMException { + CreateObligationStatement stmt = new CreateObligationStatement(new StringLiteral("o1"), List.of( + new CreateRuleStatement( + new StringLiteral("rule1"), + new SubjectPattern(), + new OperationPattern("e1"), + Map.of( + "opnd1", List.of(new LogicalOperandPatternExpression( + new NodeOperandPattern("oa1"), + new NodeOperandPattern("oa2"), + false + )) + ), + new CreateRuleStatement.ResponseBlock("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("pc2")) + )) + ) + )); + + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u2", List.of("ua2")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + ExecutionContext execCtx = new ExecutionContext(new UserContext("u2"), pap); + + stmt.execute(execCtx, pap); + + assertTrue(pap.query().obligations().obligationExists("o1")); + + Obligation actual = pap.query().obligations().getObligation("o1"); + assertEquals(1, actual.getRules().size()); + assertEquals("u2", actual.getAuthor()); + Rule rule = actual.getRules().get(0); + assertEquals("rule1", rule.getName()); + assertEquals(new EventPattern( + new SubjectPattern(), + new OperationPattern("e1"), + Map.of( + "opnd1", List.of(new LogicalOperandPatternExpression( + new NodeOperandPattern("oa1"), + new NodeOperandPattern("oa2"), + false + )) + ) + ), rule.getEventPattern()); + } + + @Test + void testToFormattedString() { + CreateObligationStatement stmt = new CreateObligationStatement( + new StringLiteral("obl1"), + List.of( + new CreateRuleStatement( + new StringLiteral("rule1"), + new SubjectPattern(), + new OperationPattern("e1"), + Map.of( + "opnd1", List.of(new LogicalOperandPatternExpression( + new NodeOperandPattern("oa1"), + new NodeOperandPattern("oa2"), + false + )) + ), + new CreateRuleStatement.ResponseBlock("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("pc2")) + )) + ), + new CreateRuleStatement( + new StringLiteral("rule2"), + new SubjectPattern(new UsernamePattern("u1")), + new OperationPattern("e3"), + Map.of( + "opnd1", List.of(new LogicalOperandPatternExpression( + new NodeOperandPattern("oa1"), + new NodeOperandPattern("oa2"), + false + )) + ), + new CreateRuleStatement.ResponseBlock("evtCtx", List.of( + new CreatePolicyStatement(new StringLiteral("pc3")) + )) + ) + ) + + ); + assertEquals( + """ + create obligation "obl1" { + create rule "rule1" + when any user + performs "e1" + on { + opnd1: "oa1" || "oa2" + } + do (evtCtx) { + create PC "pc2" + } + + create rule "rule2" + when user "u1" + performs "e3" + on { + opnd1: "oa1" || "oa2" + } + do (evtCtx) { + create PC "pc3" + } + + }""", + stmt.toFormattedString(0) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatementTest.java new file mode 100644 index 000000000..281d7048f --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateOperationStatementTest.java @@ -0,0 +1,93 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CreateOperationStatementTest { + + @Test + void testWithChecks() throws PMException { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create ua "ua2" in ["pc1"] + create u "u2" in ["ua2"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["assign"] + + create o "o1" in ["oa1"] + create o "o2" in ["oa1"] + create o "o3" in ["oa1"] + + operation op1(string a, []string b) { + check "assign" on a + check "assign" on b + check "assign" on "oa1" + } { + create policy class "test" + } + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + pdp.runTx(new UserContext("u1"), tx -> { + tx.executePML(new UserContext("u1"), """ + op1("o1", ["o2", "o3"]) + """); + }); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> pdp.runTx(new UserContext("u2"), tx -> { + tx.executePML(new UserContext("u2"), """ + op1("o1", ["o2", "o3"]) + """); + })); + } + + @Test + void testWithNoChecks() throws PMException { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + create ua "ua2" in ["pc1"] + create u "u2" in ["ua2"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["assign"] + + create o "o1" in ["oa1"] + create o "o2" in ["oa1"] + create o "o3" in ["oa1"] + + operation op1(string a, []string b) { + create policy class a + } + """; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + pdp.runTx(new UserContext("u1"), tx -> { + tx.executePML(new UserContext("u1"), """ + op1("test1", ["o2", "o3"]) + """); + }); + assertTrue(pap.query().graph().nodeExists("test1")); + + pdp.runTx(new UserContext("u2"), tx -> { + tx.executePML(new UserContext("u2"), """ + op1("test2", ["o2", "o3"]) + """); + }); + assertTrue(pap.query().graph().nodeExists("test2")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatementTest.java new file mode 100644 index 000000000..64541eb36 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreatePolicyStatementTest.java @@ -0,0 +1,57 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class CreatePolicyStatementTest { + + @Test + void testSuccess() throws PMException { + CreatePolicyStatement stmt = new CreatePolicyStatement(new StringLiteral("pc1")); + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc2"); + pap.modify().graph().createUserAttribute("ua2", List.of("pc2")); + pap.modify().graph().createUser("u2", List.of("ua2")); + ExecutionContext execCtx = new ExecutionContext(new UserContext("u2"), pap); + + stmt.execute(execCtx, pap); + + assertTrue(pap.query().graph().nodeExists("pc1")); + } + + @Test + void testToFormattedString() { + CreatePolicyStatement s = new CreatePolicyStatement( + new StringLiteral("pc1") + ); + assertEquals( + "create PC \"pc1\"", + s.toFormattedString(0) + ); + assertEquals( + " create PC \"pc1\"", + s.toFormattedString(1) + ); + + s = new CreatePolicyStatement(new StringLiteral("a")); + assertEquals("create PC \"a\"", s.toFormattedString(0)); + + s = new CreatePolicyStatement(new StringLiteral("a")); + assertEquals("create PC \"a\"", s.toFormattedString(0)); + + s = new CreatePolicyStatement(new StringLiteral("a")); + assertEquals(" create PC \"a\"", s.toFormattedString(1)); + + s = new CreatePolicyStatement(new StringLiteral("a")); + assertEquals(" create PC \"a\"", s.toFormattedString(1)); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatementTest.java new file mode 100644 index 000000000..2bc88afde --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateProhibitionStatementTest.java @@ -0,0 +1,98 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.pml.expression.NegatedExpression; +import gov.nist.csd.pm.pap.pml.expression.literal.ArrayLiteral; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import gov.nist.csd.pm.pap.pml.type.Type; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class CreateProhibitionStatementTest { + + @Test + void testSuccess() throws PMException { + CreateProhibitionStatement stmt = new CreateProhibitionStatement( + new StringLiteral("pro1"), + new StringLiteral("ua2"), + ProhibitionSubject.Type.USER_ATTRIBUTE, + buildArrayLiteral("read"), + true, + new ArrayLiteral( + List.of(new StringLiteral("oa1"), new NegatedExpression(new StringLiteral("oa2"))), Type.string() + ) + ); + + PAP pap = new MemoryPAP(); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc2"); + pap.modify().graph().createUserAttribute("ua2", List.of("pc2")); + pap.modify().graph().createUser("u2", List.of("ua2")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc2")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc2")); + + ExecutionContext execCtx = new ExecutionContext(new UserContext("u2"), pap); + + stmt.execute(execCtx, pap); + + assertDoesNotThrow(() -> pap.query().prohibitions().getProhibition("pro1")); + + Prohibition prohibition = pap.query().prohibitions().getProhibition("pro1"); + assertEquals( + new ProhibitionSubject("ua2", ProhibitionSubject.Type.USER_ATTRIBUTE), + prohibition.getSubject() + ); + assertTrue(prohibition.isIntersection()); + assertEquals( + new AccessRightSet("read"), + prohibition.getAccessRightSet() + ); + assertEquals( + List.of(new ContainerCondition("oa1", false), new ContainerCondition("oa2", true)), + prohibition.getContainers() + ); + } + + @Test + void testToFormattedString() { + CreateProhibitionStatement stmt = new CreateProhibitionStatement( + new StringLiteral("pro1"), + new StringLiteral("ua2"), + ProhibitionSubject.Type.USER_ATTRIBUTE, + buildArrayLiteral("read"), + true, + new ArrayLiteral( + List.of(new StringLiteral("oa1"), new NegatedExpression(new StringLiteral("oa2"))), Type.string() + ) + ); + assertEquals( + """ + create prohibition "pro1" + deny UA "ua2" + access rights ["read"] + on intersection of ["oa1", !"oa2"]""", + stmt.toFormattedString(0) + ); + assertEquals( + """ + create prohibition "pro1" + deny UA "ua2" + access rights ["read"] + on intersection of ["oa1", !"oa2"]""", + stmt.toFormattedString(0) + ); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatementTest.java new file mode 100644 index 000000000..edc6a23f8 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRoutineStatementTest.java @@ -0,0 +1,39 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CreateRoutineStatementTest { + + @Test + void testOperationSignatureDoesNotThrowExceptionButIsIgnored() throws PMException { + String pml = """ + routine routine1(nodeop string a) { + check "assign" on a + } { + + } + """; + MemoryPAP pap = new MemoryPAP(); + assertDoesNotThrow(() -> pap.executePML(new UserContext("u1"), pml)); + } + + @Test + void testSuccess() throws PMException { + String pml = """ + routine routine1(string a) { + create PC a + create OA "oa1" in [a] + }"""; + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + Routine routine1 = pap.query().routines().getAdminRoutine("routine1"); + assertEquals(pml, routine1.toString()); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatementTest.java new file mode 100644 index 000000000..515dfe7d1 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/CreateRuleStatementTest.java @@ -0,0 +1,53 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.AnyOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.InOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.operand.NodeOperandPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class CreateRuleStatementTest { + + @Test + void testFormattedString() { + CreateRuleStatement createRuleStatement = new CreateRuleStatement( + new StringLiteral("rule1"), + new SubjectPattern(), + new OperationPattern(), + Map.of( + "a", List.of(new AnyOperandPattern()), + "b", List.of(new InOperandPattern("test"), new NodeOperandPattern("test")) + ), + new CreateRuleStatement.ResponseBlock("", List.of()) + ); + + String actual = createRuleStatement.toFormattedString(0); + assertTrue(actual.equals(""" + create rule "rule1" + when any user + performs any operation + on { + a: any, + b: [in "test", "test"] + } + do () { + }""".trim()) || actual.equals(""" + create rule "rule1" + when any user + performs any operation + on { + b: [in "test", "test"], + a: any + } + do () { + }""")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatementTest.java new file mode 100644 index 000000000..f874c7883 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeassignStatementTest.java @@ -0,0 +1,59 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class DeassignStatementTest { + + @Test + void testSuccess() throws PMException { + DeassignStatement stmt = new DeassignStatement( + new StringLiteral("ua3"), + buildArrayLiteral("ua1", "ua2") + ); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua3", List.of("ua1", "ua2", "pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + ExecutionContext execCtx = new ExecutionContext(new UserContext("u1"), pap); + stmt.execute(execCtx, pap); + + assertTrue(pap.query().graph().getAdjacentDescendants("ua3").contains("pc1")); + } + + @Test + void testToFormattedString() { + DeassignStatement stmt = new DeassignStatement( + new StringLiteral("ua3"), + buildArrayLiteral("ua1", "ua2") + ); + + assertEquals( + """ + deassign "ua3" from ["ua1", "ua2"]""", + stmt.toFormattedString(0) + ); + assertEquals( + """ + deassign "ua3" from ["ua1", "ua2"] + """, + stmt.toFormattedString(1) + "\n" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatementTest.java new file mode 100644 index 000000000..4954e647c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteRuleStatementTest.java @@ -0,0 +1,64 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +class DeleteRuleStatementTest { + + @Test + void testSuccess() throws PMException { + DeleteRuleStatement stmt = new DeleteRuleStatement( + new StringLiteral("rule1"), new StringLiteral("obl1")); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + UserContext userContext = new UserContext("u1"); + pap.modify().obligations().createObligation(userContext.getUser(), "obl1", List.of(new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern()), + new Response("e", List.of())) + )); + + ExecutionContext execCtx = new ExecutionContext(userContext, pap); + stmt.execute(execCtx, pap); + + assertTrue(pap.query().obligations().getObligation("obl1").getRules().isEmpty()); + } + + @Test + void testToFormattedString() { + DeleteRuleStatement stmt = new DeleteRuleStatement( + new StringLiteral("rule1"), new StringLiteral("obl1")); + + assertEquals( + """ + delete rule "rule1" from obligation "obl1" + """, + stmt.toFormattedString(0) + "\n" + ); + assertEquals( + """ + delete rule "rule1" from obligation "obl1" + """, + stmt.toFormattedString(1) + "\n" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatementTest.java new file mode 100644 index 000000000..9abd16dc2 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DeleteStatementTest.java @@ -0,0 +1,88 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.ProhibitionDoesNotExistException; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class DeleteStatementTest { + + @Test + void testSuccess() throws PMException { + DeleteStatement stmt1 = new DeleteStatement(DeleteStatement.Type.OBJECT_ATTRIBUTE, new StringLiteral("oa1")); + DeleteStatement stmt2 = new DeleteStatement(DeleteStatement.Type.PROHIBITION, new StringLiteral("p1")); + DeleteStatement stmt3 = new DeleteStatement(DeleteStatement.Type.OBLIGATION, new StringLiteral("o1")); + + PAP pap = new MemoryPAP(); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + UserContext userContext = new UserContext("u1"); + pap.modify().obligations().createObligation(userContext.getUser(), "o1", List.of(new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern("e1")), + new Response("e", List.of()) + ))); + pap.modify().prohibitions().createProhibition("p1", + new ProhibitionSubject("ua1", ProhibitionSubject.Type.USER_ATTRIBUTE), + new AccessRightSet("read"), + true, + Collections.singleton(new ContainerCondition("oa1", true)) + ); + + stmt2.execute(new ExecutionContext(userContext, pap), pap); + stmt3.execute(new ExecutionContext(userContext, pap), pap); + stmt1.execute(new ExecutionContext(userContext, pap), pap); + + assertFalse(pap.query().graph().nodeExists("oa1")); + assertThrows(ProhibitionDoesNotExistException.class, () -> pap.query().prohibitions().getProhibition("p1")); + assertFalse(pap.query().obligations().obligationExists("o1")); + } + + @Test + void testToFormattedString() { + DeleteStatement stmt = new DeleteStatement(DeleteStatement.Type.OBJECT_ATTRIBUTE, new StringLiteral("test")); + DeleteStatement stmt1 = new DeleteStatement(DeleteStatement.Type.OBLIGATION, new StringLiteral("test")); + DeleteStatement stmt2 = new DeleteStatement(DeleteStatement.Type.PROHIBITION, new StringLiteral("test")); + DeleteStatement stmt3 = new DeleteStatement(DeleteStatement.Type.OBJECT, new StringLiteral("test")); + DeleteStatement stmt4 = new DeleteStatement(DeleteStatement.Type.POLICY_CLASS, new StringLiteral("test")); + DeleteStatement stmt5 = new DeleteStatement(DeleteStatement.Type.USER, new StringLiteral("test")); + DeleteStatement stmt6 = new DeleteStatement(DeleteStatement.Type.USER_ATTRIBUTE, new StringLiteral("test")); + + assertEquals("delete OA \"test\"", stmt.toFormattedString(0)); + assertEquals("delete obligation \"test\"", stmt1.toFormattedString(0)); + assertEquals("delete prohibition \"test\"", stmt2.toFormattedString(0)); + assertEquals("delete O \"test\"", stmt3.toFormattedString(0)); + assertEquals("delete PC \"test\"", stmt4.toFormattedString(0)); + assertEquals("delete U \"test\"", stmt5.toFormattedString(0)); + assertEquals("delete UA \"test\"", stmt6.toFormattedString(0)); + assertEquals( + """ + delete OA "test" + """, + stmt.toFormattedString(1) + "\n" + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatementTest.java new file mode 100644 index 000000000..d1ebae065 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/DissociateStatementTest.java @@ -0,0 +1,50 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class DissociateStatementTest { + + @Test + void testSuccess() throws PMException { + DissociateStatement stmt = new DissociateStatement(new StringLiteral("ua1"), new StringLiteral("oa1")); + + PAP pap = new MemoryPAP(); + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + UserContext userContext = new UserContext("u1"); + + stmt.execute(new ExecutionContext(userContext, pap), pap); + + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").isEmpty()); + assertTrue(pap.query().graph().getAssociationsWithTarget("oa1").isEmpty()); + } + + @Test + void testToFormattedString() { + DissociateStatement stmt = new DissociateStatement(new StringLiteral("ua1"), buildArrayLiteral("oa1")); + + assertEquals("dissociate \"ua1\" and [\"oa1\"]", stmt.toFormattedString(0)); + assertEquals( + " dissociate \"ua1\" and [\"oa1\"]", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatementTest.java new file mode 100644 index 000000000..f7e5df2de --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetNodePropertiesStatementTest.java @@ -0,0 +1,58 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.expression.literal.StringLiteral; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildMapLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class SetNodePropertiesStatementTest { + + @Test + void testSuccess() throws PMException { + SetNodePropertiesStatement stmt = new SetNodePropertiesStatement( + new StringLiteral("ua1"), + buildMapLiteral("a", "b", "c", "d") + ); + + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + UserContext userContext = new UserContext("u1"); + + stmt.execute(new ExecutionContext(userContext, pap), pap); + + assertEquals( + Map.of("a", "b", "c", "d"), + pap.query().graph().getNode("ua1").getProperties() + ); + } + + @Test + void testToFormattedString() { + SetNodePropertiesStatement stmt = new SetNodePropertiesStatement( + new StringLiteral("ua1"), + buildMapLiteral("a", "b", "c", "d") + ); + + assertEquals( + "set properties of \"ua1\" to {\"a\": \"b\", \"c\": \"d\"}", + stmt.toFormattedString(0) + ); + assertEquals( + " set properties of \"ua1\" to {\"a\": \"b\", \"c\": \"d\"}", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatementTest.java b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatementTest.java new file mode 100644 index 000000000..6e29fa830 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/pml/statement/operation/SetResourceOperationsStatementTest.java @@ -0,0 +1,49 @@ +package gov.nist.csd.pm.pap.pml.statement.operation; + + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.pml.context.ExecutionContext; +import org.junit.jupiter.api.Test; + +import static gov.nist.csd.pm.pap.pml.PMLUtil.buildArrayLiteral; +import static org.junit.jupiter.api.Assertions.*; + +class SetResourceOperationsStatementTest { + + @Test + void testSuccess() throws PMException { + SetResourceOperationsStatement stmt = new SetResourceOperationsStatement( + buildArrayLiteral("a", "b", "c", "d") + ); + + PAP pap = new MemoryPAP(); + + stmt.execute(new ExecutionContext(new UserContext(""), pap), pap); + + assertEquals( + new AccessRightSet("a", "b", "c", "d"), + pap.query().operations().getResourceOperations() + ); + } + + @Test + void testToFormattedString() { + SetResourceOperationsStatement stmt = new SetResourceOperationsStatement( + buildArrayLiteral("a", "b", "c", "d") + ); + + assertEquals( + "set resource operations [\"a\", \"b\", \"c\", \"d\"]", + stmt.toFormattedString(0) + ); + assertEquals( + " set resource operations [\"a\", \"b\", \"c\", \"d\"]", + stmt.toFormattedString(1) + ); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/query/AccessQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/AccessQuerierTest.java new file mode 100644 index 000000000..bfade02a6 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/AccessQuerierTest.java @@ -0,0 +1,1146 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.query.explain.Explain; +import gov.nist.csd.pm.pap.query.explain.Path; +import gov.nist.csd.pm.pap.query.explain.PolicyClassExplain; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static gov.nist.csd.pm.pap.op.AdminAccessRights.*; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class AccessQuerierTest extends PAPTestInitializer { + + private static final AccessRightSet RWE = new AccessRightSet("read", "write", "execute"); + + @Test + void testComputeAccessibleAscendants() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + associate "ua1" and "oa1" with ["read", "write"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa1"] + create o "o2" in ["oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection actual = pap.query().access().computeAccessibleAscendants(new UserContext("u1"), "oa1"); + assertEquals( + Set.of("oa2", "o1", "o2"), + new HashSet<>(actual) + ); + } + + @Test + void testComputeAccessibleDescendants() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + create oa "oa3" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + associate "ua1" and "oa2" with ["read", "write"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa1", "oa2"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection actual = pap.query().access().computeAccessibleDescendants(new UserContext("u1"), "o1"); + assertEquals( + Set.of("oa1", "oa2"), + new HashSet<>(actual) + ); + } + + @Test + void testBuildPOS() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + create pc "pc2" + create ua "ua2" in ["pc2"] + create oa "oa2" in ["pc2"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc2"] + + associate "ua2" and "oa2" with ["read", "write"] + associate "ua2" and "oa4" with ["read"] + + create u "u1" in ["ua1", "ua2"] + create o "o1" in ["oa1", "oa3"] + create o "o2" in ["oa4"] + + create prohibition "p1" + deny user "u1" + access rights ["write"] + on union of ["oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Set u1 = pap.query().access().computePersonalObjectSystem(new UserContext("u1")); + assertEquals( + Set.of("oa1", "oa2", "oa4"), + u1 + ); + } + + @Test + void testExplain() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + + create pc "pc2" + create ua "ua2" in ["pc2"] + create oa "oa2" in ["pc2"] + create oa "oa3" in ["oa2"] + associate "ua2" and "oa2" with ["read", "write"] + + create u "u1" in ["ua1", "ua2"] + create o "o1" in ["oa1", "oa3"] + + create prohibition "p1" + deny user "u1" + access rights ["write"] + on union of ["oa1"] + + create prohibition "p2" + deny user "u1" + access rights ["write"] + on union of [!"oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Explain explain = pap.query().access().explain(new UserContext("u1"), "o1"); + Explain expected = new Explain( + new AccessRightSet("read"), + Map.of( + "pc1", new PolicyClassExplain( + new AccessRightSet("read", "write"), + Set.of(new Path( + List.of("u1", "ua1", "oa1"), + List.of("o1", "oa1", "pc1"), + new Association("ua1", "oa1", new AccessRightSet("read", "write")) + ))), + "pc2", new PolicyClassExplain( + new AccessRightSet("read", "write"), + Set.of(new Path( + List.of("u1", "ua2", "oa2"), + List.of("o1", "oa3", "oa2", "pc2"), + new Association("ua2", "oa2", new AccessRightSet("read", "write")) + ))) + ), + new AccessRightSet("write"), + List.of( + new Prohibition("p1", new ProhibitionSubject("u1", ProhibitionSubject.Type.USER), new AccessRightSet("write"), false, List.of(new ContainerCondition("oa1", false))) + ) + ); + assertEquals(expected, explain); + } + + @Test + void testExplainOnObjAttrWithAssociation() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create UA "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + + associate "ua1" and "oa1" with ["write"] + associate "ua1" and "oa2" with ["read"] + + + create user "u1" in ["ua1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Explain actual = pap.query().access().explain(new UserContext("u1"), "oa2"); + assertEquals( + new Explain( + new AccessRightSet("read", "write"), + Map.of( + "pc1", new PolicyClassExplain( + new AccessRightSet("read", "write"), + Set.of( + new Path( + List.of("u1", "ua1", "oa1"), + List.of("oa2", "oa1", "pc1"), + new Association("ua1", "oa1", new AccessRightSet("write")) + ), + new Path( + List.of("u1", "ua1", "oa2"), + List.of("oa2", "oa1", "pc1"), + new Association("ua1", "oa2", new AccessRightSet("read")) + ) + ) + ) + ), + new AccessRightSet(), + List.of() + ), + actual + ); + } + + @Test + void testComputeSubgraphPrivileges() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + + associate "ua1" and "oa1" with ["read", "write"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa2"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Map u1 = + pap.query().access().computeAscendantPrivileges(new UserContext("u1"), "oa1"); + assertEquals( + Map.of( + "oa2", new AccessRightSet("read", "write"), + "o1", new AccessRightSet("read", "write") + ), + u1 + ); + } + + @Test + void testFindBorderAttributes() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + associate "ua1" and "oa1" with ["read", "write"] + associate "ua2" and "oa2" with ["read"] + + create u "u1" in ["ua1", "ua2"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Map u1 = pap.query().access().computeDestinationAttributes("u1"); + assertEquals( + Map.of( + "oa1", new AccessRightSet("read", "write"), + "oa2", new AccessRightSet("read") + ), + u1 + ); + } + + @Test + void testBuildACL() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + associate "ua2" and "oa1" with ["read"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Map o1 = pap.query().access().computeACL("o1"); + assertEquals( + Map.of( + "u1", new AccessRightSet("read", "write"), + "u2", new AccessRightSet("read") + ), + o1 + ); + } + + @Test + void testBuildCapabilityList() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + associate "ua1" and "oa2" with ["read"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa1"] + create o "o2" in ["oa2"] + + create prohibition "p1" + deny user "u1" + access rights ["write"] + on union of ["oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Map u1 = pap.query().access().computeCapabilityList(new UserContext("u1")); + assertEquals( + Map.of( + "o1", new AccessRightSet("read"), + "o2", new AccessRightSet("read"), + "oa1", new AccessRightSet("read"), + "oa2", new AccessRightSet("read") + ), + u1 + ); + } + + @Test + void testComputeDeniedPrivileges() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa1"] + + create prohibition "p1" + deny user "u1" + access rights ["write"] + on union of ["oa1"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + AccessRightSet deniedPrivileges = pap.query().access().computeDeniedPrivileges(new UserContext("u1"), "o1"); + assertEquals(new AccessRightSet("write"), deniedPrivileges); + } + + @Test + void testComputePolicyClassAccessRights() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create UA "ua1" in ["pc1"] + create OA "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read", "write"] + + create pc "pc2" + create UA "ua2" in ["pc2"] + create OA "oa2" in ["pc2"] + associate "ua2" and "oa2" with ["read"] + + create u "u1" in ["ua1", "ua2"] + create o "o1" in ["oa1", "oa2"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + Map policyClassAccessRights = + pap.query().access().computePolicyClassAccessRights(new UserContext("u1"), "o1"); + assertEquals( + Map.of( + "pc1", new AccessRightSet("read", "write"), + "pc2", new AccessRightSet("read") + ), + policyClassAccessRights + ); + } + + @Test + void testGetAscendants() throws PMException { + + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + String o2 = pap.modify().graph().createObject("o2", List.of(oa1)); + String o3 = pap.modify().graph().createObject("o3", List.of(oa1)); + + AccessRightSet arset = new AccessRightSet("read", "write"); + pap.modify().graph().associate(ua1, oa1, arset); + Map subgraph = pap.query().access().computeAscendantPrivileges(new UserContext(u1), oa1); + assertEquals( + Map.of("o1", arset, "o2", arset, "o3", arset), + subgraph + ); + } + + @Test + void testGetAccessibleNodes() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + String o2 = pap.modify().graph().createObject("o2", List.of(oa1)); + String o3 = pap.modify().graph().createObject("o3", List.of(oa1)); + + AccessRightSet arset = new AccessRightSet("read", "write"); + pap.modify().graph().associate(ua1, oa1, arset); + Map accessibleNodes = pap.query().access().computeCapabilityList(new UserContext(u1)); + + assertTrue(accessibleNodes.containsKey(oa1)); + assertTrue(accessibleNodes.containsKey(o1)); + assertTrue(accessibleNodes.containsKey(o2)); + assertTrue(accessibleNodes.containsKey(o3)); + + assertEquals(arset, accessibleNodes.get(oa1)); + assertEquals(arset, accessibleNodes.get(o1)); + assertEquals(arset, accessibleNodes.get(o2)); + assertEquals(arset, accessibleNodes.get(o3)); + } + + @Nested + class GetPrivilegesTests { + + @Test + void testGraph1() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph2() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1, pc2)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testGraph3() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph4() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("write")); + + + assertEquals( + new AccessRightSet("read", "write"), + pap.query().access().computePrivileges(new UserContext(u1), o1) + ); + } + + @Test + void testGraph5() throws PMException { pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read", "write")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); + } + + @Test + void testGraph6() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); + } + + @Test + void testGraph7() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testGraph8() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + } + + @Test + void testGraph9() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("read", "write")); + + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + } + + @Test + void testGraph10() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read", "write")); + + + + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph11() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + + + + assertEquals(new AccessRightSet(), pap.query().access().computePrivileges(new UserContext(u1), o1)); + } + + @Test + void testGraph12() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("write")); + + + + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph13() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(ua2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(oa2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read")); + + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.contains("read")); + } + + @Test + void testGraph14() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1, pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("*")); + + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + } + + @Test + void testGraph15() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(ua2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(oa2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("*")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read")); + + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + } + + @Test + void testGraph16() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(ua2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("write")); + + + + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + // removed graph7 due to adding the descendant IDs to the createNode, need to always connect to the testCtx.policy().graph(). + + @Test + void testGraph18() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testGraph19() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testGraph20() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("read", "write")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); + } + + @Test + void testGraph21() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1, ua2)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa2, new AccessRightSet("write")); + + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testGraph22() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String pc2 = pap.modify().graph().createPolicyClass("pc2"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + + + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph23WithProhibitions() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa3 = pap.modify().graph().createObjectAttribute("oa3", List.of(pc1)); + String oa4 = pap.modify().graph().createObjectAttribute("oa4", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(oa3)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(oa4)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa3, new AccessRightSet("read", "write", "execute")); + pap.modify().prohibitions().createProhibition("deny", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet("read"), true, + List.of(new ContainerCondition(oa1, false), + new ContainerCondition(oa2, false)) + ); + + pap.modify().prohibitions().createProhibition("deny2", ProhibitionSubject.user(u1), new AccessRightSet("write"), + true, + Collections.singleton(new ContainerCondition(oa3, false)) + ); + + + Set list = pap.query().access().computePrivileges(new UserContext(u1), o1); + assertEquals(1, list.size()); + assertTrue(list.contains("execute")); + } + + @Test + void testGraph24WithProhibitions() throws PMException { pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + String o2 = pap.modify().graph().createObject("o2", List.of(oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + + pap.modify().prohibitions().createProhibition("deny", ProhibitionSubject.userAttribute(ua1), + new AccessRightSet("read"), + true, + List.of( + new ContainerCondition(oa1, false), + new ContainerCondition(oa2, true) + ) + ); + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).contains("read")); + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o2).isEmpty()); + + pap.modify().graph().associate(ua1, oa2, new AccessRightSet("read")); + + pap.modify().prohibitions().createProhibition("deny-process", ProhibitionSubject.process("1234"), + new AccessRightSet("read"), + false, + Collections.singleton(new ContainerCondition(oa1, false)) + ); + + assertEquals( + new AccessRightSet(), + pap.query().access().computePrivileges(new UserContext(u1, "1234"), o1) + ); + } + + @Test + void testGraph25WithProhibitions() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(oa1)); + String oa3 = pap.modify().graph().createObjectAttribute("oa3", List.of(oa1)); + String oa4 = pap.modify().graph().createObjectAttribute("oa4", List.of(oa3)); + String oa5 = pap.modify().graph().createObjectAttribute("oa5", List.of(oa2)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa4)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("deny", ProhibitionSubject.user(u1), new AccessRightSet("read", "write"), + true, + List.of(new ContainerCondition(oa4, true), + new ContainerCondition(oa1, false)) + ); + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), oa5).isEmpty()); + assertTrue( + pap.query().access().computePrivileges(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testGraph25WithProhibitions2() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read", "write")); + + + pap.modify().prohibitions().createProhibition("deny", ProhibitionSubject.user(u1), new AccessRightSet("read", "write"), + true, + List.of(new ContainerCondition(oa1, false), + new ContainerCondition(oa2, false)) + ); + + + assertTrue(pap.query().access().computePrivileges(new UserContext(u1), o1).isEmpty()); + } + + @Test + void testDeciderWithUA() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua2 = pap.modify().graph().createUserAttribute("ua2", List.of(pc1)); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(ua2)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String oa2 = pap.modify().graph().createObjectAttribute("oa2", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1, oa2)); + String o2 = pap.modify().graph().createObject("o2", List.of(oa2)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet("read")); + pap.modify().graph().associate(ua2, oa1, new AccessRightSet("write")); + + + assertTrue(pap.query().access().computePrivileges(new UserContext(ua1), oa1) + .containsAll(Arrays.asList("read", "write"))); + } + + @Test + void testProhibitionsAllCombinations() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa4", List.of("pc1")); + pap.modify().graph().createObject("o1", List.of("oa1", "oa2", "oa3")); + pap.modify().graph().createObject("o2", List.of("oa1", "oa4")); + + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createUser("u2", List.of("ua1")); + pap.modify().graph().createUser("u3", List.of("ua1")); + pap.modify().graph().createUser("u4", List.of("ua1")); + + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read", "write")); + + + pap.modify().prohibitions().createProhibition( + "p1", + ProhibitionSubject.user("u1"), + new AccessRightSet("write"), + true, + List.of( + new ContainerCondition("oa1", false), + new ContainerCondition("oa2", false), + new ContainerCondition("oa3", false) + ) + ); + + pap.modify().prohibitions().createProhibition( + "p2", + ProhibitionSubject.user("u2"), + new AccessRightSet("write"), + false, + List.of( + new ContainerCondition("oa1", false), + new ContainerCondition("oa2", false), + new ContainerCondition("oa3", false) + ) + ); + + pap.modify().prohibitions().createProhibition( + "p3", + ProhibitionSubject.user("u3"), + new AccessRightSet("write"), + true, + List.of( + new ContainerCondition("oa1", false), + new ContainerCondition("oa2", true) + ) + ); + + pap.modify().prohibitions().createProhibition( + "p4", + ProhibitionSubject.user("u4"), + new AccessRightSet("write"), + false, + List.of( + new ContainerCondition("oa1", false), + new ContainerCondition("oa2", true) + ) + ); + + pap.modify().prohibitions().createProhibition( + "p5", + ProhibitionSubject.user("u4"), + new AccessRightSet("write"), + false, + Collections.singleton(new ContainerCondition("oa2", true)) + ); + + + Set list = pap.query().access().computePrivileges(new UserContext("u1"), "o1"); + assertTrue(list.contains("read") && !list.contains("write")); + + list = pap.query().access().computePrivileges(new UserContext("u1"), "o2"); + assertTrue(list.contains("read") && list.contains("write")); + + list = pap.query().access().computePrivileges(new UserContext("u2"), "o2"); + assertTrue(list.contains("read") && !list.contains("write")); + + list = pap.query().access().computePrivileges(new UserContext("u3"), "o2"); + assertTrue(list.contains("read") && !list.contains("write")); + + list = pap.query().access().computePrivileges(new UserContext("u4"), "o1"); + assertTrue(list.contains("read") && !list.contains("write")); + + list = pap.query().access().computePrivileges(new UserContext("u4"), "o2"); + assertTrue(list.contains("read") && !list.contains("write")); + } + + @Test + void testPermissions() throws PMException { pap.modify().operations().setResourceOperations(RWE); + + String pc1 = pap.modify().graph().createPolicyClass("pc1"); + String ua1 = pap.modify().graph().createUserAttribute("ua1", List.of(pc1)); + String u1 = pap.modify().graph().createUser("u1", List.of(ua1)); + String oa1 = pap.modify().graph().createObjectAttribute("oa1", List.of(pc1)); + String o1 = pap.modify().graph().createObject("o1", List.of(oa1)); + + pap.modify().graph().associate(ua1, oa1, allAccessRights()); + + + Set list = pap.query().access().computePrivileges(new UserContext("u1"), "o1"); + assertTrue(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + + pap.modify().graph().associate(ua1, oa1, allAdminAccessRights()); + list = pap.query().access().computePrivileges(new UserContext("u1"), "o1"); + assertTrue(list.containsAll(allAdminAccessRights())); + assertFalse(list.containsAll(RWE)); + + pap.modify().graph().associate(ua1, oa1, new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS)); + list = pap.query().access().computePrivileges(new UserContext("u1"), "o1"); + assertFalse(list.containsAll(allAdminAccessRights())); + assertTrue(list.containsAll(RWE)); + } + + @Test + void testPermissionsInOnlyOnePC() throws PMException { + pap.modify().operations().setResourceOperations(RWE); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createPolicyClass("pc2"); + pap.modify().graph().createUserAttribute("ua3", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("ua3")); + pap.modify().graph().createUserAttribute("u1", List.of("ua2")); + + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc2")); + pap.modify().graph().assign("oa3", List.of("oa1")); + pap.modify().graph().createObject("o1", List.of("oa3")); + + pap.modify().graph().associate("ua3", "oa1", new AccessRightSet("read")); + + + assertTrue(pap.query().access().computePrivileges(new UserContext("u1"), "o1").isEmpty()); + } + + @Test + void testProhibitionsWithContainerAsTarget() throws PMException { + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + + pap.modify().prohibitions().createProhibition("deny1", ProhibitionSubject.user("u1"), new AccessRightSet("read"), false, + Collections.singleton(new ContainerCondition("oa1", false)) + ); + + + AccessRightSet deniedAccessRights = pap.query().access().computeDeniedPrivileges(new UserContext("u1"), "oa1"); + assertTrue(deniedAccessRights.contains("read")); + } + + @Test + void testProhibitionWithContainerAsTargetComplement() throws PMException { + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + + pap.modify().prohibitions().createProhibition("deny1", ProhibitionSubject.user("u1"), new AccessRightSet("read"), false, + Collections.singleton(new ContainerCondition("oa1", true)) + ); + + + AccessRightSet deniedAccessRights = pap.query().access().computeDeniedPrivileges(new UserContext("u1"), "oa1"); + assertFalse(deniedAccessRights.contains("read")); + } + } + +} diff --git a/src/test/java/gov/nist/csd/pm/pap/query/GraphQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/GraphQuerierTest.java new file mode 100644 index 000000000..9f05a9e1c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/GraphQuerierTest.java @@ -0,0 +1,407 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.Properties; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.*; + +import static gov.nist.csd.pm.pap.graph.node.NodeType.*; +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; +import static gov.nist.csd.pm.pap.graph.node.Properties.toProperties; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public abstract class GraphQuerierTest extends PAPTestInitializer { + + @Nested + class NodeExists { + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + } + } + + @Nested + class GetNodeTest { + + @Test + void testNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, () -> pap.query().graph().getNode("pc1")); + } + + @Test + void testSuccessPolicyClass() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().setNodeProperties("pc1", toProperties("k", "v")); + + Node pc1 = pap.query().graph().getNode("pc1"); + + assertEquals("pc1", pc1.getName()); + assertEquals(PC, pc1.getType()); + assertEquals("v", pc1.getProperties().get("k")); + } + + @Test + void testSuccessObjectAttribute() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().setNodeProperties("oa1", Properties.toProperties("k", "v")); + + Node oa1 = pap.query().graph().getNode("oa1"); + + assertEquals("oa1", oa1.getName()); + assertEquals(OA, oa1.getType()); + assertEquals("v", oa1.getProperties().get("k")); + } + } + + @Nested + class Search { + @Test + void testSearch() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().setNodeProperties("oa1", toProperties("namespace", "test")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().setNodeProperties("oa2", toProperties("key1", "value1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().setNodeProperties("oa3", toProperties("key1", "value1", "key2", "value2")); + + Collection nodes = pap.query().graph().search(OA, NO_PROPERTIES); + assertEquals(4, nodes.size()); + + nodes = pap.query().graph().search(ANY, toProperties("key1", "value1")); + assertEquals(2, nodes.size()); + + nodes = pap.query().graph().search(ANY, toProperties("namespace", "test")); + assertEquals(1, nodes.size()); + + nodes = pap.query().graph().search(OA, toProperties("namespace", "test")); + assertEquals(1, nodes.size()); + nodes = pap.query().graph().search(OA, toProperties("key1", "value1")); + assertEquals(2, nodes.size()); + nodes = pap.query().graph().search(OA, toProperties("key1", "*")); + assertEquals(2, nodes.size()); + nodes = pap.query().graph().search(OA, toProperties("key1", "value1", "key2", "value2")); + assertEquals(1, nodes.size()); + nodes = pap.query().graph().search(OA, toProperties("key1", "value1", "key2", "*")); + assertEquals(1, nodes.size()); + nodes = pap.query().graph().search(OA, toProperties("key1", "value1", "key2", "no_value")); + assertEquals(0, nodes.size()); + nodes = pap.query().graph().search(ANY, NO_PROPERTIES); + assertEquals(6, nodes.size()); + } + } + + + @Nested + class GetPolicyClasses { + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createPolicyClass("pc2"); + pap.modify().graph().createPolicyClass("pc3"); + + assertTrue(pap.query().graph().getPolicyClasses().containsAll(Arrays.asList("pc1", "pc2", "pc3"))); + } + } + + @Nested + class GetAdjacentAscendantsTest { + + @Test + void NodeDoesNotExist() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.query().graph().getAdjacentAscendants("oa1")); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + + + assertTrue(pap.query().graph().getAdjacentAscendants("pc1").containsAll(List.of("oa1", "oa2", "oa3"))); + } + } + + @Nested + class GetAdjacentDescendantsTest { + + @Test + void NodeDoesNotExist() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.query().graph().getAdjacentDescendants("oa1")); + } + + @Test + void Success() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().createObject("o1", List.of("oa1")); + pap.modify().graph().assign("o1", List.of("oa2")); + pap.modify().graph().assign("o1", List.of("oa3")); + + assertTrue(pap.query().graph().getAdjacentDescendants("o1").containsAll(List.of("oa1", "oa2", "oa3"))); + } + } + + @Nested + class GetAssociationsWithSourceTest { + + @Test + void testNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.query().graph().getAssociationsWithSource("ua1")); + } + + @Test + void testSuccess() throws PMException { + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + pap.modify().graph().associate("ua1", "oa2", new AccessRightSet("read", "write")); + + Collection assocs = pap.query().graph().getAssociationsWithSource("ua1"); + + assertEquals(2, assocs.size()); + + for (Association assoc : assocs) { + checkAssociation(assoc); + } + } + + private void checkAssociation(Association association) { + if (association.getTarget().equals("oa1")) { + assertEquals(new AccessRightSet("read"), association.getAccessRightSet()); + } else if (association.getTarget().equals("oa2")) { + assertEquals(new AccessRightSet("read", "write"), association.getAccessRightSet()); + } + } + } + + @Nested + class GetAssociationsWithTargetTest { + + @Test + void testNodeDoesNotExistException() { + assertThrows(NodeDoesNotExistException.class, + () -> pap.query().graph().getAssociationsWithTarget("oa1")); + } + + @Test + void Success() throws PMException { + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + pap.modify().graph().associate("ua2", "oa1", new AccessRightSet("read", "write")); + + Collection assocs = pap.query().graph().getAssociationsWithTarget("oa1"); + + assertEquals(2, assocs.size()); + + for (Association assoc : assocs) { + checkAssociation(assoc); + } + } + + private void checkAssociation(Association association) { + if (association.getSource().equals("ua1")) { + assertEquals(new AccessRightSet("read"), association.getAccessRightSet()); + } else if (association.getSource().equals("ua2")) { + assertEquals(new AccessRightSet("read", "write"), association.getAccessRightSet()); + } + } + } + + @Test + void testGetAttributeDescendants() throws PMException { + String pml = + """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection conts = pap.query().graph().getAttributeDescendants("o1"); + List expected = List.of("oa3", "oa2", "oa1", "oa6", "oa5"); + assertTrue(conts.containsAll(expected)); + assertTrue(expected.containsAll(conts)); + } + + @Test + void testGetPolicyClassDescendants() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection pcs = pap.query().graph().getPolicyClassDescendants("o1"); + List expected = List.of("pc1", "pc2"); + assertTrue(pcs.containsAll(expected)); + assertTrue(expected.containsAll(pcs)); + } + + @Test + void testIsAscendant() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + assertTrue(pap.query().graph().isAscendant("o1", "oa1")); + assertTrue(pap.query().graph().isAscendant("o1", "oa2")); + assertTrue(pap.query().graph().isAscendant("o1", "oa3")); + assertTrue(pap.query().graph().isAscendant("o1", "pc1")); + assertTrue(pap.query().graph().isAscendant("o1", "pc2")); + assertFalse(pap.query().graph().isAscendant("o1", "pc3")); + } + + @Test + void testIsDescendant() throws PMException { + String pml = """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + assertTrue(pap.query().graph().isDescendant("o1", "oa1")); + assertTrue(pap.query().graph().isDescendant("o1", "oa2")); + assertTrue(pap.query().graph().isDescendant("o1", "oa3")); + assertTrue(pap.query().graph().isDescendant("o1", "pc1")); + assertTrue(pap.query().graph().isDescendant("o1", "pc2")); + assertFalse(pap.query().graph().isDescendant("o1", "pc3")); + } + + @Test + void testGetAscendants() throws PMException { + String pml = + """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection conts = pap.query().graph().getAscendants("pc1"); + List expected = List.of("oa1", "oa2", "oa3", "oa4", "o1"); + assertEquals(new HashSet<>(expected), new HashSet<>(conts)); + + conts = pap.query().graph().getAscendants("oa1"); + expected = List.of("oa3", "oa2", "o1"); + assertEquals(new HashSet<>(expected), new HashSet<>(conts)); + } + + @Test + void testGetDescendants() throws PMException { + String pml = + """ + set resource operations ["read", "write"] + create pc "pc1" + create oa "oa1" in ["pc1"] + create oa "oa2" in ["oa1"] + create oa "oa3" in ["oa2"] + create oa "oa4" in ["pc1"] + + create pc "pc2" + create oa "oa5" in ["pc2"] + create oa "oa6" in ["oa5"] + + create pc "pc3" + + create o "o1" in ["oa3", "oa6"] + """; + pap.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + Collection conts = pap.query().graph().getDescendants("o1"); + List expected = List.of("oa3", "oa2", "oa5", "oa6", "pc2", "oa1", "pc1"); + assertEquals(new HashSet<>(expected), new HashSet<>(conts)); + + conts = pap.query().graph().getDescendants("pc1"); + expected = List.of(); + assertEquals(new HashSet<>(expected), new HashSet<>(conts)); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pap/query/ObligationsQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/ObligationsQuerierTest.java new file mode 100644 index 000000000..9be5b1d84 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/ObligationsQuerierTest.java @@ -0,0 +1,66 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.ObligationDoesNotExistException; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Collection; +import java.util.List; + +import static gov.nist.csd.pm.pap.modification.ObligationsModifierTest.obligation1; +import static gov.nist.csd.pm.pap.modification.ObligationsModifierTest.obligation2; +import static org.junit.jupiter.api.Assertions.*; + +public abstract class ObligationsQuerierTest extends PAPTestInitializer { + + @Nested + class GetAll { + @Test + void testGetObligations() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules()); + pap.modify().obligations().createObligation(obligation2.getAuthor(), obligation2.getName(), obligation2.getRules()); + + Collection obligations = pap.query().obligations().getObligations(); + assertEquals(2, obligations.size()); + for (Obligation obligation : obligations) { + if (obligation.getName().equals(obligation1.getName())) { + assertEquals(obligation1, obligation); + } else { + assertEquals(obligation2, obligation); + } + } + } + } + + @Nested + class Get { + + @Test + void testObligationDoesNotExistException() { + assertThrows( + ObligationDoesNotExistException.class, + () -> pap.query().obligations().getObligation(obligation1.getName())); + } + + @Test + void testGetObligation() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + + pap.modify().obligations().createObligation(obligation1.getAuthor(), obligation1.getName(), obligation1.getRules()); + pap.modify().obligations().createObligation(obligation2.getAuthor(), obligation2.getName(), obligation2.getRules()); + + Obligation obligation = pap.query().obligations().getObligation(obligation1.getName()); + assertEquals(obligation1, obligation); + } + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/query/OperationsQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/OperationsQuerierTest.java new file mode 100644 index 000000000..1ec54b11a --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/OperationsQuerierTest.java @@ -0,0 +1,95 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.OperationDoesNotExistException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +public abstract class OperationsQuerierTest extends PAPTestInitializer { + + @Nested + class GetResourceAccessRights { + @Test + void testGetResourceAccessRights() throws PMException { + AccessRightSet arset = new AccessRightSet("read", "write"); + pap.modify().operations().setResourceOperations(arset); + assertEquals(arset, pap.query().operations().getResourceOperations()); + } + } + + @Test + void testGetAdminOperationNames() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().operations().createAdminOperation(new Operation("op1", List.of()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + pap.modify().operations().createAdminOperation(new Operation("op2", List.of()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + Collection adminOperationNames = pap.query().operations().getAdminOperationNames(); + assertTrue(adminOperationNames.containsAll(Set.of("op1", "op2"))); + } + + @Nested + class GetAdminOperation { + + @Test + void testSuccess() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + Operation operation = new Operation("op1", List.of()) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + pap.modify().operations().createAdminOperation(operation); + + Operation actual = pap.query().operations().getAdminOperation(operation.getName()); + assertEquals(operation, actual); + } + + @Test + void testOperationDoesNotExist() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + assertThrows(OperationDoesNotExistException.class, () -> pap.query().operations().getAdminOperation("op1")); + } + + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerierTest.java new file mode 100644 index 000000000..d61d7a931 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/ProhibitionsQuerierTest.java @@ -0,0 +1,192 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.ProhibitionDoesNotExistException; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +public abstract class ProhibitionsQuerierTest extends PAPTestInitializer { + + + @Nested + class GetAll { + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa4", List.of("pc1")); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("label1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false))); + pap.modify().prohibitions().createProhibition("label2", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of( + new ContainerCondition("oa3", true), + new ContainerCondition("oa4", false))); + + Map> prohibitions = pap.query().prohibitions().getProhibitions(); + assertEquals(1, prohibitions.size()); + assertEquals(2, prohibitions.get("subject").size()); + checkProhibitions(prohibitions.get("subject")); + } + + private void checkProhibitions(Collection prohibitions) { + for (Prohibition p : prohibitions) { + if (p.getName().equals("label1")) { + assertEquals("label1", p.getName()); + assertEquals("subject", p.getSubject().getName()); + assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); + assertTrue(p.isIntersection()); + assertEquals(2, p.getContainers().size()); + List expected = List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false) + ); + assertTrue(expected.containsAll(p.getContainers()) && p.getContainers().containsAll(expected)); + } else if (p.getName().equals("label2")) { + assertEquals("label2", p.getName()); + assertEquals("subject", p.getSubject().getName()); + assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); + assertTrue(p.isIntersection()); + assertEquals(2, p.getContainers().size()); + List expected = List.of( + new ContainerCondition("oa3", true), + new ContainerCondition("oa4", false) + ); + assertTrue(expected.containsAll(p.getContainers()) && p.getContainers().containsAll(expected)); + } else { + fail("unexpected prohibition label " + p.getName()); + } + } + } + } + + @Nested + class GetProhibitionsWithSubject { + + @Test + void testSuccess() throws PMException { + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject1", List.of("pc1")); + pap.modify().graph().createUserAttribute("subject2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa4", List.of("pc1")); + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("label1", ProhibitionSubject.userAttribute("subject1"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false))); + pap.modify().prohibitions().createProhibition("label2", ProhibitionSubject.userAttribute("subject2"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("oa3", true), + new ContainerCondition("oa4", false))); + + Collection pros = pap.query().prohibitions().getProhibitionsWithSubject("subject1"); + assertEquals(1, pros.size()); + + Prohibition p = pros.iterator().next(); + + assertEquals("label1", p.getName()); + assertEquals("subject1", p.getSubject().getName()); + assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); + assertTrue(p.isIntersection()); + assertEquals(2, p.getContainers().size()); + List expected = List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false) + ); + assertTrue(expected.containsAll(p.getContainers()) && p.getContainers().containsAll(expected)); + } + } + + @Nested + class GetProhibition { + + @Test + void testSuccess() throws PMException { + assertThrows(ProhibitionDoesNotExistException.class, + () -> pap.query().prohibitions().getProhibition("pro1")); + + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("subject", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa3", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa4", List.of("pc1")); + pap.modify().operations().setResourceOperations(new AccessRightSet("read", "write")); + + pap.modify().prohibitions().createProhibition("label1", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false))); + pap.modify().prohibitions().createProhibition("label2", ProhibitionSubject.userAttribute("subject"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("oa3", true), + new ContainerCondition("oa4", false))); + + Prohibition p = pap.query().prohibitions().getProhibition("label1"); + assertEquals("label1", p.getName()); + assertEquals("subject", p.getSubject().getName()); + assertEquals(new AccessRightSet("read"), p.getAccessRightSet()); + assertTrue(p.isIntersection()); + assertEquals(2, p.getContainers().size()); + List expected = List.of( + new ContainerCondition("oa1", true), + new ContainerCondition("oa2", false) + ); + assertTrue(expected.containsAll(p.getContainers()) && p.getContainers().containsAll(expected)); + } + } + + @Test + void testGetInheritedProhibitionsFor() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().graph().createUserAttribute("ua2", List.of("ua1")); + pap.modify().graph().createUserAttribute("ua3", List.of("ua2")); + pap.modify().graph().assign("u1", Collections.singleton("ua3")); + + pap.modify().prohibitions().createProhibition("label1", ProhibitionSubject.userAttribute("ua2"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("US project", true))); + pap.modify().prohibitions().createProhibition("label2", ProhibitionSubject.userAttribute("ua3"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("US project", true))); + + Collection prohibitions = pap.query().prohibitions().getInheritedProhibitionsFor("u1"); + assertEquals(2, prohibitions.size()); + } + + @Test + void testGetProhibitionsForContainer() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().prohibitions().createProhibition("label1", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("US project", true))); + pap.modify().prohibitions().createProhibition("label2", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet("read"), true, + List.of(new ContainerCondition("US project", true))); + + + Collection prohibitions = pap.query().prohibitions().getProhibitionsWithContainer("US project"); + assertEquals(2, prohibitions.size()); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/query/RoutinesQuerierTest.java b/src/test/java/gov/nist/csd/pm/pap/query/RoutinesQuerierTest.java new file mode 100644 index 000000000..69324188b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/query/RoutinesQuerierTest.java @@ -0,0 +1,70 @@ +package gov.nist.csd.pm.pap.query; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.PAPTestInitializer; +import gov.nist.csd.pm.pap.exception.RoutineDoesNotExistException; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.*; + +import static org.junit.jupiter.api.Assertions.*; + +public abstract class RoutinesQuerierTest extends PAPTestInitializer { + + @Test + void testGetAdminRoutineNames() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + pap.modify().routines().createAdminRoutine(new Routine("r1", List.of()) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + pap.modify().routines().createAdminRoutine(new Routine("r2", List.of()) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }); + + Collection adminRoutineNames = pap.query().routines().getAdminRoutineNames(); + assertEquals(new HashSet<>(adminRoutineNames), Set.of("r1", "r2", "deleteAllProjects")); + } + + @Nested + class GetAdminRoutine { + + @Test + void testSuccess() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + Routine routine = new Routine<>("r1", List.of()) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + pap.modify().routines().createAdminRoutine(routine); + + Routine actual = pap.query().routines().getAdminRoutine(routine.getName()); + assertEquals(routine, actual); + } + + @Test + void testRoutineDoesNotExist() throws PMException, IOException { + SamplePolicy.loadSamplePolicyFromPML(pap); + + assertThrows(RoutineDoesNotExistException.class, () -> pap.query().routines().getAdminRoutine("r1")); + } + + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/serialization/PMLTest.java b/src/test/java/gov/nist/csd/pm/pap/serialization/PMLTest.java new file mode 100644 index 000000000..6acfeb21a --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/serialization/PMLTest.java @@ -0,0 +1,74 @@ +package gov.nist.csd.pm.pap.serialization; + +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationWrapper; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.serialization.pml.PMLSerializer; +import gov.nist.csd.pm.util.PolicyEquals; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PMLTest { + + @Test + void testDeserialization() throws IOException, PMException { + String pml = SamplePolicy.loadSamplePolicyPML(); + + PMLDeserializer pmlDeserializer = new PMLDeserializer(); + + MemoryPAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("test_pc"); + pap.modify().graph().createUserAttribute("ua1", Collections.singleton("test_pc")); + pap.modify().graph().createUser("u1", Collections.singleton("ua1")); + + pap.deserialize(new UserContext("u1"), pml, pmlDeserializer); + + String serialize = pap.serialize(new PMLSerializer()); + MemoryPAP pap2 = new MemoryPAP(); + pap2.deserialize(new UserContext("u1"), serialize, pmlDeserializer); + + PolicyEquals.assertPolicyEquals(pap.query(), pap2.query()); + } + + @Test + void testDeserializationWithCustomFunctions() throws PMException { + String pml = """ + testFunc("hello world") + """; + + PMLDeserializer pmlDeserializer = new PMLDeserializer(); + + MemoryPAP pap = new MemoryPAP(); + assertThrows(PMException.class, () -> pap.deserialize(new UserContext("u1"), pml, pmlDeserializer)); + + pap.setPMLOperations(new PMLOperationWrapper(new Operation<>("testFunc", List.of("name")) { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass((String) operands.get("name")); + return null; + } + })); + + PMLDeserializer pmlDeserializer2 = new PMLDeserializer(); + pap.deserialize(new UserContext("u1"), pml, pmlDeserializer2); + assertTrue(pap.query().graph().nodeExists("hello world")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pap/serialization/SerializationTest.java b/src/test/java/gov/nist/csd/pm/pap/serialization/SerializationTest.java new file mode 100644 index 000000000..1c37e13dd --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pap/serialization/SerializationTest.java @@ -0,0 +1,105 @@ +package gov.nist.csd.pm.pap.serialization; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.serialization.json.JSONDeserializer; +import gov.nist.csd.pm.pap.serialization.json.JSONSerializer; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pap.serialization.pml.PMLSerializer; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.util.PolicyEquals; +import gov.nist.csd.pm.util.SamplePolicy; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static gov.nist.csd.pm.util.PolicyEquals.assertPolicyEquals; + +public class SerializationTest { + + @Test + void testJSONAndPML() throws PMException, IOException { + MemoryPAP pap = new MemoryPAP(); + SamplePolicy.loadSamplePolicyFromPML(pap); + + String json = pap.serialize(new JSONSerializer()); + String pml = pap.serialize(new PMLSerializer()); + + MemoryPAP jsonPAP = new MemoryPAP(); + jsonPAP.deserialize(new UserContext("u1"), json, new JSONDeserializer()); + + PAP pmlPAP = new MemoryPAP(); + pmlPAP.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + + assertPolicyEquals(jsonPAP.query(), pmlPAP.query()); + assertPolicyEquals(pap.query(), pmlPAP.query()); + assertPolicyEquals(pap.query(), jsonPAP.query()); + } + + @Test + void testPMLAndJson() throws PMException, IOException { + MemoryPAP pml = new MemoryPAP(); + MemoryPAP json = new MemoryPAP(); + + SamplePolicy.loadSamplePolicyFromPML(pml); + SamplePolicy.loadSamplePolicyFromJSON(json); + + PolicyEquals.assertPolicyEquals(pml.query(), json.query()); + + String pmlStr = pml.serialize(new PMLSerializer()); + String jsonStr = json.serialize(new JSONSerializer()); + + pml.reset(); + pml.deserialize(new UserContext("u1"), pmlStr, new PMLDeserializer()); + json.reset(); + json.deserialize(new UserContext("u1"), pmlStr, new PMLDeserializer()); + PolicyEquals.assertPolicyEquals(pml.query(), json.query()); + + pml.reset(); + pml.deserialize(new UserContext("u1"), jsonStr, new JSONDeserializer()); + json.reset(); + json.deserialize(new UserContext("u1"), jsonStr, new JSONDeserializer()); + PolicyEquals.assertPolicyEquals(pml.query(), json.query()); + } + + @Test + void testSerializationWithAdminNodes() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + """); + String pml = pap.serialize(new PMLSerializer()); + String json = pap.serialize(new JSONSerializer()); + + MemoryPAP pmlPAP = new MemoryPAP(); + pmlPAP.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + MemoryPAP jsonPAP = new MemoryPAP(); + jsonPAP.deserialize(new UserContext("u1"), json, new JSONDeserializer()); + + assertPolicyEquals(pmlPAP.query(), jsonPAP.query()); + assertPolicyEquals(pap.query(), pmlPAP.query()); + assertPolicyEquals(pap.query(), jsonPAP.query()); + } + + @Test + void testSerializationNodeProperties() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + set properties of "ua1" to {"a": "b"} + """); + String pml = pap.serialize(new PMLSerializer()); + String json = pap.serialize(new JSONSerializer()); + + MemoryPAP pmlPAP = new MemoryPAP(); + pmlPAP.deserialize(new UserContext("u1"), pml, new PMLDeserializer()); + MemoryPAP jsonPAP = new MemoryPAP(); + jsonPAP.deserialize(new UserContext("u1"), json, new JSONDeserializer()); + + assertPolicyEquals(pmlPAP.query(), jsonPAP.query()); + } +} diff --git a/src/test/java/gov/nist/csd/pm/pdp/PDPTest.java b/src/test/java/gov/nist/csd/pm/pdp/PDPTest.java index 126e297d7..22c29baf8 100644 --- a/src/test/java/gov/nist/csd/pm/pdp/PDPTest.java +++ b/src/test/java/gov/nist/csd/pm/pdp/PDPTest.java @@ -1,38 +1,332 @@ package gov.nist.csd.pm.pdp; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.memory.MemoryPDP; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; +import gov.nist.csd.pm.pap.exception.*; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; import org.junit.jupiter.api.Test; -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.CREATE_OBJECT_ATTRIBUTE; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.PAPTest.testAdminPolicy; +import static gov.nist.csd.pm.pap.op.AdminAccessRights.CREATE_OBJECT_ATTRIBUTE; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.ASCENDANT_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.DESCENDANTS_OPERAND; import static org.junit.jupiter.api.Assertions.*; class PDPTest { @Test void testRunTx() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - UserContext superUser = new UserContext(SUPER_USER); - pdp.runTx(superUser, (policy) -> { - policy.graph().createPolicyClass("pc1"); - policy.graph().createUserAttribute("ua1", "pc1"); - policy.graph().createObjectAttribute("oa1", "pc1"); - policy.graph().createObjectAttribute("oa2", "pc1"); - policy.graph().createUser("u1", "ua1"); - policy.graph().createObject("o1", "oa1"); + PAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + + pap.runTx(txPAP -> { + txPAP.modify().graph().createPolicyClass("pc1"); + txPAP.modify().graph().createUserAttribute("ua1", List.of("pc1")); + txPAP.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + txPAP.modify().graph().createObjectAttribute("oa2", List.of("pc1")); + txPAP.modify().graph().createUser("u1", List.of("ua1")); + txPAP.modify().graph().createObject("o1", List.of("oa1")); }); assertThrows(PMException.class, () -> pdp.runTx(new UserContext("u1"), ((policy) -> - policy.graph().associate("ua1", "oa1", new AccessRightSet(CREATE_OBJECT_ATTRIBUTE))))); + policy.modify().graph().associate("ua1", "oa1", new AccessRightSet(CREATE_OBJECT_ATTRIBUTE))))); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + } + + + @Test + void testBootstrapWithAdminPolicyOnly() throws PMException { + PAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + + pdp.bootstrap(p -> { + p.modify().graph().createPolicyClass("pc1"); + }); + + testAdminPolicy(pap, 2); + assertTrue(pap.query().graph().nodeExists("pc1")); + } + + @Test + void testBootstrapWithExistingPolicyThrowsException() throws PMException { + PAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + pap.modify().graph().createPolicyClass("pc1"); + assertThrows(BootstrapExistingPolicyException.class, () -> { + pdp.bootstrap((policy) -> {}); + }); + + pap.reset(); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createObject("o1", List.of("oa1")); + + pap.modify().prohibitions().createProhibition("pro1", new ProhibitionSubject("u1", ProhibitionSubject.Type.USER), + new AccessRightSet("read"), true, + Collections.singleton(new ContainerCondition("oa1", false)) + ); + + assertThrows(BootstrapExistingPolicyException.class, () -> { + pdp.bootstrap((policy) -> {}); + }); + + pap.modify().obligations().createObligation("u1", "obl1", List.of()); + + assertThrows(BootstrapExistingPolicyException.class, () -> { + pdp.bootstrap((policy) -> {}); + }); + } + + @Test + void testRollback() throws PMException { + PAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); + + assertThrows(NodeNameExistsException.class, () -> { + pdp.runTx(new UserContext("u1"), policy -> { + policy.modify().graph().createPolicyClass("pc2"); + // expect error and rollback + policy.modify().graph().createObjectAttribute("oa1", List.of("pc2")); + }); + }); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertFalse(pap.query().graph().nodeExists("pc2")); + } + + @Test + void testAdjudicateResourceOperation() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), """ + set resource operations ["read", "write"] + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + associate "ua1" and "oa1" with ["read"] + + create u "u1" in ["ua1"] + create o "o1" in ["oa1"] + """); + + PDP pdp = new PDP(pap); + ResourceAdjudicationResponse resp = pdp.adjudicateResourceOperation(new UserContext("u1"), "o1", "read"); + assertEquals(resp.getResource(), pap.query().graph().getNode("o1")); + assertEquals(resp.getDecision(), Decision.GRANT); + + resp = pdp.adjudicateResourceOperation(new UserContext("u1"), "o1", "write"); + assertNull(resp.getResource()); + assertEquals(resp.getDecision(), Decision.DENY); + } + + @Test + void testAdjudicateAdminOperation() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + associate "ua1" and "oa1" with ["assign"] + associate "ua1" and "oa2" with ["assign_to"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + + operation op1() { + check "assign_to" on "oa2" + } { + create pc "test" + } + """); + + PDP pdp = new PDP(pap); + + // builtin operation + AdminAdjudicationResponse resp = pdp.adjudicateAdminOperations( + new UserContext("u1"), + List.of(new OperationRequest("assign", Map.of(ASCENDANT_OPERAND, "o1", DESCENDANTS_OPERAND, List.of("oa2")))) + ); + assertEquals(Decision.GRANT, resp.getDecision()); + + // custom operation + resp = pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", Map.of()))); + assertEquals(Decision.GRANT, resp.getDecision()); + + // denied + resp = pdp.adjudicateAdminOperations(new UserContext("u2"), List.of(new OperationRequest("op1", Map.of()))); + assertEquals(Decision.DENY, resp.getDecision()); + } + + @Test + void testAdjudicateDoesNotExist() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext(""), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create u "u1" in ["ua1"] + + set resource operations ["read", "write"] + + """); + PDP pdp = new PDP(pap); + assertThrows(OperationDoesNotExistException.class, + () -> pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", Map.of())))); + assertThrows(NodeDoesNotExistException.class, + () -> pdp.adjudicateResourceOperation(new UserContext("u1"), "oa1", "read")); + assertThrows(OperationDoesNotExistException.class, + () -> pdp.adjudicateResourceOperation(new UserContext("u1"), "ua1", "x")); + } + + @Test + void testAdjudicateAdminRoutine() throws PMException { + PAP pap = new MemoryPAP(); + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createUserAttribute("ua2", List.of("pc1")); + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createUser("u2", List.of("ua2")); + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); + + pap.modify().routines().createAdminRoutine(new Routine("routine1", List.of("a")) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass((String) operands.get("a")); + return null; + } + }); + pap.executePML(new UserContext("u1"), """ + routine routine2() { + create policy class "test2" + } + """); + + PDP pdp = new PDP(pap); + pdp.adjudicateAdminRoutine(new UserContext("u1"), new RoutineRequest("routine1", Map.of("a", "test"))); + pdp.adjudicateAdminRoutine(new UserContext("u1"), new RoutineRequest("routine2", Map.of())); + + assertTrue(pap.query().graph().nodeExists("test")); + assertTrue(pap.query().graph().nodeExists("test2")); + + UnauthorizedException e = assertThrows( + UnauthorizedException.class, + () -> pdp.adjudicateAdminRoutine(new UserContext("u2"), new RoutineRequest("routine1", Map.of("a", "test3"))) + ); + assertEquals("[user=u2] does not have access right [create_policy_class] on [PM_ADMIN:object]", e.getMessage()); + } + + @Test + void testRoutineWithForLoop() throws PMException { + String pml = """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + create u "u1" in ["ua1"] + + associate "ua1" and "oa1" with ["create_object"] + + routine routine1() { + foreach x in ["oa1", "oa2"] { + if true { + create o x + "_o" in [x] + } + } + } + """; + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), pml); + + PDP pdp = new PDP(pap); + assertThrows(UnauthorizedException.class, () -> pdp.adjudicateAdminRoutine(new UserContext("u1"), new RoutineRequest("routine1", Map.of()))); + } + + @Test + void testRoutineTx() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + associate "ua1" and "oa1" with ["create_object"] + + create u "u1" in ["ua1"] + + routine r1() { + create o "o1" in ["oa1"] + create o "o2" in ["oa1"] + create o "o3" in ["oa2"] + } + """); + PDP pdp = new PDP(pap); + assertThrows(UnauthorizedException.class, () -> pdp.runTx(new UserContext("u1"), tx -> { + tx.executePML(new UserContext("u1"), "r1()"); + })); + assertFalse(pap.query().graph().nodeExists("o1")); + assertFalse(pap.query().graph().nodeExists("o2")); + + } + + @Test + void testPMLOperationDoesNotEmitEvents() throws PMException { + MemoryPAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + associate "ua1" and "oa1" with ["create_object"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create u "u1" in ["ua1"] + + operation op1() { + create pc "pc2" + foreach x in ["ua2", "ua3"] { + create ua x in ["pc2"] + } + } + + create obligation "o1" { + create rule "r1" + when any user + performs "create_user_attribute" + do(ctx) { + create pc "test" + } + } + """); - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("oa1")); + PDP pdp = new PDP(pap); + EPP epp = new EPP(pdp, pap); + pdp.adjudicateAdminOperations(new UserContext("u1"), List.of(new OperationRequest("op1", Map.of()))); + assertFalse(pap.query().graph().nodeExists("test")); } } \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/PDPTxTest.java b/src/test/java/gov/nist/csd/pm/pdp/PDPTxTest.java new file mode 100644 index 000000000..7912b3754 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/PDPTxTest.java @@ -0,0 +1,74 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.serialization.json.JSONSerializer; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PDPTxTest { + + @Test + void testReset() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + """); + PDPTx u2 = new PDPTx(new UserContext("u2"), pap, List.of()); + assertThrows(UnauthorizedException.class, u2::reset); + + PDPTx u1 = new PDPTx(new UserContext("u1"), pap, List.of()); + assertDoesNotThrow(u1::reset); + } + + @Test + void testSerialize() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + """); + PDPTx u2 = new PDPTx(new UserContext("u2"), pap, List.of()); + assertThrows(UnauthorizedException.class, () -> u2.serialize(new JSONSerializer())); + + PDPTx u1 = new PDPTx(new UserContext("u1"), pap, List.of()); + assertDoesNotThrow(() -> u1.serialize(new JSONSerializer())); + } + + @Test + void testDeserialize() throws PMException { + PAP pap = new MemoryPAP(); + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + """); + + String serialize = "create pc \"test\""; + + PDPTx u2 = new PDPTx(new UserContext("u2"), pap, List.of()); + assertThrows(UnauthorizedException.class, () -> u2.deserialize(new UserContext(), serialize, new PMLDeserializer())); + + PDPTx u1 = new PDPTx(new UserContext("u1"), pap, List.of()); + assertDoesNotThrow(() -> u1.deserialize(new UserContext(), serialize, new PMLDeserializer())); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/PMLBootstrapperTest.java b/src/test/java/gov/nist/csd/pm/pdp/PMLBootstrapperTest.java new file mode 100644 index 000000000..7a71e50b4 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/PMLBootstrapperTest.java @@ -0,0 +1,81 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.pml.executable.operation.PMLOperationWrapper; +import gov.nist.csd.pm.pap.pml.executable.routine.PMLRoutineWrapper; +import gov.nist.csd.pm.pap.pml.value.StringValue; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class PMLBootstrapperTest { + + @Test + void test() throws PMException { + PAP pap = new MemoryPAP(); + PDP pdp = new PDP(pap); + + String input = """ + set resource operations ["read", "write"] + + create pc "pc1" + create ua "ua1" in ["pc1"] + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["read"] + + create user "u1" in ["ua1"] + + op1() + + routine1() + + create pc TEST_CONST + """; + + Operation op1 = new Operation<>("op1") { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass("op1"); + + return null; + } + }; + + Routine routine1 = new Routine<>("routine1", List.of()) { + @Override + public Object execute(PAP pap, Map operands) throws PMException { + pap.modify().graph().createPolicyClass("routine1"); + return null; + } + }; + + pdp.bootstrap(new PMLBootstrapper(new UserContext("u1"), input, + List.of(new PMLOperationWrapper(op1)), + List.of(new PMLRoutineWrapper(routine1)), + Map.of("TEST_CONST", new StringValue("TEST_PC")) + )); + + assertTrue(pap.query().graph().nodeExists("pc1")); + assertTrue(pap.query().graph().nodeExists("op1")); + assertTrue(pap.query().graph().nodeExists("routine1")); + assertTrue(pap.query().graph().nodeExists("TEST_PC")); + assertTrue(pap.query().graph().nodeExists("ua1")); + assertTrue(pap.query().graph().nodeExists("oa1")); + assertTrue(pap.query().graph().nodeExists("u1")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/PrivilegeCheckerTest.java b/src/test/java/gov/nist/csd/pm/pdp/PrivilegeCheckerTest.java new file mode 100644 index 000000000..a3f945a7d --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/PrivilegeCheckerTest.java @@ -0,0 +1,42 @@ +package gov.nist.csd.pm.pdp; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.op.AdminAccessRights; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class PrivilegeCheckerTest { + + @Test + void testAccessRightChecker() throws PMException { + PAP pap = new MemoryPAP(); + + pap.modify().operations().setResourceOperations(new AccessRightSet("read")); + + pap.modify().graph().createPolicyClass("pc1"); + pap.modify().graph().createUserAttribute("ua1", List.of("pc1")); + pap.modify().graph().createObjectAttribute("oa1", List.of("pc1")); + + pap.modify().graph().associate("ua1", "oa1", new AccessRightSet("read")); + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet( + AdminAccessRights.ASSIGN_TO)); + + pap.modify().graph().createUser("u1", List.of("ua1")); + pap.modify().graph().createObject("o1", List.of("oa1")); + + PrivilegeChecker.check(pap, new UserContext("u1"), "o1", "read"); + PrivilegeChecker.check(pap, new UserContext("u1"), "pc1", AdminAccessRights.ASSIGN_TO); + assertThrows(UnauthorizedException.class, () -> PrivilegeChecker.check(pap, new UserContext("u1"), "pc1", AdminAccessRights.DELETE_POLICY_CLASS)); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/adjudicator/PrivilegeCheckerTest.java b/src/test/java/gov/nist/csd/pm/pdp/adjudicator/PrivilegeCheckerTest.java new file mode 100644 index 000000000..914a3485a --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/adjudicator/PrivilegeCheckerTest.java @@ -0,0 +1,75 @@ +package gov.nist.csd.pm.pdp.adjudicator; + +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.PrivilegeChecker; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pap.exception.NodeDoesNotExistException; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class PrivilegeCheckerTest { + + static PAP pap; + + @BeforeAll + static void setup() throws PMException { + pap = new MemoryPAP(); + pap.deserialize( + new UserContext("u1"), + """ + set resource operations ["read", "write"] + + create policy class "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["read", "write"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["read"] + + create user "u1" in ["ua1"] + create user "u2" in ["ua2"] + + create object "o1" in ["oa1"] + """, + new PMLDeserializer() + ); + } + + @Test + void testCheckUserAndTargetDoesNotExist() throws PMException { + assertThrows(NodeDoesNotExistException.class, + () -> PrivilegeChecker.check(pap, new UserContext("u3"), "o1", "read")); + assertThrows(NodeDoesNotExistException.class, + () -> PrivilegeChecker.check(pap, new UserContext("u1"), "o2", "read")); + } + + @Test + void testCheckNodeIsPC() { + assertDoesNotThrow(() -> PrivilegeChecker.check(pap, new UserContext("u1"), "pc1", "read")); + } + + @Test + void testAuthorize() { + assertDoesNotThrow(() -> PrivilegeChecker.check(pap, new UserContext("u1"), "o1", "read")); + } + + @Test + void testUnauthorized() { + assertThrows(PMException.class, + () -> PrivilegeChecker.check(pap, new UserContext("u2"), "o1", "read")); + } + + @Test + void testEmptyAccessRights() { + assertDoesNotThrow(() -> PrivilegeChecker.check(pap, new UserContext("u1"), "o1")); + } + +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPDPTest.java b/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPDPTest.java deleted file mode 100644 index 4ed86eb60..000000000 --- a/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPDPTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package gov.nist.csd.pm.pdp.memory; - -import gov.nist.csd.pm.SamplePolicy; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.NodeNameExistsException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.exceptions.UnauthorizedException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -class MemoryPDPTest { - - @Test - void testRollback() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - - PDP pdp = new MemoryPDP(pap, false); - assertThrows(NodeNameExistsException.class, () -> { - pdp.runTx(new UserContext(SUPER_USER), policy -> { - policy.graph().createPolicyClass("pc2"); - // expect error and rollback - policy.graph().createObjectAttribute("oa1", "pc2"); - }); - }); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("ua1")); - assertTrue(pap.graph().nodeExists("oa1")); - assertFalse(pap.graph().nodeExists("pc2")); - } - - @Test - void testExecutePML() throws PMException { - try { - PAP pap = new PAP(new MemoryPolicyStore()); - SamplePolicy.loadSamplePolicyFromPML(pap); - - FunctionDefinitionStatement functionDefinitionStatement = new FunctionDefinitionStatement( - "testfunc", - Type.voidType(), - List.of(), - (ctx, policy) -> { - policy.graph().createPolicyClass("pc3"); - return new Value(); - } - ); - - MemoryPDP memoryPDP = new MemoryPDP(pap, false); - memoryPDP.runTx(new UserContext(SUPER_USER), policy -> { - policy.userDefinedPML().createFunction(functionDefinitionStatement); - policy.executePML(new UserContext(SUPER_USER), "create ua 'ua3' in ['pc2']"); - }); - - assertTrue(pap.graph().nodeExists("ua3")); - - assertThrows(UnauthorizedException.class, () -> { - memoryPDP.runTx(new UserContext("u1"), policy -> { - policy.executePML(new UserContext("u1"), "testfunc()"); - }); - }); - - assertFalse(pap.graph().nodeExists("pc3")); - } catch (IOException e) { - throw new RuntimeException(e); - } - } -} diff --git a/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewerTest.java b/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewerTest.java deleted file mode 100644 index 363452306..000000000 --- a/src/test/java/gov/nist/csd/pm/pdp/memory/MemoryPolicyReviewerTest.java +++ /dev/null @@ -1,824 +0,0 @@ -package gov.nist.csd.pm.pdp.memory; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.Map; -import java.util.Set; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.*; -import static org.junit.jupiter.api.Assertions.*; - -class MemoryPolicyReviewerTest { - - @Nested - class GetAccessRights { - private static final AccessRightSet RWE = new AccessRightSet("read", "write", "execute"); - - @Test - void testGetChildren() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String o1 = pap.graph().createObject("o1", oa1); - String o2 = pap.graph().createObject("o2", oa1); - String o3 = pap.graph().createObject("o3", oa1); - - AccessRightSet arset = new AccessRightSet("read", "write"); - pap.graph().associate(ua1, oa1, arset); - - Map subgraph = pdp.reviewer().getSubgraphAccessRights(new UserContext(u1), oa1); - assertEquals( - Map.of("o1", arset, "o2", arset, "o3", arset), - subgraph - ); - } - - @Test - void testGetAccessibleNodes() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String o1 = pap.graph().createObject("o1", oa1); - String o2 = pap.graph().createObject("o2", oa1); - String o3 = pap.graph().createObject("o3", oa1); - - AccessRightSet arset = new AccessRightSet("read", "write"); - pap.graph().associate(ua1, oa1, arset); - - Map accessibleNodes = pdp.reviewer().buildCapabilityList(new UserContext(u1)); - - assertTrue(accessibleNodes.containsKey(oa1)); - assertTrue(accessibleNodes.containsKey(o1)); - assertTrue(accessibleNodes.containsKey(o2)); - assertTrue(accessibleNodes.containsKey(o3)); - - assertEquals(arset, accessibleNodes.get(oa1)); - assertEquals(arset, accessibleNodes.get(o1)); - assertEquals(arset, accessibleNodes.get(o2)); - assertEquals(arset, accessibleNodes.get(o3)); - } - - @Test - void testGraph1() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - @Test - void testGraph2() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1, pc2); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph3() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - @Test - void testGraph4() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa1, new AccessRightSet("write")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - @Test - void testGraph5() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc2); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); - } - @Test - void testGraph6() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc2); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); - } - @Test - void testGraph7() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph8() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - } - @Test - void testGraph9() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - pap.graph().associate(ua2, oa1, new AccessRightSet("read", "write")); - - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - } - @Test - void testGraph10() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc2); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - @Test - void testGraph11() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph12() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa1, new AccessRightSet("write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - @Test - void testGraph13() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String ua1 = pap.graph().createUserAttribute("ua1", ua2); - String u1 = pap.graph().createUser("u1", ua1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String oa1 = pap.graph().createObjectAttribute("oa1", oa2); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read")); - - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.contains("read")); - } - @Test - void testGraph14() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1, pc2); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - pap.graph().associate(ua2, oa1, new AccessRightSet("*")); - - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - } - @Test - void testGraph15() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String ua1 = pap.graph().createUserAttribute("ua1", ua2); - String u1 = pap.graph().createUser("u1", ua1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String oa1 = pap.graph().createObjectAttribute("oa1", oa2); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("*")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read")); - - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - } - @Test - void testGraph16() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String ua1 = pap.graph().createUserAttribute("ua1", ua2); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa1, new AccessRightSet("write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - - // removed graph7 due to adding the parent IDs to the createNode, need to always connect to the pap.graph(). - - @Test - void testGraph18() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String o1 = pap.graph().createObject("o1", oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph19() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph20() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa2, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read"))); - } - @Test - void testGraph21() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String u1 = pap.graph().createUser("u1", ua1, ua2); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc2); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa2, new AccessRightSet("write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - @Test - void testGraph22() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - String pc1 = pap.graph().createPolicyClass("pc1"); - String pc2 = pap.graph().createPolicyClass("pc2"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - - @Test - void testGraph23WithProhibitions() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa3 = pap.graph().createObjectAttribute("oa3", pc1); - String oa4 = pap.graph().createObjectAttribute("oa4", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", oa3); - String oa1 = pap.graph().createObjectAttribute("oa1", oa4); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa3, new AccessRightSet("read", "write", "execute")); - pap.prohibitions().create("deny", ProhibitionSubject.userAttribute("ua1"), new AccessRightSet("read"), true, - new ContainerCondition(oa1, false), - new ContainerCondition(oa2, false) - ); - - pap.prohibitions().create("deny2", ProhibitionSubject.user(u1), new AccessRightSet("write"), - true, - new ContainerCondition(oa3, false)); - - Set list = pdp.reviewer().getAccessRights(new UserContext(u1), o1); - assertEquals(1, list.size()); - assertTrue(list.contains("execute")); - } - - @Test - void testGraph24WithProhibitions() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String o1 = pap.graph().createObject("o1", oa1, oa2); - String o2 = pap.graph().createObject("o2", oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - - pap.prohibitions().create("deny", ProhibitionSubject.userAttribute(ua1), - new AccessRightSet("read"), - true, - new ContainerCondition(oa1, false), - new ContainerCondition(oa2, true) - ); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).contains("read")); - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o2).isEmpty()); - - pap.graph().associate(ua1, oa2, new AccessRightSet("read")); - - pap.prohibitions().create("deny-process", ProhibitionSubject.process("1234"), - new AccessRightSet("read"), - false, - new ContainerCondition(oa1, false)); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1, "1234"), o1).isEmpty()); - } - - @Test - void testGraph25WithProhibitions() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", oa1); - String oa3 = pap.graph().createObjectAttribute("oa3", oa1); - String oa4 = pap.graph().createObjectAttribute("oa4", oa3); - String oa5 = pap.graph().createObjectAttribute("oa5", oa2); - String o1 = pap.graph().createObject("o1", oa4); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - pap.prohibitions().create("deny", ProhibitionSubject.user(u1), new AccessRightSet("read", "write"), - true, - new ContainerCondition(oa4, true), - new ContainerCondition(oa1, false)); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), oa5).isEmpty()); - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).containsAll(Arrays.asList("read", "write"))); - } - - @Test - void testGraph25WithProhibitions2() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String o1 = pap.graph().createObject("o1", oa1, oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read", "write")); - - - pap.prohibitions().create("deny", ProhibitionSubject.user(u1), new AccessRightSet("read", "write"), - true, - new ContainerCondition(oa1, false), - new ContainerCondition(oa2, false)); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(u1), o1).isEmpty()); - } - - @Test - void testDeciderWithUA() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua2 = pap.graph().createUserAttribute("ua2", pc1); - String ua1 = pap.graph().createUserAttribute("ua1", ua2); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String oa2 = pap.graph().createObjectAttribute("oa2", pc1); - String o1 = pap.graph().createObject("o1", oa1, oa2); - String o2 = pap.graph().createObject("o2", oa2); - - pap.graph().associate(ua1, oa1, new AccessRightSet("read")); - pap.graph().associate(ua2, oa1, new AccessRightSet("write")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext(ua1), oa1).containsAll(Arrays.asList("read", "write"))); - } - - @Test - void testProhibitionsAllCombinations() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa2", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc1"); - pap.graph().createObjectAttribute("oa4", "pc1"); - pap.graph().createObject("o1", "oa1", "oa2", "oa3"); - pap.graph().createObject("o2", "oa1", "oa4"); - - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createUser("u1", "ua1"); - pap.graph().createUser("u2", "ua1"); - pap.graph().createUser("u3", "ua1"); - pap.graph().createUser("u4", "ua1"); - - pap.graph().associate("ua1", "oa1", new AccessRightSet("read", "write")); - - - pap.prohibitions().create( - "p1", - ProhibitionSubject.user("u1"), - new AccessRightSet("write"), - true, - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", false), - new ContainerCondition("oa3", false) - ); - - pap.prohibitions().create( - "p2", - ProhibitionSubject.user("u2"), - new AccessRightSet("write"), - false, - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", false), - new ContainerCondition("oa3", false) - ); - - pap.prohibitions().create( - "p3", - ProhibitionSubject.user("u3"), - new AccessRightSet("write"), - true, - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", true) - ); - - pap.prohibitions().create( - "p4", - ProhibitionSubject.user("u4"), - new AccessRightSet("write"), - false, - new ContainerCondition("oa1", false), - new ContainerCondition("oa2", true) - ); - - pap.prohibitions().create( - "p5", - ProhibitionSubject.user("u4"), - new AccessRightSet("write"), - false, - new ContainerCondition("oa2", true) - ); - - Set list = pdp.reviewer().getAccessRights(new UserContext("u1"), "o1"); - assertTrue(list.contains("read") && !list.contains("write")); - - list = pdp.reviewer().getAccessRights(new UserContext("u1"), "o2"); - assertTrue(list.contains("read") && list.contains("write")); - - list =pdp.reviewer().getAccessRights(new UserContext("u2"), "o2"); - assertTrue(list.contains("read") && !list.contains("write")); - - list = pdp.reviewer().getAccessRights(new UserContext("u3"), "o2"); - assertTrue(list.contains("read") && !list.contains("write")); - - list = pdp.reviewer().getAccessRights(new UserContext("u4"), "o1"); - assertTrue(list.contains("read") && !list.contains("write")); - - list = pdp.reviewer().getAccessRights(new UserContext("u4"), "o2"); - assertTrue(list.contains("read") && !list.contains("write")); - } - - @Test - void testPermissions() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - - String pc1 = pap.graph().createPolicyClass("pc1"); - String ua1 = pap.graph().createUserAttribute("ua1", pc1); - String u1 = pap.graph().createUser("u1", ua1); - String oa1 = pap.graph().createObjectAttribute("oa1", pc1); - String o1 = pap.graph().createObject("o1", oa1); - - pap.graph().associate(ua1, oa1, allAccessRights()); - - Set list = pdp.reviewer().getAccessRights(new UserContext("u1"), "o1"); - assertTrue(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - - pap.graph().associate(ua1, oa1, allAdminAccessRights()); - list = pdp.reviewer().getAccessRights(new UserContext("u1"), "o1"); - assertTrue(list.containsAll(allAdminAccessRights())); - assertFalse(list.containsAll(RWE)); - - pap.graph().associate(ua1, oa1, new AccessRightSet(ALL_RESOURCE_ACCESS_RIGHTS)); - list = pdp.reviewer().getAccessRights(new UserContext("u1"), "o1"); - assertFalse(list.containsAll(allAdminAccessRights())); - assertTrue(list.containsAll(RWE)); - } - - @Test - void testPermissionsInOnlyOnePC() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(RWE); - pap.graph().createPolicyClass("pc1"); - pap.graph().createPolicyClass("pc2"); - pap.graph().createUserAttribute("ua3", "pc1"); - pap.graph().createUserAttribute("ua2", "ua3"); - pap.graph().createUserAttribute("u1", "ua2"); - - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createObjectAttribute("oa3", "pc2"); - pap.graph().assign("oa3", "oa1"); - pap.graph().createObject("o1", "oa3"); - - pap.graph().associate("ua3", "oa1", new AccessRightSet("read")); - - assertTrue(pdp.reviewer().getAccessRights(new UserContext("u1"), "o1").isEmpty()); - } - - @Test - void testProhibitionsWithContainerAsTarget() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUser("u1", "ua1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - - pap.prohibitions().create("deny1", ProhibitionSubject.user("u1"), new AccessRightSet("read"), false, - new ContainerCondition("oa1", false)); - - AccessRightSet deniedAccessRights = pdp.reviewer().getDeniedAccessRights(new UserContext("u1"), "oa1"); - assertTrue(deniedAccessRights.contains("read")); - } - - @Test - void testProhibitionWithContainerAsTargetComplement() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - PDP pdp = new MemoryPDP(pap, false); - - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - pap.graph().createUser("u1", "ua1"); - pap.graph().associate("ua1", "oa1", new AccessRightSet("read")); - - pap.prohibitions().create("deny1", ProhibitionSubject.user("u1"), new AccessRightSet("read"), false, - new ContainerCondition("oa1", true)); - - AccessRightSet deniedAccessRights = pdp.reviewer().getDeniedAccessRights(new UserContext("u1"), "oa1"); - assertFalse(deniedAccessRights.contains("read")); - } - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicatorTest.java b/src/test/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicatorTest.java new file mode 100644 index 000000000..4f531df6c --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/GraphModificationAdjudicatorTest.java @@ -0,0 +1,236 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.graph.*; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.graph.GraphOp.*; +import static org.junit.jupiter.api.Assertions.*; + +class GraphModificationAdjudicatorTest { + + PAP pap; + PDP pdp; + EPP epp; + + TestEventProcessor testEventProcessor; + GraphModificationAdjudicator ok; + GraphModificationAdjudicator fail; + + + @BeforeEach + void setup() throws PMException { + pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create pc "pc2" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create ua "ua3" in ["pc1"] + create ua "ua4" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and "oa2" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + associate "ua3" and "ua1" with ["*a"] + associate "ua1" and "ua4" with ["*a"] + associate "ua1" and "ua3" with ["*a"] + + create u "u1" in ["ua1", "ua3"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + pdp = new PDP(pap); + epp = new EPP(pdp, pap); + + testEventProcessor = new TestEventProcessor(); + pdp.addEventListener(testEventProcessor); + + ok = new GraphModificationAdjudicator(new UserContext("u1"), pap, pdp); + fail = new GraphModificationAdjudicator(new UserContext("u2"), pap, pdp); + } + + @Test + void createPolicyClass() throws PMException { + assertDoesNotThrow(() -> ok.createPolicyClass("test")); + assertEquals( + new EventContext("u1", "", new CreatePolicyClassOp(), Map.of(NAME_OPERAND, "test")), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> fail.createPolicyClass("test")); + } + + @Test + void createUserAttribute() throws PMException { + assertDoesNotThrow(() -> ok.createUserAttribute("test", List.of("ua1"))); + assertEquals( + new EventContext("u1", "", new CreateUserAttributeOp(), Map.of(NAME_OPERAND, "test", DESCENDANTS_OPERAND, List.of("ua1"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> fail.createUserAttribute("test", List.of("ua1"))); + } + + @Test + void createObjectAttribute() throws PMException { + assertDoesNotThrow(() -> ok.createObjectAttribute("test", List.of("oa1"))); + assertEquals( + new EventContext("u1", "", new CreateObjectAttributeOp(), Map.of(NAME_OPERAND, "test", DESCENDANTS_OPERAND, List.of("oa1"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> fail.createObjectAttribute("test", List.of("oa1"))); + } + + @Test + void createObject() throws PMException { + assertDoesNotThrow(() -> ok.createObject("test", List.of("oa1"))); + assertEquals( + new EventContext("u1", "", new CreateObjectOp(), Map.of(NAME_OPERAND, "test", DESCENDANTS_OPERAND, List.of("oa1"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> fail.createObject("test", List.of("oa1"))); + } + + @Test + void createUser() throws PMException { + assertDoesNotThrow(() -> ok.createUser("test", List.of("ua1"))); + assertEquals( + new EventContext("u1", "", new CreateUserOp(), Map.of(NAME_OPERAND, "test", DESCENDANTS_OPERAND, List.of("ua1"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().nodeExists("test")); + + assertThrows(UnauthorizedException.class, () -> fail.createUser("test", List.of("ua1"))); + } + + @Test + void setNodeProperties() throws PMException { + assertDoesNotThrow(() -> ok.setNodeProperties("o1", Map.of("a", "b"))); + assertEquals( + new EventContext("u1", "", new SetNodePropertiesOp(), Map.of(NAME_OPERAND, "o1", PROPERTIES_OPERAND, Map.of("a", "b"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().getNode("o1").getProperties().equals(Map.of("a", "b"))); + + assertThrows(UnauthorizedException.class, () -> fail.setNodeProperties("o1", Map.of("a", "b"))); + } + + @Test + void deleteNodeOk() throws PMException { + assertDoesNotThrow(() -> ok.deleteNode("o1")); + assertEquals( + new EventContext("u1", "", new DeleteObjectOp(), Map.of(NAME_OPERAND, "o1", DESCENDANTS_OPERAND, Set.of("oa1"), TYPE_OPERAND, NodeType.O)), + testEventProcessor.getEventContext() + ); + assertDoesNotThrow(() -> ok.deleteNode("oa2")); + assertEquals( + new EventContext("u1", "", new DeleteObjectAttributeOp(), Map.of(NAME_OPERAND, "oa2", DESCENDANTS_OPERAND, Set.of("pc1"), TYPE_OPERAND, NodeType.OA)), + testEventProcessor.getEventContext() + ); + assertDoesNotThrow(() -> ok.deleteNode("ua4")); + assertEquals( + new EventContext("u1", "", new DeleteUserAttributeOp(), Map.of(NAME_OPERAND, "ua4", DESCENDANTS_OPERAND, Set.of("pc1"), TYPE_OPERAND, NodeType.UA)), + testEventProcessor.getEventContext() + ); + assertDoesNotThrow(() -> ok.deleteNode("pc2")); + assertEquals( + new EventContext("u1", "", new DeletePolicyClassOp(), Map.of(NAME_OPERAND, "pc2", TYPE_OPERAND, NodeType.PC, DESCENDANTS_OPERAND, Set.of())), + testEventProcessor.getEventContext() + ); + assertDoesNotThrow(() -> ok.deleteNode("u1")); + assertEquals( + new EventContext("u1", "", new DeleteUserOp(), Map.of(NAME_OPERAND, "u1", DESCENDANTS_OPERAND, Set.of("ua1", "ua3"), TYPE_OPERAND, NodeType.U)), + testEventProcessor.getEventContext() + ); + + assertFalse(pap.query().graph().nodeExists("o1")); + assertFalse(pap.query().graph().nodeExists("oa2")); + assertFalse(pap.query().graph().nodeExists("ua4")); + assertFalse(pap.query().graph().nodeExists("pc2")); + assertFalse(pap.query().graph().nodeExists("u1")); + } + + @Test + void deleteNodeFail() { + assertThrows(UnauthorizedException.class, () -> fail.deleteNode("pc1")); + assertThrows(UnauthorizedException.class, () -> fail.deleteNode("ua1")); + assertThrows(UnauthorizedException.class, () -> fail.deleteNode("oa1")); + assertThrows(UnauthorizedException.class, () -> fail.deleteNode("u1")); + assertThrows(UnauthorizedException.class, () -> fail.deleteNode("o1")); + } + + @Test + void assign() throws PMException { + assertDoesNotThrow(() -> ok.assign("o1", List.of("oa2"))); + assertEquals( + new EventContext("u1", "", new AssignOp(), Map.of(ASCENDANT_OPERAND, "o1", DESCENDANTS_OPERAND, List.of("oa2"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().isAscendant("o1", "oa2")); + + assertThrows(UnauthorizedException.class, () -> fail.assign("o1", List.of("oa1"))); + } + + @Test + void deassign() throws PMException { + assertDoesNotThrow(() -> ok.deassign("u1", List.of("ua1"))); + assertEquals( + new EventContext("u1", "", new DeassignOp(), Map.of(ASCENDANT_OPERAND, "u1", DESCENDANTS_OPERAND, List.of("ua1"))), + testEventProcessor.getEventContext() + ); + assertFalse(pap.query().graph().isAscendant("u1", "ua1")); + + assertThrows(UnauthorizedException.class, () -> fail.deassign("o1", List.of("oa1"))); + } + + @Test + void associate() throws PMException { + assertDoesNotThrow(() -> ok.associate("ua1", "ua3", new AccessRightSet("assign"))); + assertEquals( + new EventContext("u1", "", new AssociateOp(), Map.of(UA_OPERAND, "ua1", TARGET_OPERAND, "ua3", ARSET_OPERAND, new AccessRightSet("assign"))), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().graph().getAssociationsWithSource("ua1").contains(new Association("ua1", "ua3", new AccessRightSet("assign")))); + + assertThrows(UnauthorizedException.class, () -> fail.associate("ua1", "ua3", new AccessRightSet("assign"))); + } + + @Test + void dissociate() throws PMException { + assertDoesNotThrow(() -> ok.dissociate("ua1", "ua3")); + assertEquals( + new EventContext("u1", "", new DissociateOp(), Map.of(UA_OPERAND, "ua1", TARGET_OPERAND, "ua3")), + testEventProcessor.getEventContext() + ); + assertFalse(pap.query().graph().getAssociationsWithSource("ua1").contains(new Association("ua1", "ua3", new AccessRightSet("*a")))); + + assertThrows(UnauthorizedException.class, () -> fail.dissociate("ua1", "ua3")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicatorTest.java b/src/test/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicatorTest.java new file mode 100644 index 000000000..8a2a8342b --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/ObligationsModificationAdjudicatorTest.java @@ -0,0 +1,103 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventPattern; +import gov.nist.csd.pm.pap.obligation.Response; +import gov.nist.csd.pm.pap.obligation.Rule; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.pml.pattern.OperationPattern; +import gov.nist.csd.pm.pap.pml.pattern.subject.SubjectPattern; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class ObligationsModificationAdjudicatorTest { + + PAP pap; + PDP pdp; + EPP epp; + + TestEventProcessor testEventProcessor; + ObligationsModificationAdjudicator ok; + ObligationsModificationAdjudicator fail; + + + @BeforeEach + void setup() throws PMException { + pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and "oa2" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + pdp = new PDP(pap); + epp = new EPP(pdp, pap); + + testEventProcessor = new TestEventProcessor(); + pdp.addEventListener(testEventProcessor); + + ok = new ObligationsModificationAdjudicator(new UserContext("u1"), pap, pdp); + fail = new ObligationsModificationAdjudicator(new UserContext("u2"), pap, pdp); + } + + + @Test + void createObligation() { + assertDoesNotThrow(() -> ok.createObligation("u1", "name", List.of( + new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern(), Map.of()), + new Response("e", List.of()) + ) + ))); + assertThrows(UnauthorizedException.class, () -> fail.createObligation("u1", "name", List.of( + new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern(), Map.of()), + new Response("e", List.of()) + ) + ))); + } + + @Test + void deleteObligation() throws PMException { + ok.createObligation("u1", "test", List.of( + new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern(), Map.of()), + new Response("e", List.of()) + ) + )); + ok.createObligation("u1", "test2", List.of( + new Rule( + "rule1", + new EventPattern(new SubjectPattern(), new OperationPattern(), Map.of()), + new Response("e", List.of()) + ) + )); + assertDoesNotThrow(() -> ok.deleteObligation("test")); + assertFalse(pap.query().prohibitions().getProhibitions().containsKey("test")); + assertThrows(UnauthorizedException.class, () -> fail.deleteObligation("test2")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicatorTest.java b/src/test/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicatorTest.java new file mode 100644 index 000000000..b1d8aa863 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/OperationsModificationAdjudicatorTest.java @@ -0,0 +1,125 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.Operation; +import gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.DeleteAdminOperationOp; +import gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.operation.CreateAdminOperationOp.OPERATION_OPERAND; +import static gov.nist.csd.pm.pap.op.operation.SetResourceOperationsOp.OPERATIONS_OPERAND; +import static org.junit.jupiter.api.Assertions.*; + +class OperationsModificationAdjudicatorTest { + + PAP pap; + PDP pdp; + EPP epp; + + TestEventProcessor testEventProcessor; + OperationsModificationAdjudicator ok; + OperationsModificationAdjudicator fail; + + + @BeforeEach + void setup() throws PMException { + pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + pdp = new PDP(pap); + epp = new EPP(pdp, pap); + + testEventProcessor = new TestEventProcessor(); + pdp.addEventListener(testEventProcessor); + + ok = new OperationsModificationAdjudicator(new UserContext("u1"), pap, pdp); + fail = new OperationsModificationAdjudicator(new UserContext("u2"), pap, pdp); + } + + + @Test + void setResourceOperations() throws PMException { + assertDoesNotThrow(() -> ok.setResourceOperations(new AccessRightSet("read"))); + assertEquals( + new EventContext("u1", "", new SetResourceOperationsOp(), Map.of(OPERATIONS_OPERAND, new AccessRightSet("read"))), + testEventProcessor.getEventContext() + ); + assertEquals(new AccessRightSet("read"), pap.query().operations().getResourceOperations()); + assertThrows(UnauthorizedException.class, () -> fail.setResourceOperations(new AccessRightSet("read"))); + } + + @Test + void createAdminOperation() throws PMException { + Operation op1 = new Operation<>("op1") { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + assertDoesNotThrow(() -> ok.createAdminOperation(op1)); + assertEquals( + new EventContext("u1", "", new CreateAdminOperationOp(), Map.of(OPERATION_OPERAND, op1)), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().operations().getAdminOperationNames().contains("op1")); + assertThrows(UnauthorizedException.class, () -> fail.createAdminOperation(op1)); + } + + @Test + void deleteAdminOperation() throws PMException { + Operation op1 = new Operation<>("op1") { + @Override + public void canExecute(PAP pap, UserContext userCtx, Map operands) throws PMException { + + } + + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + ok.createAdminOperation(op1); + + assertDoesNotThrow(() -> ok.deleteAdminOperation("op1")); + assertEquals( + new EventContext("u1", "", new DeleteAdminOperationOp(), Map.of(NAME_OPERAND, "op1")), + testEventProcessor.getEventContext() + ); + + assertThrows(UnauthorizedException.class, () -> fail.deleteAdminOperation("op1")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicatorTest.java b/src/test/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicatorTest.java new file mode 100644 index 000000000..8aea5da41 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/ProhibitionsModificationAdjudicatorTest.java @@ -0,0 +1,165 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.pap.prohibition.ContainerCondition; +import gov.nist.csd.pm.pap.prohibition.ProhibitionSubject; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.prohibition.CreateProhibitionOp; +import gov.nist.csd.pm.pap.op.prohibition.DeleteProhibitionOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.prohibition.ProhibitionOp.*; +import static org.junit.jupiter.api.Assertions.*; + +class ProhibitionsModificationAdjudicatorTest { + + PAP pap; + PDP pdp; + EPP epp; + + TestEventProcessor testEventProcessor; + ProhibitionsModificationAdjudicator ok; + ProhibitionsModificationAdjudicator fail; + + @BeforeEach + void setup() throws PMException { + pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + create oa "oa1" in ["pc1"] + create oa "oa2" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and "oa2" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + associate "ua1" and "ua2" with ["*a"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + pdp = new PDP(pap); + epp = new EPP(pdp, pap); + + testEventProcessor = new TestEventProcessor(); + pdp.addEventListener(testEventProcessor); + + ok = new ProhibitionsModificationAdjudicator(new UserContext("u1"), pap, pdp); + fail = new ProhibitionsModificationAdjudicator(new UserContext("u2"), pap, pdp); + } + + @Test + void createProhibition() throws PMException { + assertDoesNotThrow(() -> ok.createProhibition( + "pro1", + new ProhibitionSubject("u2", ProhibitionSubject.Type.USER), + new AccessRightSet("assign"), + true, + List.of(new ContainerCondition("oa1", false)) + )); + assertEquals( + new EventContext( + "u1", "", + new CreateProhibitionOp(), + Map.of( + NAME_OPERAND, "pro1", + SUBJECT_OPERAND, new ProhibitionSubject("u2", ProhibitionSubject.Type.USER), + ARSET_OPERAND, new AccessRightSet("assign"), + INTERSECTION_OPERAND, true, + CONTAINERS_OPERAND, List.of(new ContainerCondition("oa1", false)) + ) + ), + testEventProcessor.getEventContext() + ); + + assertTrue(pap.query().prohibitions().getProhibitions().containsKey("u2")); + + assertDoesNotThrow(() -> ok.createProhibition( + "pro2", + new ProhibitionSubject("123", ProhibitionSubject.Type.PROCESS), + new AccessRightSet("assign"), + true, + List.of(new ContainerCondition("oa1", true)) + )); + assertEquals( + new EventContext( + "u1", "", + new CreateProhibitionOp(), + Map.of( + NAME_OPERAND, "pro2", + SUBJECT_OPERAND, new ProhibitionSubject("123", ProhibitionSubject.Type.PROCESS), + ARSET_OPERAND, new AccessRightSet("assign"), + INTERSECTION_OPERAND, true, + CONTAINERS_OPERAND, List.of(new ContainerCondition("oa1", true)) + ) + ), + testEventProcessor.getEventContext() + ); + + assertTrue(pap.query().prohibitions().getProhibitions().containsKey("123")); + + + assertThrows(UnauthorizedException.class, () -> fail.createProhibition( + "pro1", + new ProhibitionSubject("u2", ProhibitionSubject.Type.USER), + new AccessRightSet("assign"), + true, + List.of(new ContainerCondition("oa1", false)) + )); + + assertThrows(UnauthorizedException.class, () -> fail.createProhibition( + "pro1", + new ProhibitionSubject("123", ProhibitionSubject.Type.PROCESS), + new AccessRightSet("assign"), + true, + List.of(new ContainerCondition("oa1", true)) + )); + } + + @Test + void deleteProhibition() throws PMException { + ok.createProhibition( + "pro1", + new ProhibitionSubject("u2", ProhibitionSubject.Type.USER), + new AccessRightSet("assign"), + true, + List.of(new ContainerCondition("oa1", false)) + ); + + assertThrows(UnauthorizedException.class, () -> fail.deleteProhibition("pro1")); + assertDoesNotThrow(() -> ok.deleteProhibition("pro1")); + + assertEquals( + new EventContext( + "u1", "", + new DeleteProhibitionOp(), + Map.of( + NAME_OPERAND, "pro1", + SUBJECT_OPERAND, new ProhibitionSubject("u2", ProhibitionSubject.Type.USER), + ARSET_OPERAND, new AccessRightSet("assign"), + INTERSECTION_OPERAND, true, + CONTAINERS_OPERAND, List.of(new ContainerCondition("oa1", false)) + ) + ), + testEventProcessor.getEventContext() + ); + + assertFalse(pap.query().prohibitions().getProhibitions().containsKey("u2")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicatorTest.java b/src/test/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicatorTest.java new file mode 100644 index 000000000..ddbc1f1d7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/RoutinesModificationAdjudicatorTest.java @@ -0,0 +1,102 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EPP; +import gov.nist.csd.pm.impl.memory.pap.MemoryPAP; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp; +import gov.nist.csd.pm.pap.op.routine.DeleteAdminRoutineOp; +import gov.nist.csd.pm.pap.query.UserContext; +import gov.nist.csd.pm.pap.routine.Routine; +import gov.nist.csd.pm.pdp.PDP; +import gov.nist.csd.pm.pdp.exception.UnauthorizedException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static gov.nist.csd.pm.pap.op.Operation.NAME_OPERAND; +import static gov.nist.csd.pm.pap.op.routine.CreateAdminRoutineOp.ROUTINE_OPERAND; +import static org.junit.jupiter.api.Assertions.*; + +class RoutinesModificationAdjudicatorTest { + + PAP pap; + PDP pdp; + EPP epp; + + TestEventProcessor testEventProcessor; + RoutinesModificationAdjudicator ok; + RoutinesModificationAdjudicator fail; + + + @BeforeEach + void setup() throws PMException { + pap = new MemoryPAP(); + + pap.executePML(new UserContext("u1"), """ + create pc "pc1" + + create ua "ua1" in ["pc1"] + create ua "ua2" in ["pc1"] + + create oa "oa1" in ["pc1"] + + associate "ua1" and "oa1" with ["*a"] + associate "ua1" and ADMIN_POLICY_OBJECT with ["*a"] + + create u "u1" in ["ua1"] + create u "u2" in ["ua2"] + create o "o1" in ["oa1"] + """); + + pdp = new PDP(pap); + epp = new EPP(pdp, pap); + + testEventProcessor = new TestEventProcessor(); + pdp.addEventListener(testEventProcessor); + + ok = new RoutinesModificationAdjudicator(new UserContext("u1"), pap, pdp); + fail = new RoutinesModificationAdjudicator(new UserContext("u2"), pap, pdp); + } + + + @Test + void createAdminRoutine() throws PMException { + Routine routine1 = new Routine<>("routine1", List.of()) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + + assertDoesNotThrow(() -> ok.createAdminRoutine(routine1)); + assertEquals( + new EventContext("u1", "", new CreateAdminRoutineOp(), Map.of(ROUTINE_OPERAND, routine1)), + testEventProcessor.getEventContext() + ); + assertTrue(pap.query().routines().getAdminRoutineNames().contains("routine1")); + assertThrows(UnauthorizedException.class, () -> fail.createAdminRoutine(routine1)); + } + + @Test + void deleteAdminRoutine() throws PMException { + Routine routine1 = new Routine<>("routine1", List.of()) { + @Override + public Void execute(PAP pap, Map operands) throws PMException { + return null; + } + }; + ok.createAdminRoutine(routine1); + + assertDoesNotThrow(() -> ok.deleteAdminRoutine("routine1")); + assertEquals( + new EventContext("u1", "", new DeleteAdminRoutineOp(), Map.of(NAME_OPERAND, "routine1")), + testEventProcessor.getEventContext() + ); + + assertThrows(UnauthorizedException.class, () -> fail.deleteAdminRoutine("routine1")); + } +} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/pdp/modification/TestEventProcessor.java b/src/test/java/gov/nist/csd/pm/pdp/modification/TestEventProcessor.java new file mode 100644 index 000000000..bf8f32b30 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/pdp/modification/TestEventProcessor.java @@ -0,0 +1,19 @@ +package gov.nist.csd.pm.pdp.modification; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.obligation.EventContext; +import gov.nist.csd.pm.epp.EventProcessor; + +public class TestEventProcessor implements EventProcessor { + + private EventContext eventContext; + + public EventContext getEventContext() { + return eventContext; + } + + @Override + public void processEvent(EventContext eventCtx) throws PMException { + this.eventContext = eventCtx; + } +} diff --git a/src/test/java/gov/nist/csd/pm/policy/PolicyEquals.java b/src/test/java/gov/nist/csd/pm/policy/PolicyEquals.java deleted file mode 100644 index 9c1522fcd..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/PolicyEquals.java +++ /dev/null @@ -1,70 +0,0 @@ -package gov.nist.csd.pm.policy; - -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.graph.nodes.Node; -import gov.nist.csd.pm.policy.model.graph.nodes.NodeType; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; - -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class PolicyEquals { - - public static void check(Policy a, Policy b) throws PMException { - assertEquals(a.graph().getResourceAccessRights(), b.graph().getResourceAccessRights()); - - List aNodes = a.graph().search(NodeType.ANY, NO_PROPERTIES); - List bNodes = b.graph().search(NodeType.ANY, NO_PROPERTIES); - assertTrue(aNodes.containsAll(bNodes)); - assertTrue(bNodes.containsAll(aNodes)); - - for (String nodeName : aNodes) { - Node aNode = a.graph().getNode(nodeName); - Node bNode = b.graph().getNode(nodeName); - assertEquals(aNode, bNode); - - List aChildren = a.graph().getChildren(nodeName); - List aParents = a.graph().getParents(nodeName); - - List bChildren = b.graph().getChildren(nodeName); - List bParents = b.graph().getParents(nodeName); - - assertTrue(aChildren.containsAll(bChildren)); - assertTrue(bChildren.containsAll(aChildren)); - assertTrue(aParents.containsAll(bParents)); - assertTrue(bParents.containsAll(aParents)); - - List aSourceAssocs = a.graph().getAssociationsWithSource(nodeName); - List aTargetAssocs = a.graph().getAssociationsWithTarget(nodeName); - - List bSourceAssocs = b.graph().getAssociationsWithSource(nodeName); - List bTargetAssocs = b.graph().getAssociationsWithTarget(nodeName); - - assertTrue(aSourceAssocs.containsAll(bSourceAssocs)); - assertTrue(bSourceAssocs.containsAll(aSourceAssocs)); - assertTrue(aTargetAssocs.containsAll(bTargetAssocs)); - assertTrue(bTargetAssocs.containsAll(aTargetAssocs)); - } - - // check prohibitions - Map> aProhibitions = a.prohibitions().getAll(); - Map> bProhibitions = a.prohibitions().getAll(); - - assertTrue(aProhibitions.keySet().containsAll(bProhibitions.keySet())); - assertTrue(aProhibitions.values().containsAll(bProhibitions.values())); - - // check obligations - List aObligations = a.obligations().getAll(); - List bObligations = b.obligations().getAll(); - - assertTrue(aObligations.containsAll(bObligations)); - assertTrue(bObligations.containsAll(aObligations)); - } - -} diff --git a/src/test/java/gov/nist/csd/pm/policy/events/PolicyEventHandlerTest.java b/src/test/java/gov/nist/csd/pm/policy/events/PolicyEventHandlerTest.java deleted file mode 100644 index eee38d159..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/events/PolicyEventHandlerTest.java +++ /dev/null @@ -1,202 +0,0 @@ -package gov.nist.csd.pm.policy.events; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -class PolicyEventHandlerTest { - - @Test - void testPolicyEventHandler() throws PMException { - TestPolicyEventHandler handler = new TestPolicyEventHandler(); - - handler.handle(new AddConstantEvent("", new Value())); - handler.handle(new AddFunctionEvent(new FunctionDefinitionStatement(null, null, null, List.of()))); - handler.handle(new AssignEvent("", "")); - handler.handle(new AssignToEvent("", "")); - handler.handle(new AssociateEvent("", "", new AccessRightSet())); - handler.handle(new BeginTxEvent()); - handler.handle(new CommitTxEvent()); - handler.handle(new CreateObjectAttributeEvent("", null, null, null)); - handler.handle(new CreateObjectEvent(null, null, null, null)); - handler.handle(new CreateObligationEvent(null, null, null)); - handler.handle(new CreatePolicyClassEvent(null, null)); - handler.handle(new CreateProhibitionEvent(null, null, null, false, null)); - handler.handle(new CreateUserAttributeEvent(null, null, null)); - handler.handle(new CreateUserEvent(null, null, null)); - handler.handle(new DeassignEvent("", "")); - handler.handle(new DeassignFromEvent("", "")); - handler.handle(new DeleteNodeEvent("")); - handler.handle(new DeleteObligationEvent(new Obligation(new UserContext(""), ""))); - handler.handle(new DeleteProhibitionEvent(null)); - handler.handle(new DissociateEvent("", "")); - handler.handle(new PolicySynchronizationEvent(null)); - handler.handle(new RemoveConstantEvent(null)); - handler.handle(new RemoveFunctionEvent(null)); - handler.handle(new RollbackTxEvent(null)); - handler.handle(new SetNodePropertiesEvent(null, null)); - handler.handle(new SetResourceAccessRightsEvent(null)); - handler.handle(new UpdateObligationEvent(null, null, null)); - handler.handle(new UpdateProhibitionEvent(null, null, null, false, null)); - - assertEquals(28, handler.count); - } - - class TestPolicyEventHandler extends PolicyEventHandler { - int count = 0; - TestPolicyEventHandler() {} - @Override - public void handleAddConstantEvent(AddConstantEvent e) { - count++; - } - - @Override - public void handleAddFunctionEvent(AddFunctionEvent e) { - count++; - } - - @Override - public void handleAssignEvent(AssignEvent e) { - count++; - } - - @Override - public void handleAssignToEvent(AssignToEvent e) { - count++; - } - - @Override - public void handleAssociateEvent(AssociateEvent e) { - count++; - } - - @Override - public void handleBeginTxEvent(BeginTxEvent e) { - count++; - } - - @Override - public void handleCommitTxEvent(CommitTxEvent e) { - count++; - } - - @Override - public void handleCreateNodeEvent(CreateNodeEvent e) { - count++; - } - - @Override - public void handleCreateObjectAttributeEvent(CreateObjectAttributeEvent e) { - count++; - } - - @Override - public void handleCreateObjectEvent(CreateObjectEvent e) { - count++; - } - - @Override - public void handleCreateObligationEvent(CreateObligationEvent e) { - count++; - } - - @Override - public void handleCreatePolicyClassEvent(CreatePolicyClassEvent e) { - count++; - } - - @Override - public void handleCreateProhibitionEvent(CreateProhibitionEvent e) { - count++; - } - - @Override - public void handleCreateUserAttributeEvent(CreateUserAttributeEvent e) { - count++; - } - - @Override - public void handleCreateUserEvent(CreateUserEvent e) { - count++; - } - - @Override - public void handleDeassignEvent(DeassignEvent e) { - count++; - } - - @Override - public void handleDeassignFromEvent(DeassignFromEvent e) { - count++; - } - - @Override - public void handleDeleteNodeEvent(DeleteNodeEvent e) { - count++; - } - - @Override - public void handleDeleteObligationEvent(DeleteObligationEvent e) { - count++; - } - - @Override - public void handleDeleteProhibitionEvent(DeleteProhibitionEvent e) { - count++; - } - - @Override - public void handleDissociateEvent(DissociateEvent e) { - count++; - } - - @Override - public void handlePolicySyncEvent(PolicySynchronizationEvent e) { - count++; - } - - @Override - public void handleRemoveConstantEvent(RemoveConstantEvent e) { - count++; - } - - @Override - public void handleRemoveFunctionEvent(RemoveFunctionEvent e) { - count++; - } - - @Override - public void handleRollbackTxEvent(RollbackTxEvent e) { - count++; - } - - @Override - public void handleSetNodePropertiesEvent(SetNodePropertiesEvent e) { - count++; - } - - @Override - public void handleSetResourceAccessRightsEvent(SetResourceAccessRightsEvent e) { - count++; - } - - @Override - public void handleUpdateObligationEvent(UpdateObligationEvent e) { - count++; - } - - @Override - public void handleUpdateProhibitionEvent(UpdateProhibitionEvent e) { - count++; - } - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/model/obligation/ResponseTest.java b/src/test/java/gov/nist/csd/pm/policy/model/obligation/ResponseTest.java deleted file mode 100644 index dfea030b9..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/model/obligation/ResponseTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package gov.nist.csd.pm.policy.model.obligation; - -import gov.nist.csd.pm.epp.EPP; -import gov.nist.csd.pm.epp.EventContext; -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.PDP; -import gov.nist.csd.pm.pdp.memory.MemoryPDP; -import gov.nist.csd.pm.policy.events.AssignToEvent; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import org.junit.jupiter.api.Test; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -class ResponseTest { - - @Test - void testResponseExecutionWithUserDefinedAndBuiltinPML() throws PMException { - String pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - const x = "hello world" - function createX() { - create policy class x - } - - create obligation 'obl1' { - create rule 'rule1' - when any user - performs ['assign_to'] - on 'oa1' - do(ctx) { - createX() - } - } - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - MemoryPDP pdp = new MemoryPDP(pap, false); - EPP epp = new EPP(pdp, pap); - epp.handlePolicyEvent(new EventContext(new UserContext("u1"), "oa1", new AssignToEvent("o1", "oa1"))); - assertTrue(pap.graph().nodeExists("hello world")); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/CompileTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/CompileTest.java deleted file mode 100644 index 1160b499e..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/CompileTest.java +++ /dev/null @@ -1,463 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.Policy; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.pml.model.context.ExecutionContext; -import gov.nist.csd.pm.policy.pml.model.exception.PMLCompilationException; -import gov.nist.csd.pm.policy.pml.model.expression.*; -import gov.nist.csd.pm.policy.pml.model.scope.UnknownVariableInScopeException; -import gov.nist.csd.pm.policy.pml.statement.*; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -class CompileTest { - - @Test - void testCompileLet() throws PMException { - String pml = """ - let a = 'hello world' - let b = ['hello', 'world'] - let c = { - '1': '2', - '3': '4' - } - let d = {'1': '2', a: b} - let e = true - let f = c['1'] - let g = concat([f, ' ', a]) - let h = [] - """; - List stmts = test(pml, new PAP(new MemoryPolicyStore())); - VarStatement stmt = (VarStatement) stmts.get(0); - assertEquals("a", stmt.getVarName()); - Assertions.assertEquals("hello world", stmt.getExpression().getLiteral().getStringLiteral()); - - stmt = (VarStatement) stmts.get(1); - assertEquals("b", stmt.getVarName()); - Assertions.assertEquals(Type.array(Type.string()), stmt.getExpression().getLiteral().getArrayLiteral().getType()); - Assertions.assertArrayEquals(new Expression[]{ - new Expression(new Literal("hello")), - new Expression(new Literal("world")) - }, stmt.getExpression().getLiteral().getArrayLiteral().getArray()); - - stmt = (VarStatement) stmts.get(2); - assertEquals("c", stmt.getVarName()); - MapLiteral mapLiteral = stmt.getExpression().getLiteral().getMapLiteral(); - assertEquals(Type.map(Type.string(), Type.string()), mapLiteral.getType()); - Map actual = mapLiteral.getMap(); - - Expression k1 = new Expression(new Literal("1")); - Expression v1 = new Expression(new Literal("2")); - Expression k2 = new Expression(new Literal("3")); - Expression v2 = new Expression(new Literal("4")); - - Map expected = Map.of( - k1, v1, - k2, v2 - ); - assertEquals(2, actual.size()); - assertEquals(expected.get(k1), v1); - assertEquals(expected.get(k2), v2); - assertEquals(Type.map(Type.string(), Type.string()), mapLiteral.getType()); - - stmt = (VarStatement) stmts.get(3); - assertEquals("d", stmt.getVarName()); - mapLiteral = stmt.getExpression().getLiteral().getMapLiteral(); - assertEquals(Type.map(Type.string(), Type.any()), mapLiteral.getType()); - actual = mapLiteral.getMap(); - - k1 = new Expression(new Literal("1")); - v1 = new Expression(new Literal("2")); - k2 = new Expression(new VariableReference("a", Type.string())); - v2 = new Expression(new VariableReference("b", Type.array(Type.string()))); - - expected = Map.of( - k1, v1, - k2, v2 - ); - assertEquals(2, actual.size()); - assertEquals(expected.get(k1), v1); - assertEquals(expected.get(k2), v2); - assertEquals(Type.map(Type.string(), Type.any()), mapLiteral.getType()); - - stmt = (VarStatement) stmts.get(4); - assertEquals("e", stmt.getVarName()); - Assertions.assertTrue(stmt.getExpression().getLiteral().getBooleanLiteral()); - - stmt = (VarStatement) stmts.get(5); - assertEquals("f", stmt.getVarName()); - Assertions.assertEquals("c", stmt.getExpression().getVariableReference().getEntryReference().getVarRef().getID()); - Assertions.assertEquals(k1, stmt.getExpression().getVariableReference().getEntryReference().getKey()); - - stmt = (VarStatement) stmts.get(6); - assertEquals("g", stmt.getVarName()); - Expression expectedExpression = new Expression(new FunctionInvocationStatement("concat", Arrays.asList( - new Expression(new Literal(new ArrayLiteral( - new Expression[]{ - new Expression(new VariableReference("f", Type.string())), - new Expression(new Literal(" ")), - new Expression(new VariableReference("a", Type.string())) - }, - Type.string() - ))) - ))); - assertEquals(expectedExpression.toString(), stmt.getExpression().toString()); - - - stmt = (VarStatement) stmts.get(7); - assertEquals("h", stmt.getVarName()); - expectedExpression = new Expression(new Literal(new ArrayLiteral(Type.array(Type.any())))); - assertEquals(expectedExpression.toString(), stmt.getExpression().toString()); - Assertions.assertEquals(Type.any(), stmt.getExpression().getLiteral().getArrayLiteral().getType()); - } - - @Test - void testCompileErrors() { - String pml = """ - let a = concat('1') - let b = a['a'] - let c = {'a': 'b'} - let d = c[true] - let e = {'': '', ['']: {'': ''}, true: ''} - let a = b - a = b - """; - PMLCompilationException ex = assertThrows(PMLCompilationException.class, () -> test(pml, new PAP(new MemoryPolicyStore()))); - assertEquals(5, ex.getErrors().size(), ex.getErrors().toString()); - Assertions.assertTrue(ex.getErrors().get(0).errorMessage().contains("expected []string, got string")); - Assertions.assertTrue(ex.getErrors().get(1).errorMessage().contains("expected map or array type")); - Assertions.assertTrue(ex.getErrors().get(2).errorMessage().contains("expression type boolean not allowed, only: [string]")); - Assertions.assertTrue(ex.getErrors().get(3).errorMessage().contains("expected map keys to be of the same type but found")); - Assertions.assertTrue(ex.getErrors().get(4).errorMessage().contains("expected map keys to be of the same type but found")); - } - - @Test - void testConstErrors() { - String pml = """ - const a = 'hello world' - const a = 'test' - a = 'test' - """; - PMLCompilationException ex = assertThrows(PMLCompilationException.class, () -> test(pml, new PAP(new MemoryPolicyStore()))); - assertEquals(2, ex.getErrors().size(), ex.getErrors().toString()); - Assertions.assertTrue(ex.getErrors().get(0).errorMessage().contains("already defined")); - Assertions.assertTrue(ex.getErrors().get(1).errorMessage().contains("cannot reassign")); - } - - @Test - void testForeachCompileErrors() { - String pml = """ - foreach x, y in ['', ''] { - - } - """; - PMLCompilationException ex = assertThrows(PMLCompilationException.class, () -> test(pml, new PAP(new MemoryPolicyStore()))); - assertEquals(1, ex.getErrors().size()); - - String pml1 = """ - foreach x, y in {'k': 'v', 'k1': 'v1'} { - - } - """; - assertDoesNotThrow(() -> test(pml1, new PAP(new MemoryPolicyStore()))); - } - - @Test - void testForRangeCompileErrors() throws PMException { - String pml = """ - for i in range [1, 5] { - create policy class i - } - """; - PMLCompilationException ex = assertThrows(PMLCompilationException.class, () -> test(pml, new PAP(new MemoryPolicyStore()))); - assertEquals(1, ex.getErrors().size()); - Assertions.assertTrue(ex.getErrors().get(0).errorMessage().contains("number not allowed, only: [string]")); - } - - private List test(String pml, Policy policyAuthor) throws PMException { - return PMLCompiler.compilePML(policyAuthor, pml); - } - - @Test - void testMaps() { - String pml = """ - let m = {'k1': {'k2': 'v1'}} - let x = m['k1']['k2']['k3'] - """; - PMLCompilationException ex = assertThrows(PMLCompilationException.class, () -> test(pml, new PAP(new MemoryPolicyStore()))); - assertEquals(1, ex.getErrors().size()); - Assertions.assertTrue(ex.getErrors().get(0).errorMessage().contains("expected map or array type")); - - String pml1 = """ - let m = {'k1': {'k2': 'v1'}} - create policy class m['k1'] - """; - ex = assertThrows(PMLCompilationException.class, () -> test(pml1, new PAP(new MemoryPolicyStore()))); - assertEquals(1, ex.getErrors().size()); - Assertions.assertTrue(ex.getErrors().get(0).errorMessage().contains("expression type map[string]string not allowed, only: [string]")); - } - - @Test - void testMapsSuccess() throws PMException, UnknownVariableInScopeException { - String pml = """ - let m = {'k1': {'k1-1': {'k1-1-1': 'v1'}}} - let x = m['k1']['k1-1']['k1-1-1'] - create policy class x - """; - PAP pap = new PAP(new MemoryPolicyStore()); - List test = test(pml, new PAP(new MemoryPolicyStore())); - - ExecutionContext ctx = new ExecutionContext(new UserContext(SUPER_USER)); - PMLStatement stmt = test.get(0); - stmt.execute(ctx, pap); - Value m = ctx.scope().getValue("m"); - assertTrue(m.isMap()); - assertEquals(Type.string(), m.getType().getMapKeyType()); - assertEquals(Type.map(Type.string(), Type.map(Type.string(), Type.map(Type.string(), Type.string()))), m.getType()); - - stmt = test.get(1); - stmt.execute(ctx, pap); - Value x = ctx.scope().getValue("x"); - assertEquals(Type.string(), x.getType()); - assertEquals("v1", x.getStringValue()); - - stmt = test.get(2); - stmt.execute(ctx, pap); - } - - @Test - void testCompileObligation() throws PMException { - String pml = """ - create obligation 'test' { - create rule 'rule1' - when any user - performs ['create_object_attribute'] - on 'oa1' - do(event) { - create policy class event['eventName'] - let target = event['target'] - - create policy class concat([event['name'], '_test']) - set properties of event['event']['name'] to {'key': target} - - create policy class concat([event['userCtx']['user'], '_test']) - } - } - """; - - UserContext userCtx = new UserContext(SUPER_USER); - PAP pap = new PAP(new MemoryPolicyStore()); - ExecutionContext ctx = new ExecutionContext(userCtx); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - List test = test(pml, pap); - assertEquals(1, test.size()); - - PMLStatement stmt = test.get(0); - stmt.execute(ctx, pap); - - assertEquals(1, pap.obligations().getAll().size()); - Obligation actual = pap.obligations().get("test"); - assertEquals(1, actual.getRules().size()); - assertEquals("test", actual.getLabel()); - assertEquals(userCtx, actual.getAuthor()); - - Rule rule = actual.getRules().get(0); - assertEquals("rule1", rule.getLabel()); - - EventPattern event = rule.getEventPattern(); - assertEquals(EventSubject.anyUser(), event.getSubject()); - assertTrue(event.getOperations().contains("create_object_attribute")); - assertEquals(Target.policyElement("oa1"), event.getTarget()); - - Response response = rule.getResponse(); - - List statements = response.getStatements(); - assertEquals(5, statements.size()); - - stmt = statements.get(0); - - Type evtCtxType = Type.map(Type.string(), Type.any()); - PMLStatement expected = new CreatePolicyStatement( - new Expression( - new VariableReference( - new EntryReference( - new VariableReference("event", evtCtxType), new Expression(new Literal("eventName")) - ), - Type.any() - ) - ) - ); - assertEquals(expected, stmt); - - stmt = statements.get(1); - expected = new VarStatement( - "target", - new Expression( - new VariableReference( - new EntryReference( - new VariableReference("event", evtCtxType), new Expression(new Literal("target")) - ), - Type.any() - ) - ), - false); - assertEquals(expected, stmt); - - stmt = statements.get(2); - expected = new CreatePolicyStatement( - new Expression( - new FunctionInvocationStatement( - "concat", - Arrays.asList(new Expression(new Literal(new ArrayLiteral( - new Expression[]{ - new Expression(new VariableReference(new EntryReference(new VariableReference("event", Type.any()), new Expression(new Literal("name"))), Type.any())), - new Expression(new Literal("_test")) - }, - Type.string() - ))))) - ) - ); - assertEquals(expected, stmt); - - stmt = statements.get(3); - HashMap exprMap = new HashMap<>(); - exprMap.put(new Expression(new Literal("key")), new Expression(new VariableReference("target", Type.any()))); - expected = new SetNodePropertiesStatement( - new Expression( - new VariableReference( - new EntryReference( - new VariableReference( - new EntryReference( - new VariableReference("event", Type.any()), - new Expression(new Literal("event")) - ), - Type.any() - ), - new Expression(new Literal("name")) - ), - Type.any() - ) - ), - new Expression(new Literal(new MapLiteral(exprMap, Type.string(), Type.any()))) - ); - assertEquals(expected, stmt); - - stmt = statements.get(4); - expected = new CreatePolicyStatement( - new Expression( - new FunctionInvocationStatement( - "concat", - Arrays.asList(new Expression(new Literal(new ArrayLiteral( - new Expression[]{ - new Expression( - new VariableReference( - new EntryReference( - new VariableReference( - new EntryReference( - new VariableReference("event", Type.any()), - new Expression(new Literal("userCtx")) - ), - Type.any() - ), - new Expression(new Literal("user")) - ), - Type.any() - ) - ), - new Expression(new Literal("_test")), - }, - Type.any() - ))))) - ) - ); - assertEquals(expected, stmt); - } - - @Test - void testScopeOrder() { - String pml = """ - let x = 'hello' - create policy class concat([x, ' ', y]) - let y = 'world' - """; - assertThrows(PMLCompilationException.class, () -> PMLCompiler.compilePML(new PAP(new MemoryPolicyStore()), pml)); - } - - @Test - void testEmptyMap() { - String pml = """ - function testFunc(map[string]string m) { - - } - - testFunc({}) - """; - assertDoesNotThrow(() -> PMLCompiler.compilePML(new PAP(new MemoryPolicyStore()), pml)); - } - - @Test - void testForLoopLocalVar() throws PMException { - String pml = """ - for i in range [1, 100] { - let x = i - create pc numToStr(x) - } - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - assertEquals(101, pap.graph().getPolicyClasses().size()); - - String pml2 = """ - for i in range [1, 100] { - let x = i - create pc numToStr(x) - } - - create oa 'oa1' in x - """; - PAP pap2 = new PAP(new MemoryPolicyStore()); - assertThrows(PMLCompilationException.class, () -> pap2.deserialize().fromPML(new UserContext(SUPER_USER), pml2)); - - pml = """ - create pc 'pc1' - create oa 'oa1' in ['pc1'] - foreach child in getChildren('pc1') { - let x = 'pc2' - create pc x - } - """; - pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml); - assertTrue(pap.graph().nodeExists("pc2")); - - String pml3 = """ - foreach child in getChildren('pc1') { - let x = 'pc2' - create pc x - } - - create oa 'oa1' in x - """; - PAP pap3 = new PAP(new MemoryPolicyStore()); - assertThrows(PMLCompilationException.class, () -> pap3.deserialize().fromPML(new UserContext(SUPER_USER), pml3)); - - } -} diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/ExecutionTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/ExecutionTest.java deleted file mode 100644 index 4576d18bd..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/ExecutionTest.java +++ /dev/null @@ -1,467 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.graph.relationships.Association; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.pap.PAP; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -public class ExecutionTest { - - static UserContext superUser = new UserContext(SUPER_USER); - - @Test - void testGraphPML() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - - String input = - """ - set resource access rights ['read', 'write'] - - create policy class 'pc1' - - set properties of 'pc1' to {'k': 'v'} - - create object attribute 'oa1' in ['pc1'] - create object attribute 'oa2' in ['pc1'] - create object attribute 'oa3' in ['pc1'] - - let parents = ['oa1', 'oa2', 'oa3'] - create object 'o1' in parents - - create user attribute 'ua1' in ['pc1'] - create user attribute 'ua2' in ['pc1'] - create user attribute 'ua3' in ['pc1'] - - let username = 'u1' - create user username in ['ua1'] - assign username to ['ua2', 'ua3'] - - associate 'ua1' and 'oa1' with ['read', 'write'] - associate 'ua2' and 'oa2' with ['read', 'write'] - associate 'ua3' and 'oa3' with ['read', 'write'] - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("oa1")); - assertTrue(pap.graph().nodeExists("oa2")); - assertTrue(pap.graph().nodeExists("oa3")); - assertTrue(pap.graph().nodeExists("ua1")); - assertTrue(pap.graph().nodeExists("ua2")); - assertTrue(pap.graph().nodeExists("ua3")); - assertTrue(pap.graph().nodeExists("o1")); - assertTrue(pap.graph().nodeExists("u1")); - - assertEquals("v", pap.graph().getNode("pc1").getProperties().get("k")); - - List children = pap.graph().getChildren("pc1"); - assertTrue(children.containsAll(Arrays.asList("ua1", "ua2", "ua3"))); - children = pap.graph().getChildren("pc1"); - assertTrue(children.containsAll(Arrays.asList("oa1", "oa2", "oa3"))); - - assertTrue(pap.graph().getParents("ua1").contains("pc1")); - assertTrue(pap.graph().getParents("ua2").contains("pc1")); - assertTrue(pap.graph().getParents("ua3").contains("pc1")); - assertTrue(pap.graph().getParents("oa1").contains("pc1")); - assertTrue(pap.graph().getParents("oa2").contains("pc1")); - assertTrue(pap.graph().getParents("oa3").contains("pc1")); - assertTrue(pap.graph().getParents("u1").containsAll(Arrays.asList("ua1", "ua2", "ua3"))); - assertTrue(pap.graph().getParents("o1").containsAll(Arrays.asList("oa1", "oa2", "oa3"))); - - assertEquals(new Association("ua1", "oa1", new AccessRightSet("read", "write")), - pap.graph().getAssociationsWithSource("ua1").get(0)); - assertEquals(new Association("ua2", "oa2", new AccessRightSet("read", "write")), - pap.graph().getAssociationsWithSource("ua2").get(0)); - assertEquals(new Association("ua3", "oa3", new AccessRightSet("read", "write")), - pap.graph().getAssociationsWithSource("ua3").get(0)); - - input = - """ - deassign 'u1' from ['ua1', 'ua2'] - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().getParents("u1").containsAll(Arrays.asList("ua1", "ua2"))); - assertFalse(pap.graph().getChildren("ua1").contains("u1")); - assertFalse(pap.graph().getChildren("ua2").contains("u1")); - - input = - """ - delete user 'u1' - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().nodeExists("u1")); - - input = - """ - deassign 'o1' from ['oa1'] - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().getParents("oa1").contains("oa1")); - assertFalse(pap.graph().getChildren("oa1").contains("o1")); - - input = - """ - delete object 'o1' - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().nodeExists("o1")); - - input = - """ - delete user attribute 'ua1' - delete user attribute 'ua2' - delete user attribute 'ua3' - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().nodeExists("ua1")); - assertFalse(pap.graph().nodeExists("ua2")); - assertFalse(pap.graph().nodeExists("ua3")); - - - input = - """ - delete object attribute 'oa1' - delete object attribute 'oa2' - delete object attribute 'oa3' - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().nodeExists("oa1")); - assertFalse(pap.graph().nodeExists("oa2")); - assertFalse(pap.graph().nodeExists("oa3")); - - input = - """ - delete policy class 'pc1' - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertFalse(pap.graph().nodeExists("pc1")); - } - - @Test - void testIf() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - String input = """ - let x = 'test' - let y = 'test' - if equals(x, y) { - create policy class 'pc1' - } - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertTrue(pap.graph().nodeExists("pc1")); - - input = """ - let x = 'test' - let y = 'test' - let z = 'test1' - if equals(x, z) { - create policy class 'pc1' - } else if equals(x, y) { - create policy class 'pc2' - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertFalse(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - - input = """ - let x = 'test' - let y = 'test1' - let z = 'test2' - if equals(x, z) { - create policy class 'pc1' - } else if equals(x, y) { - create policy class 'pc2' - } else { - create policy class 'pc3' - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertFalse(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - - input = """ - let x = 'test' - let y = 'test1' - let z = 'test2' - if equals(x, y) { - create policy class 'pc1' - } else { - create policy class 'pc2' - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertFalse(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - - input = """ - let x = 'test' - let y = 'test1' - let z = 'test2' - if !equals(x, y) { - create policy class 'pc1' - } else { - create policy class 'pc2' - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists("pc2")); - } - - @Test - void testForeach() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - String input = """ - foreach x in ['pc1', 'pc2', 'pc3'] { - create policy class x - } - """; - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - - input = """ - let m = {'k1': 'pc1', 'k2': 'pc2', 'k3': 'pc3'} - foreach x in m { - create policy class m[x] - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - - input = """ - foreach x, y in {'k1': ['pc1', 'pc2'], 'k2': ['pc3']} { - foreach z in y { - create policy class z - } - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - - input = """ - foreach x, y in {'k1': ['pc1', 'pc2'], 'k2': ['pc3']} { - foreach z in y { - create policy class z - break - } - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - - input = """ - foreach x, y in {'k1': ['pc1', 'pc2'], 'k2': ['pc3']} { - foreach z in y { - continue - create policy class z - } - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertFalse(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists("pc2")); - assertFalse(pap.graph().nodeExists("pc3")); - - input = """ - let a = 'test' - let b = 'test' - foreach x in ['pc1', 'pc2', 'pc3'] { - if equals(a, b) { - a = 'test2' - continue - } - - create policy class x - } - """; - pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertFalse(pap.graph().nodeExists("pc1")); - assertTrue(pap.graph().nodeExists("pc2")); - assertTrue(pap.graph().nodeExists("pc3")); - } - - @Test - void testForRange() throws PMException { - String input = """ - for i in range [1, 5] { - create policy class numToStr(i) - } - """; - PAP pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertEquals(6, pap.graph().getPolicyClasses().size()); - assertTrue(pap.graph().getPolicyClasses().containsAll(List.of("1", "2", "3", "4", "5"))); - } - - @Test - void testFunction() throws PMException { - String input = """ - function testFunc(any x) { - create policy class x - } - - testFunc('pc1') - """; - PAP pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - - assertTrue(pap.graph().nodeExists("pc1")); - - String input1 = """ - function testFunc(any x) { - create policy class x - } - - testFunc(['pc1']) - """; - PAP pap1 = new PAP(new MemoryPolicyStore()); - assertThrows(IllegalStateException.class, () -> PMLExecutor.compileAndExecutePML(pap1, superUser, input1)); - - input = """ - let x = 'hello' - function testFunc() { - x = concat([x, ' world']) - create policy class x - } - - testFunc() - """; - PMLExecutor.compileAndExecutePML(pap1, superUser, input); - assertTrue(pap1.graph().nodeExists("hello world")); - } - - @Test - void testChangeVariableValue() throws PMException { - String input = """ - let a = 'hello world' - const b = a - create policy class b - """; - PAP pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertTrue(pap.graph().nodeExists("hello world")); - - PAP pap1 = new PAP(new MemoryPolicyStore()); - String input1 = """ - let a = 'hello world' - const b = a - a = 'test' - create policy class b - """; - PMLExecutor.compileAndExecutePML(pap1, superUser, input1); - assertFalse(pap.graph().nodeExists("test")); - } - - @Test - void testMaps() throws PMException { - String input = """ - let m = {'k1': {'k1-1': {'k1-1-1': 'v1'}}} - let x = m['k1']['k1-1']['k1-1-1'] - create policy class x - """; - PAP pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertTrue(pap.graph().getPolicyClasses().contains("v1")); - } - - @Test - void testArrayWithLiteral() throws PMException { - String input = """ - set resource access rights ["read", "write"] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - PMLExecutor.compileAndExecutePML(pap, superUser, input); - assertTrue(pap.graph().getResourceAccessRights().contains("read")); - - String input1 = """ - set resource access rights [["read", "write"], ["exec"]] - """; - assertThrows(PMException.class, () -> PMLExecutor.compileAndExecutePML(pap, superUser, input1)); - } - - @Test - void testDeleteNonExistentNode() throws PMException { - String input = """ - delete pc 'pc1' - """; - PAP pap = new PAP(new MemoryPolicyStore()); - assertDoesNotThrow(() -> PMLExecutor.compileAndExecutePML(pap, superUser, input)); - } - - @Test - void testDeleteProhibition() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - pap.graph().setResourceAccessRights(new AccessRightSet("read")); - pap.graph().createPolicyClass("pc1"); - pap.graph().createUserAttribute("ua1", "pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - String input = """ - create prohibition 'p1' - deny user attribute "ua1" - access rights ["read"] - on union of ["oa1"] - """; - pap.executePML(superUser, input); - - input = """ - delete prohibition 'p1' - """; - pap.executePML(superUser, input); - assertFalse(pap.prohibitions().getAll().containsKey("p1")); - } - - @Test - void testArrayGetByIndex() throws PMException { - String s = """ - let x = ["1", "2", "3"] - create pc x[1] - - let y = [["1", "2", "3"]] - create pc y[0][0] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.executePML(new UserContext(SUPER_USER), s); - assertTrue(pap.graph().nodeExists("2")); - assertTrue(pap.graph().nodeExists("1")); - } -} diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/ObligationTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/ObligationTest.java deleted file mode 100644 index def89732f..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/ObligationTest.java +++ /dev/null @@ -1,213 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.obligation.Obligation; -import gov.nist.csd.pm.policy.model.obligation.Response; -import gov.nist.csd.pm.policy.model.obligation.Rule; -import gov.nist.csd.pm.policy.model.obligation.event.EventPattern; -import gov.nist.csd.pm.policy.model.obligation.event.EventSubject; -import gov.nist.csd.pm.policy.model.obligation.event.Performs; -import gov.nist.csd.pm.policy.model.obligation.event.Target; -import gov.nist.csd.pm.policy.pml.model.expression.*; -import gov.nist.csd.pm.policy.pml.statement.*; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class ObligationTest { - - @Test - void testObligation() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - pap.graph().createPolicyClass("pc1"); - pap.graph().createObjectAttribute("oa1", "pc1"); - - String input = """ - create policy class 'pc1' - create oa 'oa1' in ['pc1'] - create obligation 'obligation1' { - create rule 'rule1' - when any user - performs ['test_event'] - on 'oa1' - do(evtCtx) { - create policy class evtCtx['eventName'] - - delete rule 'rule1' from obligation 'obligation1' - } - } - """; - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - - Obligation obligation1 = pap.obligations().get("obligation1"); - assertEquals("obligation1", obligation1.getLabel()); - assertEquals(1, obligation1.getRules().size()); - assertEquals(new UserContext(SUPER_USER), obligation1.getAuthor()); - - Rule rule = obligation1.getRules().get(0); - assertEquals("rule1", rule.getLabel()); - assertEquals(new EventPattern( - EventSubject.anyUser(), - Performs.events("test_event"), - Target.policyElement("oa1") - ), rule.getEventPattern()); - assertEquals(2, rule.getResponse().getStatements().size()); - } - - @Test - void testObligationComplex() throws PMException { - String pml = """ - create policy class 'pc1'; - create oa 'oa1' in ['pc1']; - - create obligation 'test' { - create rule 'rule1' - when any user - performs ['create_object_attribute'] - on 'oa1' - do(evtCtx) { - create policy class evtCtx['eventName']; - let target = evtCtx['target']; - - let event = evtCtx['event']; - create policy class concat([event['name'], '_test']); - set properties of event['name'] to {'key': target}; - - create policy class concat([evtCtx['userCtx']['user'], '_test']); - } - } - """; - - UserContext userCtx = new UserContext(SUPER_USER); - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(userCtx, pml); - - assertEquals(1, pap.obligations().getAll().size()); - Obligation actual = pap.obligations().get("test"); - assertEquals(1, actual.getRules().size()); - assertEquals("test", actual.getLabel()); - assertEquals(userCtx, actual.getAuthor()); - - Rule rule = actual.getRules().get(0); - assertEquals("rule1", rule.getLabel()); - - EventPattern event = rule.getEventPattern(); - assertEquals(EventSubject.anyUser(), event.getSubject()); - assertTrue(event.getOperations().contains("create_object_attribute")); - assertEquals(Target.policyElement("oa1"), event.getTarget()); - - Response response = rule.getResponse(); - assertEquals("evtCtx", response.getEventCtxVariable()); - - List statements = response.getStatements(); - assertEquals(6, statements.size()); - - PMLStatement stmt = statements.get(0); - Type evtCtxType = Type.map(Type.string(), Type.any()); - PMLStatement expected = new CreatePolicyStatement( - new Expression( - new VariableReference( - new EntryReference( - new VariableReference("evtCtx", evtCtxType), new Expression(new Literal("eventName")) - ), - Type.any() - ) - ) - ); - assertEquals(expected, stmt); - - stmt = statements.get(1); - expected = new VarStatement( - "target", - new Expression( - new VariableReference( - new EntryReference( - new VariableReference("evtCtx", evtCtxType), new Expression(new Literal("target")) - ), - Type.any() - ) - ), - false); - assertEquals(expected, stmt); - - stmt = statements.get(2); - expected = new VarStatement( - "event", - new Expression( - new VariableReference( - new EntryReference( - new VariableReference("evtCtx", evtCtxType), new Expression(new Literal("event")) - ), - Type.any() - ) - ), - false); - assertEquals(expected, stmt); - - stmt = statements.get(3); - expected = new CreatePolicyStatement( - new Expression( - new FunctionInvocationStatement( - "concat", - Arrays.asList(new Expression(new Literal(new ArrayLiteral( - new Expression[]{ - new Expression(new VariableReference(new EntryReference(new VariableReference("event", Type.any()), new Expression(new Literal("name"))), Type.any())), - new Expression(new Literal("_test")) - }, - Type.string() - ))))) - ) - ); - assertEquals(expected, stmt); - - stmt = statements.get(4); - HashMap exprMap = new HashMap<>(); - exprMap.put(new Expression(new Literal("key")), new Expression(new VariableReference("target", Type.any()))); - expected = new SetNodePropertiesStatement( - new Expression(new VariableReference(new EntryReference(new VariableReference("event", Type.any()), new Expression(new Literal("name"))), Type.any())), - new Expression(new Literal(new MapLiteral(exprMap, Type.string(), Type.any()))) - ); - assertEquals(expected, stmt); - - stmt = statements.get(5); - expected = new CreatePolicyStatement( - new Expression( - new FunctionInvocationStatement( - "concat", - Arrays.asList(new Expression(new Literal(new ArrayLiteral( - new Expression[]{ - new Expression( - new VariableReference( - new EntryReference( - new VariableReference( - new EntryReference( - new VariableReference("evtCtx", Type.map(Type.string(), Type.any())), - new Expression(new Literal("userCtx")) - ), - Type.any() - ), - new Expression(new Literal("user")) - ), - Type.any() - ) - ), - new Expression(new Literal("_test")) - }, - Type.any() - ))))) - ) - ); - assertEquals(expected, stmt); - } - - -} diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/PMLExecutorTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/PMLExecutorTest.java deleted file mode 100644 index 8d5a406a5..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/PMLExecutorTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.pml.model.expression.Literal; -import gov.nist.csd.pm.policy.pml.model.expression.Type; -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.pml.model.function.FormalArgument; -import gov.nist.csd.pm.policy.pml.statement.Expression; -import gov.nist.csd.pm.policy.pml.statement.FunctionDefinitionStatement; -import gov.nist.csd.pm.policy.pml.statement.PMLStatement; -import gov.nist.csd.pm.policy.pml.statement.VarStatement; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -class PMLExecutorTest { - - @Test - void testCustomBuiltinFunctions() throws PMException { - FunctionDefinitionStatement test1 = new FunctionDefinitionStatement.Builder("test1") - .returns(Type.voidType()) - .args( - new FormalArgument("a1", Type.string()) - ) - .executor((ctx, policy) -> { - return new Value("hello world"); - }) - .build(); - FunctionDefinitionStatement test2 = new FunctionDefinitionStatement.Builder("test2") - .returns(Type.voidType()) - .args( - new FormalArgument("a1", Type.string()) - ) - .body( - new VarStatement("test123", new Expression(new Literal("hello world")), true) - ) - .build(); - - PAP pap = new PAP(new MemoryPolicyStore()); - - String pml = """ - - test1('') - test2('') - - """; - - List statements = PMLCompiler.compilePML(pap, pml, test1, test2); - assertEquals(2, statements.size()); - - Map functions = pap.userDefinedPML().getFunctions(); - assertTrue(functions.isEmpty()); - - pap.deserialize().fromPML(new UserContext(SUPER_USER), pml, test1, test2); - assertEquals(2, statements.size()); - - functions = pap.userDefinedPML().getFunctions(); - assertTrue(functions.isEmpty()); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/PMLFormatterTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/PMLFormatterTest.java deleted file mode 100644 index 6b2c8d21b..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/PMLFormatterTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class PMLFormatterTest { - - private static final String expected = """ - set resource access rights ['read', 'write'] - create policy class 'pc1' - create oa 'oa1' in ['pc1'] - create ua 'ua1' in ['pc1'] - associate 'ua1' and 'oa1' with ['read', 'write'] - create obligation 'obl1' { - create rule 'rule1' - when any user - performs ['event1', 'event2'] - do(evtCtx) { - let event = evtCtx['event'] - if equals(event, 'event1') { - create policy class 'e1' - } else if equals(event, 'event2') { - create policy class 'e2' - } - } - } - """; - private static final String input = - "set resource access rights ['read', 'write']" + - "create policy class 'pc1'" + - "create oa 'oa1' in ['pc1']" + - "create ua 'ua1' in ['pc1']" + - "associate 'ua1' and 'oa1' with ['read', 'write']" + - "create obligation 'obl1' {" + - "create rule 'rule1'" + - " when any user" + - " performs" + - " ['event1'," + - " 'event2']" + - " do(evtCtx) {" + - " let event = evtCtx['event']" + - " if equals(event, 'event1') {" + - " create policy class 'e1'" + - " } else if equals(event, 'event2') {" + - " create policy class 'e2'" + - "}" + - "}" + - "}"; - - @Test - void testFormatWithObligation() { - String format = PMLFormatter.format(input); - assertEquals(expected, format); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/PMLTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/PMLTest.java deleted file mode 100644 index aa51ca8a1..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/PMLTest.java +++ /dev/null @@ -1,129 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.pml.model.exception.PMLCompilationException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import org.junit.jupiter.api.Test; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class PMLTest { - - @Test - void testBuiltinFunction() throws PMException, PMLCompilationException { - String input = """ - let x = concat(['hello', 'world']) - create policy class x - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertTrue(pap.graph().nodeExists("helloworld")); - } - - @Test - void testExpression() throws PMException, PMLCompilationException { - String input = """ - let a1 = 'test' - let a2 = ['1', '2', a1] - let a3 = {'1': '2', '3': a1} - - function testFunc(string x) string { - return concat([x, '_test']) - } - - let a4 = testFunc('test') - let a5 = testFunc(a4) - let a6 = a5 - let a7 = '1' - let a8 = a3[a7] - let a9 = a3['1'] - - create policy class a4 - create policy class a5 - create policy class concat(['test', a6]) - create policy class a8 - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - // 5 accounts for super policy class - assertEquals(5, pap.graph().getPolicyClasses().size()); - } - - @Test - void testCreatePolicy() throws PMException, PMLCompilationException { - String input = """ - create policy class 'pc1' - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertTrue(pap.graph().nodeExists("pc1")); - } - - @Test - void testCreateAttr() throws PMException, PMLCompilationException { - String input = """ - create policy class 'pc1' - create user attribute 'ua1' in ['pc1'] - create object attribute 'oa1' in ['pc1'] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertTrue(pap.graph().nodeExists("ua1")); - assertTrue(pap.graph().getParents("ua1").contains("pc1")); - assertTrue(pap.graph().nodeExists("oa1")); - assertTrue(pap.graph().getParents("oa1").contains("pc1")); - assertTrue(pap.graph().getChildren("pc1").contains("ua1")); - assertTrue(pap.graph().getChildren("pc1").contains("oa1")); - } - - @Test - void testCreateUserObject() throws PMException, PMLCompilationException { - String input = """ - create policy class 'pc1' - create user attribute 'ua1' in ['pc1'] - create object attribute 'oa1' in ['pc1'] - create user 'u1' in ['ua1'] - create object 'o1' in ['oa1'] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertTrue(pap.graph().nodeExists("u1")); - assertTrue(pap.graph().getParents("u1").contains("ua1")); - assertTrue(pap.graph().nodeExists("o1")); - assertTrue(pap.graph().getParents("o1").contains("oa1")); - assertTrue(pap.graph().getChildren("oa1").contains("o1")); - assertTrue(pap.graph().getChildren("ua1").contains("u1")); - } - - @Test - void testSetNodeProperties() throws PMException, PMLCompilationException { - String input = """ - create policy class 'pc1' - create user attribute 'ua1' in ['pc1'] - set properties of 'ua1' to {'key': 'value'} - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertEquals("value", pap.graph().getNode("ua1").getProperties().get("key")); - } - - @Test - void testAssign() throws PMException, PMLCompilationException { - String input = """ - create policy class 'pc1' - create user attribute 'ua1' in ['pc1'] - create user attribute 'ua2' in ['pc1'] - create user attribute 'ua3' in ['pc1'] - assign 'ua1' to ['ua2', 'ua3'] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - assertTrue(pap.graph().getParents("ua1").contains("ua2")); - assertTrue(pap.graph().getParents("ua1").contains("ua3")); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/ProhibitionTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/ProhibitionTest.java deleted file mode 100644 index 7d2bf20ea..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/ProhibitionTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package gov.nist.csd.pm.policy.pml; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.pdp.memory.MemoryPolicyReviewer; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.AccessRightSet; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.model.prohibition.ContainerCondition; -import gov.nist.csd.pm.policy.model.prohibition.Prohibition; -import gov.nist.csd.pm.policy.model.prohibition.ProhibitionSubject; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.CREATE_POLICY_CLASS; -import static org.junit.jupiter.api.Assertions.*; - -class ProhibitionTest { - - @Test - void testCreateProhibition() throws PMException { - String input = """ - set resource access rights ['read', 'write'] - create pc 'pc1' - create oa 'oa1' in ['pc1'] - create ua 'ua1' in ['pc1'] - create u 'u1' in ['ua1'] - create u 'u2' in ['ua1'] - associate 'ua1' and 'oa1' with ['read', 'write'] - - create prohibition 'pro1' - deny user 'u1' - access rights [create_policy_class, 'write'] - on union of ['oa1'] - """; - PAP pap = new PAP(new MemoryPolicyStore()); - pap.deserialize().fromPML(new UserContext(SUPER_USER), input); - - Prohibition prohibition = pap.prohibitions().get("pro1"); - assertEquals("pro1", prohibition.getLabel()); - assertEquals(new ProhibitionSubject("u1", ProhibitionSubject.Type.USER), prohibition.getSubject()); - assertEquals(new AccessRightSet(CREATE_POLICY_CLASS, "write"), prohibition.getAccessRightSet()); - assertFalse(prohibition.isIntersection()); - assertEquals(List.of(new ContainerCondition("oa1", false)), prohibition.getContainers()); - - MemoryPolicyReviewer reviewer = new MemoryPolicyReviewer(pap); - AccessRightSet accessRights = reviewer.getAccessRights(new UserContext("u1"), "oa1"); - assertEquals(new AccessRightSet("read"), accessRights); - accessRights = reviewer.getAccessRights(new UserContext("u2"), "oa1"); - assertEquals(new AccessRightSet("read", "write"), accessRights); - - input = """ - delete prohibition 'pro1' - """; - pap.executePML(new UserContext(SUPER_USER), input); - assertTrue(pap.prohibitions().getWithSubject("u1").isEmpty()); - } -} diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/expression/ValueTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/expression/ValueTest.java deleted file mode 100644 index a862d577d..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/expression/ValueTest.java +++ /dev/null @@ -1,113 +0,0 @@ -package gov.nist.csd.pm.policy.pml.expression; - -import gov.nist.csd.pm.policy.pml.model.expression.Value; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.events.CreateObjectAttributeEvent; -import gov.nist.csd.pm.epp.EventContext; -import org.junit.jupiter.api.Test; - -import java.util.*; - -import static gov.nist.csd.pm.policy.model.access.AdminAccessRights.CREATE_OBJECT_ATTRIBUTE; -import static gov.nist.csd.pm.policy.model.graph.nodes.Properties.NO_PROPERTIES; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -class ValueTest { - - @Test - void testStringToValue() throws PMException { - Value value = Value.objectToValue("test"); - assertTrue(value.isString()); - assertEquals("test", value.getStringValue()); - } - - @Test - void testArrayToValue() throws PMException { - Value value = Value.objectToValue(List.of("hello", "world")); - assertTrue(value.isArray()); - assertEquals(new Value("hello"), value.getArrayValue().get(0)); - assertEquals(new Value("world"), value.getArrayValue().get(1)); - } - - @Test - void testBooleanToValue() throws PMException { - Value value = Value.objectToValue(true); - assertTrue(value.isBoolean()); - assertTrue(value.getBooleanValue()); - } - - @Test - void testListToValue() throws PMException { - Value value = Value.objectToValue(Arrays.asList("hello", "world")); - assertTrue(value.isArray()); - assertEquals(new Value("hello"), value.getArrayValue().get(0)); - assertEquals(new Value("world"), value.getArrayValue().get(1)); - } - - @Test - void testObjectToValue() throws PMException { - EventContext testEventCtx = new EventContext(new UserContext("testUser"), "target123", - new CreateObjectAttributeEvent("testOA", NO_PROPERTIES, "pc1")); - - Value objectToValue = Value.objectToValue(testEventCtx); - assertTrue(objectToValue.isMap()); - - Value key = new Value("userCtx"); - Value value = objectToValue.getMapValue().get(key); - assertTrue(value.isMap()); - assertEquals( - Map.of(new Value("user"), new Value("testUser"), new Value("process"), new Value("")), - value.getMapValue() - ); - - key = new Value("target"); - value = objectToValue.getMapValue().get(key); - assertTrue(value.isString()); - assertEquals( - "target123", - value.getStringValue() - ); - - key = new Value("eventName"); - value = objectToValue.getMapValue().get(key); - assertTrue(value.isString()); - assertEquals( - CREATE_OBJECT_ATTRIBUTE, - value.getStringValue() - ); - - key = new Value("event"); - value = objectToValue.getMapValue().get(key); - assertTrue(value.isMap()); - assertEquals( - Map.of(new Value("name"), new Value("testOA"), - new Value("type"), new Value("OA"), - new Value("properties"), new Value(new HashMap<>()), - new Value("initialParent"), new Value("pc1"), - new Value("additionalParents"), new Value(new ArrayList<>()), - new Value("eventName"), new Value("create_object_attribute") - ), - value.getMapValue() - ); - } - - @Test - void testToObject() throws PMException { - Value v = new Value("hello world"); - Object o = Value.valueToObject(v); - assertTrue(o instanceof String); - assertEquals("hello world", o); - - v = new Value(List.of(new Value("1"), new Value("2"))); - o = Value.valueToObject(v); - assertTrue(o instanceof List); - assertEquals(List.of("1", "2"), o); - - v = new Value(List.of(new Value(List.of(new Value("1"), new Value("2"))))); - o = Value.valueToObject(v); - assertTrue(o instanceof List); - assertEquals(List.of(List.of("1", "2")), o); - } -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/pml/statement/ExpressionTest.java b/src/test/java/gov/nist/csd/pm/policy/pml/statement/ExpressionTest.java deleted file mode 100644 index b099ac4bf..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/pml/statement/ExpressionTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package gov.nist.csd.pm.policy.pml.statement; - -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.PMException; -import gov.nist.csd.pm.policy.model.access.UserContext; -import gov.nist.csd.pm.policy.pml.PMLExecutor; -import org.junit.jupiter.api.Test; - -import static gov.nist.csd.pm.pap.SuperPolicy.SUPER_USER; -import static org.junit.jupiter.api.Assertions.*; - -class ExpressionTest { - - @Test - void testCompareExpression() throws PMException { - String pml = """ - let x = "hello world" - let y = "hello world" - if x == y { - create policy class 'pc1' - } - - x = "test" - if x != y { - create policy class 'pc2' - } - - x = ["1", "2"] - if x != y { - create policy class 'pc3' - } - - y = ["1", "2"] - if x == y { - create policy class 'pc4' - } - - x = {"1": "2"} - if x != y { - create policy class 'pc5' - } - - y = {"1": "2"} - if x == y { - create policy class 'pc6' - } - - """; - MemoryPolicyStore memoryPolicyStore = new MemoryPolicyStore(); - PMLExecutor.compileAndExecutePML(memoryPolicyStore, new UserContext(SUPER_USER), pml); - - assertTrue(memoryPolicyStore.graph().nodeExists("pc1")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc2")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc3")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc4")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc5")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc6")); - } - - @Test - void testLogicalExpression() throws PMException { - String pml = """ - let x = "a" - let y = "a" - let z = "b" - - if x == y || x == z { - create pc 'pc1' - } - - if x == y && x == z { - create pc 'pc2' - } - - z = "a" - if x == y && x == z { - create pc 'pc3' - } - - x = "a" == "a" || "a" == "x" - if x { - create pc 'pc4' - } - """; - - MemoryPolicyStore memoryPolicyStore = new MemoryPolicyStore(); - PMLExecutor.compileAndExecutePML(memoryPolicyStore, new UserContext(SUPER_USER), pml); - - assertTrue(memoryPolicyStore.graph().nodeExists("pc1")); - assertFalse(memoryPolicyStore.graph().nodeExists("pc2")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc3")); - assertTrue(memoryPolicyStore.graph().nodeExists("pc4")); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/policy/tx/TxHandlerRunnerTest.java b/src/test/java/gov/nist/csd/pm/policy/tx/TxHandlerRunnerTest.java deleted file mode 100644 index 5f08b6df8..000000000 --- a/src/test/java/gov/nist/csd/pm/policy/tx/TxHandlerRunnerTest.java +++ /dev/null @@ -1,34 +0,0 @@ -package gov.nist.csd.pm.policy.tx; - -import gov.nist.csd.pm.pap.PAP; -import gov.nist.csd.pm.pap.memory.MemoryPolicyStore; -import gov.nist.csd.pm.policy.exceptions.NodeNameExistsException; -import gov.nist.csd.pm.policy.exceptions.PMException; -import org.junit.jupiter.api.Test; - -import static gov.nist.csd.pm.policy.tx.TxRunner.runTx; -import static org.junit.jupiter.api.Assertions.*; - -class TxHandlerRunnerTest { - - @Test - void testRunTx() throws PMException { - PAP pap = new PAP(new MemoryPolicyStore()); - runTx(pap, () -> { - pap.graph().createPolicyClass("pc1"); - }); - - assertTrue(pap.graph().nodeExists("pc1")); - - assertThrows(NodeNameExistsException.class, () -> runTx(pap, () -> { - pap.graph().deleteNode("pc1"); - pap.graph().createPolicyClass("pc2"); - // expect error and rollback - pap.graph().createPolicyClass("pc2"); - })); - - assertTrue(pap.graph().nodeExists("pc1")); - assertFalse(pap.graph().nodeExists("pc2")); - } - -} \ No newline at end of file diff --git a/src/test/java/gov/nist/csd/pm/util/PolicyEquals.java b/src/test/java/gov/nist/csd/pm/util/PolicyEquals.java new file mode 100644 index 000000000..f0839ffe7 --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/util/PolicyEquals.java @@ -0,0 +1,80 @@ +package gov.nist.csd.pm.util; + +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.graph.node.Node; +import gov.nist.csd.pm.pap.graph.node.NodeType; +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.graph.relationship.Association; +import gov.nist.csd.pm.pap.obligation.Obligation; +import gov.nist.csd.pm.pap.prohibition.Prohibition; +import gov.nist.csd.pm.pap.query.PolicyQuery; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; + +import static gov.nist.csd.pm.pap.graph.node.Properties.NO_PROPERTIES; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class PolicyEquals { + + public static void assertPolicyEquals(PolicyQuery a, PolicyQuery b) throws PMException { + // check nodes + // assignments + // associations + Collection aNodes = new HashSet<>(a.graph().search(NodeType.ANY, NO_PROPERTIES)); + Collection bNodes = new HashSet<>(b.graph().search(NodeType.ANY, NO_PROPERTIES)); + assertEquals(aNodes, bNodes); + + for (String nodeName : aNodes) { + Node aNode = a.graph().getNode(nodeName); + Node bNode = b.graph().getNode(nodeName); + assertEquals(aNode, bNode); + + Collection aAscendants = new HashSet<>(a.graph().getAdjacentAscendants(nodeName)); + Collection aDescendants = new HashSet<>(a.graph().getAdjacentDescendants(nodeName)); + + Collection bAscendants = new HashSet<>(b.graph().getAdjacentAscendants(nodeName)); + Collection bDescendants = new HashSet<>(b.graph().getAdjacentDescendants(nodeName)); + + assertEquals(aAscendants, bAscendants); + assertEquals(aDescendants, bDescendants); + + Collection aSourceAssocs = new HashSet<>(a.graph().getAssociationsWithSource(nodeName)); + Collection aTargetAssocs = new HashSet<>(a.graph().getAssociationsWithTarget(nodeName)); + + Collection bSourceAssocs = new HashSet<>(b.graph().getAssociationsWithSource(nodeName)); + Collection bTargetAssocs = new HashSet<>(b.graph().getAssociationsWithTarget(nodeName)); + + assertEquals(aSourceAssocs, bSourceAssocs); + assertEquals(aTargetAssocs, bTargetAssocs); + } + + // check prohibitions + Map> aProhibitions = a.prohibitions().getProhibitions(); + Map> bProhibitions = b.prohibitions().getProhibitions(); + + assertEquals(aProhibitions, bProhibitions); + + // check obligations + Collection aObligations = new HashSet<>(a.obligations().getObligations()); + Collection bObligations = new HashSet<>(b.obligations().getObligations()); + + assertEquals(aObligations, bObligations); + + // check operations + AccessRightSet aResOps = a.operations().getResourceOperations(); + AccessRightSet bResOps = b.operations().getResourceOperations(); + assertEquals(aResOps, bResOps); + + Collection aOps = new HashSet<>(a.operations().getAdminOperationNames()); + Collection bOps = new HashSet<>(b.operations().getAdminOperationNames()); + assertEquals(aOps, bOps); + + // check routines + Collection aRoutines = new HashSet<>(a.routines().getAdminRoutineNames()); + Collection bRoutines = new HashSet<>(b.routines().getAdminRoutineNames()); + assertEquals(aRoutines, bRoutines); + } +} diff --git a/src/test/java/gov/nist/csd/pm/util/SamplePolicy.java b/src/test/java/gov/nist/csd/pm/util/SamplePolicy.java new file mode 100644 index 000000000..b2c975afe --- /dev/null +++ b/src/test/java/gov/nist/csd/pm/util/SamplePolicy.java @@ -0,0 +1,42 @@ +package gov.nist.csd.pm.util; + +import gov.nist.csd.pm.pap.graph.relationship.AccessRightSet; +import gov.nist.csd.pm.pap.PAP; +import gov.nist.csd.pm.pap.admin.AdminPolicyNode; +import gov.nist.csd.pm.pap.serialization.json.JSONDeserializer; +import gov.nist.csd.pm.pap.serialization.pml.PMLDeserializer; +import gov.nist.csd.pm.pap.exception.PMException; +import gov.nist.csd.pm.pap.query.UserContext; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collections; + +public class SamplePolicy { + + public static void loadSamplePolicyFromPML(PAP pap) throws IOException, PMException { + String s = IOUtils.resourceToString("sample/sample.pml", StandardCharsets.UTF_8, SamplePolicy.class.getClassLoader()); + + pap.modify().graph().createPolicyClass("test_pc"); + pap.modify().graph().createUserAttribute("ua1", Collections.singleton("test_pc")); + pap.modify().graph().createUser("u1", Collections.singleton("ua1")); + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); + + pap.deserialize(new UserContext("u1"), s, new PMLDeserializer()); + } + + public static void loadSamplePolicyFromJSON(PAP pap) throws IOException, PMException { + String s = IOUtils.resourceToString("sample/sample.json", StandardCharsets.UTF_8, SamplePolicy.class.getClassLoader()); + pap.modify().graph().createPolicyClass("test_pc"); + pap.modify().graph().createUserAttribute("ua1", Collections.singleton("test_pc")); + pap.modify().graph().createUser("u1", Collections.singleton("ua1")); + pap.modify().graph().associate("ua1", AdminPolicyNode.ADMIN_POLICY_OBJECT.nodeName(), new AccessRightSet("*")); + + pap.deserialize(new UserContext("u1"), s, new JSONDeserializer()); + } + + public static String loadSamplePolicyPML() throws IOException { + return IOUtils.resourceToString("sample/sample.pml", StandardCharsets.UTF_8, SamplePolicy.class.getClassLoader()); + } +} diff --git a/src/test/resources/sample/sample.json b/src/test/resources/sample/sample.json new file mode 100644 index 000000000..6401e8114 --- /dev/null +++ b/src/test/resources/sample/sample.json @@ -0,0 +1,151 @@ +{ + "resourceOperations": [ + "read", + "delete_readme", + "delete_project", + "write" + ], + "graph": { + "pcs": { + "RBAC": {}, + "Location": {} + }, + "uas": { + "US user": { + "assignments": [ + "Location" + ], + "associations": { + "US project": [ + "*" + ] + } + }, + "reader": { + "assignments": [ + "employee" + ], + "associations": { + "project": [ + "read" + ] + } + }, + "EU user": { + "assignments": [ + "Location" + ], + "associations": { + "EU project": [ + "*" + ] + } + }, + "writer": { + "assignments": [ + "reader" + ], + "associations": { + "project": [ + "write" + ] + } + }, + "employee": { + "assignments": [ + "RBAC" + ] + }, + "deleter": { + "assignments": [ + "employee" + ], + "associations": { + "project": [ + "write" + ] + } + } + }, + "oas": { + "EU project": { + "assignments": [ + "Location" + ] + }, + "us_project1": { + "assignments": [ + "US project", + "project" + ] + }, + "project": { + "assignments": [ + "RBAC" + ] + }, + "eu_project1": { + "assignments": [ + "project", + "EU project" + ] + }, + "US project": { + "assignments": [ + "Location" + ] + } + }, + "users": { + "eu_writer1": { + "assignments": [ + "EU user", + "writer" + ] + }, + "us_writer1": { + "assignments": [ + "US user", + "writer" + ] + }, + "eu_reader1": { + "assignments": [ + "EU user", + "reader" + ] + }, + "us_reader1": { + "assignments": [ + "US user", + "reader" + ] + } + }, + "objects": { + "eu_project1 README": { + "assignments": [ + "eu_project1" + ] + }, + "us_project1 README": { + "assignments": [ + "us_project1" + ] + } + } + }, + "prohibitions": [], + "obligations": [ + "create obligation \"create us project admin\" {\n create rule \"us project\"\n when any user\n performs \"createProject\"\n on {\n locProjectAttr: \"US project\"\n }\n do (ctx) {\n createProjectAdmin(ctx.operands.projectName)\n }\n\n create rule \"eu project\"\n when any user\n performs \"createProject\"\n on {\n locProjectAttr: \"EU project\"\n }\n do (ctx) {\n createProjectAdmin(ctx.operands.projectName)\n }\n\n}" + ], + "operations": [ + "operation deleteProject(nodeop string projectName) {\n check \"delete_project\" on projectName\n} {\n delete OA projectName\n}", + "operation createProject(string projectName, nodeop string locProjectAttr) {\n check \"assign_to\" on \"project\"\n check \"assign_to\" on locProjectAttr\n} {\n create OA projectName in [\"project\", locProjectAttr]\n create O projectName + \" README\" in [projectName]\n}", + "operation deleteReadme(nodeop string projectReadme) {\n check \"delete_readme\" on projectReadme\n} {\n delete O projectReadme\n}", + "operation createProjectAdmin(string projectName) {\n uaName := projectName + \" admin\"\n create UA uaName in [\"writer\"]\n associate uaName and projectName with [\"*\"]\n create prohibition \"deny admin delete README\"\n deny UA uaName\n access rights [\"delete_readme\"]\n on union of [projectName]\n}" + ], + "routines": [ + "routine deleteAllProjects(string locProjectOA) {\n foreach project in getAdjacentAscendants(locProjectOA) {\n deleteReadme(project + \" README\")\n deleteProject(project)\n }\n}" + ] +} \ No newline at end of file diff --git a/src/test/resources/sample/sample.pml b/src/test/resources/sample/sample.pml index d380469fd..f2beb8894 100644 --- a/src/test/resources/sample/sample.pml +++ b/src/test/resources/sample/sample.pml @@ -1,33 +1,94 @@ -set resource access rights ["read", "write"] +set resource operations ["read", "write", "delete_project", "delete_readme"] -create policy class "pc1" -create user attribute "ua1" in ["pc1"] -create user attribute "oa1" in ["pc1"] -associate "ua1" and "oa1" with ["read", "write"] +create pc "RBAC" -create policy class "pc2" -create user attribute "ua2" in ["pc2"] -create object attribute "oa2" in ["pc2"] -associate "ua2" and "oa2" with ["read", "write"] + create UA "employee" in ["RBAC"] + create UA "reader" in ["employee"] + create UA "writer" in ["reader"] + create UA "deleter" in ["employee"] -create user "u1" in ["ua1", "ua2"] -create user "u2" in ["ua1", "ua2"] + create OA "project" in ["RBAC"] -create object "o1" in ["oa1", "oa2"] + associate "reader" and "project" with ["read"] + associate "writer" and "project" with ["write"] + associate "deleter" and "project" with ["write"] -create prohibition "u2-prohibition" -deny user "u2" -access rights ["write"] -on intersection of ["oa1", "oa2"] +create pc "Location" -create obligation "o1-obligation" { - create rule "o1-assignment-rule" - when any user - performs ["assign"] - on "o1" - do(evtCtx) { - let parent = evtCtx["parent"] - associate "ua1" and parent with ["read", "write"] - associate "ua2" and parent with ["read", "write"] + create UA "US user" in ["Location"] + create UA "EU user" in ["Location"] + + create OA "US project" in ["Location"] + create OA "EU project" in ["Location"] + + associate "US user" and "US project" with ["*"] + associate "EU user" and "EU project" with ["*"] + +create user "us_reader1" in ["reader", "US user"] +create user "us_writer1" in ["writer", "US user"] + +create user "eu_reader1" in ["reader", "EU user"] +create user "eu_writer1" in ["writer", "EU user"] + +createProject("us_project1", "US project") +createProject("eu_project1", "EU project") + +routine deleteAllProjects(string locProjectOA) { + foreach project in getAdjacentAscendants(locProjectOA) { + deleteReadme(project + " README") + deleteProject(project) } } + +operation deleteReadme(nodeop string projectReadme) { + check "delete_readme" on projectReadme +} { + delete object projectReadme +} + +operation deleteProject(nodeop string projectName) { + check "delete_project" on projectName +} { + delete oa projectName +} + +operation createProject(string projectName, nodeop string locProjectAttr) { + check "assign_to" on "project" + check "assign_to" on locProjectAttr +} { + create oa projectName in ["project", locProjectAttr] + create o projectName + " README" in [projectName] +} + +operation createProjectAdmin(string projectName) { + uaName := projectName + " admin" + create UA uaName in ["writer"] + associate uaName and projectName with ["*"] + + create prohibition "deny admin delete README" + deny user attribute uaName + access rights ["delete_readme"] + on union of [projectName] +} + +create obligation "create us project admin" { + create rule "us project" + when any user + performs "createProject" + on { + locProjectAttr: "US project" + } + do(ctx) { + createProjectAdmin(ctx.operands.projectName) + } + + create rule "eu project" + when any user + performs "createProject" + on { + locProjectAttr: "EU project" + } + do(ctx) { + createProjectAdmin(ctx.operands.projectName) + } +} \ No newline at end of file diff --git a/src/test/resources/sql/db.properties b/src/test/resources/sql/db.properties deleted file mode 100644 index 2fea8d591..000000000 --- a/src/test/resources/sql/db.properties +++ /dev/null @@ -1,6 +0,0 @@ -#connectionUrl=jdbc:mysql://localhost:3306/pm_core -#user=root -#password=root -#execution=external - -execution=container \ No newline at end of file diff --git a/src/test/resources/sql/pm_core.sql b/src/test/resources/sql/pm_core.sql deleted file mode 100644 index faf36dfe8..000000000 --- a/src/test/resources/sql/pm_core.sql +++ /dev/null @@ -1,116 +0,0 @@ -DROP SCHEMA IF EXISTS `pm_core`; -CREATE SCHEMA `pm_core`; -USE `pm_core`; - -CREATE TABLE IF NOT EXISTS `resource_access_rights` ( - `id` int(1) NOT NULL AUTO_INCREMENT, - `access_rights` json NOT NULL, - PRIMARY KEY (`id`) -); - -CREATE TABLE IF NOT EXISTS `node_type` ( - `id` int(11) NOT NULL, - `name` varchar(50) DEFAULT NULL, - `description` varchar(50) DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `idx_node_type_name` (`name`) -); - -CREATE TABLE IF NOT EXISTS `node` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `node_type_id` int(11) NOT NULL, - `name` varchar(50) DEFAULT NULL, - `properties` json DEFAULT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `node_name` (`name`), - KEY `node_type_id_idx` (`node_type_id`), - CONSTRAINT `fk_node_type_id` FOREIGN KEY (`node_type_id`) REFERENCES `node_type` (`id`) -); - -CREATE TABLE IF NOT EXISTS `assignment` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `start_node_id` int(11) NOT NULL, - `end_node_id` int(11) NOT NULL, - PRIMARY KEY (`id`), - KEY `assign_start_node_id` (`start_node_id`), - KEY `assign_end_node_id` (`end_node_id`), - UNIQUE `assign_start_and_end_ids` (`start_node_id`,`end_node_id`), - CONSTRAINT `fk_endnode` FOREIGN KEY (`end_node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_startnode` FOREIGN KEY (`start_node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `association` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `start_node_id` int(11) NOT NULL, - `end_node_id` int(11) NOT NULL, - `operation_set` json NOT NULL, - PRIMARY KEY (`id`), - KEY `assoc_start_node_id` (`start_node_id`), - KEY `assoc_end_node_id` (`end_node_id`), - UNIQUE KEY `assoc_start_and_end_ids` (`start_node_id`,`end_node_id`), - CONSTRAINT `FK_end_node_id` FOREIGN KEY (`end_node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE, - CONSTRAINT `FK_start_node_id` FOREIGN KEY (`start_node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `prohibition_type` ( - `id` int(11) NOT NULL, - `name` varchar(20), - PRIMARY KEY (`id`), - UNIQUE KEY `prohibition_type_name` (`name`) -); - -CREATE TABLE IF NOT EXISTS `prohibition` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `label` varchar(50) NOT NULL, - `node_id` int(11), - `process_id` varchar(50), - `subject_type` int(11) NOT NULL, - `is_intersection` int(1) NOT NULL, - `access_rights` json NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `prohibition_label` (`label`), - CONSTRAINT `fk_prohibition_node_id` FOREIGN KEY (`node_id`) REFERENCES `node` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_prohibition_type_id` FOREIGN KEY (`subject_type`) REFERENCES `prohibition_type` (`id`) -); - -CREATE TABLE IF NOT EXISTS `prohibition_container` ( - `prohibition_id` int(11) NOT NULL, - `container_id` int(11) NOT NULL, - `is_complement` int(1) NOT NULL, - PRIMARY KEY (`prohibition_id`,`container_id`), - CONSTRAINT `fk_prohibition_id` FOREIGN KEY (`prohibition_id`) REFERENCES `prohibition` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_container_id` FOREIGN KEY (`container_id`) REFERENCES `node` (`id`) -); - -CREATE TABLE IF NOT EXISTS `obligation` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `label` varchar(50) NOT NULL, - `author` json NOT NULL, - `rules` BLOB NOT NULL, - PRIMARY KEY(`id`), - UNIQUE KEY `obligation_label` (`label`) -); - -CREATE TABLE IF NOT EXISTS `pml_function` ( - `name` varchar(50) NOT NULL, - `bytes` BLOB NOT NULL, - PRIMARY KEY (`name`) -); - -CREATE TABLE IF NOT EXISTS `pml_constant` ( - `name` varchar(50) NOT NULL, - `value` BLOB NOT NULL, - PRIMARY KEY (`name`) -); - -INSERT INTO `prohibition_type` (id, name) VALUES - (1, 'USER'), - (2, 'USER_ATTRIBUTE'), - (3, 'PROCESS'); - -INSERT INTO `node_type` (`id`, `name`, `description`) VALUES - (1, 'OA', 'Object Attribute'), - (2, 'UA', 'User Attribute'), - (3, 'U', 'User'), - (4, 'O', 'Object'), - (5, 'PC', 'Policy Class'); \ No newline at end of file diff --git a/testdb/csv/O.csv b/testdb/csv/O.csv new file mode 100644 index 000000000..f55791cf2 --- /dev/null +++ b/testdb/csv/O.csv @@ -0,0 +1,50000 @@ +1, O1 +2, O2 +3, O3 +4, O4 +5, O5 +6, O6 +7, O7 +8, O8 +9, O9 +10, O10 +11, O11 +12, O12 +13, O13 +14, O14 +15, O15 +16, O16 +17, O17 +18, O18 +19, O19 +20, O20 +21, O21 +22, O22 +23, O23 +24, O24 +25, O25 +26, O26 +27, O27 +28, O28 +29, O29 +30, O30 +31, O31 +32, O32 +33, O33 +34, O34 +35, O35 +36, O36 +37, O37 +38, O38 +39, O39 +40, O40 +41, O41 +42, O42 +43, O43 +44, O44 +45, O45 +46, O46 +47, O47 +48, O48 +49, O49 +50, O50 +51, O51 +52, O52 +53, O53 +54, O54 +55, O55 +56, O56 +57, O57 +58, O58 +59, O59 +60, O60 +61, O61 +62, O62 +63, O63 +64, O64 +65, O65 +66, O66 +67, O67 +68, O68 +69, O69 +70, O70 +71, O71 +72, O72 +73, O73 +74, O74 +75, O75 +76, O76 +77, O77 +78, O78 +79, O79 +80, O80 +81, O81 +82, O82 +83, O83 +84, O84 +85, O85 +86, O86 +87, O87 +88, O88 +89, O89 +90, O90 +91, O91 +92, O92 +93, O93 +94, O94 +95, O95 +96, O96 +97, O97 +98, O98 +99, O99 +100, O100 +101, O101 +102, O102 +103, O103 +104, O104 +105, O105 +106, O106 +107, O107 +108, O108 +109, O109 +110, O110 +111, O111 +112, O112 +113, O113 +114, O114 +115, O115 +116, O116 +117, O117 +118, O118 +119, O119 +120, O120 +121, O121 +122, O122 +123, O123 +124, O124 +125, O125 +126, O126 +127, O127 +128, O128 +129, O129 +130, O130 +131, O131 +132, O132 +133, O133 +134, O134 +135, O135 +136, O136 +137, O137 +138, O138 +139, O139 +140, O140 +141, O141 +142, O142 +143, O143 +144, O144 +145, O145 +146, O146 +147, O147 +148, O148 +149, O149 +150, O150 +151, O151 +152, O152 +153, O153 +154, O154 +155, O155 +156, O156 +157, O157 +158, O158 +159, O159 +160, O160 +161, O161 +162, O162 +163, O163 +164, O164 +165, O165 +166, O166 +167, O167 +168, O168 +169, O169 +170, O170 +171, O171 +172, O172 +173, O173 +174, O174 +175, O175 +176, O176 +177, O177 +178, O178 +179, O179 +180, O180 +181, O181 +182, O182 +183, O183 +184, O184 +185, O185 +186, O186 +187, O187 +188, O188 +189, O189 +190, O190 +191, O191 +192, O192 +193, O193 +194, O194 +195, O195 +196, O196 +197, O197 +198, O198 +199, O199 +200, O200 +201, O201 +202, O202 +203, O203 +204, O204 +205, O205 +206, O206 +207, O207 +208, O208 +209, O209 +210, O210 +211, O211 +212, O212 +213, O213 +214, O214 +215, O215 +216, O216 +217, O217 +218, O218 +219, O219 +220, O220 +221, O221 +222, O222 +223, O223 +224, O224 +225, O225 +226, O226 +227, O227 +228, O228 +229, O229 +230, O230 +231, O231 +232, O232 +233, O233 +234, O234 +235, O235 +236, O236 +237, O237 +238, O238 +239, O239 +240, O240 +241, O241 +242, O242 +243, O243 +244, O244 +245, O245 +246, O246 +247, O247 +248, O248 +249, O249 +250, O250 +251, O251 +252, O252 +253, O253 +254, O254 +255, O255 +256, O256 +257, O257 +258, O258 +259, O259 +260, O260 +261, O261 +262, O262 +263, O263 +264, O264 +265, O265 +266, O266 +267, O267 +268, O268 +269, O269 +270, O270 +271, O271 +272, O272 +273, O273 +274, O274 +275, O275 +276, O276 +277, O277 +278, O278 +279, O279 +280, O280 +281, O281 +282, O282 +283, O283 +284, O284 +285, O285 +286, O286 +287, O287 +288, O288 +289, O289 +290, O290 +291, O291 +292, O292 +293, O293 +294, O294 +295, O295 +296, O296 +297, O297 +298, O298 +299, O299 +300, O300 +301, O301 +302, O302 +303, O303 +304, O304 +305, O305 +306, O306 +307, O307 +308, O308 +309, O309 +310, O310 +311, O311 +312, O312 +313, O313 +314, O314 +315, O315 +316, O316 +317, O317 +318, O318 +319, O319 +320, O320 +321, O321 +322, O322 +323, O323 +324, O324 +325, O325 +326, O326 +327, O327 +328, O328 +329, O329 +330, O330 +331, O331 +332, O332 +333, O333 +334, O334 +335, O335 +336, O336 +337, O337 +338, O338 +339, O339 +340, O340 +341, O341 +342, O342 +343, O343 +344, O344 +345, O345 +346, O346 +347, O347 +348, O348 +349, O349 +350, O350 +351, O351 +352, O352 +353, O353 +354, O354 +355, O355 +356, O356 +357, O357 +358, O358 +359, O359 +360, O360 +361, O361 +362, O362 +363, O363 +364, O364 +365, O365 +366, O366 +367, O367 +368, O368 +369, O369 +370, O370 +371, O371 +372, O372 +373, O373 +374, O374 +375, O375 +376, O376 +377, O377 +378, O378 +379, O379 +380, O380 +381, O381 +382, O382 +383, O383 +384, O384 +385, O385 +386, O386 +387, O387 +388, O388 +389, O389 +390, O390 +391, O391 +392, O392 +393, O393 +394, O394 +395, O395 +396, O396 +397, O397 +398, O398 +399, O399 +400, O400 +401, O401 +402, O402 +403, O403 +404, O404 +405, O405 +406, O406 +407, O407 +408, O408 +409, O409 +410, O410 +411, O411 +412, O412 +413, O413 +414, O414 +415, O415 +416, O416 +417, O417 +418, O418 +419, O419 +420, O420 +421, O421 +422, O422 +423, O423 +424, O424 +425, O425 +426, O426 +427, O427 +428, O428 +429, O429 +430, O430 +431, O431 +432, O432 +433, O433 +434, O434 +435, O435 +436, O436 +437, O437 +438, O438 +439, O439 +440, O440 +441, O441 +442, O442 +443, O443 +444, O444 +445, O445 +446, O446 +447, O447 +448, O448 +449, O449 +450, O450 +451, O451 +452, O452 +453, O453 +454, O454 +455, O455 +456, O456 +457, O457 +458, O458 +459, O459 +460, O460 +461, O461 +462, O462 +463, O463 +464, O464 +465, O465 +466, O466 +467, O467 +468, O468 +469, O469 +470, O470 +471, O471 +472, O472 +473, O473 +474, O474 +475, O475 +476, O476 +477, O477 +478, O478 +479, O479 +480, O480 +481, O481 +482, O482 +483, O483 +484, O484 +485, O485 +486, O486 +487, O487 +488, O488 +489, O489 +490, O490 +491, O491 +492, O492 +493, O493 +494, O494 +495, O495 +496, O496 +497, O497 +498, O498 +499, O499 +500, O500 +501, O501 +502, O502 +503, O503 +504, O504 +505, O505 +506, O506 +507, O507 +508, O508 +509, O509 +510, O510 +511, O511 +512, O512 +513, O513 +514, O514 +515, O515 +516, O516 +517, O517 +518, O518 +519, O519 +520, O520 +521, O521 +522, O522 +523, O523 +524, O524 +525, O525 +526, O526 +527, O527 +528, O528 +529, O529 +530, O530 +531, O531 +532, O532 +533, O533 +534, O534 +535, O535 +536, O536 +537, O537 +538, O538 +539, O539 +540, O540 +541, O541 +542, O542 +543, O543 +544, O544 +545, O545 +546, O546 +547, O547 +548, O548 +549, O549 +550, O550 +551, O551 +552, O552 +553, O553 +554, O554 +555, O555 +556, O556 +557, O557 +558, O558 +559, O559 +560, O560 +561, O561 +562, O562 +563, O563 +564, O564 +565, O565 +566, O566 +567, O567 +568, O568 +569, O569 +570, O570 +571, O571 +572, O572 +573, O573 +574, O574 +575, O575 +576, O576 +577, O577 +578, O578 +579, O579 +580, O580 +581, O581 +582, O582 +583, O583 +584, O584 +585, O585 +586, O586 +587, O587 +588, O588 +589, O589 +590, O590 +591, O591 +592, O592 +593, O593 +594, O594 +595, O595 +596, O596 +597, O597 +598, O598 +599, O599 +600, O600 +601, O601 +602, O602 +603, O603 +604, O604 +605, O605 +606, O606 +607, O607 +608, O608 +609, O609 +610, O610 +611, O611 +612, O612 +613, O613 +614, O614 +615, O615 +616, O616 +617, O617 +618, O618 +619, O619 +620, O620 +621, O621 +622, O622 +623, O623 +624, O624 +625, O625 +626, O626 +627, O627 +628, O628 +629, O629 +630, O630 +631, O631 +632, O632 +633, O633 +634, O634 +635, O635 +636, O636 +637, O637 +638, O638 +639, O639 +640, O640 +641, O641 +642, O642 +643, O643 +644, O644 +645, O645 +646, O646 +647, O647 +648, O648 +649, O649 +650, O650 +651, O651 +652, O652 +653, O653 +654, O654 +655, O655 +656, O656 +657, O657 +658, O658 +659, O659 +660, O660 +661, O661 +662, O662 +663, O663 +664, O664 +665, O665 +666, O666 +667, O667 +668, O668 +669, O669 +670, O670 +671, O671 +672, O672 +673, O673 +674, O674 +675, O675 +676, O676 +677, O677 +678, O678 +679, O679 +680, O680 +681, O681 +682, O682 +683, O683 +684, O684 +685, O685 +686, O686 +687, O687 +688, O688 +689, O689 +690, O690 +691, O691 +692, O692 +693, O693 +694, O694 +695, O695 +696, O696 +697, O697 +698, O698 +699, O699 +700, O700 +701, O701 +702, O702 +703, O703 +704, O704 +705, O705 +706, O706 +707, O707 +708, O708 +709, O709 +710, O710 +711, O711 +712, O712 +713, O713 +714, O714 +715, O715 +716, O716 +717, O717 +718, O718 +719, O719 +720, O720 +721, O721 +722, O722 +723, O723 +724, O724 +725, O725 +726, O726 +727, O727 +728, O728 +729, O729 +730, O730 +731, O731 +732, O732 +733, O733 +734, O734 +735, O735 +736, O736 +737, O737 +738, O738 +739, O739 +740, O740 +741, O741 +742, O742 +743, O743 +744, O744 +745, O745 +746, O746 +747, O747 +748, O748 +749, O749 +750, O750 +751, O751 +752, O752 +753, O753 +754, O754 +755, O755 +756, O756 +757, O757 +758, O758 +759, O759 +760, O760 +761, O761 +762, O762 +763, O763 +764, O764 +765, O765 +766, O766 +767, O767 +768, O768 +769, O769 +770, O770 +771, O771 +772, O772 +773, O773 +774, O774 +775, O775 +776, O776 +777, O777 +778, O778 +779, O779 +780, O780 +781, O781 +782, O782 +783, O783 +784, O784 +785, O785 +786, O786 +787, O787 +788, O788 +789, O789 +790, O790 +791, O791 +792, O792 +793, O793 +794, O794 +795, O795 +796, O796 +797, O797 +798, O798 +799, O799 +800, O800 +801, O801 +802, O802 +803, O803 +804, O804 +805, O805 +806, O806 +807, O807 +808, O808 +809, O809 +810, O810 +811, O811 +812, O812 +813, O813 +814, O814 +815, O815 +816, O816 +817, O817 +818, O818 +819, O819 +820, O820 +821, O821 +822, O822 +823, O823 +824, O824 +825, O825 +826, O826 +827, O827 +828, O828 +829, O829 +830, O830 +831, O831 +832, O832 +833, O833 +834, O834 +835, O835 +836, O836 +837, O837 +838, O838 +839, O839 +840, O840 +841, O841 +842, O842 +843, O843 +844, O844 +845, O845 +846, O846 +847, O847 +848, O848 +849, O849 +850, O850 +851, O851 +852, O852 +853, O853 +854, O854 +855, O855 +856, O856 +857, O857 +858, O858 +859, O859 +860, O860 +861, O861 +862, O862 +863, O863 +864, O864 +865, O865 +866, O866 +867, O867 +868, O868 +869, O869 +870, O870 +871, O871 +872, O872 +873, O873 +874, O874 +875, O875 +876, O876 +877, O877 +878, O878 +879, O879 +880, O880 +881, O881 +882, O882 +883, O883 +884, O884 +885, O885 +886, O886 +887, O887 +888, O888 +889, O889 +890, O890 +891, O891 +892, O892 +893, O893 +894, O894 +895, O895 +896, O896 +897, O897 +898, O898 +899, O899 +900, O900 +901, O901 +902, O902 +903, O903 +904, O904 +905, O905 +906, O906 +907, O907 +908, O908 +909, O909 +910, O910 +911, O911 +912, O912 +913, O913 +914, O914 +915, O915 +916, O916 +917, O917 +918, O918 +919, O919 +920, O920 +921, O921 +922, O922 +923, O923 +924, O924 +925, O925 +926, O926 +927, O927 +928, O928 +929, O929 +930, O930 +931, O931 +932, O932 +933, O933 +934, O934 +935, O935 +936, O936 +937, O937 +938, O938 +939, O939 +940, O940 +941, O941 +942, O942 +943, O943 +944, O944 +945, O945 +946, O946 +947, O947 +948, O948 +949, O949 +950, O950 +951, O951 +952, O952 +953, O953 +954, O954 +955, O955 +956, O956 +957, O957 +958, O958 +959, O959 +960, O960 +961, O961 +962, O962 +963, O963 +964, O964 +965, O965 +966, O966 +967, O967 +968, O968 +969, O969 +970, O970 +971, O971 +972, O972 +973, O973 +974, O974 +975, O975 +976, O976 +977, O977 +978, O978 +979, O979 +980, O980 +981, O981 +982, O982 +983, O983 +984, O984 +985, O985 +986, O986 +987, O987 +988, O988 +989, O989 +990, O990 +991, O991 +992, O992 +993, O993 +994, O994 +995, O995 +996, O996 +997, O997 +998, O998 +999, O999 +1000, O1000 +1001, O1001 +1002, O1002 +1003, O1003 +1004, O1004 +1005, O1005 +1006, O1006 +1007, O1007 +1008, O1008 +1009, O1009 +1010, O1010 +1011, O1011 +1012, O1012 +1013, O1013 +1014, O1014 +1015, O1015 +1016, O1016 +1017, O1017 +1018, O1018 +1019, O1019 +1020, O1020 +1021, O1021 +1022, O1022 +1023, O1023 +1024, O1024 +1025, O1025 +1026, O1026 +1027, O1027 +1028, O1028 +1029, O1029 +1030, O1030 +1031, O1031 +1032, O1032 +1033, O1033 +1034, O1034 +1035, O1035 +1036, O1036 +1037, O1037 +1038, O1038 +1039, O1039 +1040, O1040 +1041, O1041 +1042, O1042 +1043, O1043 +1044, O1044 +1045, O1045 +1046, O1046 +1047, O1047 +1048, O1048 +1049, O1049 +1050, O1050 +1051, O1051 +1052, O1052 +1053, O1053 +1054, O1054 +1055, O1055 +1056, O1056 +1057, O1057 +1058, O1058 +1059, O1059 +1060, O1060 +1061, O1061 +1062, O1062 +1063, O1063 +1064, O1064 +1065, O1065 +1066, O1066 +1067, O1067 +1068, O1068 +1069, O1069 +1070, O1070 +1071, O1071 +1072, O1072 +1073, O1073 +1074, O1074 +1075, O1075 +1076, O1076 +1077, O1077 +1078, O1078 +1079, O1079 +1080, O1080 +1081, O1081 +1082, O1082 +1083, O1083 +1084, O1084 +1085, O1085 +1086, O1086 +1087, O1087 +1088, O1088 +1089, O1089 +1090, O1090 +1091, O1091 +1092, O1092 +1093, O1093 +1094, O1094 +1095, O1095 +1096, O1096 +1097, O1097 +1098, O1098 +1099, O1099 +1100, O1100 +1101, O1101 +1102, O1102 +1103, O1103 +1104, O1104 +1105, O1105 +1106, O1106 +1107, O1107 +1108, O1108 +1109, O1109 +1110, O1110 +1111, O1111 +1112, O1112 +1113, O1113 +1114, O1114 +1115, O1115 +1116, O1116 +1117, O1117 +1118, O1118 +1119, O1119 +1120, O1120 +1121, O1121 +1122, O1122 +1123, O1123 +1124, O1124 +1125, O1125 +1126, O1126 +1127, O1127 +1128, O1128 +1129, O1129 +1130, O1130 +1131, O1131 +1132, O1132 +1133, O1133 +1134, O1134 +1135, O1135 +1136, O1136 +1137, O1137 +1138, O1138 +1139, O1139 +1140, O1140 +1141, O1141 +1142, O1142 +1143, O1143 +1144, O1144 +1145, O1145 +1146, O1146 +1147, O1147 +1148, O1148 +1149, O1149 +1150, O1150 +1151, O1151 +1152, O1152 +1153, O1153 +1154, O1154 +1155, O1155 +1156, O1156 +1157, O1157 +1158, O1158 +1159, O1159 +1160, O1160 +1161, O1161 +1162, O1162 +1163, O1163 +1164, O1164 +1165, O1165 +1166, O1166 +1167, O1167 +1168, O1168 +1169, O1169 +1170, O1170 +1171, O1171 +1172, O1172 +1173, O1173 +1174, O1174 +1175, O1175 +1176, O1176 +1177, O1177 +1178, O1178 +1179, O1179 +1180, O1180 +1181, O1181 +1182, O1182 +1183, O1183 +1184, O1184 +1185, O1185 +1186, O1186 +1187, O1187 +1188, O1188 +1189, O1189 +1190, O1190 +1191, O1191 +1192, O1192 +1193, O1193 +1194, O1194 +1195, O1195 +1196, O1196 +1197, O1197 +1198, O1198 +1199, O1199 +1200, O1200 +1201, O1201 +1202, O1202 +1203, O1203 +1204, O1204 +1205, O1205 +1206, O1206 +1207, O1207 +1208, O1208 +1209, O1209 +1210, O1210 +1211, O1211 +1212, O1212 +1213, O1213 +1214, O1214 +1215, O1215 +1216, O1216 +1217, O1217 +1218, O1218 +1219, O1219 +1220, O1220 +1221, O1221 +1222, O1222 +1223, O1223 +1224, O1224 +1225, O1225 +1226, O1226 +1227, O1227 +1228, O1228 +1229, O1229 +1230, O1230 +1231, O1231 +1232, O1232 +1233, O1233 +1234, O1234 +1235, O1235 +1236, O1236 +1237, O1237 +1238, O1238 +1239, O1239 +1240, O1240 +1241, O1241 +1242, O1242 +1243, O1243 +1244, O1244 +1245, O1245 +1246, O1246 +1247, O1247 +1248, O1248 +1249, O1249 +1250, O1250 +1251, O1251 +1252, O1252 +1253, O1253 +1254, O1254 +1255, O1255 +1256, O1256 +1257, O1257 +1258, O1258 +1259, O1259 +1260, O1260 +1261, O1261 +1262, O1262 +1263, O1263 +1264, O1264 +1265, O1265 +1266, O1266 +1267, O1267 +1268, O1268 +1269, O1269 +1270, O1270 +1271, O1271 +1272, O1272 +1273, O1273 +1274, O1274 +1275, O1275 +1276, O1276 +1277, O1277 +1278, O1278 +1279, O1279 +1280, O1280 +1281, O1281 +1282, O1282 +1283, O1283 +1284, O1284 +1285, O1285 +1286, O1286 +1287, O1287 +1288, O1288 +1289, O1289 +1290, O1290 +1291, O1291 +1292, O1292 +1293, O1293 +1294, O1294 +1295, O1295 +1296, O1296 +1297, O1297 +1298, O1298 +1299, O1299 +1300, O1300 +1301, O1301 +1302, O1302 +1303, O1303 +1304, O1304 +1305, O1305 +1306, O1306 +1307, O1307 +1308, O1308 +1309, O1309 +1310, O1310 +1311, O1311 +1312, O1312 +1313, O1313 +1314, O1314 +1315, O1315 +1316, O1316 +1317, O1317 +1318, O1318 +1319, O1319 +1320, O1320 +1321, O1321 +1322, O1322 +1323, O1323 +1324, O1324 +1325, O1325 +1326, O1326 +1327, O1327 +1328, O1328 +1329, O1329 +1330, O1330 +1331, O1331 +1332, O1332 +1333, O1333 +1334, O1334 +1335, O1335 +1336, O1336 +1337, O1337 +1338, O1338 +1339, O1339 +1340, O1340 +1341, O1341 +1342, O1342 +1343, O1343 +1344, O1344 +1345, O1345 +1346, O1346 +1347, O1347 +1348, O1348 +1349, O1349 +1350, O1350 +1351, O1351 +1352, O1352 +1353, O1353 +1354, O1354 +1355, O1355 +1356, O1356 +1357, O1357 +1358, O1358 +1359, O1359 +1360, O1360 +1361, O1361 +1362, O1362 +1363, O1363 +1364, O1364 +1365, O1365 +1366, O1366 +1367, O1367 +1368, O1368 +1369, O1369 +1370, O1370 +1371, O1371 +1372, O1372 +1373, O1373 +1374, O1374 +1375, O1375 +1376, O1376 +1377, O1377 +1378, O1378 +1379, O1379 +1380, O1380 +1381, O1381 +1382, O1382 +1383, O1383 +1384, O1384 +1385, O1385 +1386, O1386 +1387, O1387 +1388, O1388 +1389, O1389 +1390, O1390 +1391, O1391 +1392, O1392 +1393, O1393 +1394, O1394 +1395, O1395 +1396, O1396 +1397, O1397 +1398, O1398 +1399, O1399 +1400, O1400 +1401, O1401 +1402, O1402 +1403, O1403 +1404, O1404 +1405, O1405 +1406, O1406 +1407, O1407 +1408, O1408 +1409, O1409 +1410, O1410 +1411, O1411 +1412, O1412 +1413, O1413 +1414, O1414 +1415, O1415 +1416, O1416 +1417, O1417 +1418, O1418 +1419, O1419 +1420, O1420 +1421, O1421 +1422, O1422 +1423, O1423 +1424, O1424 +1425, O1425 +1426, O1426 +1427, O1427 +1428, O1428 +1429, O1429 +1430, O1430 +1431, O1431 +1432, O1432 +1433, O1433 +1434, O1434 +1435, O1435 +1436, O1436 +1437, O1437 +1438, O1438 +1439, O1439 +1440, O1440 +1441, O1441 +1442, O1442 +1443, O1443 +1444, O1444 +1445, O1445 +1446, O1446 +1447, O1447 +1448, O1448 +1449, O1449 +1450, O1450 +1451, O1451 +1452, O1452 +1453, O1453 +1454, O1454 +1455, O1455 +1456, O1456 +1457, O1457 +1458, O1458 +1459, O1459 +1460, O1460 +1461, O1461 +1462, O1462 +1463, O1463 +1464, O1464 +1465, O1465 +1466, O1466 +1467, O1467 +1468, O1468 +1469, O1469 +1470, O1470 +1471, O1471 +1472, O1472 +1473, O1473 +1474, O1474 +1475, O1475 +1476, O1476 +1477, O1477 +1478, O1478 +1479, O1479 +1480, O1480 +1481, O1481 +1482, O1482 +1483, O1483 +1484, O1484 +1485, O1485 +1486, O1486 +1487, O1487 +1488, O1488 +1489, O1489 +1490, O1490 +1491, O1491 +1492, O1492 +1493, O1493 +1494, O1494 +1495, O1495 +1496, O1496 +1497, O1497 +1498, O1498 +1499, O1499 +1500, O1500 +1501, O1501 +1502, O1502 +1503, O1503 +1504, O1504 +1505, O1505 +1506, O1506 +1507, O1507 +1508, O1508 +1509, O1509 +1510, O1510 +1511, O1511 +1512, O1512 +1513, O1513 +1514, O1514 +1515, O1515 +1516, O1516 +1517, O1517 +1518, O1518 +1519, O1519 +1520, O1520 +1521, O1521 +1522, O1522 +1523, O1523 +1524, O1524 +1525, O1525 +1526, O1526 +1527, O1527 +1528, O1528 +1529, O1529 +1530, O1530 +1531, O1531 +1532, O1532 +1533, O1533 +1534, O1534 +1535, O1535 +1536, O1536 +1537, O1537 +1538, O1538 +1539, O1539 +1540, O1540 +1541, O1541 +1542, O1542 +1543, O1543 +1544, O1544 +1545, O1545 +1546, O1546 +1547, O1547 +1548, O1548 +1549, O1549 +1550, O1550 +1551, O1551 +1552, O1552 +1553, O1553 +1554, O1554 +1555, O1555 +1556, O1556 +1557, O1557 +1558, O1558 +1559, O1559 +1560, O1560 +1561, O1561 +1562, O1562 +1563, O1563 +1564, O1564 +1565, O1565 +1566, O1566 +1567, O1567 +1568, O1568 +1569, O1569 +1570, O1570 +1571, O1571 +1572, O1572 +1573, O1573 +1574, O1574 +1575, O1575 +1576, O1576 +1577, O1577 +1578, O1578 +1579, O1579 +1580, O1580 +1581, O1581 +1582, O1582 +1583, O1583 +1584, O1584 +1585, O1585 +1586, O1586 +1587, O1587 +1588, O1588 +1589, O1589 +1590, O1590 +1591, O1591 +1592, O1592 +1593, O1593 +1594, O1594 +1595, O1595 +1596, O1596 +1597, O1597 +1598, O1598 +1599, O1599 +1600, O1600 +1601, O1601 +1602, O1602 +1603, O1603 +1604, O1604 +1605, O1605 +1606, O1606 +1607, O1607 +1608, O1608 +1609, O1609 +1610, O1610 +1611, O1611 +1612, O1612 +1613, O1613 +1614, O1614 +1615, O1615 +1616, O1616 +1617, O1617 +1618, O1618 +1619, O1619 +1620, O1620 +1621, O1621 +1622, O1622 +1623, O1623 +1624, O1624 +1625, O1625 +1626, O1626 +1627, O1627 +1628, O1628 +1629, O1629 +1630, O1630 +1631, O1631 +1632, O1632 +1633, O1633 +1634, O1634 +1635, O1635 +1636, O1636 +1637, O1637 +1638, O1638 +1639, O1639 +1640, O1640 +1641, O1641 +1642, O1642 +1643, O1643 +1644, O1644 +1645, O1645 +1646, O1646 +1647, O1647 +1648, O1648 +1649, O1649 +1650, O1650 +1651, O1651 +1652, O1652 +1653, O1653 +1654, O1654 +1655, O1655 +1656, O1656 +1657, O1657 +1658, O1658 +1659, O1659 +1660, O1660 +1661, O1661 +1662, O1662 +1663, O1663 +1664, O1664 +1665, O1665 +1666, O1666 +1667, O1667 +1668, O1668 +1669, O1669 +1670, O1670 +1671, O1671 +1672, O1672 +1673, O1673 +1674, O1674 +1675, O1675 +1676, O1676 +1677, O1677 +1678, O1678 +1679, O1679 +1680, O1680 +1681, O1681 +1682, O1682 +1683, O1683 +1684, O1684 +1685, O1685 +1686, O1686 +1687, O1687 +1688, O1688 +1689, O1689 +1690, O1690 +1691, O1691 +1692, O1692 +1693, O1693 +1694, O1694 +1695, O1695 +1696, O1696 +1697, O1697 +1698, O1698 +1699, O1699 +1700, O1700 +1701, O1701 +1702, O1702 +1703, O1703 +1704, O1704 +1705, O1705 +1706, O1706 +1707, O1707 +1708, O1708 +1709, O1709 +1710, O1710 +1711, O1711 +1712, O1712 +1713, O1713 +1714, O1714 +1715, O1715 +1716, O1716 +1717, O1717 +1718, O1718 +1719, O1719 +1720, O1720 +1721, O1721 +1722, O1722 +1723, O1723 +1724, O1724 +1725, O1725 +1726, O1726 +1727, O1727 +1728, O1728 +1729, O1729 +1730, O1730 +1731, O1731 +1732, O1732 +1733, O1733 +1734, O1734 +1735, O1735 +1736, O1736 +1737, O1737 +1738, O1738 +1739, O1739 +1740, O1740 +1741, O1741 +1742, O1742 +1743, O1743 +1744, O1744 +1745, O1745 +1746, O1746 +1747, O1747 +1748, O1748 +1749, O1749 +1750, O1750 +1751, O1751 +1752, O1752 +1753, O1753 +1754, O1754 +1755, O1755 +1756, O1756 +1757, O1757 +1758, O1758 +1759, O1759 +1760, O1760 +1761, O1761 +1762, O1762 +1763, O1763 +1764, O1764 +1765, O1765 +1766, O1766 +1767, O1767 +1768, O1768 +1769, O1769 +1770, O1770 +1771, O1771 +1772, O1772 +1773, O1773 +1774, O1774 +1775, O1775 +1776, O1776 +1777, O1777 +1778, O1778 +1779, O1779 +1780, O1780 +1781, O1781 +1782, O1782 +1783, O1783 +1784, O1784 +1785, O1785 +1786, O1786 +1787, O1787 +1788, O1788 +1789, O1789 +1790, O1790 +1791, O1791 +1792, O1792 +1793, O1793 +1794, O1794 +1795, O1795 +1796, O1796 +1797, O1797 +1798, O1798 +1799, O1799 +1800, O1800 +1801, O1801 +1802, O1802 +1803, O1803 +1804, O1804 +1805, O1805 +1806, O1806 +1807, O1807 +1808, O1808 +1809, O1809 +1810, O1810 +1811, O1811 +1812, O1812 +1813, O1813 +1814, O1814 +1815, O1815 +1816, O1816 +1817, O1817 +1818, O1818 +1819, O1819 +1820, O1820 +1821, O1821 +1822, O1822 +1823, O1823 +1824, O1824 +1825, O1825 +1826, O1826 +1827, O1827 +1828, O1828 +1829, O1829 +1830, O1830 +1831, O1831 +1832, O1832 +1833, O1833 +1834, O1834 +1835, O1835 +1836, O1836 +1837, O1837 +1838, O1838 +1839, O1839 +1840, O1840 +1841, O1841 +1842, O1842 +1843, O1843 +1844, O1844 +1845, O1845 +1846, O1846 +1847, O1847 +1848, O1848 +1849, O1849 +1850, O1850 +1851, O1851 +1852, O1852 +1853, O1853 +1854, O1854 +1855, O1855 +1856, O1856 +1857, O1857 +1858, O1858 +1859, O1859 +1860, O1860 +1861, O1861 +1862, O1862 +1863, O1863 +1864, O1864 +1865, O1865 +1866, O1866 +1867, O1867 +1868, O1868 +1869, O1869 +1870, O1870 +1871, O1871 +1872, O1872 +1873, O1873 +1874, O1874 +1875, O1875 +1876, O1876 +1877, O1877 +1878, O1878 +1879, O1879 +1880, O1880 +1881, O1881 +1882, O1882 +1883, O1883 +1884, O1884 +1885, O1885 +1886, O1886 +1887, O1887 +1888, O1888 +1889, O1889 +1890, O1890 +1891, O1891 +1892, O1892 +1893, O1893 +1894, O1894 +1895, O1895 +1896, O1896 +1897, O1897 +1898, O1898 +1899, O1899 +1900, O1900 +1901, O1901 +1902, O1902 +1903, O1903 +1904, O1904 +1905, O1905 +1906, O1906 +1907, O1907 +1908, O1908 +1909, O1909 +1910, O1910 +1911, O1911 +1912, O1912 +1913, O1913 +1914, O1914 +1915, O1915 +1916, O1916 +1917, O1917 +1918, O1918 +1919, O1919 +1920, O1920 +1921, O1921 +1922, O1922 +1923, O1923 +1924, O1924 +1925, O1925 +1926, O1926 +1927, O1927 +1928, O1928 +1929, O1929 +1930, O1930 +1931, O1931 +1932, O1932 +1933, O1933 +1934, O1934 +1935, O1935 +1936, O1936 +1937, O1937 +1938, O1938 +1939, O1939 +1940, O1940 +1941, O1941 +1942, O1942 +1943, O1943 +1944, O1944 +1945, O1945 +1946, O1946 +1947, O1947 +1948, O1948 +1949, O1949 +1950, O1950 +1951, O1951 +1952, O1952 +1953, O1953 +1954, O1954 +1955, O1955 +1956, O1956 +1957, O1957 +1958, O1958 +1959, O1959 +1960, O1960 +1961, O1961 +1962, O1962 +1963, O1963 +1964, O1964 +1965, O1965 +1966, O1966 +1967, O1967 +1968, O1968 +1969, O1969 +1970, O1970 +1971, O1971 +1972, O1972 +1973, O1973 +1974, O1974 +1975, O1975 +1976, O1976 +1977, O1977 +1978, O1978 +1979, O1979 +1980, O1980 +1981, O1981 +1982, O1982 +1983, O1983 +1984, O1984 +1985, O1985 +1986, O1986 +1987, O1987 +1988, O1988 +1989, O1989 +1990, O1990 +1991, O1991 +1992, O1992 +1993, O1993 +1994, O1994 +1995, O1995 +1996, O1996 +1997, O1997 +1998, O1998 +1999, O1999 +2000, O2000 +2001, O2001 +2002, O2002 +2003, O2003 +2004, O2004 +2005, O2005 +2006, O2006 +2007, O2007 +2008, O2008 +2009, O2009 +2010, O2010 +2011, O2011 +2012, O2012 +2013, O2013 +2014, O2014 +2015, O2015 +2016, O2016 +2017, O2017 +2018, O2018 +2019, O2019 +2020, O2020 +2021, O2021 +2022, O2022 +2023, O2023 +2024, O2024 +2025, O2025 +2026, O2026 +2027, O2027 +2028, O2028 +2029, O2029 +2030, O2030 +2031, O2031 +2032, O2032 +2033, O2033 +2034, O2034 +2035, O2035 +2036, O2036 +2037, O2037 +2038, O2038 +2039, O2039 +2040, O2040 +2041, O2041 +2042, O2042 +2043, O2043 +2044, O2044 +2045, O2045 +2046, O2046 +2047, O2047 +2048, O2048 +2049, O2049 +2050, O2050 +2051, O2051 +2052, O2052 +2053, O2053 +2054, O2054 +2055, O2055 +2056, O2056 +2057, O2057 +2058, O2058 +2059, O2059 +2060, O2060 +2061, O2061 +2062, O2062 +2063, O2063 +2064, O2064 +2065, O2065 +2066, O2066 +2067, O2067 +2068, O2068 +2069, O2069 +2070, O2070 +2071, O2071 +2072, O2072 +2073, O2073 +2074, O2074 +2075, O2075 +2076, O2076 +2077, O2077 +2078, O2078 +2079, O2079 +2080, O2080 +2081, O2081 +2082, O2082 +2083, O2083 +2084, O2084 +2085, O2085 +2086, O2086 +2087, O2087 +2088, O2088 +2089, O2089 +2090, O2090 +2091, O2091 +2092, O2092 +2093, O2093 +2094, O2094 +2095, O2095 +2096, O2096 +2097, O2097 +2098, O2098 +2099, O2099 +2100, O2100 +2101, O2101 +2102, O2102 +2103, O2103 +2104, O2104 +2105, O2105 +2106, O2106 +2107, O2107 +2108, O2108 +2109, O2109 +2110, O2110 +2111, O2111 +2112, O2112 +2113, O2113 +2114, O2114 +2115, O2115 +2116, O2116 +2117, O2117 +2118, O2118 +2119, O2119 +2120, O2120 +2121, O2121 +2122, O2122 +2123, O2123 +2124, O2124 +2125, O2125 +2126, O2126 +2127, O2127 +2128, O2128 +2129, O2129 +2130, O2130 +2131, O2131 +2132, O2132 +2133, O2133 +2134, O2134 +2135, O2135 +2136, O2136 +2137, O2137 +2138, O2138 +2139, O2139 +2140, O2140 +2141, O2141 +2142, O2142 +2143, O2143 +2144, O2144 +2145, O2145 +2146, O2146 +2147, O2147 +2148, O2148 +2149, O2149 +2150, O2150 +2151, O2151 +2152, O2152 +2153, O2153 +2154, O2154 +2155, O2155 +2156, O2156 +2157, O2157 +2158, O2158 +2159, O2159 +2160, O2160 +2161, O2161 +2162, O2162 +2163, O2163 +2164, O2164 +2165, O2165 +2166, O2166 +2167, O2167 +2168, O2168 +2169, O2169 +2170, O2170 +2171, O2171 +2172, O2172 +2173, O2173 +2174, O2174 +2175, O2175 +2176, O2176 +2177, O2177 +2178, O2178 +2179, O2179 +2180, O2180 +2181, O2181 +2182, O2182 +2183, O2183 +2184, O2184 +2185, O2185 +2186, O2186 +2187, O2187 +2188, O2188 +2189, O2189 +2190, O2190 +2191, O2191 +2192, O2192 +2193, O2193 +2194, O2194 +2195, O2195 +2196, O2196 +2197, O2197 +2198, O2198 +2199, O2199 +2200, O2200 +2201, O2201 +2202, O2202 +2203, O2203 +2204, O2204 +2205, O2205 +2206, O2206 +2207, O2207 +2208, O2208 +2209, O2209 +2210, O2210 +2211, O2211 +2212, O2212 +2213, O2213 +2214, O2214 +2215, O2215 +2216, O2216 +2217, O2217 +2218, O2218 +2219, O2219 +2220, O2220 +2221, O2221 +2222, O2222 +2223, O2223 +2224, O2224 +2225, O2225 +2226, O2226 +2227, O2227 +2228, O2228 +2229, O2229 +2230, O2230 +2231, O2231 +2232, O2232 +2233, O2233 +2234, O2234 +2235, O2235 +2236, O2236 +2237, O2237 +2238, O2238 +2239, O2239 +2240, O2240 +2241, O2241 +2242, O2242 +2243, O2243 +2244, O2244 +2245, O2245 +2246, O2246 +2247, O2247 +2248, O2248 +2249, O2249 +2250, O2250 +2251, O2251 +2252, O2252 +2253, O2253 +2254, O2254 +2255, O2255 +2256, O2256 +2257, O2257 +2258, O2258 +2259, O2259 +2260, O2260 +2261, O2261 +2262, O2262 +2263, O2263 +2264, O2264 +2265, O2265 +2266, O2266 +2267, O2267 +2268, O2268 +2269, O2269 +2270, O2270 +2271, O2271 +2272, O2272 +2273, O2273 +2274, O2274 +2275, O2275 +2276, O2276 +2277, O2277 +2278, O2278 +2279, O2279 +2280, O2280 +2281, O2281 +2282, O2282 +2283, O2283 +2284, O2284 +2285, O2285 +2286, O2286 +2287, O2287 +2288, O2288 +2289, O2289 +2290, O2290 +2291, O2291 +2292, O2292 +2293, O2293 +2294, O2294 +2295, O2295 +2296, O2296 +2297, O2297 +2298, O2298 +2299, O2299 +2300, O2300 +2301, O2301 +2302, O2302 +2303, O2303 +2304, O2304 +2305, O2305 +2306, O2306 +2307, O2307 +2308, O2308 +2309, O2309 +2310, O2310 +2311, O2311 +2312, O2312 +2313, O2313 +2314, O2314 +2315, O2315 +2316, O2316 +2317, O2317 +2318, O2318 +2319, O2319 +2320, O2320 +2321, O2321 +2322, O2322 +2323, O2323 +2324, O2324 +2325, O2325 +2326, O2326 +2327, O2327 +2328, O2328 +2329, O2329 +2330, O2330 +2331, O2331 +2332, O2332 +2333, O2333 +2334, O2334 +2335, O2335 +2336, O2336 +2337, O2337 +2338, O2338 +2339, O2339 +2340, O2340 +2341, O2341 +2342, O2342 +2343, O2343 +2344, O2344 +2345, O2345 +2346, O2346 +2347, O2347 +2348, O2348 +2349, O2349 +2350, O2350 +2351, O2351 +2352, O2352 +2353, O2353 +2354, O2354 +2355, O2355 +2356, O2356 +2357, O2357 +2358, O2358 +2359, O2359 +2360, O2360 +2361, O2361 +2362, O2362 +2363, O2363 +2364, O2364 +2365, O2365 +2366, O2366 +2367, O2367 +2368, O2368 +2369, O2369 +2370, O2370 +2371, O2371 +2372, O2372 +2373, O2373 +2374, O2374 +2375, O2375 +2376, O2376 +2377, O2377 +2378, O2378 +2379, O2379 +2380, O2380 +2381, O2381 +2382, O2382 +2383, O2383 +2384, O2384 +2385, O2385 +2386, O2386 +2387, O2387 +2388, O2388 +2389, O2389 +2390, O2390 +2391, O2391 +2392, O2392 +2393, O2393 +2394, O2394 +2395, O2395 +2396, O2396 +2397, O2397 +2398, O2398 +2399, O2399 +2400, O2400 +2401, O2401 +2402, O2402 +2403, O2403 +2404, O2404 +2405, O2405 +2406, O2406 +2407, O2407 +2408, O2408 +2409, O2409 +2410, O2410 +2411, O2411 +2412, O2412 +2413, O2413 +2414, O2414 +2415, O2415 +2416, O2416 +2417, O2417 +2418, O2418 +2419, O2419 +2420, O2420 +2421, O2421 +2422, O2422 +2423, O2423 +2424, O2424 +2425, O2425 +2426, O2426 +2427, O2427 +2428, O2428 +2429, O2429 +2430, O2430 +2431, O2431 +2432, O2432 +2433, O2433 +2434, O2434 +2435, O2435 +2436, O2436 +2437, O2437 +2438, O2438 +2439, O2439 +2440, O2440 +2441, O2441 +2442, O2442 +2443, O2443 +2444, O2444 +2445, O2445 +2446, O2446 +2447, O2447 +2448, O2448 +2449, O2449 +2450, O2450 +2451, O2451 +2452, O2452 +2453, O2453 +2454, O2454 +2455, O2455 +2456, O2456 +2457, O2457 +2458, O2458 +2459, O2459 +2460, O2460 +2461, O2461 +2462, O2462 +2463, O2463 +2464, O2464 +2465, O2465 +2466, O2466 +2467, O2467 +2468, O2468 +2469, O2469 +2470, O2470 +2471, O2471 +2472, O2472 +2473, O2473 +2474, O2474 +2475, O2475 +2476, O2476 +2477, O2477 +2478, O2478 +2479, O2479 +2480, O2480 +2481, O2481 +2482, O2482 +2483, O2483 +2484, O2484 +2485, O2485 +2486, O2486 +2487, O2487 +2488, O2488 +2489, O2489 +2490, O2490 +2491, O2491 +2492, O2492 +2493, O2493 +2494, O2494 +2495, O2495 +2496, O2496 +2497, O2497 +2498, O2498 +2499, O2499 +2500, O2500 +2501, O2501 +2502, O2502 +2503, O2503 +2504, O2504 +2505, O2505 +2506, O2506 +2507, O2507 +2508, O2508 +2509, O2509 +2510, O2510 +2511, O2511 +2512, O2512 +2513, O2513 +2514, O2514 +2515, O2515 +2516, O2516 +2517, O2517 +2518, O2518 +2519, O2519 +2520, O2520 +2521, O2521 +2522, O2522 +2523, O2523 +2524, O2524 +2525, O2525 +2526, O2526 +2527, O2527 +2528, O2528 +2529, O2529 +2530, O2530 +2531, O2531 +2532, O2532 +2533, O2533 +2534, O2534 +2535, O2535 +2536, O2536 +2537, O2537 +2538, O2538 +2539, O2539 +2540, O2540 +2541, O2541 +2542, O2542 +2543, O2543 +2544, O2544 +2545, O2545 +2546, O2546 +2547, O2547 +2548, O2548 +2549, O2549 +2550, O2550 +2551, O2551 +2552, O2552 +2553, O2553 +2554, O2554 +2555, O2555 +2556, O2556 +2557, O2557 +2558, O2558 +2559, O2559 +2560, O2560 +2561, O2561 +2562, O2562 +2563, O2563 +2564, O2564 +2565, O2565 +2566, O2566 +2567, O2567 +2568, O2568 +2569, O2569 +2570, O2570 +2571, O2571 +2572, O2572 +2573, O2573 +2574, O2574 +2575, O2575 +2576, O2576 +2577, O2577 +2578, O2578 +2579, O2579 +2580, O2580 +2581, O2581 +2582, O2582 +2583, O2583 +2584, O2584 +2585, O2585 +2586, O2586 +2587, O2587 +2588, O2588 +2589, O2589 +2590, O2590 +2591, O2591 +2592, O2592 +2593, O2593 +2594, O2594 +2595, O2595 +2596, O2596 +2597, O2597 +2598, O2598 +2599, O2599 +2600, O2600 +2601, O2601 +2602, O2602 +2603, O2603 +2604, O2604 +2605, O2605 +2606, O2606 +2607, O2607 +2608, O2608 +2609, O2609 +2610, O2610 +2611, O2611 +2612, O2612 +2613, O2613 +2614, O2614 +2615, O2615 +2616, O2616 +2617, O2617 +2618, O2618 +2619, O2619 +2620, O2620 +2621, O2621 +2622, O2622 +2623, O2623 +2624, O2624 +2625, O2625 +2626, O2626 +2627, O2627 +2628, O2628 +2629, O2629 +2630, O2630 +2631, O2631 +2632, O2632 +2633, O2633 +2634, O2634 +2635, O2635 +2636, O2636 +2637, O2637 +2638, O2638 +2639, O2639 +2640, O2640 +2641, O2641 +2642, O2642 +2643, O2643 +2644, O2644 +2645, O2645 +2646, O2646 +2647, O2647 +2648, O2648 +2649, O2649 +2650, O2650 +2651, O2651 +2652, O2652 +2653, O2653 +2654, O2654 +2655, O2655 +2656, O2656 +2657, O2657 +2658, O2658 +2659, O2659 +2660, O2660 +2661, O2661 +2662, O2662 +2663, O2663 +2664, O2664 +2665, O2665 +2666, O2666 +2667, O2667 +2668, O2668 +2669, O2669 +2670, O2670 +2671, O2671 +2672, O2672 +2673, O2673 +2674, O2674 +2675, O2675 +2676, O2676 +2677, O2677 +2678, O2678 +2679, O2679 +2680, O2680 +2681, O2681 +2682, O2682 +2683, O2683 +2684, O2684 +2685, O2685 +2686, O2686 +2687, O2687 +2688, O2688 +2689, O2689 +2690, O2690 +2691, O2691 +2692, O2692 +2693, O2693 +2694, O2694 +2695, O2695 +2696, O2696 +2697, O2697 +2698, O2698 +2699, O2699 +2700, O2700 +2701, O2701 +2702, O2702 +2703, O2703 +2704, O2704 +2705, O2705 +2706, O2706 +2707, O2707 +2708, O2708 +2709, O2709 +2710, O2710 +2711, O2711 +2712, O2712 +2713, O2713 +2714, O2714 +2715, O2715 +2716, O2716 +2717, O2717 +2718, O2718 +2719, O2719 +2720, O2720 +2721, O2721 +2722, O2722 +2723, O2723 +2724, O2724 +2725, O2725 +2726, O2726 +2727, O2727 +2728, O2728 +2729, O2729 +2730, O2730 +2731, O2731 +2732, O2732 +2733, O2733 +2734, O2734 +2735, O2735 +2736, O2736 +2737, O2737 +2738, O2738 +2739, O2739 +2740, O2740 +2741, O2741 +2742, O2742 +2743, O2743 +2744, O2744 +2745, O2745 +2746, O2746 +2747, O2747 +2748, O2748 +2749, O2749 +2750, O2750 +2751, O2751 +2752, O2752 +2753, O2753 +2754, O2754 +2755, O2755 +2756, O2756 +2757, O2757 +2758, O2758 +2759, O2759 +2760, O2760 +2761, O2761 +2762, O2762 +2763, O2763 +2764, O2764 +2765, O2765 +2766, O2766 +2767, O2767 +2768, O2768 +2769, O2769 +2770, O2770 +2771, O2771 +2772, O2772 +2773, O2773 +2774, O2774 +2775, O2775 +2776, O2776 +2777, O2777 +2778, O2778 +2779, O2779 +2780, O2780 +2781, O2781 +2782, O2782 +2783, O2783 +2784, O2784 +2785, O2785 +2786, O2786 +2787, O2787 +2788, O2788 +2789, O2789 +2790, O2790 +2791, O2791 +2792, O2792 +2793, O2793 +2794, O2794 +2795, O2795 +2796, O2796 +2797, O2797 +2798, O2798 +2799, O2799 +2800, O2800 +2801, O2801 +2802, O2802 +2803, O2803 +2804, O2804 +2805, O2805 +2806, O2806 +2807, O2807 +2808, O2808 +2809, O2809 +2810, O2810 +2811, O2811 +2812, O2812 +2813, O2813 +2814, O2814 +2815, O2815 +2816, O2816 +2817, O2817 +2818, O2818 +2819, O2819 +2820, O2820 +2821, O2821 +2822, O2822 +2823, O2823 +2824, O2824 +2825, O2825 +2826, O2826 +2827, O2827 +2828, O2828 +2829, O2829 +2830, O2830 +2831, O2831 +2832, O2832 +2833, O2833 +2834, O2834 +2835, O2835 +2836, O2836 +2837, O2837 +2838, O2838 +2839, O2839 +2840, O2840 +2841, O2841 +2842, O2842 +2843, O2843 +2844, O2844 +2845, O2845 +2846, O2846 +2847, O2847 +2848, O2848 +2849, O2849 +2850, O2850 +2851, O2851 +2852, O2852 +2853, O2853 +2854, O2854 +2855, O2855 +2856, O2856 +2857, O2857 +2858, O2858 +2859, O2859 +2860, O2860 +2861, O2861 +2862, O2862 +2863, O2863 +2864, O2864 +2865, O2865 +2866, O2866 +2867, O2867 +2868, O2868 +2869, O2869 +2870, O2870 +2871, O2871 +2872, O2872 +2873, O2873 +2874, O2874 +2875, O2875 +2876, O2876 +2877, O2877 +2878, O2878 +2879, O2879 +2880, O2880 +2881, O2881 +2882, O2882 +2883, O2883 +2884, O2884 +2885, O2885 +2886, O2886 +2887, O2887 +2888, O2888 +2889, O2889 +2890, O2890 +2891, O2891 +2892, O2892 +2893, O2893 +2894, O2894 +2895, O2895 +2896, O2896 +2897, O2897 +2898, O2898 +2899, O2899 +2900, O2900 +2901, O2901 +2902, O2902 +2903, O2903 +2904, O2904 +2905, O2905 +2906, O2906 +2907, O2907 +2908, O2908 +2909, O2909 +2910, O2910 +2911, O2911 +2912, O2912 +2913, O2913 +2914, O2914 +2915, O2915 +2916, O2916 +2917, O2917 +2918, O2918 +2919, O2919 +2920, O2920 +2921, O2921 +2922, O2922 +2923, O2923 +2924, O2924 +2925, O2925 +2926, O2926 +2927, O2927 +2928, O2928 +2929, O2929 +2930, O2930 +2931, O2931 +2932, O2932 +2933, O2933 +2934, O2934 +2935, O2935 +2936, O2936 +2937, O2937 +2938, O2938 +2939, O2939 +2940, O2940 +2941, O2941 +2942, O2942 +2943, O2943 +2944, O2944 +2945, O2945 +2946, O2946 +2947, O2947 +2948, O2948 +2949, O2949 +2950, O2950 +2951, O2951 +2952, O2952 +2953, O2953 +2954, O2954 +2955, O2955 +2956, O2956 +2957, O2957 +2958, O2958 +2959, O2959 +2960, O2960 +2961, O2961 +2962, O2962 +2963, O2963 +2964, O2964 +2965, O2965 +2966, O2966 +2967, O2967 +2968, O2968 +2969, O2969 +2970, O2970 +2971, O2971 +2972, O2972 +2973, O2973 +2974, O2974 +2975, O2975 +2976, O2976 +2977, O2977 +2978, O2978 +2979, O2979 +2980, O2980 +2981, O2981 +2982, O2982 +2983, O2983 +2984, O2984 +2985, O2985 +2986, O2986 +2987, O2987 +2988, O2988 +2989, O2989 +2990, O2990 +2991, O2991 +2992, O2992 +2993, O2993 +2994, O2994 +2995, O2995 +2996, O2996 +2997, O2997 +2998, O2998 +2999, O2999 +3000, O3000 +3001, O3001 +3002, O3002 +3003, O3003 +3004, O3004 +3005, O3005 +3006, O3006 +3007, O3007 +3008, O3008 +3009, O3009 +3010, O3010 +3011, O3011 +3012, O3012 +3013, O3013 +3014, O3014 +3015, O3015 +3016, O3016 +3017, O3017 +3018, O3018 +3019, O3019 +3020, O3020 +3021, O3021 +3022, O3022 +3023, O3023 +3024, O3024 +3025, O3025 +3026, O3026 +3027, O3027 +3028, O3028 +3029, O3029 +3030, O3030 +3031, O3031 +3032, O3032 +3033, O3033 +3034, O3034 +3035, O3035 +3036, O3036 +3037, O3037 +3038, O3038 +3039, O3039 +3040, O3040 +3041, O3041 +3042, O3042 +3043, O3043 +3044, O3044 +3045, O3045 +3046, O3046 +3047, O3047 +3048, O3048 +3049, O3049 +3050, O3050 +3051, O3051 +3052, O3052 +3053, O3053 +3054, O3054 +3055, O3055 +3056, O3056 +3057, O3057 +3058, O3058 +3059, O3059 +3060, O3060 +3061, O3061 +3062, O3062 +3063, O3063 +3064, O3064 +3065, O3065 +3066, O3066 +3067, O3067 +3068, O3068 +3069, O3069 +3070, O3070 +3071, O3071 +3072, O3072 +3073, O3073 +3074, O3074 +3075, O3075 +3076, O3076 +3077, O3077 +3078, O3078 +3079, O3079 +3080, O3080 +3081, O3081 +3082, O3082 +3083, O3083 +3084, O3084 +3085, O3085 +3086, O3086 +3087, O3087 +3088, O3088 +3089, O3089 +3090, O3090 +3091, O3091 +3092, O3092 +3093, O3093 +3094, O3094 +3095, O3095 +3096, O3096 +3097, O3097 +3098, O3098 +3099, O3099 +3100, O3100 +3101, O3101 +3102, O3102 +3103, O3103 +3104, O3104 +3105, O3105 +3106, O3106 +3107, O3107 +3108, O3108 +3109, O3109 +3110, O3110 +3111, O3111 +3112, O3112 +3113, O3113 +3114, O3114 +3115, O3115 +3116, O3116 +3117, O3117 +3118, O3118 +3119, O3119 +3120, O3120 +3121, O3121 +3122, O3122 +3123, O3123 +3124, O3124 +3125, O3125 +3126, O3126 +3127, O3127 +3128, O3128 +3129, O3129 +3130, O3130 +3131, O3131 +3132, O3132 +3133, O3133 +3134, O3134 +3135, O3135 +3136, O3136 +3137, O3137 +3138, O3138 +3139, O3139 +3140, O3140 +3141, O3141 +3142, O3142 +3143, O3143 +3144, O3144 +3145, O3145 +3146, O3146 +3147, O3147 +3148, O3148 +3149, O3149 +3150, O3150 +3151, O3151 +3152, O3152 +3153, O3153 +3154, O3154 +3155, O3155 +3156, O3156 +3157, O3157 +3158, O3158 +3159, O3159 +3160, O3160 +3161, O3161 +3162, O3162 +3163, O3163 +3164, O3164 +3165, O3165 +3166, O3166 +3167, O3167 +3168, O3168 +3169, O3169 +3170, O3170 +3171, O3171 +3172, O3172 +3173, O3173 +3174, O3174 +3175, O3175 +3176, O3176 +3177, O3177 +3178, O3178 +3179, O3179 +3180, O3180 +3181, O3181 +3182, O3182 +3183, O3183 +3184, O3184 +3185, O3185 +3186, O3186 +3187, O3187 +3188, O3188 +3189, O3189 +3190, O3190 +3191, O3191 +3192, O3192 +3193, O3193 +3194, O3194 +3195, O3195 +3196, O3196 +3197, O3197 +3198, O3198 +3199, O3199 +3200, O3200 +3201, O3201 +3202, O3202 +3203, O3203 +3204, O3204 +3205, O3205 +3206, O3206 +3207, O3207 +3208, O3208 +3209, O3209 +3210, O3210 +3211, O3211 +3212, O3212 +3213, O3213 +3214, O3214 +3215, O3215 +3216, O3216 +3217, O3217 +3218, O3218 +3219, O3219 +3220, O3220 +3221, O3221 +3222, O3222 +3223, O3223 +3224, O3224 +3225, O3225 +3226, O3226 +3227, O3227 +3228, O3228 +3229, O3229 +3230, O3230 +3231, O3231 +3232, O3232 +3233, O3233 +3234, O3234 +3235, O3235 +3236, O3236 +3237, O3237 +3238, O3238 +3239, O3239 +3240, O3240 +3241, O3241 +3242, O3242 +3243, O3243 +3244, O3244 +3245, O3245 +3246, O3246 +3247, O3247 +3248, O3248 +3249, O3249 +3250, O3250 +3251, O3251 +3252, O3252 +3253, O3253 +3254, O3254 +3255, O3255 +3256, O3256 +3257, O3257 +3258, O3258 +3259, O3259 +3260, O3260 +3261, O3261 +3262, O3262 +3263, O3263 +3264, O3264 +3265, O3265 +3266, O3266 +3267, O3267 +3268, O3268 +3269, O3269 +3270, O3270 +3271, O3271 +3272, O3272 +3273, O3273 +3274, O3274 +3275, O3275 +3276, O3276 +3277, O3277 +3278, O3278 +3279, O3279 +3280, O3280 +3281, O3281 +3282, O3282 +3283, O3283 +3284, O3284 +3285, O3285 +3286, O3286 +3287, O3287 +3288, O3288 +3289, O3289 +3290, O3290 +3291, O3291 +3292, O3292 +3293, O3293 +3294, O3294 +3295, O3295 +3296, O3296 +3297, O3297 +3298, O3298 +3299, O3299 +3300, O3300 +3301, O3301 +3302, O3302 +3303, O3303 +3304, O3304 +3305, O3305 +3306, O3306 +3307, O3307 +3308, O3308 +3309, O3309 +3310, O3310 +3311, O3311 +3312, O3312 +3313, O3313 +3314, O3314 +3315, O3315 +3316, O3316 +3317, O3317 +3318, O3318 +3319, O3319 +3320, O3320 +3321, O3321 +3322, O3322 +3323, O3323 +3324, O3324 +3325, O3325 +3326, O3326 +3327, O3327 +3328, O3328 +3329, O3329 +3330, O3330 +3331, O3331 +3332, O3332 +3333, O3333 +3334, O3334 +3335, O3335 +3336, O3336 +3337, O3337 +3338, O3338 +3339, O3339 +3340, O3340 +3341, O3341 +3342, O3342 +3343, O3343 +3344, O3344 +3345, O3345 +3346, O3346 +3347, O3347 +3348, O3348 +3349, O3349 +3350, O3350 +3351, O3351 +3352, O3352 +3353, O3353 +3354, O3354 +3355, O3355 +3356, O3356 +3357, O3357 +3358, O3358 +3359, O3359 +3360, O3360 +3361, O3361 +3362, O3362 +3363, O3363 +3364, O3364 +3365, O3365 +3366, O3366 +3367, O3367 +3368, O3368 +3369, O3369 +3370, O3370 +3371, O3371 +3372, O3372 +3373, O3373 +3374, O3374 +3375, O3375 +3376, O3376 +3377, O3377 +3378, O3378 +3379, O3379 +3380, O3380 +3381, O3381 +3382, O3382 +3383, O3383 +3384, O3384 +3385, O3385 +3386, O3386 +3387, O3387 +3388, O3388 +3389, O3389 +3390, O3390 +3391, O3391 +3392, O3392 +3393, O3393 +3394, O3394 +3395, O3395 +3396, O3396 +3397, O3397 +3398, O3398 +3399, O3399 +3400, O3400 +3401, O3401 +3402, O3402 +3403, O3403 +3404, O3404 +3405, O3405 +3406, O3406 +3407, O3407 +3408, O3408 +3409, O3409 +3410, O3410 +3411, O3411 +3412, O3412 +3413, O3413 +3414, O3414 +3415, O3415 +3416, O3416 +3417, O3417 +3418, O3418 +3419, O3419 +3420, O3420 +3421, O3421 +3422, O3422 +3423, O3423 +3424, O3424 +3425, O3425 +3426, O3426 +3427, O3427 +3428, O3428 +3429, O3429 +3430, O3430 +3431, O3431 +3432, O3432 +3433, O3433 +3434, O3434 +3435, O3435 +3436, O3436 +3437, O3437 +3438, O3438 +3439, O3439 +3440, O3440 +3441, O3441 +3442, O3442 +3443, O3443 +3444, O3444 +3445, O3445 +3446, O3446 +3447, O3447 +3448, O3448 +3449, O3449 +3450, O3450 +3451, O3451 +3452, O3452 +3453, O3453 +3454, O3454 +3455, O3455 +3456, O3456 +3457, O3457 +3458, O3458 +3459, O3459 +3460, O3460 +3461, O3461 +3462, O3462 +3463, O3463 +3464, O3464 +3465, O3465 +3466, O3466 +3467, O3467 +3468, O3468 +3469, O3469 +3470, O3470 +3471, O3471 +3472, O3472 +3473, O3473 +3474, O3474 +3475, O3475 +3476, O3476 +3477, O3477 +3478, O3478 +3479, O3479 +3480, O3480 +3481, O3481 +3482, O3482 +3483, O3483 +3484, O3484 +3485, O3485 +3486, O3486 +3487, O3487 +3488, O3488 +3489, O3489 +3490, O3490 +3491, O3491 +3492, O3492 +3493, O3493 +3494, O3494 +3495, O3495 +3496, O3496 +3497, O3497 +3498, O3498 +3499, O3499 +3500, O3500 +3501, O3501 +3502, O3502 +3503, O3503 +3504, O3504 +3505, O3505 +3506, O3506 +3507, O3507 +3508, O3508 +3509, O3509 +3510, O3510 +3511, O3511 +3512, O3512 +3513, O3513 +3514, O3514 +3515, O3515 +3516, O3516 +3517, O3517 +3518, O3518 +3519, O3519 +3520, O3520 +3521, O3521 +3522, O3522 +3523, O3523 +3524, O3524 +3525, O3525 +3526, O3526 +3527, O3527 +3528, O3528 +3529, O3529 +3530, O3530 +3531, O3531 +3532, O3532 +3533, O3533 +3534, O3534 +3535, O3535 +3536, O3536 +3537, O3537 +3538, O3538 +3539, O3539 +3540, O3540 +3541, O3541 +3542, O3542 +3543, O3543 +3544, O3544 +3545, O3545 +3546, O3546 +3547, O3547 +3548, O3548 +3549, O3549 +3550, O3550 +3551, O3551 +3552, O3552 +3553, O3553 +3554, O3554 +3555, O3555 +3556, O3556 +3557, O3557 +3558, O3558 +3559, O3559 +3560, O3560 +3561, O3561 +3562, O3562 +3563, O3563 +3564, O3564 +3565, O3565 +3566, O3566 +3567, O3567 +3568, O3568 +3569, O3569 +3570, O3570 +3571, O3571 +3572, O3572 +3573, O3573 +3574, O3574 +3575, O3575 +3576, O3576 +3577, O3577 +3578, O3578 +3579, O3579 +3580, O3580 +3581, O3581 +3582, O3582 +3583, O3583 +3584, O3584 +3585, O3585 +3586, O3586 +3587, O3587 +3588, O3588 +3589, O3589 +3590, O3590 +3591, O3591 +3592, O3592 +3593, O3593 +3594, O3594 +3595, O3595 +3596, O3596 +3597, O3597 +3598, O3598 +3599, O3599 +3600, O3600 +3601, O3601 +3602, O3602 +3603, O3603 +3604, O3604 +3605, O3605 +3606, O3606 +3607, O3607 +3608, O3608 +3609, O3609 +3610, O3610 +3611, O3611 +3612, O3612 +3613, O3613 +3614, O3614 +3615, O3615 +3616, O3616 +3617, O3617 +3618, O3618 +3619, O3619 +3620, O3620 +3621, O3621 +3622, O3622 +3623, O3623 +3624, O3624 +3625, O3625 +3626, O3626 +3627, O3627 +3628, O3628 +3629, O3629 +3630, O3630 +3631, O3631 +3632, O3632 +3633, O3633 +3634, O3634 +3635, O3635 +3636, O3636 +3637, O3637 +3638, O3638 +3639, O3639 +3640, O3640 +3641, O3641 +3642, O3642 +3643, O3643 +3644, O3644 +3645, O3645 +3646, O3646 +3647, O3647 +3648, O3648 +3649, O3649 +3650, O3650 +3651, O3651 +3652, O3652 +3653, O3653 +3654, O3654 +3655, O3655 +3656, O3656 +3657, O3657 +3658, O3658 +3659, O3659 +3660, O3660 +3661, O3661 +3662, O3662 +3663, O3663 +3664, O3664 +3665, O3665 +3666, O3666 +3667, O3667 +3668, O3668 +3669, O3669 +3670, O3670 +3671, O3671 +3672, O3672 +3673, O3673 +3674, O3674 +3675, O3675 +3676, O3676 +3677, O3677 +3678, O3678 +3679, O3679 +3680, O3680 +3681, O3681 +3682, O3682 +3683, O3683 +3684, O3684 +3685, O3685 +3686, O3686 +3687, O3687 +3688, O3688 +3689, O3689 +3690, O3690 +3691, O3691 +3692, O3692 +3693, O3693 +3694, O3694 +3695, O3695 +3696, O3696 +3697, O3697 +3698, O3698 +3699, O3699 +3700, O3700 +3701, O3701 +3702, O3702 +3703, O3703 +3704, O3704 +3705, O3705 +3706, O3706 +3707, O3707 +3708, O3708 +3709, O3709 +3710, O3710 +3711, O3711 +3712, O3712 +3713, O3713 +3714, O3714 +3715, O3715 +3716, O3716 +3717, O3717 +3718, O3718 +3719, O3719 +3720, O3720 +3721, O3721 +3722, O3722 +3723, O3723 +3724, O3724 +3725, O3725 +3726, O3726 +3727, O3727 +3728, O3728 +3729, O3729 +3730, O3730 +3731, O3731 +3732, O3732 +3733, O3733 +3734, O3734 +3735, O3735 +3736, O3736 +3737, O3737 +3738, O3738 +3739, O3739 +3740, O3740 +3741, O3741 +3742, O3742 +3743, O3743 +3744, O3744 +3745, O3745 +3746, O3746 +3747, O3747 +3748, O3748 +3749, O3749 +3750, O3750 +3751, O3751 +3752, O3752 +3753, O3753 +3754, O3754 +3755, O3755 +3756, O3756 +3757, O3757 +3758, O3758 +3759, O3759 +3760, O3760 +3761, O3761 +3762, O3762 +3763, O3763 +3764, O3764 +3765, O3765 +3766, O3766 +3767, O3767 +3768, O3768 +3769, O3769 +3770, O3770 +3771, O3771 +3772, O3772 +3773, O3773 +3774, O3774 +3775, O3775 +3776, O3776 +3777, O3777 +3778, O3778 +3779, O3779 +3780, O3780 +3781, O3781 +3782, O3782 +3783, O3783 +3784, O3784 +3785, O3785 +3786, O3786 +3787, O3787 +3788, O3788 +3789, O3789 +3790, O3790 +3791, O3791 +3792, O3792 +3793, O3793 +3794, O3794 +3795, O3795 +3796, O3796 +3797, O3797 +3798, O3798 +3799, O3799 +3800, O3800 +3801, O3801 +3802, O3802 +3803, O3803 +3804, O3804 +3805, O3805 +3806, O3806 +3807, O3807 +3808, O3808 +3809, O3809 +3810, O3810 +3811, O3811 +3812, O3812 +3813, O3813 +3814, O3814 +3815, O3815 +3816, O3816 +3817, O3817 +3818, O3818 +3819, O3819 +3820, O3820 +3821, O3821 +3822, O3822 +3823, O3823 +3824, O3824 +3825, O3825 +3826, O3826 +3827, O3827 +3828, O3828 +3829, O3829 +3830, O3830 +3831, O3831 +3832, O3832 +3833, O3833 +3834, O3834 +3835, O3835 +3836, O3836 +3837, O3837 +3838, O3838 +3839, O3839 +3840, O3840 +3841, O3841 +3842, O3842 +3843, O3843 +3844, O3844 +3845, O3845 +3846, O3846 +3847, O3847 +3848, O3848 +3849, O3849 +3850, O3850 +3851, O3851 +3852, O3852 +3853, O3853 +3854, O3854 +3855, O3855 +3856, O3856 +3857, O3857 +3858, O3858 +3859, O3859 +3860, O3860 +3861, O3861 +3862, O3862 +3863, O3863 +3864, O3864 +3865, O3865 +3866, O3866 +3867, O3867 +3868, O3868 +3869, O3869 +3870, O3870 +3871, O3871 +3872, O3872 +3873, O3873 +3874, O3874 +3875, O3875 +3876, O3876 +3877, O3877 +3878, O3878 +3879, O3879 +3880, O3880 +3881, O3881 +3882, O3882 +3883, O3883 +3884, O3884 +3885, O3885 +3886, O3886 +3887, O3887 +3888, O3888 +3889, O3889 +3890, O3890 +3891, O3891 +3892, O3892 +3893, O3893 +3894, O3894 +3895, O3895 +3896, O3896 +3897, O3897 +3898, O3898 +3899, O3899 +3900, O3900 +3901, O3901 +3902, O3902 +3903, O3903 +3904, O3904 +3905, O3905 +3906, O3906 +3907, O3907 +3908, O3908 +3909, O3909 +3910, O3910 +3911, O3911 +3912, O3912 +3913, O3913 +3914, O3914 +3915, O3915 +3916, O3916 +3917, O3917 +3918, O3918 +3919, O3919 +3920, O3920 +3921, O3921 +3922, O3922 +3923, O3923 +3924, O3924 +3925, O3925 +3926, O3926 +3927, O3927 +3928, O3928 +3929, O3929 +3930, O3930 +3931, O3931 +3932, O3932 +3933, O3933 +3934, O3934 +3935, O3935 +3936, O3936 +3937, O3937 +3938, O3938 +3939, O3939 +3940, O3940 +3941, O3941 +3942, O3942 +3943, O3943 +3944, O3944 +3945, O3945 +3946, O3946 +3947, O3947 +3948, O3948 +3949, O3949 +3950, O3950 +3951, O3951 +3952, O3952 +3953, O3953 +3954, O3954 +3955, O3955 +3956, O3956 +3957, O3957 +3958, O3958 +3959, O3959 +3960, O3960 +3961, O3961 +3962, O3962 +3963, O3963 +3964, O3964 +3965, O3965 +3966, O3966 +3967, O3967 +3968, O3968 +3969, O3969 +3970, O3970 +3971, O3971 +3972, O3972 +3973, O3973 +3974, O3974 +3975, O3975 +3976, O3976 +3977, O3977 +3978, O3978 +3979, O3979 +3980, O3980 +3981, O3981 +3982, O3982 +3983, O3983 +3984, O3984 +3985, O3985 +3986, O3986 +3987, O3987 +3988, O3988 +3989, O3989 +3990, O3990 +3991, O3991 +3992, O3992 +3993, O3993 +3994, O3994 +3995, O3995 +3996, O3996 +3997, O3997 +3998, O3998 +3999, O3999 +4000, O4000 +4001, O4001 +4002, O4002 +4003, O4003 +4004, O4004 +4005, O4005 +4006, O4006 +4007, O4007 +4008, O4008 +4009, O4009 +4010, O4010 +4011, O4011 +4012, O4012 +4013, O4013 +4014, O4014 +4015, O4015 +4016, O4016 +4017, O4017 +4018, O4018 +4019, O4019 +4020, O4020 +4021, O4021 +4022, O4022 +4023, O4023 +4024, O4024 +4025, O4025 +4026, O4026 +4027, O4027 +4028, O4028 +4029, O4029 +4030, O4030 +4031, O4031 +4032, O4032 +4033, O4033 +4034, O4034 +4035, O4035 +4036, O4036 +4037, O4037 +4038, O4038 +4039, O4039 +4040, O4040 +4041, O4041 +4042, O4042 +4043, O4043 +4044, O4044 +4045, O4045 +4046, O4046 +4047, O4047 +4048, O4048 +4049, O4049 +4050, O4050 +4051, O4051 +4052, O4052 +4053, O4053 +4054, O4054 +4055, O4055 +4056, O4056 +4057, O4057 +4058, O4058 +4059, O4059 +4060, O4060 +4061, O4061 +4062, O4062 +4063, O4063 +4064, O4064 +4065, O4065 +4066, O4066 +4067, O4067 +4068, O4068 +4069, O4069 +4070, O4070 +4071, O4071 +4072, O4072 +4073, O4073 +4074, O4074 +4075, O4075 +4076, O4076 +4077, O4077 +4078, O4078 +4079, O4079 +4080, O4080 +4081, O4081 +4082, O4082 +4083, O4083 +4084, O4084 +4085, O4085 +4086, O4086 +4087, O4087 +4088, O4088 +4089, O4089 +4090, O4090 +4091, O4091 +4092, O4092 +4093, O4093 +4094, O4094 +4095, O4095 +4096, O4096 +4097, O4097 +4098, O4098 +4099, O4099 +4100, O4100 +4101, O4101 +4102, O4102 +4103, O4103 +4104, O4104 +4105, O4105 +4106, O4106 +4107, O4107 +4108, O4108 +4109, O4109 +4110, O4110 +4111, O4111 +4112, O4112 +4113, O4113 +4114, O4114 +4115, O4115 +4116, O4116 +4117, O4117 +4118, O4118 +4119, O4119 +4120, O4120 +4121, O4121 +4122, O4122 +4123, O4123 +4124, O4124 +4125, O4125 +4126, O4126 +4127, O4127 +4128, O4128 +4129, O4129 +4130, O4130 +4131, O4131 +4132, O4132 +4133, O4133 +4134, O4134 +4135, O4135 +4136, O4136 +4137, O4137 +4138, O4138 +4139, O4139 +4140, O4140 +4141, O4141 +4142, O4142 +4143, O4143 +4144, O4144 +4145, O4145 +4146, O4146 +4147, O4147 +4148, O4148 +4149, O4149 +4150, O4150 +4151, O4151 +4152, O4152 +4153, O4153 +4154, O4154 +4155, O4155 +4156, O4156 +4157, O4157 +4158, O4158 +4159, O4159 +4160, O4160 +4161, O4161 +4162, O4162 +4163, O4163 +4164, O4164 +4165, O4165 +4166, O4166 +4167, O4167 +4168, O4168 +4169, O4169 +4170, O4170 +4171, O4171 +4172, O4172 +4173, O4173 +4174, O4174 +4175, O4175 +4176, O4176 +4177, O4177 +4178, O4178 +4179, O4179 +4180, O4180 +4181, O4181 +4182, O4182 +4183, O4183 +4184, O4184 +4185, O4185 +4186, O4186 +4187, O4187 +4188, O4188 +4189, O4189 +4190, O4190 +4191, O4191 +4192, O4192 +4193, O4193 +4194, O4194 +4195, O4195 +4196, O4196 +4197, O4197 +4198, O4198 +4199, O4199 +4200, O4200 +4201, O4201 +4202, O4202 +4203, O4203 +4204, O4204 +4205, O4205 +4206, O4206 +4207, O4207 +4208, O4208 +4209, O4209 +4210, O4210 +4211, O4211 +4212, O4212 +4213, O4213 +4214, O4214 +4215, O4215 +4216, O4216 +4217, O4217 +4218, O4218 +4219, O4219 +4220, O4220 +4221, O4221 +4222, O4222 +4223, O4223 +4224, O4224 +4225, O4225 +4226, O4226 +4227, O4227 +4228, O4228 +4229, O4229 +4230, O4230 +4231, O4231 +4232, O4232 +4233, O4233 +4234, O4234 +4235, O4235 +4236, O4236 +4237, O4237 +4238, O4238 +4239, O4239 +4240, O4240 +4241, O4241 +4242, O4242 +4243, O4243 +4244, O4244 +4245, O4245 +4246, O4246 +4247, O4247 +4248, O4248 +4249, O4249 +4250, O4250 +4251, O4251 +4252, O4252 +4253, O4253 +4254, O4254 +4255, O4255 +4256, O4256 +4257, O4257 +4258, O4258 +4259, O4259 +4260, O4260 +4261, O4261 +4262, O4262 +4263, O4263 +4264, O4264 +4265, O4265 +4266, O4266 +4267, O4267 +4268, O4268 +4269, O4269 +4270, O4270 +4271, O4271 +4272, O4272 +4273, O4273 +4274, O4274 +4275, O4275 +4276, O4276 +4277, O4277 +4278, O4278 +4279, O4279 +4280, O4280 +4281, O4281 +4282, O4282 +4283, O4283 +4284, O4284 +4285, O4285 +4286, O4286 +4287, O4287 +4288, O4288 +4289, O4289 +4290, O4290 +4291, O4291 +4292, O4292 +4293, O4293 +4294, O4294 +4295, O4295 +4296, O4296 +4297, O4297 +4298, O4298 +4299, O4299 +4300, O4300 +4301, O4301 +4302, O4302 +4303, O4303 +4304, O4304 +4305, O4305 +4306, O4306 +4307, O4307 +4308, O4308 +4309, O4309 +4310, O4310 +4311, O4311 +4312, O4312 +4313, O4313 +4314, O4314 +4315, O4315 +4316, O4316 +4317, O4317 +4318, O4318 +4319, O4319 +4320, O4320 +4321, O4321 +4322, O4322 +4323, O4323 +4324, O4324 +4325, O4325 +4326, O4326 +4327, O4327 +4328, O4328 +4329, O4329 +4330, O4330 +4331, O4331 +4332, O4332 +4333, O4333 +4334, O4334 +4335, O4335 +4336, O4336 +4337, O4337 +4338, O4338 +4339, O4339 +4340, O4340 +4341, O4341 +4342, O4342 +4343, O4343 +4344, O4344 +4345, O4345 +4346, O4346 +4347, O4347 +4348, O4348 +4349, O4349 +4350, O4350 +4351, O4351 +4352, O4352 +4353, O4353 +4354, O4354 +4355, O4355 +4356, O4356 +4357, O4357 +4358, O4358 +4359, O4359 +4360, O4360 +4361, O4361 +4362, O4362 +4363, O4363 +4364, O4364 +4365, O4365 +4366, O4366 +4367, O4367 +4368, O4368 +4369, O4369 +4370, O4370 +4371, O4371 +4372, O4372 +4373, O4373 +4374, O4374 +4375, O4375 +4376, O4376 +4377, O4377 +4378, O4378 +4379, O4379 +4380, O4380 +4381, O4381 +4382, O4382 +4383, O4383 +4384, O4384 +4385, O4385 +4386, O4386 +4387, O4387 +4388, O4388 +4389, O4389 +4390, O4390 +4391, O4391 +4392, O4392 +4393, O4393 +4394, O4394 +4395, O4395 +4396, O4396 +4397, O4397 +4398, O4398 +4399, O4399 +4400, O4400 +4401, O4401 +4402, O4402 +4403, O4403 +4404, O4404 +4405, O4405 +4406, O4406 +4407, O4407 +4408, O4408 +4409, O4409 +4410, O4410 +4411, O4411 +4412, O4412 +4413, O4413 +4414, O4414 +4415, O4415 +4416, O4416 +4417, O4417 +4418, O4418 +4419, O4419 +4420, O4420 +4421, O4421 +4422, O4422 +4423, O4423 +4424, O4424 +4425, O4425 +4426, O4426 +4427, O4427 +4428, O4428 +4429, O4429 +4430, O4430 +4431, O4431 +4432, O4432 +4433, O4433 +4434, O4434 +4435, O4435 +4436, O4436 +4437, O4437 +4438, O4438 +4439, O4439 +4440, O4440 +4441, O4441 +4442, O4442 +4443, O4443 +4444, O4444 +4445, O4445 +4446, O4446 +4447, O4447 +4448, O4448 +4449, O4449 +4450, O4450 +4451, O4451 +4452, O4452 +4453, O4453 +4454, O4454 +4455, O4455 +4456, O4456 +4457, O4457 +4458, O4458 +4459, O4459 +4460, O4460 +4461, O4461 +4462, O4462 +4463, O4463 +4464, O4464 +4465, O4465 +4466, O4466 +4467, O4467 +4468, O4468 +4469, O4469 +4470, O4470 +4471, O4471 +4472, O4472 +4473, O4473 +4474, O4474 +4475, O4475 +4476, O4476 +4477, O4477 +4478, O4478 +4479, O4479 +4480, O4480 +4481, O4481 +4482, O4482 +4483, O4483 +4484, O4484 +4485, O4485 +4486, O4486 +4487, O4487 +4488, O4488 +4489, O4489 +4490, O4490 +4491, O4491 +4492, O4492 +4493, O4493 +4494, O4494 +4495, O4495 +4496, O4496 +4497, O4497 +4498, O4498 +4499, O4499 +4500, O4500 +4501, O4501 +4502, O4502 +4503, O4503 +4504, O4504 +4505, O4505 +4506, O4506 +4507, O4507 +4508, O4508 +4509, O4509 +4510, O4510 +4511, O4511 +4512, O4512 +4513, O4513 +4514, O4514 +4515, O4515 +4516, O4516 +4517, O4517 +4518, O4518 +4519, O4519 +4520, O4520 +4521, O4521 +4522, O4522 +4523, O4523 +4524, O4524 +4525, O4525 +4526, O4526 +4527, O4527 +4528, O4528 +4529, O4529 +4530, O4530 +4531, O4531 +4532, O4532 +4533, O4533 +4534, O4534 +4535, O4535 +4536, O4536 +4537, O4537 +4538, O4538 +4539, O4539 +4540, O4540 +4541, O4541 +4542, O4542 +4543, O4543 +4544, O4544 +4545, O4545 +4546, O4546 +4547, O4547 +4548, O4548 +4549, O4549 +4550, O4550 +4551, O4551 +4552, O4552 +4553, O4553 +4554, O4554 +4555, O4555 +4556, O4556 +4557, O4557 +4558, O4558 +4559, O4559 +4560, O4560 +4561, O4561 +4562, O4562 +4563, O4563 +4564, O4564 +4565, O4565 +4566, O4566 +4567, O4567 +4568, O4568 +4569, O4569 +4570, O4570 +4571, O4571 +4572, O4572 +4573, O4573 +4574, O4574 +4575, O4575 +4576, O4576 +4577, O4577 +4578, O4578 +4579, O4579 +4580, O4580 +4581, O4581 +4582, O4582 +4583, O4583 +4584, O4584 +4585, O4585 +4586, O4586 +4587, O4587 +4588, O4588 +4589, O4589 +4590, O4590 +4591, O4591 +4592, O4592 +4593, O4593 +4594, O4594 +4595, O4595 +4596, O4596 +4597, O4597 +4598, O4598 +4599, O4599 +4600, O4600 +4601, O4601 +4602, O4602 +4603, O4603 +4604, O4604 +4605, O4605 +4606, O4606 +4607, O4607 +4608, O4608 +4609, O4609 +4610, O4610 +4611, O4611 +4612, O4612 +4613, O4613 +4614, O4614 +4615, O4615 +4616, O4616 +4617, O4617 +4618, O4618 +4619, O4619 +4620, O4620 +4621, O4621 +4622, O4622 +4623, O4623 +4624, O4624 +4625, O4625 +4626, O4626 +4627, O4627 +4628, O4628 +4629, O4629 +4630, O4630 +4631, O4631 +4632, O4632 +4633, O4633 +4634, O4634 +4635, O4635 +4636, O4636 +4637, O4637 +4638, O4638 +4639, O4639 +4640, O4640 +4641, O4641 +4642, O4642 +4643, O4643 +4644, O4644 +4645, O4645 +4646, O4646 +4647, O4647 +4648, O4648 +4649, O4649 +4650, O4650 +4651, O4651 +4652, O4652 +4653, O4653 +4654, O4654 +4655, O4655 +4656, O4656 +4657, O4657 +4658, O4658 +4659, O4659 +4660, O4660 +4661, O4661 +4662, O4662 +4663, O4663 +4664, O4664 +4665, O4665 +4666, O4666 +4667, O4667 +4668, O4668 +4669, O4669 +4670, O4670 +4671, O4671 +4672, O4672 +4673, O4673 +4674, O4674 +4675, O4675 +4676, O4676 +4677, O4677 +4678, O4678 +4679, O4679 +4680, O4680 +4681, O4681 +4682, O4682 +4683, O4683 +4684, O4684 +4685, O4685 +4686, O4686 +4687, O4687 +4688, O4688 +4689, O4689 +4690, O4690 +4691, O4691 +4692, O4692 +4693, O4693 +4694, O4694 +4695, O4695 +4696, O4696 +4697, O4697 +4698, O4698 +4699, O4699 +4700, O4700 +4701, O4701 +4702, O4702 +4703, O4703 +4704, O4704 +4705, O4705 +4706, O4706 +4707, O4707 +4708, O4708 +4709, O4709 +4710, O4710 +4711, O4711 +4712, O4712 +4713, O4713 +4714, O4714 +4715, O4715 +4716, O4716 +4717, O4717 +4718, O4718 +4719, O4719 +4720, O4720 +4721, O4721 +4722, O4722 +4723, O4723 +4724, O4724 +4725, O4725 +4726, O4726 +4727, O4727 +4728, O4728 +4729, O4729 +4730, O4730 +4731, O4731 +4732, O4732 +4733, O4733 +4734, O4734 +4735, O4735 +4736, O4736 +4737, O4737 +4738, O4738 +4739, O4739 +4740, O4740 +4741, O4741 +4742, O4742 +4743, O4743 +4744, O4744 +4745, O4745 +4746, O4746 +4747, O4747 +4748, O4748 +4749, O4749 +4750, O4750 +4751, O4751 +4752, O4752 +4753, O4753 +4754, O4754 +4755, O4755 +4756, O4756 +4757, O4757 +4758, O4758 +4759, O4759 +4760, O4760 +4761, O4761 +4762, O4762 +4763, O4763 +4764, O4764 +4765, O4765 +4766, O4766 +4767, O4767 +4768, O4768 +4769, O4769 +4770, O4770 +4771, O4771 +4772, O4772 +4773, O4773 +4774, O4774 +4775, O4775 +4776, O4776 +4777, O4777 +4778, O4778 +4779, O4779 +4780, O4780 +4781, O4781 +4782, O4782 +4783, O4783 +4784, O4784 +4785, O4785 +4786, O4786 +4787, O4787 +4788, O4788 +4789, O4789 +4790, O4790 +4791, O4791 +4792, O4792 +4793, O4793 +4794, O4794 +4795, O4795 +4796, O4796 +4797, O4797 +4798, O4798 +4799, O4799 +4800, O4800 +4801, O4801 +4802, O4802 +4803, O4803 +4804, O4804 +4805, O4805 +4806, O4806 +4807, O4807 +4808, O4808 +4809, O4809 +4810, O4810 +4811, O4811 +4812, O4812 +4813, O4813 +4814, O4814 +4815, O4815 +4816, O4816 +4817, O4817 +4818, O4818 +4819, O4819 +4820, O4820 +4821, O4821 +4822, O4822 +4823, O4823 +4824, O4824 +4825, O4825 +4826, O4826 +4827, O4827 +4828, O4828 +4829, O4829 +4830, O4830 +4831, O4831 +4832, O4832 +4833, O4833 +4834, O4834 +4835, O4835 +4836, O4836 +4837, O4837 +4838, O4838 +4839, O4839 +4840, O4840 +4841, O4841 +4842, O4842 +4843, O4843 +4844, O4844 +4845, O4845 +4846, O4846 +4847, O4847 +4848, O4848 +4849, O4849 +4850, O4850 +4851, O4851 +4852, O4852 +4853, O4853 +4854, O4854 +4855, O4855 +4856, O4856 +4857, O4857 +4858, O4858 +4859, O4859 +4860, O4860 +4861, O4861 +4862, O4862 +4863, O4863 +4864, O4864 +4865, O4865 +4866, O4866 +4867, O4867 +4868, O4868 +4869, O4869 +4870, O4870 +4871, O4871 +4872, O4872 +4873, O4873 +4874, O4874 +4875, O4875 +4876, O4876 +4877, O4877 +4878, O4878 +4879, O4879 +4880, O4880 +4881, O4881 +4882, O4882 +4883, O4883 +4884, O4884 +4885, O4885 +4886, O4886 +4887, O4887 +4888, O4888 +4889, O4889 +4890, O4890 +4891, O4891 +4892, O4892 +4893, O4893 +4894, O4894 +4895, O4895 +4896, O4896 +4897, O4897 +4898, O4898 +4899, O4899 +4900, O4900 +4901, O4901 +4902, O4902 +4903, O4903 +4904, O4904 +4905, O4905 +4906, O4906 +4907, O4907 +4908, O4908 +4909, O4909 +4910, O4910 +4911, O4911 +4912, O4912 +4913, O4913 +4914, O4914 +4915, O4915 +4916, O4916 +4917, O4917 +4918, O4918 +4919, O4919 +4920, O4920 +4921, O4921 +4922, O4922 +4923, O4923 +4924, O4924 +4925, O4925 +4926, O4926 +4927, O4927 +4928, O4928 +4929, O4929 +4930, O4930 +4931, O4931 +4932, O4932 +4933, O4933 +4934, O4934 +4935, O4935 +4936, O4936 +4937, O4937 +4938, O4938 +4939, O4939 +4940, O4940 +4941, O4941 +4942, O4942 +4943, O4943 +4944, O4944 +4945, O4945 +4946, O4946 +4947, O4947 +4948, O4948 +4949, O4949 +4950, O4950 +4951, O4951 +4952, O4952 +4953, O4953 +4954, O4954 +4955, O4955 +4956, O4956 +4957, O4957 +4958, O4958 +4959, O4959 +4960, O4960 +4961, O4961 +4962, O4962 +4963, O4963 +4964, O4964 +4965, O4965 +4966, O4966 +4967, O4967 +4968, O4968 +4969, O4969 +4970, O4970 +4971, O4971 +4972, O4972 +4973, O4973 +4974, O4974 +4975, O4975 +4976, O4976 +4977, O4977 +4978, O4978 +4979, O4979 +4980, O4980 +4981, O4981 +4982, O4982 +4983, O4983 +4984, O4984 +4985, O4985 +4986, O4986 +4987, O4987 +4988, O4988 +4989, O4989 +4990, O4990 +4991, O4991 +4992, O4992 +4993, O4993 +4994, O4994 +4995, O4995 +4996, O4996 +4997, O4997 +4998, O4998 +4999, O4999 +5000, O5000 +5001, O5001 +5002, O5002 +5003, O5003 +5004, O5004 +5005, O5005 +5006, O5006 +5007, O5007 +5008, O5008 +5009, O5009 +5010, O5010 +5011, O5011 +5012, O5012 +5013, O5013 +5014, O5014 +5015, O5015 +5016, O5016 +5017, O5017 +5018, O5018 +5019, O5019 +5020, O5020 +5021, O5021 +5022, O5022 +5023, O5023 +5024, O5024 +5025, O5025 +5026, O5026 +5027, O5027 +5028, O5028 +5029, O5029 +5030, O5030 +5031, O5031 +5032, O5032 +5033, O5033 +5034, O5034 +5035, O5035 +5036, O5036 +5037, O5037 +5038, O5038 +5039, O5039 +5040, O5040 +5041, O5041 +5042, O5042 +5043, O5043 +5044, O5044 +5045, O5045 +5046, O5046 +5047, O5047 +5048, O5048 +5049, O5049 +5050, O5050 +5051, O5051 +5052, O5052 +5053, O5053 +5054, O5054 +5055, O5055 +5056, O5056 +5057, O5057 +5058, O5058 +5059, O5059 +5060, O5060 +5061, O5061 +5062, O5062 +5063, O5063 +5064, O5064 +5065, O5065 +5066, O5066 +5067, O5067 +5068, O5068 +5069, O5069 +5070, O5070 +5071, O5071 +5072, O5072 +5073, O5073 +5074, O5074 +5075, O5075 +5076, O5076 +5077, O5077 +5078, O5078 +5079, O5079 +5080, O5080 +5081, O5081 +5082, O5082 +5083, O5083 +5084, O5084 +5085, O5085 +5086, O5086 +5087, O5087 +5088, O5088 +5089, O5089 +5090, O5090 +5091, O5091 +5092, O5092 +5093, O5093 +5094, O5094 +5095, O5095 +5096, O5096 +5097, O5097 +5098, O5098 +5099, O5099 +5100, O5100 +5101, O5101 +5102, O5102 +5103, O5103 +5104, O5104 +5105, O5105 +5106, O5106 +5107, O5107 +5108, O5108 +5109, O5109 +5110, O5110 +5111, O5111 +5112, O5112 +5113, O5113 +5114, O5114 +5115, O5115 +5116, O5116 +5117, O5117 +5118, O5118 +5119, O5119 +5120, O5120 +5121, O5121 +5122, O5122 +5123, O5123 +5124, O5124 +5125, O5125 +5126, O5126 +5127, O5127 +5128, O5128 +5129, O5129 +5130, O5130 +5131, O5131 +5132, O5132 +5133, O5133 +5134, O5134 +5135, O5135 +5136, O5136 +5137, O5137 +5138, O5138 +5139, O5139 +5140, O5140 +5141, O5141 +5142, O5142 +5143, O5143 +5144, O5144 +5145, O5145 +5146, O5146 +5147, O5147 +5148, O5148 +5149, O5149 +5150, O5150 +5151, O5151 +5152, O5152 +5153, O5153 +5154, O5154 +5155, O5155 +5156, O5156 +5157, O5157 +5158, O5158 +5159, O5159 +5160, O5160 +5161, O5161 +5162, O5162 +5163, O5163 +5164, O5164 +5165, O5165 +5166, O5166 +5167, O5167 +5168, O5168 +5169, O5169 +5170, O5170 +5171, O5171 +5172, O5172 +5173, O5173 +5174, O5174 +5175, O5175 +5176, O5176 +5177, O5177 +5178, O5178 +5179, O5179 +5180, O5180 +5181, O5181 +5182, O5182 +5183, O5183 +5184, O5184 +5185, O5185 +5186, O5186 +5187, O5187 +5188, O5188 +5189, O5189 +5190, O5190 +5191, O5191 +5192, O5192 +5193, O5193 +5194, O5194 +5195, O5195 +5196, O5196 +5197, O5197 +5198, O5198 +5199, O5199 +5200, O5200 +5201, O5201 +5202, O5202 +5203, O5203 +5204, O5204 +5205, O5205 +5206, O5206 +5207, O5207 +5208, O5208 +5209, O5209 +5210, O5210 +5211, O5211 +5212, O5212 +5213, O5213 +5214, O5214 +5215, O5215 +5216, O5216 +5217, O5217 +5218, O5218 +5219, O5219 +5220, O5220 +5221, O5221 +5222, O5222 +5223, O5223 +5224, O5224 +5225, O5225 +5226, O5226 +5227, O5227 +5228, O5228 +5229, O5229 +5230, O5230 +5231, O5231 +5232, O5232 +5233, O5233 +5234, O5234 +5235, O5235 +5236, O5236 +5237, O5237 +5238, O5238 +5239, O5239 +5240, O5240 +5241, O5241 +5242, O5242 +5243, O5243 +5244, O5244 +5245, O5245 +5246, O5246 +5247, O5247 +5248, O5248 +5249, O5249 +5250, O5250 +5251, O5251 +5252, O5252 +5253, O5253 +5254, O5254 +5255, O5255 +5256, O5256 +5257, O5257 +5258, O5258 +5259, O5259 +5260, O5260 +5261, O5261 +5262, O5262 +5263, O5263 +5264, O5264 +5265, O5265 +5266, O5266 +5267, O5267 +5268, O5268 +5269, O5269 +5270, O5270 +5271, O5271 +5272, O5272 +5273, O5273 +5274, O5274 +5275, O5275 +5276, O5276 +5277, O5277 +5278, O5278 +5279, O5279 +5280, O5280 +5281, O5281 +5282, O5282 +5283, O5283 +5284, O5284 +5285, O5285 +5286, O5286 +5287, O5287 +5288, O5288 +5289, O5289 +5290, O5290 +5291, O5291 +5292, O5292 +5293, O5293 +5294, O5294 +5295, O5295 +5296, O5296 +5297, O5297 +5298, O5298 +5299, O5299 +5300, O5300 +5301, O5301 +5302, O5302 +5303, O5303 +5304, O5304 +5305, O5305 +5306, O5306 +5307, O5307 +5308, O5308 +5309, O5309 +5310, O5310 +5311, O5311 +5312, O5312 +5313, O5313 +5314, O5314 +5315, O5315 +5316, O5316 +5317, O5317 +5318, O5318 +5319, O5319 +5320, O5320 +5321, O5321 +5322, O5322 +5323, O5323 +5324, O5324 +5325, O5325 +5326, O5326 +5327, O5327 +5328, O5328 +5329, O5329 +5330, O5330 +5331, O5331 +5332, O5332 +5333, O5333 +5334, O5334 +5335, O5335 +5336, O5336 +5337, O5337 +5338, O5338 +5339, O5339 +5340, O5340 +5341, O5341 +5342, O5342 +5343, O5343 +5344, O5344 +5345, O5345 +5346, O5346 +5347, O5347 +5348, O5348 +5349, O5349 +5350, O5350 +5351, O5351 +5352, O5352 +5353, O5353 +5354, O5354 +5355, O5355 +5356, O5356 +5357, O5357 +5358, O5358 +5359, O5359 +5360, O5360 +5361, O5361 +5362, O5362 +5363, O5363 +5364, O5364 +5365, O5365 +5366, O5366 +5367, O5367 +5368, O5368 +5369, O5369 +5370, O5370 +5371, O5371 +5372, O5372 +5373, O5373 +5374, O5374 +5375, O5375 +5376, O5376 +5377, O5377 +5378, O5378 +5379, O5379 +5380, O5380 +5381, O5381 +5382, O5382 +5383, O5383 +5384, O5384 +5385, O5385 +5386, O5386 +5387, O5387 +5388, O5388 +5389, O5389 +5390, O5390 +5391, O5391 +5392, O5392 +5393, O5393 +5394, O5394 +5395, O5395 +5396, O5396 +5397, O5397 +5398, O5398 +5399, O5399 +5400, O5400 +5401, O5401 +5402, O5402 +5403, O5403 +5404, O5404 +5405, O5405 +5406, O5406 +5407, O5407 +5408, O5408 +5409, O5409 +5410, O5410 +5411, O5411 +5412, O5412 +5413, O5413 +5414, O5414 +5415, O5415 +5416, O5416 +5417, O5417 +5418, O5418 +5419, O5419 +5420, O5420 +5421, O5421 +5422, O5422 +5423, O5423 +5424, O5424 +5425, O5425 +5426, O5426 +5427, O5427 +5428, O5428 +5429, O5429 +5430, O5430 +5431, O5431 +5432, O5432 +5433, O5433 +5434, O5434 +5435, O5435 +5436, O5436 +5437, O5437 +5438, O5438 +5439, O5439 +5440, O5440 +5441, O5441 +5442, O5442 +5443, O5443 +5444, O5444 +5445, O5445 +5446, O5446 +5447, O5447 +5448, O5448 +5449, O5449 +5450, O5450 +5451, O5451 +5452, O5452 +5453, O5453 +5454, O5454 +5455, O5455 +5456, O5456 +5457, O5457 +5458, O5458 +5459, O5459 +5460, O5460 +5461, O5461 +5462, O5462 +5463, O5463 +5464, O5464 +5465, O5465 +5466, O5466 +5467, O5467 +5468, O5468 +5469, O5469 +5470, O5470 +5471, O5471 +5472, O5472 +5473, O5473 +5474, O5474 +5475, O5475 +5476, O5476 +5477, O5477 +5478, O5478 +5479, O5479 +5480, O5480 +5481, O5481 +5482, O5482 +5483, O5483 +5484, O5484 +5485, O5485 +5486, O5486 +5487, O5487 +5488, O5488 +5489, O5489 +5490, O5490 +5491, O5491 +5492, O5492 +5493, O5493 +5494, O5494 +5495, O5495 +5496, O5496 +5497, O5497 +5498, O5498 +5499, O5499 +5500, O5500 +5501, O5501 +5502, O5502 +5503, O5503 +5504, O5504 +5505, O5505 +5506, O5506 +5507, O5507 +5508, O5508 +5509, O5509 +5510, O5510 +5511, O5511 +5512, O5512 +5513, O5513 +5514, O5514 +5515, O5515 +5516, O5516 +5517, O5517 +5518, O5518 +5519, O5519 +5520, O5520 +5521, O5521 +5522, O5522 +5523, O5523 +5524, O5524 +5525, O5525 +5526, O5526 +5527, O5527 +5528, O5528 +5529, O5529 +5530, O5530 +5531, O5531 +5532, O5532 +5533, O5533 +5534, O5534 +5535, O5535 +5536, O5536 +5537, O5537 +5538, O5538 +5539, O5539 +5540, O5540 +5541, O5541 +5542, O5542 +5543, O5543 +5544, O5544 +5545, O5545 +5546, O5546 +5547, O5547 +5548, O5548 +5549, O5549 +5550, O5550 +5551, O5551 +5552, O5552 +5553, O5553 +5554, O5554 +5555, O5555 +5556, O5556 +5557, O5557 +5558, O5558 +5559, O5559 +5560, O5560 +5561, O5561 +5562, O5562 +5563, O5563 +5564, O5564 +5565, O5565 +5566, O5566 +5567, O5567 +5568, O5568 +5569, O5569 +5570, O5570 +5571, O5571 +5572, O5572 +5573, O5573 +5574, O5574 +5575, O5575 +5576, O5576 +5577, O5577 +5578, O5578 +5579, O5579 +5580, O5580 +5581, O5581 +5582, O5582 +5583, O5583 +5584, O5584 +5585, O5585 +5586, O5586 +5587, O5587 +5588, O5588 +5589, O5589 +5590, O5590 +5591, O5591 +5592, O5592 +5593, O5593 +5594, O5594 +5595, O5595 +5596, O5596 +5597, O5597 +5598, O5598 +5599, O5599 +5600, O5600 +5601, O5601 +5602, O5602 +5603, O5603 +5604, O5604 +5605, O5605 +5606, O5606 +5607, O5607 +5608, O5608 +5609, O5609 +5610, O5610 +5611, O5611 +5612, O5612 +5613, O5613 +5614, O5614 +5615, O5615 +5616, O5616 +5617, O5617 +5618, O5618 +5619, O5619 +5620, O5620 +5621, O5621 +5622, O5622 +5623, O5623 +5624, O5624 +5625, O5625 +5626, O5626 +5627, O5627 +5628, O5628 +5629, O5629 +5630, O5630 +5631, O5631 +5632, O5632 +5633, O5633 +5634, O5634 +5635, O5635 +5636, O5636 +5637, O5637 +5638, O5638 +5639, O5639 +5640, O5640 +5641, O5641 +5642, O5642 +5643, O5643 +5644, O5644 +5645, O5645 +5646, O5646 +5647, O5647 +5648, O5648 +5649, O5649 +5650, O5650 +5651, O5651 +5652, O5652 +5653, O5653 +5654, O5654 +5655, O5655 +5656, O5656 +5657, O5657 +5658, O5658 +5659, O5659 +5660, O5660 +5661, O5661 +5662, O5662 +5663, O5663 +5664, O5664 +5665, O5665 +5666, O5666 +5667, O5667 +5668, O5668 +5669, O5669 +5670, O5670 +5671, O5671 +5672, O5672 +5673, O5673 +5674, O5674 +5675, O5675 +5676, O5676 +5677, O5677 +5678, O5678 +5679, O5679 +5680, O5680 +5681, O5681 +5682, O5682 +5683, O5683 +5684, O5684 +5685, O5685 +5686, O5686 +5687, O5687 +5688, O5688 +5689, O5689 +5690, O5690 +5691, O5691 +5692, O5692 +5693, O5693 +5694, O5694 +5695, O5695 +5696, O5696 +5697, O5697 +5698, O5698 +5699, O5699 +5700, O5700 +5701, O5701 +5702, O5702 +5703, O5703 +5704, O5704 +5705, O5705 +5706, O5706 +5707, O5707 +5708, O5708 +5709, O5709 +5710, O5710 +5711, O5711 +5712, O5712 +5713, O5713 +5714, O5714 +5715, O5715 +5716, O5716 +5717, O5717 +5718, O5718 +5719, O5719 +5720, O5720 +5721, O5721 +5722, O5722 +5723, O5723 +5724, O5724 +5725, O5725 +5726, O5726 +5727, O5727 +5728, O5728 +5729, O5729 +5730, O5730 +5731, O5731 +5732, O5732 +5733, O5733 +5734, O5734 +5735, O5735 +5736, O5736 +5737, O5737 +5738, O5738 +5739, O5739 +5740, O5740 +5741, O5741 +5742, O5742 +5743, O5743 +5744, O5744 +5745, O5745 +5746, O5746 +5747, O5747 +5748, O5748 +5749, O5749 +5750, O5750 +5751, O5751 +5752, O5752 +5753, O5753 +5754, O5754 +5755, O5755 +5756, O5756 +5757, O5757 +5758, O5758 +5759, O5759 +5760, O5760 +5761, O5761 +5762, O5762 +5763, O5763 +5764, O5764 +5765, O5765 +5766, O5766 +5767, O5767 +5768, O5768 +5769, O5769 +5770, O5770 +5771, O5771 +5772, O5772 +5773, O5773 +5774, O5774 +5775, O5775 +5776, O5776 +5777, O5777 +5778, O5778 +5779, O5779 +5780, O5780 +5781, O5781 +5782, O5782 +5783, O5783 +5784, O5784 +5785, O5785 +5786, O5786 +5787, O5787 +5788, O5788 +5789, O5789 +5790, O5790 +5791, O5791 +5792, O5792 +5793, O5793 +5794, O5794 +5795, O5795 +5796, O5796 +5797, O5797 +5798, O5798 +5799, O5799 +5800, O5800 +5801, O5801 +5802, O5802 +5803, O5803 +5804, O5804 +5805, O5805 +5806, O5806 +5807, O5807 +5808, O5808 +5809, O5809 +5810, O5810 +5811, O5811 +5812, O5812 +5813, O5813 +5814, O5814 +5815, O5815 +5816, O5816 +5817, O5817 +5818, O5818 +5819, O5819 +5820, O5820 +5821, O5821 +5822, O5822 +5823, O5823 +5824, O5824 +5825, O5825 +5826, O5826 +5827, O5827 +5828, O5828 +5829, O5829 +5830, O5830 +5831, O5831 +5832, O5832 +5833, O5833 +5834, O5834 +5835, O5835 +5836, O5836 +5837, O5837 +5838, O5838 +5839, O5839 +5840, O5840 +5841, O5841 +5842, O5842 +5843, O5843 +5844, O5844 +5845, O5845 +5846, O5846 +5847, O5847 +5848, O5848 +5849, O5849 +5850, O5850 +5851, O5851 +5852, O5852 +5853, O5853 +5854, O5854 +5855, O5855 +5856, O5856 +5857, O5857 +5858, O5858 +5859, O5859 +5860, O5860 +5861, O5861 +5862, O5862 +5863, O5863 +5864, O5864 +5865, O5865 +5866, O5866 +5867, O5867 +5868, O5868 +5869, O5869 +5870, O5870 +5871, O5871 +5872, O5872 +5873, O5873 +5874, O5874 +5875, O5875 +5876, O5876 +5877, O5877 +5878, O5878 +5879, O5879 +5880, O5880 +5881, O5881 +5882, O5882 +5883, O5883 +5884, O5884 +5885, O5885 +5886, O5886 +5887, O5887 +5888, O5888 +5889, O5889 +5890, O5890 +5891, O5891 +5892, O5892 +5893, O5893 +5894, O5894 +5895, O5895 +5896, O5896 +5897, O5897 +5898, O5898 +5899, O5899 +5900, O5900 +5901, O5901 +5902, O5902 +5903, O5903 +5904, O5904 +5905, O5905 +5906, O5906 +5907, O5907 +5908, O5908 +5909, O5909 +5910, O5910 +5911, O5911 +5912, O5912 +5913, O5913 +5914, O5914 +5915, O5915 +5916, O5916 +5917, O5917 +5918, O5918 +5919, O5919 +5920, O5920 +5921, O5921 +5922, O5922 +5923, O5923 +5924, O5924 +5925, O5925 +5926, O5926 +5927, O5927 +5928, O5928 +5929, O5929 +5930, O5930 +5931, O5931 +5932, O5932 +5933, O5933 +5934, O5934 +5935, O5935 +5936, O5936 +5937, O5937 +5938, O5938 +5939, O5939 +5940, O5940 +5941, O5941 +5942, O5942 +5943, O5943 +5944, O5944 +5945, O5945 +5946, O5946 +5947, O5947 +5948, O5948 +5949, O5949 +5950, O5950 +5951, O5951 +5952, O5952 +5953, O5953 +5954, O5954 +5955, O5955 +5956, O5956 +5957, O5957 +5958, O5958 +5959, O5959 +5960, O5960 +5961, O5961 +5962, O5962 +5963, O5963 +5964, O5964 +5965, O5965 +5966, O5966 +5967, O5967 +5968, O5968 +5969, O5969 +5970, O5970 +5971, O5971 +5972, O5972 +5973, O5973 +5974, O5974 +5975, O5975 +5976, O5976 +5977, O5977 +5978, O5978 +5979, O5979 +5980, O5980 +5981, O5981 +5982, O5982 +5983, O5983 +5984, O5984 +5985, O5985 +5986, O5986 +5987, O5987 +5988, O5988 +5989, O5989 +5990, O5990 +5991, O5991 +5992, O5992 +5993, O5993 +5994, O5994 +5995, O5995 +5996, O5996 +5997, O5997 +5998, O5998 +5999, O5999 +6000, O6000 +6001, O6001 +6002, O6002 +6003, O6003 +6004, O6004 +6005, O6005 +6006, O6006 +6007, O6007 +6008, O6008 +6009, O6009 +6010, O6010 +6011, O6011 +6012, O6012 +6013, O6013 +6014, O6014 +6015, O6015 +6016, O6016 +6017, O6017 +6018, O6018 +6019, O6019 +6020, O6020 +6021, O6021 +6022, O6022 +6023, O6023 +6024, O6024 +6025, O6025 +6026, O6026 +6027, O6027 +6028, O6028 +6029, O6029 +6030, O6030 +6031, O6031 +6032, O6032 +6033, O6033 +6034, O6034 +6035, O6035 +6036, O6036 +6037, O6037 +6038, O6038 +6039, O6039 +6040, O6040 +6041, O6041 +6042, O6042 +6043, O6043 +6044, O6044 +6045, O6045 +6046, O6046 +6047, O6047 +6048, O6048 +6049, O6049 +6050, O6050 +6051, O6051 +6052, O6052 +6053, O6053 +6054, O6054 +6055, O6055 +6056, O6056 +6057, O6057 +6058, O6058 +6059, O6059 +6060, O6060 +6061, O6061 +6062, O6062 +6063, O6063 +6064, O6064 +6065, O6065 +6066, O6066 +6067, O6067 +6068, O6068 +6069, O6069 +6070, O6070 +6071, O6071 +6072, O6072 +6073, O6073 +6074, O6074 +6075, O6075 +6076, O6076 +6077, O6077 +6078, O6078 +6079, O6079 +6080, O6080 +6081, O6081 +6082, O6082 +6083, O6083 +6084, O6084 +6085, O6085 +6086, O6086 +6087, O6087 +6088, O6088 +6089, O6089 +6090, O6090 +6091, O6091 +6092, O6092 +6093, O6093 +6094, O6094 +6095, O6095 +6096, O6096 +6097, O6097 +6098, O6098 +6099, O6099 +6100, O6100 +6101, O6101 +6102, O6102 +6103, O6103 +6104, O6104 +6105, O6105 +6106, O6106 +6107, O6107 +6108, O6108 +6109, O6109 +6110, O6110 +6111, O6111 +6112, O6112 +6113, O6113 +6114, O6114 +6115, O6115 +6116, O6116 +6117, O6117 +6118, O6118 +6119, O6119 +6120, O6120 +6121, O6121 +6122, O6122 +6123, O6123 +6124, O6124 +6125, O6125 +6126, O6126 +6127, O6127 +6128, O6128 +6129, O6129 +6130, O6130 +6131, O6131 +6132, O6132 +6133, O6133 +6134, O6134 +6135, O6135 +6136, O6136 +6137, O6137 +6138, O6138 +6139, O6139 +6140, O6140 +6141, O6141 +6142, O6142 +6143, O6143 +6144, O6144 +6145, O6145 +6146, O6146 +6147, O6147 +6148, O6148 +6149, O6149 +6150, O6150 +6151, O6151 +6152, O6152 +6153, O6153 +6154, O6154 +6155, O6155 +6156, O6156 +6157, O6157 +6158, O6158 +6159, O6159 +6160, O6160 +6161, O6161 +6162, O6162 +6163, O6163 +6164, O6164 +6165, O6165 +6166, O6166 +6167, O6167 +6168, O6168 +6169, O6169 +6170, O6170 +6171, O6171 +6172, O6172 +6173, O6173 +6174, O6174 +6175, O6175 +6176, O6176 +6177, O6177 +6178, O6178 +6179, O6179 +6180, O6180 +6181, O6181 +6182, O6182 +6183, O6183 +6184, O6184 +6185, O6185 +6186, O6186 +6187, O6187 +6188, O6188 +6189, O6189 +6190, O6190 +6191, O6191 +6192, O6192 +6193, O6193 +6194, O6194 +6195, O6195 +6196, O6196 +6197, O6197 +6198, O6198 +6199, O6199 +6200, O6200 +6201, O6201 +6202, O6202 +6203, O6203 +6204, O6204 +6205, O6205 +6206, O6206 +6207, O6207 +6208, O6208 +6209, O6209 +6210, O6210 +6211, O6211 +6212, O6212 +6213, O6213 +6214, O6214 +6215, O6215 +6216, O6216 +6217, O6217 +6218, O6218 +6219, O6219 +6220, O6220 +6221, O6221 +6222, O6222 +6223, O6223 +6224, O6224 +6225, O6225 +6226, O6226 +6227, O6227 +6228, O6228 +6229, O6229 +6230, O6230 +6231, O6231 +6232, O6232 +6233, O6233 +6234, O6234 +6235, O6235 +6236, O6236 +6237, O6237 +6238, O6238 +6239, O6239 +6240, O6240 +6241, O6241 +6242, O6242 +6243, O6243 +6244, O6244 +6245, O6245 +6246, O6246 +6247, O6247 +6248, O6248 +6249, O6249 +6250, O6250 +6251, O6251 +6252, O6252 +6253, O6253 +6254, O6254 +6255, O6255 +6256, O6256 +6257, O6257 +6258, O6258 +6259, O6259 +6260, O6260 +6261, O6261 +6262, O6262 +6263, O6263 +6264, O6264 +6265, O6265 +6266, O6266 +6267, O6267 +6268, O6268 +6269, O6269 +6270, O6270 +6271, O6271 +6272, O6272 +6273, O6273 +6274, O6274 +6275, O6275 +6276, O6276 +6277, O6277 +6278, O6278 +6279, O6279 +6280, O6280 +6281, O6281 +6282, O6282 +6283, O6283 +6284, O6284 +6285, O6285 +6286, O6286 +6287, O6287 +6288, O6288 +6289, O6289 +6290, O6290 +6291, O6291 +6292, O6292 +6293, O6293 +6294, O6294 +6295, O6295 +6296, O6296 +6297, O6297 +6298, O6298 +6299, O6299 +6300, O6300 +6301, O6301 +6302, O6302 +6303, O6303 +6304, O6304 +6305, O6305 +6306, O6306 +6307, O6307 +6308, O6308 +6309, O6309 +6310, O6310 +6311, O6311 +6312, O6312 +6313, O6313 +6314, O6314 +6315, O6315 +6316, O6316 +6317, O6317 +6318, O6318 +6319, O6319 +6320, O6320 +6321, O6321 +6322, O6322 +6323, O6323 +6324, O6324 +6325, O6325 +6326, O6326 +6327, O6327 +6328, O6328 +6329, O6329 +6330, O6330 +6331, O6331 +6332, O6332 +6333, O6333 +6334, O6334 +6335, O6335 +6336, O6336 +6337, O6337 +6338, O6338 +6339, O6339 +6340, O6340 +6341, O6341 +6342, O6342 +6343, O6343 +6344, O6344 +6345, O6345 +6346, O6346 +6347, O6347 +6348, O6348 +6349, O6349 +6350, O6350 +6351, O6351 +6352, O6352 +6353, O6353 +6354, O6354 +6355, O6355 +6356, O6356 +6357, O6357 +6358, O6358 +6359, O6359 +6360, O6360 +6361, O6361 +6362, O6362 +6363, O6363 +6364, O6364 +6365, O6365 +6366, O6366 +6367, O6367 +6368, O6368 +6369, O6369 +6370, O6370 +6371, O6371 +6372, O6372 +6373, O6373 +6374, O6374 +6375, O6375 +6376, O6376 +6377, O6377 +6378, O6378 +6379, O6379 +6380, O6380 +6381, O6381 +6382, O6382 +6383, O6383 +6384, O6384 +6385, O6385 +6386, O6386 +6387, O6387 +6388, O6388 +6389, O6389 +6390, O6390 +6391, O6391 +6392, O6392 +6393, O6393 +6394, O6394 +6395, O6395 +6396, O6396 +6397, O6397 +6398, O6398 +6399, O6399 +6400, O6400 +6401, O6401 +6402, O6402 +6403, O6403 +6404, O6404 +6405, O6405 +6406, O6406 +6407, O6407 +6408, O6408 +6409, O6409 +6410, O6410 +6411, O6411 +6412, O6412 +6413, O6413 +6414, O6414 +6415, O6415 +6416, O6416 +6417, O6417 +6418, O6418 +6419, O6419 +6420, O6420 +6421, O6421 +6422, O6422 +6423, O6423 +6424, O6424 +6425, O6425 +6426, O6426 +6427, O6427 +6428, O6428 +6429, O6429 +6430, O6430 +6431, O6431 +6432, O6432 +6433, O6433 +6434, O6434 +6435, O6435 +6436, O6436 +6437, O6437 +6438, O6438 +6439, O6439 +6440, O6440 +6441, O6441 +6442, O6442 +6443, O6443 +6444, O6444 +6445, O6445 +6446, O6446 +6447, O6447 +6448, O6448 +6449, O6449 +6450, O6450 +6451, O6451 +6452, O6452 +6453, O6453 +6454, O6454 +6455, O6455 +6456, O6456 +6457, O6457 +6458, O6458 +6459, O6459 +6460, O6460 +6461, O6461 +6462, O6462 +6463, O6463 +6464, O6464 +6465, O6465 +6466, O6466 +6467, O6467 +6468, O6468 +6469, O6469 +6470, O6470 +6471, O6471 +6472, O6472 +6473, O6473 +6474, O6474 +6475, O6475 +6476, O6476 +6477, O6477 +6478, O6478 +6479, O6479 +6480, O6480 +6481, O6481 +6482, O6482 +6483, O6483 +6484, O6484 +6485, O6485 +6486, O6486 +6487, O6487 +6488, O6488 +6489, O6489 +6490, O6490 +6491, O6491 +6492, O6492 +6493, O6493 +6494, O6494 +6495, O6495 +6496, O6496 +6497, O6497 +6498, O6498 +6499, O6499 +6500, O6500 +6501, O6501 +6502, O6502 +6503, O6503 +6504, O6504 +6505, O6505 +6506, O6506 +6507, O6507 +6508, O6508 +6509, O6509 +6510, O6510 +6511, O6511 +6512, O6512 +6513, O6513 +6514, O6514 +6515, O6515 +6516, O6516 +6517, O6517 +6518, O6518 +6519, O6519 +6520, O6520 +6521, O6521 +6522, O6522 +6523, O6523 +6524, O6524 +6525, O6525 +6526, O6526 +6527, O6527 +6528, O6528 +6529, O6529 +6530, O6530 +6531, O6531 +6532, O6532 +6533, O6533 +6534, O6534 +6535, O6535 +6536, O6536 +6537, O6537 +6538, O6538 +6539, O6539 +6540, O6540 +6541, O6541 +6542, O6542 +6543, O6543 +6544, O6544 +6545, O6545 +6546, O6546 +6547, O6547 +6548, O6548 +6549, O6549 +6550, O6550 +6551, O6551 +6552, O6552 +6553, O6553 +6554, O6554 +6555, O6555 +6556, O6556 +6557, O6557 +6558, O6558 +6559, O6559 +6560, O6560 +6561, O6561 +6562, O6562 +6563, O6563 +6564, O6564 +6565, O6565 +6566, O6566 +6567, O6567 +6568, O6568 +6569, O6569 +6570, O6570 +6571, O6571 +6572, O6572 +6573, O6573 +6574, O6574 +6575, O6575 +6576, O6576 +6577, O6577 +6578, O6578 +6579, O6579 +6580, O6580 +6581, O6581 +6582, O6582 +6583, O6583 +6584, O6584 +6585, O6585 +6586, O6586 +6587, O6587 +6588, O6588 +6589, O6589 +6590, O6590 +6591, O6591 +6592, O6592 +6593, O6593 +6594, O6594 +6595, O6595 +6596, O6596 +6597, O6597 +6598, O6598 +6599, O6599 +6600, O6600 +6601, O6601 +6602, O6602 +6603, O6603 +6604, O6604 +6605, O6605 +6606, O6606 +6607, O6607 +6608, O6608 +6609, O6609 +6610, O6610 +6611, O6611 +6612, O6612 +6613, O6613 +6614, O6614 +6615, O6615 +6616, O6616 +6617, O6617 +6618, O6618 +6619, O6619 +6620, O6620 +6621, O6621 +6622, O6622 +6623, O6623 +6624, O6624 +6625, O6625 +6626, O6626 +6627, O6627 +6628, O6628 +6629, O6629 +6630, O6630 +6631, O6631 +6632, O6632 +6633, O6633 +6634, O6634 +6635, O6635 +6636, O6636 +6637, O6637 +6638, O6638 +6639, O6639 +6640, O6640 +6641, O6641 +6642, O6642 +6643, O6643 +6644, O6644 +6645, O6645 +6646, O6646 +6647, O6647 +6648, O6648 +6649, O6649 +6650, O6650 +6651, O6651 +6652, O6652 +6653, O6653 +6654, O6654 +6655, O6655 +6656, O6656 +6657, O6657 +6658, O6658 +6659, O6659 +6660, O6660 +6661, O6661 +6662, O6662 +6663, O6663 +6664, O6664 +6665, O6665 +6666, O6666 +6667, O6667 +6668, O6668 +6669, O6669 +6670, O6670 +6671, O6671 +6672, O6672 +6673, O6673 +6674, O6674 +6675, O6675 +6676, O6676 +6677, O6677 +6678, O6678 +6679, O6679 +6680, O6680 +6681, O6681 +6682, O6682 +6683, O6683 +6684, O6684 +6685, O6685 +6686, O6686 +6687, O6687 +6688, O6688 +6689, O6689 +6690, O6690 +6691, O6691 +6692, O6692 +6693, O6693 +6694, O6694 +6695, O6695 +6696, O6696 +6697, O6697 +6698, O6698 +6699, O6699 +6700, O6700 +6701, O6701 +6702, O6702 +6703, O6703 +6704, O6704 +6705, O6705 +6706, O6706 +6707, O6707 +6708, O6708 +6709, O6709 +6710, O6710 +6711, O6711 +6712, O6712 +6713, O6713 +6714, O6714 +6715, O6715 +6716, O6716 +6717, O6717 +6718, O6718 +6719, O6719 +6720, O6720 +6721, O6721 +6722, O6722 +6723, O6723 +6724, O6724 +6725, O6725 +6726, O6726 +6727, O6727 +6728, O6728 +6729, O6729 +6730, O6730 +6731, O6731 +6732, O6732 +6733, O6733 +6734, O6734 +6735, O6735 +6736, O6736 +6737, O6737 +6738, O6738 +6739, O6739 +6740, O6740 +6741, O6741 +6742, O6742 +6743, O6743 +6744, O6744 +6745, O6745 +6746, O6746 +6747, O6747 +6748, O6748 +6749, O6749 +6750, O6750 +6751, O6751 +6752, O6752 +6753, O6753 +6754, O6754 +6755, O6755 +6756, O6756 +6757, O6757 +6758, O6758 +6759, O6759 +6760, O6760 +6761, O6761 +6762, O6762 +6763, O6763 +6764, O6764 +6765, O6765 +6766, O6766 +6767, O6767 +6768, O6768 +6769, O6769 +6770, O6770 +6771, O6771 +6772, O6772 +6773, O6773 +6774, O6774 +6775, O6775 +6776, O6776 +6777, O6777 +6778, O6778 +6779, O6779 +6780, O6780 +6781, O6781 +6782, O6782 +6783, O6783 +6784, O6784 +6785, O6785 +6786, O6786 +6787, O6787 +6788, O6788 +6789, O6789 +6790, O6790 +6791, O6791 +6792, O6792 +6793, O6793 +6794, O6794 +6795, O6795 +6796, O6796 +6797, O6797 +6798, O6798 +6799, O6799 +6800, O6800 +6801, O6801 +6802, O6802 +6803, O6803 +6804, O6804 +6805, O6805 +6806, O6806 +6807, O6807 +6808, O6808 +6809, O6809 +6810, O6810 +6811, O6811 +6812, O6812 +6813, O6813 +6814, O6814 +6815, O6815 +6816, O6816 +6817, O6817 +6818, O6818 +6819, O6819 +6820, O6820 +6821, O6821 +6822, O6822 +6823, O6823 +6824, O6824 +6825, O6825 +6826, O6826 +6827, O6827 +6828, O6828 +6829, O6829 +6830, O6830 +6831, O6831 +6832, O6832 +6833, O6833 +6834, O6834 +6835, O6835 +6836, O6836 +6837, O6837 +6838, O6838 +6839, O6839 +6840, O6840 +6841, O6841 +6842, O6842 +6843, O6843 +6844, O6844 +6845, O6845 +6846, O6846 +6847, O6847 +6848, O6848 +6849, O6849 +6850, O6850 +6851, O6851 +6852, O6852 +6853, O6853 +6854, O6854 +6855, O6855 +6856, O6856 +6857, O6857 +6858, O6858 +6859, O6859 +6860, O6860 +6861, O6861 +6862, O6862 +6863, O6863 +6864, O6864 +6865, O6865 +6866, O6866 +6867, O6867 +6868, O6868 +6869, O6869 +6870, O6870 +6871, O6871 +6872, O6872 +6873, O6873 +6874, O6874 +6875, O6875 +6876, O6876 +6877, O6877 +6878, O6878 +6879, O6879 +6880, O6880 +6881, O6881 +6882, O6882 +6883, O6883 +6884, O6884 +6885, O6885 +6886, O6886 +6887, O6887 +6888, O6888 +6889, O6889 +6890, O6890 +6891, O6891 +6892, O6892 +6893, O6893 +6894, O6894 +6895, O6895 +6896, O6896 +6897, O6897 +6898, O6898 +6899, O6899 +6900, O6900 +6901, O6901 +6902, O6902 +6903, O6903 +6904, O6904 +6905, O6905 +6906, O6906 +6907, O6907 +6908, O6908 +6909, O6909 +6910, O6910 +6911, O6911 +6912, O6912 +6913, O6913 +6914, O6914 +6915, O6915 +6916, O6916 +6917, O6917 +6918, O6918 +6919, O6919 +6920, O6920 +6921, O6921 +6922, O6922 +6923, O6923 +6924, O6924 +6925, O6925 +6926, O6926 +6927, O6927 +6928, O6928 +6929, O6929 +6930, O6930 +6931, O6931 +6932, O6932 +6933, O6933 +6934, O6934 +6935, O6935 +6936, O6936 +6937, O6937 +6938, O6938 +6939, O6939 +6940, O6940 +6941, O6941 +6942, O6942 +6943, O6943 +6944, O6944 +6945, O6945 +6946, O6946 +6947, O6947 +6948, O6948 +6949, O6949 +6950, O6950 +6951, O6951 +6952, O6952 +6953, O6953 +6954, O6954 +6955, O6955 +6956, O6956 +6957, O6957 +6958, O6958 +6959, O6959 +6960, O6960 +6961, O6961 +6962, O6962 +6963, O6963 +6964, O6964 +6965, O6965 +6966, O6966 +6967, O6967 +6968, O6968 +6969, O6969 +6970, O6970 +6971, O6971 +6972, O6972 +6973, O6973 +6974, O6974 +6975, O6975 +6976, O6976 +6977, O6977 +6978, O6978 +6979, O6979 +6980, O6980 +6981, O6981 +6982, O6982 +6983, O6983 +6984, O6984 +6985, O6985 +6986, O6986 +6987, O6987 +6988, O6988 +6989, O6989 +6990, O6990 +6991, O6991 +6992, O6992 +6993, O6993 +6994, O6994 +6995, O6995 +6996, O6996 +6997, O6997 +6998, O6998 +6999, O6999 +7000, O7000 +7001, O7001 +7002, O7002 +7003, O7003 +7004, O7004 +7005, O7005 +7006, O7006 +7007, O7007 +7008, O7008 +7009, O7009 +7010, O7010 +7011, O7011 +7012, O7012 +7013, O7013 +7014, O7014 +7015, O7015 +7016, O7016 +7017, O7017 +7018, O7018 +7019, O7019 +7020, O7020 +7021, O7021 +7022, O7022 +7023, O7023 +7024, O7024 +7025, O7025 +7026, O7026 +7027, O7027 +7028, O7028 +7029, O7029 +7030, O7030 +7031, O7031 +7032, O7032 +7033, O7033 +7034, O7034 +7035, O7035 +7036, O7036 +7037, O7037 +7038, O7038 +7039, O7039 +7040, O7040 +7041, O7041 +7042, O7042 +7043, O7043 +7044, O7044 +7045, O7045 +7046, O7046 +7047, O7047 +7048, O7048 +7049, O7049 +7050, O7050 +7051, O7051 +7052, O7052 +7053, O7053 +7054, O7054 +7055, O7055 +7056, O7056 +7057, O7057 +7058, O7058 +7059, O7059 +7060, O7060 +7061, O7061 +7062, O7062 +7063, O7063 +7064, O7064 +7065, O7065 +7066, O7066 +7067, O7067 +7068, O7068 +7069, O7069 +7070, O7070 +7071, O7071 +7072, O7072 +7073, O7073 +7074, O7074 +7075, O7075 +7076, O7076 +7077, O7077 +7078, O7078 +7079, O7079 +7080, O7080 +7081, O7081 +7082, O7082 +7083, O7083 +7084, O7084 +7085, O7085 +7086, O7086 +7087, O7087 +7088, O7088 +7089, O7089 +7090, O7090 +7091, O7091 +7092, O7092 +7093, O7093 +7094, O7094 +7095, O7095 +7096, O7096 +7097, O7097 +7098, O7098 +7099, O7099 +7100, O7100 +7101, O7101 +7102, O7102 +7103, O7103 +7104, O7104 +7105, O7105 +7106, O7106 +7107, O7107 +7108, O7108 +7109, O7109 +7110, O7110 +7111, O7111 +7112, O7112 +7113, O7113 +7114, O7114 +7115, O7115 +7116, O7116 +7117, O7117 +7118, O7118 +7119, O7119 +7120, O7120 +7121, O7121 +7122, O7122 +7123, O7123 +7124, O7124 +7125, O7125 +7126, O7126 +7127, O7127 +7128, O7128 +7129, O7129 +7130, O7130 +7131, O7131 +7132, O7132 +7133, O7133 +7134, O7134 +7135, O7135 +7136, O7136 +7137, O7137 +7138, O7138 +7139, O7139 +7140, O7140 +7141, O7141 +7142, O7142 +7143, O7143 +7144, O7144 +7145, O7145 +7146, O7146 +7147, O7147 +7148, O7148 +7149, O7149 +7150, O7150 +7151, O7151 +7152, O7152 +7153, O7153 +7154, O7154 +7155, O7155 +7156, O7156 +7157, O7157 +7158, O7158 +7159, O7159 +7160, O7160 +7161, O7161 +7162, O7162 +7163, O7163 +7164, O7164 +7165, O7165 +7166, O7166 +7167, O7167 +7168, O7168 +7169, O7169 +7170, O7170 +7171, O7171 +7172, O7172 +7173, O7173 +7174, O7174 +7175, O7175 +7176, O7176 +7177, O7177 +7178, O7178 +7179, O7179 +7180, O7180 +7181, O7181 +7182, O7182 +7183, O7183 +7184, O7184 +7185, O7185 +7186, O7186 +7187, O7187 +7188, O7188 +7189, O7189 +7190, O7190 +7191, O7191 +7192, O7192 +7193, O7193 +7194, O7194 +7195, O7195 +7196, O7196 +7197, O7197 +7198, O7198 +7199, O7199 +7200, O7200 +7201, O7201 +7202, O7202 +7203, O7203 +7204, O7204 +7205, O7205 +7206, O7206 +7207, O7207 +7208, O7208 +7209, O7209 +7210, O7210 +7211, O7211 +7212, O7212 +7213, O7213 +7214, O7214 +7215, O7215 +7216, O7216 +7217, O7217 +7218, O7218 +7219, O7219 +7220, O7220 +7221, O7221 +7222, O7222 +7223, O7223 +7224, O7224 +7225, O7225 +7226, O7226 +7227, O7227 +7228, O7228 +7229, O7229 +7230, O7230 +7231, O7231 +7232, O7232 +7233, O7233 +7234, O7234 +7235, O7235 +7236, O7236 +7237, O7237 +7238, O7238 +7239, O7239 +7240, O7240 +7241, O7241 +7242, O7242 +7243, O7243 +7244, O7244 +7245, O7245 +7246, O7246 +7247, O7247 +7248, O7248 +7249, O7249 +7250, O7250 +7251, O7251 +7252, O7252 +7253, O7253 +7254, O7254 +7255, O7255 +7256, O7256 +7257, O7257 +7258, O7258 +7259, O7259 +7260, O7260 +7261, O7261 +7262, O7262 +7263, O7263 +7264, O7264 +7265, O7265 +7266, O7266 +7267, O7267 +7268, O7268 +7269, O7269 +7270, O7270 +7271, O7271 +7272, O7272 +7273, O7273 +7274, O7274 +7275, O7275 +7276, O7276 +7277, O7277 +7278, O7278 +7279, O7279 +7280, O7280 +7281, O7281 +7282, O7282 +7283, O7283 +7284, O7284 +7285, O7285 +7286, O7286 +7287, O7287 +7288, O7288 +7289, O7289 +7290, O7290 +7291, O7291 +7292, O7292 +7293, O7293 +7294, O7294 +7295, O7295 +7296, O7296 +7297, O7297 +7298, O7298 +7299, O7299 +7300, O7300 +7301, O7301 +7302, O7302 +7303, O7303 +7304, O7304 +7305, O7305 +7306, O7306 +7307, O7307 +7308, O7308 +7309, O7309 +7310, O7310 +7311, O7311 +7312, O7312 +7313, O7313 +7314, O7314 +7315, O7315 +7316, O7316 +7317, O7317 +7318, O7318 +7319, O7319 +7320, O7320 +7321, O7321 +7322, O7322 +7323, O7323 +7324, O7324 +7325, O7325 +7326, O7326 +7327, O7327 +7328, O7328 +7329, O7329 +7330, O7330 +7331, O7331 +7332, O7332 +7333, O7333 +7334, O7334 +7335, O7335 +7336, O7336 +7337, O7337 +7338, O7338 +7339, O7339 +7340, O7340 +7341, O7341 +7342, O7342 +7343, O7343 +7344, O7344 +7345, O7345 +7346, O7346 +7347, O7347 +7348, O7348 +7349, O7349 +7350, O7350 +7351, O7351 +7352, O7352 +7353, O7353 +7354, O7354 +7355, O7355 +7356, O7356 +7357, O7357 +7358, O7358 +7359, O7359 +7360, O7360 +7361, O7361 +7362, O7362 +7363, O7363 +7364, O7364 +7365, O7365 +7366, O7366 +7367, O7367 +7368, O7368 +7369, O7369 +7370, O7370 +7371, O7371 +7372, O7372 +7373, O7373 +7374, O7374 +7375, O7375 +7376, O7376 +7377, O7377 +7378, O7378 +7379, O7379 +7380, O7380 +7381, O7381 +7382, O7382 +7383, O7383 +7384, O7384 +7385, O7385 +7386, O7386 +7387, O7387 +7388, O7388 +7389, O7389 +7390, O7390 +7391, O7391 +7392, O7392 +7393, O7393 +7394, O7394 +7395, O7395 +7396, O7396 +7397, O7397 +7398, O7398 +7399, O7399 +7400, O7400 +7401, O7401 +7402, O7402 +7403, O7403 +7404, O7404 +7405, O7405 +7406, O7406 +7407, O7407 +7408, O7408 +7409, O7409 +7410, O7410 +7411, O7411 +7412, O7412 +7413, O7413 +7414, O7414 +7415, O7415 +7416, O7416 +7417, O7417 +7418, O7418 +7419, O7419 +7420, O7420 +7421, O7421 +7422, O7422 +7423, O7423 +7424, O7424 +7425, O7425 +7426, O7426 +7427, O7427 +7428, O7428 +7429, O7429 +7430, O7430 +7431, O7431 +7432, O7432 +7433, O7433 +7434, O7434 +7435, O7435 +7436, O7436 +7437, O7437 +7438, O7438 +7439, O7439 +7440, O7440 +7441, O7441 +7442, O7442 +7443, O7443 +7444, O7444 +7445, O7445 +7446, O7446 +7447, O7447 +7448, O7448 +7449, O7449 +7450, O7450 +7451, O7451 +7452, O7452 +7453, O7453 +7454, O7454 +7455, O7455 +7456, O7456 +7457, O7457 +7458, O7458 +7459, O7459 +7460, O7460 +7461, O7461 +7462, O7462 +7463, O7463 +7464, O7464 +7465, O7465 +7466, O7466 +7467, O7467 +7468, O7468 +7469, O7469 +7470, O7470 +7471, O7471 +7472, O7472 +7473, O7473 +7474, O7474 +7475, O7475 +7476, O7476 +7477, O7477 +7478, O7478 +7479, O7479 +7480, O7480 +7481, O7481 +7482, O7482 +7483, O7483 +7484, O7484 +7485, O7485 +7486, O7486 +7487, O7487 +7488, O7488 +7489, O7489 +7490, O7490 +7491, O7491 +7492, O7492 +7493, O7493 +7494, O7494 +7495, O7495 +7496, O7496 +7497, O7497 +7498, O7498 +7499, O7499 +7500, O7500 +7501, O7501 +7502, O7502 +7503, O7503 +7504, O7504 +7505, O7505 +7506, O7506 +7507, O7507 +7508, O7508 +7509, O7509 +7510, O7510 +7511, O7511 +7512, O7512 +7513, O7513 +7514, O7514 +7515, O7515 +7516, O7516 +7517, O7517 +7518, O7518 +7519, O7519 +7520, O7520 +7521, O7521 +7522, O7522 +7523, O7523 +7524, O7524 +7525, O7525 +7526, O7526 +7527, O7527 +7528, O7528 +7529, O7529 +7530, O7530 +7531, O7531 +7532, O7532 +7533, O7533 +7534, O7534 +7535, O7535 +7536, O7536 +7537, O7537 +7538, O7538 +7539, O7539 +7540, O7540 +7541, O7541 +7542, O7542 +7543, O7543 +7544, O7544 +7545, O7545 +7546, O7546 +7547, O7547 +7548, O7548 +7549, O7549 +7550, O7550 +7551, O7551 +7552, O7552 +7553, O7553 +7554, O7554 +7555, O7555 +7556, O7556 +7557, O7557 +7558, O7558 +7559, O7559 +7560, O7560 +7561, O7561 +7562, O7562 +7563, O7563 +7564, O7564 +7565, O7565 +7566, O7566 +7567, O7567 +7568, O7568 +7569, O7569 +7570, O7570 +7571, O7571 +7572, O7572 +7573, O7573 +7574, O7574 +7575, O7575 +7576, O7576 +7577, O7577 +7578, O7578 +7579, O7579 +7580, O7580 +7581, O7581 +7582, O7582 +7583, O7583 +7584, O7584 +7585, O7585 +7586, O7586 +7587, O7587 +7588, O7588 +7589, O7589 +7590, O7590 +7591, O7591 +7592, O7592 +7593, O7593 +7594, O7594 +7595, O7595 +7596, O7596 +7597, O7597 +7598, O7598 +7599, O7599 +7600, O7600 +7601, O7601 +7602, O7602 +7603, O7603 +7604, O7604 +7605, O7605 +7606, O7606 +7607, O7607 +7608, O7608 +7609, O7609 +7610, O7610 +7611, O7611 +7612, O7612 +7613, O7613 +7614, O7614 +7615, O7615 +7616, O7616 +7617, O7617 +7618, O7618 +7619, O7619 +7620, O7620 +7621, O7621 +7622, O7622 +7623, O7623 +7624, O7624 +7625, O7625 +7626, O7626 +7627, O7627 +7628, O7628 +7629, O7629 +7630, O7630 +7631, O7631 +7632, O7632 +7633, O7633 +7634, O7634 +7635, O7635 +7636, O7636 +7637, O7637 +7638, O7638 +7639, O7639 +7640, O7640 +7641, O7641 +7642, O7642 +7643, O7643 +7644, O7644 +7645, O7645 +7646, O7646 +7647, O7647 +7648, O7648 +7649, O7649 +7650, O7650 +7651, O7651 +7652, O7652 +7653, O7653 +7654, O7654 +7655, O7655 +7656, O7656 +7657, O7657 +7658, O7658 +7659, O7659 +7660, O7660 +7661, O7661 +7662, O7662 +7663, O7663 +7664, O7664 +7665, O7665 +7666, O7666 +7667, O7667 +7668, O7668 +7669, O7669 +7670, O7670 +7671, O7671 +7672, O7672 +7673, O7673 +7674, O7674 +7675, O7675 +7676, O7676 +7677, O7677 +7678, O7678 +7679, O7679 +7680, O7680 +7681, O7681 +7682, O7682 +7683, O7683 +7684, O7684 +7685, O7685 +7686, O7686 +7687, O7687 +7688, O7688 +7689, O7689 +7690, O7690 +7691, O7691 +7692, O7692 +7693, O7693 +7694, O7694 +7695, O7695 +7696, O7696 +7697, O7697 +7698, O7698 +7699, O7699 +7700, O7700 +7701, O7701 +7702, O7702 +7703, O7703 +7704, O7704 +7705, O7705 +7706, O7706 +7707, O7707 +7708, O7708 +7709, O7709 +7710, O7710 +7711, O7711 +7712, O7712 +7713, O7713 +7714, O7714 +7715, O7715 +7716, O7716 +7717, O7717 +7718, O7718 +7719, O7719 +7720, O7720 +7721, O7721 +7722, O7722 +7723, O7723 +7724, O7724 +7725, O7725 +7726, O7726 +7727, O7727 +7728, O7728 +7729, O7729 +7730, O7730 +7731, O7731 +7732, O7732 +7733, O7733 +7734, O7734 +7735, O7735 +7736, O7736 +7737, O7737 +7738, O7738 +7739, O7739 +7740, O7740 +7741, O7741 +7742, O7742 +7743, O7743 +7744, O7744 +7745, O7745 +7746, O7746 +7747, O7747 +7748, O7748 +7749, O7749 +7750, O7750 +7751, O7751 +7752, O7752 +7753, O7753 +7754, O7754 +7755, O7755 +7756, O7756 +7757, O7757 +7758, O7758 +7759, O7759 +7760, O7760 +7761, O7761 +7762, O7762 +7763, O7763 +7764, O7764 +7765, O7765 +7766, O7766 +7767, O7767 +7768, O7768 +7769, O7769 +7770, O7770 +7771, O7771 +7772, O7772 +7773, O7773 +7774, O7774 +7775, O7775 +7776, O7776 +7777, O7777 +7778, O7778 +7779, O7779 +7780, O7780 +7781, O7781 +7782, O7782 +7783, O7783 +7784, O7784 +7785, O7785 +7786, O7786 +7787, O7787 +7788, O7788 +7789, O7789 +7790, O7790 +7791, O7791 +7792, O7792 +7793, O7793 +7794, O7794 +7795, O7795 +7796, O7796 +7797, O7797 +7798, O7798 +7799, O7799 +7800, O7800 +7801, O7801 +7802, O7802 +7803, O7803 +7804, O7804 +7805, O7805 +7806, O7806 +7807, O7807 +7808, O7808 +7809, O7809 +7810, O7810 +7811, O7811 +7812, O7812 +7813, O7813 +7814, O7814 +7815, O7815 +7816, O7816 +7817, O7817 +7818, O7818 +7819, O7819 +7820, O7820 +7821, O7821 +7822, O7822 +7823, O7823 +7824, O7824 +7825, O7825 +7826, O7826 +7827, O7827 +7828, O7828 +7829, O7829 +7830, O7830 +7831, O7831 +7832, O7832 +7833, O7833 +7834, O7834 +7835, O7835 +7836, O7836 +7837, O7837 +7838, O7838 +7839, O7839 +7840, O7840 +7841, O7841 +7842, O7842 +7843, O7843 +7844, O7844 +7845, O7845 +7846, O7846 +7847, O7847 +7848, O7848 +7849, O7849 +7850, O7850 +7851, O7851 +7852, O7852 +7853, O7853 +7854, O7854 +7855, O7855 +7856, O7856 +7857, O7857 +7858, O7858 +7859, O7859 +7860, O7860 +7861, O7861 +7862, O7862 +7863, O7863 +7864, O7864 +7865, O7865 +7866, O7866 +7867, O7867 +7868, O7868 +7869, O7869 +7870, O7870 +7871, O7871 +7872, O7872 +7873, O7873 +7874, O7874 +7875, O7875 +7876, O7876 +7877, O7877 +7878, O7878 +7879, O7879 +7880, O7880 +7881, O7881 +7882, O7882 +7883, O7883 +7884, O7884 +7885, O7885 +7886, O7886 +7887, O7887 +7888, O7888 +7889, O7889 +7890, O7890 +7891, O7891 +7892, O7892 +7893, O7893 +7894, O7894 +7895, O7895 +7896, O7896 +7897, O7897 +7898, O7898 +7899, O7899 +7900, O7900 +7901, O7901 +7902, O7902 +7903, O7903 +7904, O7904 +7905, O7905 +7906, O7906 +7907, O7907 +7908, O7908 +7909, O7909 +7910, O7910 +7911, O7911 +7912, O7912 +7913, O7913 +7914, O7914 +7915, O7915 +7916, O7916 +7917, O7917 +7918, O7918 +7919, O7919 +7920, O7920 +7921, O7921 +7922, O7922 +7923, O7923 +7924, O7924 +7925, O7925 +7926, O7926 +7927, O7927 +7928, O7928 +7929, O7929 +7930, O7930 +7931, O7931 +7932, O7932 +7933, O7933 +7934, O7934 +7935, O7935 +7936, O7936 +7937, O7937 +7938, O7938 +7939, O7939 +7940, O7940 +7941, O7941 +7942, O7942 +7943, O7943 +7944, O7944 +7945, O7945 +7946, O7946 +7947, O7947 +7948, O7948 +7949, O7949 +7950, O7950 +7951, O7951 +7952, O7952 +7953, O7953 +7954, O7954 +7955, O7955 +7956, O7956 +7957, O7957 +7958, O7958 +7959, O7959 +7960, O7960 +7961, O7961 +7962, O7962 +7963, O7963 +7964, O7964 +7965, O7965 +7966, O7966 +7967, O7967 +7968, O7968 +7969, O7969 +7970, O7970 +7971, O7971 +7972, O7972 +7973, O7973 +7974, O7974 +7975, O7975 +7976, O7976 +7977, O7977 +7978, O7978 +7979, O7979 +7980, O7980 +7981, O7981 +7982, O7982 +7983, O7983 +7984, O7984 +7985, O7985 +7986, O7986 +7987, O7987 +7988, O7988 +7989, O7989 +7990, O7990 +7991, O7991 +7992, O7992 +7993, O7993 +7994, O7994 +7995, O7995 +7996, O7996 +7997, O7997 +7998, O7998 +7999, O7999 +8000, O8000 +8001, O8001 +8002, O8002 +8003, O8003 +8004, O8004 +8005, O8005 +8006, O8006 +8007, O8007 +8008, O8008 +8009, O8009 +8010, O8010 +8011, O8011 +8012, O8012 +8013, O8013 +8014, O8014 +8015, O8015 +8016, O8016 +8017, O8017 +8018, O8018 +8019, O8019 +8020, O8020 +8021, O8021 +8022, O8022 +8023, O8023 +8024, O8024 +8025, O8025 +8026, O8026 +8027, O8027 +8028, O8028 +8029, O8029 +8030, O8030 +8031, O8031 +8032, O8032 +8033, O8033 +8034, O8034 +8035, O8035 +8036, O8036 +8037, O8037 +8038, O8038 +8039, O8039 +8040, O8040 +8041, O8041 +8042, O8042 +8043, O8043 +8044, O8044 +8045, O8045 +8046, O8046 +8047, O8047 +8048, O8048 +8049, O8049 +8050, O8050 +8051, O8051 +8052, O8052 +8053, O8053 +8054, O8054 +8055, O8055 +8056, O8056 +8057, O8057 +8058, O8058 +8059, O8059 +8060, O8060 +8061, O8061 +8062, O8062 +8063, O8063 +8064, O8064 +8065, O8065 +8066, O8066 +8067, O8067 +8068, O8068 +8069, O8069 +8070, O8070 +8071, O8071 +8072, O8072 +8073, O8073 +8074, O8074 +8075, O8075 +8076, O8076 +8077, O8077 +8078, O8078 +8079, O8079 +8080, O8080 +8081, O8081 +8082, O8082 +8083, O8083 +8084, O8084 +8085, O8085 +8086, O8086 +8087, O8087 +8088, O8088 +8089, O8089 +8090, O8090 +8091, O8091 +8092, O8092 +8093, O8093 +8094, O8094 +8095, O8095 +8096, O8096 +8097, O8097 +8098, O8098 +8099, O8099 +8100, O8100 +8101, O8101 +8102, O8102 +8103, O8103 +8104, O8104 +8105, O8105 +8106, O8106 +8107, O8107 +8108, O8108 +8109, O8109 +8110, O8110 +8111, O8111 +8112, O8112 +8113, O8113 +8114, O8114 +8115, O8115 +8116, O8116 +8117, O8117 +8118, O8118 +8119, O8119 +8120, O8120 +8121, O8121 +8122, O8122 +8123, O8123 +8124, O8124 +8125, O8125 +8126, O8126 +8127, O8127 +8128, O8128 +8129, O8129 +8130, O8130 +8131, O8131 +8132, O8132 +8133, O8133 +8134, O8134 +8135, O8135 +8136, O8136 +8137, O8137 +8138, O8138 +8139, O8139 +8140, O8140 +8141, O8141 +8142, O8142 +8143, O8143 +8144, O8144 +8145, O8145 +8146, O8146 +8147, O8147 +8148, O8148 +8149, O8149 +8150, O8150 +8151, O8151 +8152, O8152 +8153, O8153 +8154, O8154 +8155, O8155 +8156, O8156 +8157, O8157 +8158, O8158 +8159, O8159 +8160, O8160 +8161, O8161 +8162, O8162 +8163, O8163 +8164, O8164 +8165, O8165 +8166, O8166 +8167, O8167 +8168, O8168 +8169, O8169 +8170, O8170 +8171, O8171 +8172, O8172 +8173, O8173 +8174, O8174 +8175, O8175 +8176, O8176 +8177, O8177 +8178, O8178 +8179, O8179 +8180, O8180 +8181, O8181 +8182, O8182 +8183, O8183 +8184, O8184 +8185, O8185 +8186, O8186 +8187, O8187 +8188, O8188 +8189, O8189 +8190, O8190 +8191, O8191 +8192, O8192 +8193, O8193 +8194, O8194 +8195, O8195 +8196, O8196 +8197, O8197 +8198, O8198 +8199, O8199 +8200, O8200 +8201, O8201 +8202, O8202 +8203, O8203 +8204, O8204 +8205, O8205 +8206, O8206 +8207, O8207 +8208, O8208 +8209, O8209 +8210, O8210 +8211, O8211 +8212, O8212 +8213, O8213 +8214, O8214 +8215, O8215 +8216, O8216 +8217, O8217 +8218, O8218 +8219, O8219 +8220, O8220 +8221, O8221 +8222, O8222 +8223, O8223 +8224, O8224 +8225, O8225 +8226, O8226 +8227, O8227 +8228, O8228 +8229, O8229 +8230, O8230 +8231, O8231 +8232, O8232 +8233, O8233 +8234, O8234 +8235, O8235 +8236, O8236 +8237, O8237 +8238, O8238 +8239, O8239 +8240, O8240 +8241, O8241 +8242, O8242 +8243, O8243 +8244, O8244 +8245, O8245 +8246, O8246 +8247, O8247 +8248, O8248 +8249, O8249 +8250, O8250 +8251, O8251 +8252, O8252 +8253, O8253 +8254, O8254 +8255, O8255 +8256, O8256 +8257, O8257 +8258, O8258 +8259, O8259 +8260, O8260 +8261, O8261 +8262, O8262 +8263, O8263 +8264, O8264 +8265, O8265 +8266, O8266 +8267, O8267 +8268, O8268 +8269, O8269 +8270, O8270 +8271, O8271 +8272, O8272 +8273, O8273 +8274, O8274 +8275, O8275 +8276, O8276 +8277, O8277 +8278, O8278 +8279, O8279 +8280, O8280 +8281, O8281 +8282, O8282 +8283, O8283 +8284, O8284 +8285, O8285 +8286, O8286 +8287, O8287 +8288, O8288 +8289, O8289 +8290, O8290 +8291, O8291 +8292, O8292 +8293, O8293 +8294, O8294 +8295, O8295 +8296, O8296 +8297, O8297 +8298, O8298 +8299, O8299 +8300, O8300 +8301, O8301 +8302, O8302 +8303, O8303 +8304, O8304 +8305, O8305 +8306, O8306 +8307, O8307 +8308, O8308 +8309, O8309 +8310, O8310 +8311, O8311 +8312, O8312 +8313, O8313 +8314, O8314 +8315, O8315 +8316, O8316 +8317, O8317 +8318, O8318 +8319, O8319 +8320, O8320 +8321, O8321 +8322, O8322 +8323, O8323 +8324, O8324 +8325, O8325 +8326, O8326 +8327, O8327 +8328, O8328 +8329, O8329 +8330, O8330 +8331, O8331 +8332, O8332 +8333, O8333 +8334, O8334 +8335, O8335 +8336, O8336 +8337, O8337 +8338, O8338 +8339, O8339 +8340, O8340 +8341, O8341 +8342, O8342 +8343, O8343 +8344, O8344 +8345, O8345 +8346, O8346 +8347, O8347 +8348, O8348 +8349, O8349 +8350, O8350 +8351, O8351 +8352, O8352 +8353, O8353 +8354, O8354 +8355, O8355 +8356, O8356 +8357, O8357 +8358, O8358 +8359, O8359 +8360, O8360 +8361, O8361 +8362, O8362 +8363, O8363 +8364, O8364 +8365, O8365 +8366, O8366 +8367, O8367 +8368, O8368 +8369, O8369 +8370, O8370 +8371, O8371 +8372, O8372 +8373, O8373 +8374, O8374 +8375, O8375 +8376, O8376 +8377, O8377 +8378, O8378 +8379, O8379 +8380, O8380 +8381, O8381 +8382, O8382 +8383, O8383 +8384, O8384 +8385, O8385 +8386, O8386 +8387, O8387 +8388, O8388 +8389, O8389 +8390, O8390 +8391, O8391 +8392, O8392 +8393, O8393 +8394, O8394 +8395, O8395 +8396, O8396 +8397, O8397 +8398, O8398 +8399, O8399 +8400, O8400 +8401, O8401 +8402, O8402 +8403, O8403 +8404, O8404 +8405, O8405 +8406, O8406 +8407, O8407 +8408, O8408 +8409, O8409 +8410, O8410 +8411, O8411 +8412, O8412 +8413, O8413 +8414, O8414 +8415, O8415 +8416, O8416 +8417, O8417 +8418, O8418 +8419, O8419 +8420, O8420 +8421, O8421 +8422, O8422 +8423, O8423 +8424, O8424 +8425, O8425 +8426, O8426 +8427, O8427 +8428, O8428 +8429, O8429 +8430, O8430 +8431, O8431 +8432, O8432 +8433, O8433 +8434, O8434 +8435, O8435 +8436, O8436 +8437, O8437 +8438, O8438 +8439, O8439 +8440, O8440 +8441, O8441 +8442, O8442 +8443, O8443 +8444, O8444 +8445, O8445 +8446, O8446 +8447, O8447 +8448, O8448 +8449, O8449 +8450, O8450 +8451, O8451 +8452, O8452 +8453, O8453 +8454, O8454 +8455, O8455 +8456, O8456 +8457, O8457 +8458, O8458 +8459, O8459 +8460, O8460 +8461, O8461 +8462, O8462 +8463, O8463 +8464, O8464 +8465, O8465 +8466, O8466 +8467, O8467 +8468, O8468 +8469, O8469 +8470, O8470 +8471, O8471 +8472, O8472 +8473, O8473 +8474, O8474 +8475, O8475 +8476, O8476 +8477, O8477 +8478, O8478 +8479, O8479 +8480, O8480 +8481, O8481 +8482, O8482 +8483, O8483 +8484, O8484 +8485, O8485 +8486, O8486 +8487, O8487 +8488, O8488 +8489, O8489 +8490, O8490 +8491, O8491 +8492, O8492 +8493, O8493 +8494, O8494 +8495, O8495 +8496, O8496 +8497, O8497 +8498, O8498 +8499, O8499 +8500, O8500 +8501, O8501 +8502, O8502 +8503, O8503 +8504, O8504 +8505, O8505 +8506, O8506 +8507, O8507 +8508, O8508 +8509, O8509 +8510, O8510 +8511, O8511 +8512, O8512 +8513, O8513 +8514, O8514 +8515, O8515 +8516, O8516 +8517, O8517 +8518, O8518 +8519, O8519 +8520, O8520 +8521, O8521 +8522, O8522 +8523, O8523 +8524, O8524 +8525, O8525 +8526, O8526 +8527, O8527 +8528, O8528 +8529, O8529 +8530, O8530 +8531, O8531 +8532, O8532 +8533, O8533 +8534, O8534 +8535, O8535 +8536, O8536 +8537, O8537 +8538, O8538 +8539, O8539 +8540, O8540 +8541, O8541 +8542, O8542 +8543, O8543 +8544, O8544 +8545, O8545 +8546, O8546 +8547, O8547 +8548, O8548 +8549, O8549 +8550, O8550 +8551, O8551 +8552, O8552 +8553, O8553 +8554, O8554 +8555, O8555 +8556, O8556 +8557, O8557 +8558, O8558 +8559, O8559 +8560, O8560 +8561, O8561 +8562, O8562 +8563, O8563 +8564, O8564 +8565, O8565 +8566, O8566 +8567, O8567 +8568, O8568 +8569, O8569 +8570, O8570 +8571, O8571 +8572, O8572 +8573, O8573 +8574, O8574 +8575, O8575 +8576, O8576 +8577, O8577 +8578, O8578 +8579, O8579 +8580, O8580 +8581, O8581 +8582, O8582 +8583, O8583 +8584, O8584 +8585, O8585 +8586, O8586 +8587, O8587 +8588, O8588 +8589, O8589 +8590, O8590 +8591, O8591 +8592, O8592 +8593, O8593 +8594, O8594 +8595, O8595 +8596, O8596 +8597, O8597 +8598, O8598 +8599, O8599 +8600, O8600 +8601, O8601 +8602, O8602 +8603, O8603 +8604, O8604 +8605, O8605 +8606, O8606 +8607, O8607 +8608, O8608 +8609, O8609 +8610, O8610 +8611, O8611 +8612, O8612 +8613, O8613 +8614, O8614 +8615, O8615 +8616, O8616 +8617, O8617 +8618, O8618 +8619, O8619 +8620, O8620 +8621, O8621 +8622, O8622 +8623, O8623 +8624, O8624 +8625, O8625 +8626, O8626 +8627, O8627 +8628, O8628 +8629, O8629 +8630, O8630 +8631, O8631 +8632, O8632 +8633, O8633 +8634, O8634 +8635, O8635 +8636, O8636 +8637, O8637 +8638, O8638 +8639, O8639 +8640, O8640 +8641, O8641 +8642, O8642 +8643, O8643 +8644, O8644 +8645, O8645 +8646, O8646 +8647, O8647 +8648, O8648 +8649, O8649 +8650, O8650 +8651, O8651 +8652, O8652 +8653, O8653 +8654, O8654 +8655, O8655 +8656, O8656 +8657, O8657 +8658, O8658 +8659, O8659 +8660, O8660 +8661, O8661 +8662, O8662 +8663, O8663 +8664, O8664 +8665, O8665 +8666, O8666 +8667, O8667 +8668, O8668 +8669, O8669 +8670, O8670 +8671, O8671 +8672, O8672 +8673, O8673 +8674, O8674 +8675, O8675 +8676, O8676 +8677, O8677 +8678, O8678 +8679, O8679 +8680, O8680 +8681, O8681 +8682, O8682 +8683, O8683 +8684, O8684 +8685, O8685 +8686, O8686 +8687, O8687 +8688, O8688 +8689, O8689 +8690, O8690 +8691, O8691 +8692, O8692 +8693, O8693 +8694, O8694 +8695, O8695 +8696, O8696 +8697, O8697 +8698, O8698 +8699, O8699 +8700, O8700 +8701, O8701 +8702, O8702 +8703, O8703 +8704, O8704 +8705, O8705 +8706, O8706 +8707, O8707 +8708, O8708 +8709, O8709 +8710, O8710 +8711, O8711 +8712, O8712 +8713, O8713 +8714, O8714 +8715, O8715 +8716, O8716 +8717, O8717 +8718, O8718 +8719, O8719 +8720, O8720 +8721, O8721 +8722, O8722 +8723, O8723 +8724, O8724 +8725, O8725 +8726, O8726 +8727, O8727 +8728, O8728 +8729, O8729 +8730, O8730 +8731, O8731 +8732, O8732 +8733, O8733 +8734, O8734 +8735, O8735 +8736, O8736 +8737, O8737 +8738, O8738 +8739, O8739 +8740, O8740 +8741, O8741 +8742, O8742 +8743, O8743 +8744, O8744 +8745, O8745 +8746, O8746 +8747, O8747 +8748, O8748 +8749, O8749 +8750, O8750 +8751, O8751 +8752, O8752 +8753, O8753 +8754, O8754 +8755, O8755 +8756, O8756 +8757, O8757 +8758, O8758 +8759, O8759 +8760, O8760 +8761, O8761 +8762, O8762 +8763, O8763 +8764, O8764 +8765, O8765 +8766, O8766 +8767, O8767 +8768, O8768 +8769, O8769 +8770, O8770 +8771, O8771 +8772, O8772 +8773, O8773 +8774, O8774 +8775, O8775 +8776, O8776 +8777, O8777 +8778, O8778 +8779, O8779 +8780, O8780 +8781, O8781 +8782, O8782 +8783, O8783 +8784, O8784 +8785, O8785 +8786, O8786 +8787, O8787 +8788, O8788 +8789, O8789 +8790, O8790 +8791, O8791 +8792, O8792 +8793, O8793 +8794, O8794 +8795, O8795 +8796, O8796 +8797, O8797 +8798, O8798 +8799, O8799 +8800, O8800 +8801, O8801 +8802, O8802 +8803, O8803 +8804, O8804 +8805, O8805 +8806, O8806 +8807, O8807 +8808, O8808 +8809, O8809 +8810, O8810 +8811, O8811 +8812, O8812 +8813, O8813 +8814, O8814 +8815, O8815 +8816, O8816 +8817, O8817 +8818, O8818 +8819, O8819 +8820, O8820 +8821, O8821 +8822, O8822 +8823, O8823 +8824, O8824 +8825, O8825 +8826, O8826 +8827, O8827 +8828, O8828 +8829, O8829 +8830, O8830 +8831, O8831 +8832, O8832 +8833, O8833 +8834, O8834 +8835, O8835 +8836, O8836 +8837, O8837 +8838, O8838 +8839, O8839 +8840, O8840 +8841, O8841 +8842, O8842 +8843, O8843 +8844, O8844 +8845, O8845 +8846, O8846 +8847, O8847 +8848, O8848 +8849, O8849 +8850, O8850 +8851, O8851 +8852, O8852 +8853, O8853 +8854, O8854 +8855, O8855 +8856, O8856 +8857, O8857 +8858, O8858 +8859, O8859 +8860, O8860 +8861, O8861 +8862, O8862 +8863, O8863 +8864, O8864 +8865, O8865 +8866, O8866 +8867, O8867 +8868, O8868 +8869, O8869 +8870, O8870 +8871, O8871 +8872, O8872 +8873, O8873 +8874, O8874 +8875, O8875 +8876, O8876 +8877, O8877 +8878, O8878 +8879, O8879 +8880, O8880 +8881, O8881 +8882, O8882 +8883, O8883 +8884, O8884 +8885, O8885 +8886, O8886 +8887, O8887 +8888, O8888 +8889, O8889 +8890, O8890 +8891, O8891 +8892, O8892 +8893, O8893 +8894, O8894 +8895, O8895 +8896, O8896 +8897, O8897 +8898, O8898 +8899, O8899 +8900, O8900 +8901, O8901 +8902, O8902 +8903, O8903 +8904, O8904 +8905, O8905 +8906, O8906 +8907, O8907 +8908, O8908 +8909, O8909 +8910, O8910 +8911, O8911 +8912, O8912 +8913, O8913 +8914, O8914 +8915, O8915 +8916, O8916 +8917, O8917 +8918, O8918 +8919, O8919 +8920, O8920 +8921, O8921 +8922, O8922 +8923, O8923 +8924, O8924 +8925, O8925 +8926, O8926 +8927, O8927 +8928, O8928 +8929, O8929 +8930, O8930 +8931, O8931 +8932, O8932 +8933, O8933 +8934, O8934 +8935, O8935 +8936, O8936 +8937, O8937 +8938, O8938 +8939, O8939 +8940, O8940 +8941, O8941 +8942, O8942 +8943, O8943 +8944, O8944 +8945, O8945 +8946, O8946 +8947, O8947 +8948, O8948 +8949, O8949 +8950, O8950 +8951, O8951 +8952, O8952 +8953, O8953 +8954, O8954 +8955, O8955 +8956, O8956 +8957, O8957 +8958, O8958 +8959, O8959 +8960, O8960 +8961, O8961 +8962, O8962 +8963, O8963 +8964, O8964 +8965, O8965 +8966, O8966 +8967, O8967 +8968, O8968 +8969, O8969 +8970, O8970 +8971, O8971 +8972, O8972 +8973, O8973 +8974, O8974 +8975, O8975 +8976, O8976 +8977, O8977 +8978, O8978 +8979, O8979 +8980, O8980 +8981, O8981 +8982, O8982 +8983, O8983 +8984, O8984 +8985, O8985 +8986, O8986 +8987, O8987 +8988, O8988 +8989, O8989 +8990, O8990 +8991, O8991 +8992, O8992 +8993, O8993 +8994, O8994 +8995, O8995 +8996, O8996 +8997, O8997 +8998, O8998 +8999, O8999 +9000, O9000 +9001, O9001 +9002, O9002 +9003, O9003 +9004, O9004 +9005, O9005 +9006, O9006 +9007, O9007 +9008, O9008 +9009, O9009 +9010, O9010 +9011, O9011 +9012, O9012 +9013, O9013 +9014, O9014 +9015, O9015 +9016, O9016 +9017, O9017 +9018, O9018 +9019, O9019 +9020, O9020 +9021, O9021 +9022, O9022 +9023, O9023 +9024, O9024 +9025, O9025 +9026, O9026 +9027, O9027 +9028, O9028 +9029, O9029 +9030, O9030 +9031, O9031 +9032, O9032 +9033, O9033 +9034, O9034 +9035, O9035 +9036, O9036 +9037, O9037 +9038, O9038 +9039, O9039 +9040, O9040 +9041, O9041 +9042, O9042 +9043, O9043 +9044, O9044 +9045, O9045 +9046, O9046 +9047, O9047 +9048, O9048 +9049, O9049 +9050, O9050 +9051, O9051 +9052, O9052 +9053, O9053 +9054, O9054 +9055, O9055 +9056, O9056 +9057, O9057 +9058, O9058 +9059, O9059 +9060, O9060 +9061, O9061 +9062, O9062 +9063, O9063 +9064, O9064 +9065, O9065 +9066, O9066 +9067, O9067 +9068, O9068 +9069, O9069 +9070, O9070 +9071, O9071 +9072, O9072 +9073, O9073 +9074, O9074 +9075, O9075 +9076, O9076 +9077, O9077 +9078, O9078 +9079, O9079 +9080, O9080 +9081, O9081 +9082, O9082 +9083, O9083 +9084, O9084 +9085, O9085 +9086, O9086 +9087, O9087 +9088, O9088 +9089, O9089 +9090, O9090 +9091, O9091 +9092, O9092 +9093, O9093 +9094, O9094 +9095, O9095 +9096, O9096 +9097, O9097 +9098, O9098 +9099, O9099 +9100, O9100 +9101, O9101 +9102, O9102 +9103, O9103 +9104, O9104 +9105, O9105 +9106, O9106 +9107, O9107 +9108, O9108 +9109, O9109 +9110, O9110 +9111, O9111 +9112, O9112 +9113, O9113 +9114, O9114 +9115, O9115 +9116, O9116 +9117, O9117 +9118, O9118 +9119, O9119 +9120, O9120 +9121, O9121 +9122, O9122 +9123, O9123 +9124, O9124 +9125, O9125 +9126, O9126 +9127, O9127 +9128, O9128 +9129, O9129 +9130, O9130 +9131, O9131 +9132, O9132 +9133, O9133 +9134, O9134 +9135, O9135 +9136, O9136 +9137, O9137 +9138, O9138 +9139, O9139 +9140, O9140 +9141, O9141 +9142, O9142 +9143, O9143 +9144, O9144 +9145, O9145 +9146, O9146 +9147, O9147 +9148, O9148 +9149, O9149 +9150, O9150 +9151, O9151 +9152, O9152 +9153, O9153 +9154, O9154 +9155, O9155 +9156, O9156 +9157, O9157 +9158, O9158 +9159, O9159 +9160, O9160 +9161, O9161 +9162, O9162 +9163, O9163 +9164, O9164 +9165, O9165 +9166, O9166 +9167, O9167 +9168, O9168 +9169, O9169 +9170, O9170 +9171, O9171 +9172, O9172 +9173, O9173 +9174, O9174 +9175, O9175 +9176, O9176 +9177, O9177 +9178, O9178 +9179, O9179 +9180, O9180 +9181, O9181 +9182, O9182 +9183, O9183 +9184, O9184 +9185, O9185 +9186, O9186 +9187, O9187 +9188, O9188 +9189, O9189 +9190, O9190 +9191, O9191 +9192, O9192 +9193, O9193 +9194, O9194 +9195, O9195 +9196, O9196 +9197, O9197 +9198, O9198 +9199, O9199 +9200, O9200 +9201, O9201 +9202, O9202 +9203, O9203 +9204, O9204 +9205, O9205 +9206, O9206 +9207, O9207 +9208, O9208 +9209, O9209 +9210, O9210 +9211, O9211 +9212, O9212 +9213, O9213 +9214, O9214 +9215, O9215 +9216, O9216 +9217, O9217 +9218, O9218 +9219, O9219 +9220, O9220 +9221, O9221 +9222, O9222 +9223, O9223 +9224, O9224 +9225, O9225 +9226, O9226 +9227, O9227 +9228, O9228 +9229, O9229 +9230, O9230 +9231, O9231 +9232, O9232 +9233, O9233 +9234, O9234 +9235, O9235 +9236, O9236 +9237, O9237 +9238, O9238 +9239, O9239 +9240, O9240 +9241, O9241 +9242, O9242 +9243, O9243 +9244, O9244 +9245, O9245 +9246, O9246 +9247, O9247 +9248, O9248 +9249, O9249 +9250, O9250 +9251, O9251 +9252, O9252 +9253, O9253 +9254, O9254 +9255, O9255 +9256, O9256 +9257, O9257 +9258, O9258 +9259, O9259 +9260, O9260 +9261, O9261 +9262, O9262 +9263, O9263 +9264, O9264 +9265, O9265 +9266, O9266 +9267, O9267 +9268, O9268 +9269, O9269 +9270, O9270 +9271, O9271 +9272, O9272 +9273, O9273 +9274, O9274 +9275, O9275 +9276, O9276 +9277, O9277 +9278, O9278 +9279, O9279 +9280, O9280 +9281, O9281 +9282, O9282 +9283, O9283 +9284, O9284 +9285, O9285 +9286, O9286 +9287, O9287 +9288, O9288 +9289, O9289 +9290, O9290 +9291, O9291 +9292, O9292 +9293, O9293 +9294, O9294 +9295, O9295 +9296, O9296 +9297, O9297 +9298, O9298 +9299, O9299 +9300, O9300 +9301, O9301 +9302, O9302 +9303, O9303 +9304, O9304 +9305, O9305 +9306, O9306 +9307, O9307 +9308, O9308 +9309, O9309 +9310, O9310 +9311, O9311 +9312, O9312 +9313, O9313 +9314, O9314 +9315, O9315 +9316, O9316 +9317, O9317 +9318, O9318 +9319, O9319 +9320, O9320 +9321, O9321 +9322, O9322 +9323, O9323 +9324, O9324 +9325, O9325 +9326, O9326 +9327, O9327 +9328, O9328 +9329, O9329 +9330, O9330 +9331, O9331 +9332, O9332 +9333, O9333 +9334, O9334 +9335, O9335 +9336, O9336 +9337, O9337 +9338, O9338 +9339, O9339 +9340, O9340 +9341, O9341 +9342, O9342 +9343, O9343 +9344, O9344 +9345, O9345 +9346, O9346 +9347, O9347 +9348, O9348 +9349, O9349 +9350, O9350 +9351, O9351 +9352, O9352 +9353, O9353 +9354, O9354 +9355, O9355 +9356, O9356 +9357, O9357 +9358, O9358 +9359, O9359 +9360, O9360 +9361, O9361 +9362, O9362 +9363, O9363 +9364, O9364 +9365, O9365 +9366, O9366 +9367, O9367 +9368, O9368 +9369, O9369 +9370, O9370 +9371, O9371 +9372, O9372 +9373, O9373 +9374, O9374 +9375, O9375 +9376, O9376 +9377, O9377 +9378, O9378 +9379, O9379 +9380, O9380 +9381, O9381 +9382, O9382 +9383, O9383 +9384, O9384 +9385, O9385 +9386, O9386 +9387, O9387 +9388, O9388 +9389, O9389 +9390, O9390 +9391, O9391 +9392, O9392 +9393, O9393 +9394, O9394 +9395, O9395 +9396, O9396 +9397, O9397 +9398, O9398 +9399, O9399 +9400, O9400 +9401, O9401 +9402, O9402 +9403, O9403 +9404, O9404 +9405, O9405 +9406, O9406 +9407, O9407 +9408, O9408 +9409, O9409 +9410, O9410 +9411, O9411 +9412, O9412 +9413, O9413 +9414, O9414 +9415, O9415 +9416, O9416 +9417, O9417 +9418, O9418 +9419, O9419 +9420, O9420 +9421, O9421 +9422, O9422 +9423, O9423 +9424, O9424 +9425, O9425 +9426, O9426 +9427, O9427 +9428, O9428 +9429, O9429 +9430, O9430 +9431, O9431 +9432, O9432 +9433, O9433 +9434, O9434 +9435, O9435 +9436, O9436 +9437, O9437 +9438, O9438 +9439, O9439 +9440, O9440 +9441, O9441 +9442, O9442 +9443, O9443 +9444, O9444 +9445, O9445 +9446, O9446 +9447, O9447 +9448, O9448 +9449, O9449 +9450, O9450 +9451, O9451 +9452, O9452 +9453, O9453 +9454, O9454 +9455, O9455 +9456, O9456 +9457, O9457 +9458, O9458 +9459, O9459 +9460, O9460 +9461, O9461 +9462, O9462 +9463, O9463 +9464, O9464 +9465, O9465 +9466, O9466 +9467, O9467 +9468, O9468 +9469, O9469 +9470, O9470 +9471, O9471 +9472, O9472 +9473, O9473 +9474, O9474 +9475, O9475 +9476, O9476 +9477, O9477 +9478, O9478 +9479, O9479 +9480, O9480 +9481, O9481 +9482, O9482 +9483, O9483 +9484, O9484 +9485, O9485 +9486, O9486 +9487, O9487 +9488, O9488 +9489, O9489 +9490, O9490 +9491, O9491 +9492, O9492 +9493, O9493 +9494, O9494 +9495, O9495 +9496, O9496 +9497, O9497 +9498, O9498 +9499, O9499 +9500, O9500 +9501, O9501 +9502, O9502 +9503, O9503 +9504, O9504 +9505, O9505 +9506, O9506 +9507, O9507 +9508, O9508 +9509, O9509 +9510, O9510 +9511, O9511 +9512, O9512 +9513, O9513 +9514, O9514 +9515, O9515 +9516, O9516 +9517, O9517 +9518, O9518 +9519, O9519 +9520, O9520 +9521, O9521 +9522, O9522 +9523, O9523 +9524, O9524 +9525, O9525 +9526, O9526 +9527, O9527 +9528, O9528 +9529, O9529 +9530, O9530 +9531, O9531 +9532, O9532 +9533, O9533 +9534, O9534 +9535, O9535 +9536, O9536 +9537, O9537 +9538, O9538 +9539, O9539 +9540, O9540 +9541, O9541 +9542, O9542 +9543, O9543 +9544, O9544 +9545, O9545 +9546, O9546 +9547, O9547 +9548, O9548 +9549, O9549 +9550, O9550 +9551, O9551 +9552, O9552 +9553, O9553 +9554, O9554 +9555, O9555 +9556, O9556 +9557, O9557 +9558, O9558 +9559, O9559 +9560, O9560 +9561, O9561 +9562, O9562 +9563, O9563 +9564, O9564 +9565, O9565 +9566, O9566 +9567, O9567 +9568, O9568 +9569, O9569 +9570, O9570 +9571, O9571 +9572, O9572 +9573, O9573 +9574, O9574 +9575, O9575 +9576, O9576 +9577, O9577 +9578, O9578 +9579, O9579 +9580, O9580 +9581, O9581 +9582, O9582 +9583, O9583 +9584, O9584 +9585, O9585 +9586, O9586 +9587, O9587 +9588, O9588 +9589, O9589 +9590, O9590 +9591, O9591 +9592, O9592 +9593, O9593 +9594, O9594 +9595, O9595 +9596, O9596 +9597, O9597 +9598, O9598 +9599, O9599 +9600, O9600 +9601, O9601 +9602, O9602 +9603, O9603 +9604, O9604 +9605, O9605 +9606, O9606 +9607, O9607 +9608, O9608 +9609, O9609 +9610, O9610 +9611, O9611 +9612, O9612 +9613, O9613 +9614, O9614 +9615, O9615 +9616, O9616 +9617, O9617 +9618, O9618 +9619, O9619 +9620, O9620 +9621, O9621 +9622, O9622 +9623, O9623 +9624, O9624 +9625, O9625 +9626, O9626 +9627, O9627 +9628, O9628 +9629, O9629 +9630, O9630 +9631, O9631 +9632, O9632 +9633, O9633 +9634, O9634 +9635, O9635 +9636, O9636 +9637, O9637 +9638, O9638 +9639, O9639 +9640, O9640 +9641, O9641 +9642, O9642 +9643, O9643 +9644, O9644 +9645, O9645 +9646, O9646 +9647, O9647 +9648, O9648 +9649, O9649 +9650, O9650 +9651, O9651 +9652, O9652 +9653, O9653 +9654, O9654 +9655, O9655 +9656, O9656 +9657, O9657 +9658, O9658 +9659, O9659 +9660, O9660 +9661, O9661 +9662, O9662 +9663, O9663 +9664, O9664 +9665, O9665 +9666, O9666 +9667, O9667 +9668, O9668 +9669, O9669 +9670, O9670 +9671, O9671 +9672, O9672 +9673, O9673 +9674, O9674 +9675, O9675 +9676, O9676 +9677, O9677 +9678, O9678 +9679, O9679 +9680, O9680 +9681, O9681 +9682, O9682 +9683, O9683 +9684, O9684 +9685, O9685 +9686, O9686 +9687, O9687 +9688, O9688 +9689, O9689 +9690, O9690 +9691, O9691 +9692, O9692 +9693, O9693 +9694, O9694 +9695, O9695 +9696, O9696 +9697, O9697 +9698, O9698 +9699, O9699 +9700, O9700 +9701, O9701 +9702, O9702 +9703, O9703 +9704, O9704 +9705, O9705 +9706, O9706 +9707, O9707 +9708, O9708 +9709, O9709 +9710, O9710 +9711, O9711 +9712, O9712 +9713, O9713 +9714, O9714 +9715, O9715 +9716, O9716 +9717, O9717 +9718, O9718 +9719, O9719 +9720, O9720 +9721, O9721 +9722, O9722 +9723, O9723 +9724, O9724 +9725, O9725 +9726, O9726 +9727, O9727 +9728, O9728 +9729, O9729 +9730, O9730 +9731, O9731 +9732, O9732 +9733, O9733 +9734, O9734 +9735, O9735 +9736, O9736 +9737, O9737 +9738, O9738 +9739, O9739 +9740, O9740 +9741, O9741 +9742, O9742 +9743, O9743 +9744, O9744 +9745, O9745 +9746, O9746 +9747, O9747 +9748, O9748 +9749, O9749 +9750, O9750 +9751, O9751 +9752, O9752 +9753, O9753 +9754, O9754 +9755, O9755 +9756, O9756 +9757, O9757 +9758, O9758 +9759, O9759 +9760, O9760 +9761, O9761 +9762, O9762 +9763, O9763 +9764, O9764 +9765, O9765 +9766, O9766 +9767, O9767 +9768, O9768 +9769, O9769 +9770, O9770 +9771, O9771 +9772, O9772 +9773, O9773 +9774, O9774 +9775, O9775 +9776, O9776 +9777, O9777 +9778, O9778 +9779, O9779 +9780, O9780 +9781, O9781 +9782, O9782 +9783, O9783 +9784, O9784 +9785, O9785 +9786, O9786 +9787, O9787 +9788, O9788 +9789, O9789 +9790, O9790 +9791, O9791 +9792, O9792 +9793, O9793 +9794, O9794 +9795, O9795 +9796, O9796 +9797, O9797 +9798, O9798 +9799, O9799 +9800, O9800 +9801, O9801 +9802, O9802 +9803, O9803 +9804, O9804 +9805, O9805 +9806, O9806 +9807, O9807 +9808, O9808 +9809, O9809 +9810, O9810 +9811, O9811 +9812, O9812 +9813, O9813 +9814, O9814 +9815, O9815 +9816, O9816 +9817, O9817 +9818, O9818 +9819, O9819 +9820, O9820 +9821, O9821 +9822, O9822 +9823, O9823 +9824, O9824 +9825, O9825 +9826, O9826 +9827, O9827 +9828, O9828 +9829, O9829 +9830, O9830 +9831, O9831 +9832, O9832 +9833, O9833 +9834, O9834 +9835, O9835 +9836, O9836 +9837, O9837 +9838, O9838 +9839, O9839 +9840, O9840 +9841, O9841 +9842, O9842 +9843, O9843 +9844, O9844 +9845, O9845 +9846, O9846 +9847, O9847 +9848, O9848 +9849, O9849 +9850, O9850 +9851, O9851 +9852, O9852 +9853, O9853 +9854, O9854 +9855, O9855 +9856, O9856 +9857, O9857 +9858, O9858 +9859, O9859 +9860, O9860 +9861, O9861 +9862, O9862 +9863, O9863 +9864, O9864 +9865, O9865 +9866, O9866 +9867, O9867 +9868, O9868 +9869, O9869 +9870, O9870 +9871, O9871 +9872, O9872 +9873, O9873 +9874, O9874 +9875, O9875 +9876, O9876 +9877, O9877 +9878, O9878 +9879, O9879 +9880, O9880 +9881, O9881 +9882, O9882 +9883, O9883 +9884, O9884 +9885, O9885 +9886, O9886 +9887, O9887 +9888, O9888 +9889, O9889 +9890, O9890 +9891, O9891 +9892, O9892 +9893, O9893 +9894, O9894 +9895, O9895 +9896, O9896 +9897, O9897 +9898, O9898 +9899, O9899 +9900, O9900 +9901, O9901 +9902, O9902 +9903, O9903 +9904, O9904 +9905, O9905 +9906, O9906 +9907, O9907 +9908, O9908 +9909, O9909 +9910, O9910 +9911, O9911 +9912, O9912 +9913, O9913 +9914, O9914 +9915, O9915 +9916, O9916 +9917, O9917 +9918, O9918 +9919, O9919 +9920, O9920 +9921, O9921 +9922, O9922 +9923, O9923 +9924, O9924 +9925, O9925 +9926, O9926 +9927, O9927 +9928, O9928 +9929, O9929 +9930, O9930 +9931, O9931 +9932, O9932 +9933, O9933 +9934, O9934 +9935, O9935 +9936, O9936 +9937, O9937 +9938, O9938 +9939, O9939 +9940, O9940 +9941, O9941 +9942, O9942 +9943, O9943 +9944, O9944 +9945, O9945 +9946, O9946 +9947, O9947 +9948, O9948 +9949, O9949 +9950, O9950 +9951, O9951 +9952, O9952 +9953, O9953 +9954, O9954 +9955, O9955 +9956, O9956 +9957, O9957 +9958, O9958 +9959, O9959 +9960, O9960 +9961, O9961 +9962, O9962 +9963, O9963 +9964, O9964 +9965, O9965 +9966, O9966 +9967, O9967 +9968, O9968 +9969, O9969 +9970, O9970 +9971, O9971 +9972, O9972 +9973, O9973 +9974, O9974 +9975, O9975 +9976, O9976 +9977, O9977 +9978, O9978 +9979, O9979 +9980, O9980 +9981, O9981 +9982, O9982 +9983, O9983 +9984, O9984 +9985, O9985 +9986, O9986 +9987, O9987 +9988, O9988 +9989, O9989 +9990, O9990 +9991, O9991 +9992, O9992 +9993, O9993 +9994, O9994 +9995, O9995 +9996, O9996 +9997, O9997 +9998, O9998 +9999, O9999 +10000, O10000 +10001, O10001 +10002, O10002 +10003, O10003 +10004, O10004 +10005, O10005 +10006, O10006 +10007, O10007 +10008, O10008 +10009, O10009 +10010, O10010 +10011, O10011 +10012, O10012 +10013, O10013 +10014, O10014 +10015, O10015 +10016, O10016 +10017, O10017 +10018, O10018 +10019, O10019 +10020, O10020 +10021, O10021 +10022, O10022 +10023, O10023 +10024, O10024 +10025, O10025 +10026, O10026 +10027, O10027 +10028, O10028 +10029, O10029 +10030, O10030 +10031, O10031 +10032, O10032 +10033, O10033 +10034, O10034 +10035, O10035 +10036, O10036 +10037, O10037 +10038, O10038 +10039, O10039 +10040, O10040 +10041, O10041 +10042, O10042 +10043, O10043 +10044, O10044 +10045, O10045 +10046, O10046 +10047, O10047 +10048, O10048 +10049, O10049 +10050, O10050 +10051, O10051 +10052, O10052 +10053, O10053 +10054, O10054 +10055, O10055 +10056, O10056 +10057, O10057 +10058, O10058 +10059, O10059 +10060, O10060 +10061, O10061 +10062, O10062 +10063, O10063 +10064, O10064 +10065, O10065 +10066, O10066 +10067, O10067 +10068, O10068 +10069, O10069 +10070, O10070 +10071, O10071 +10072, O10072 +10073, O10073 +10074, O10074 +10075, O10075 +10076, O10076 +10077, O10077 +10078, O10078 +10079, O10079 +10080, O10080 +10081, O10081 +10082, O10082 +10083, O10083 +10084, O10084 +10085, O10085 +10086, O10086 +10087, O10087 +10088, O10088 +10089, O10089 +10090, O10090 +10091, O10091 +10092, O10092 +10093, O10093 +10094, O10094 +10095, O10095 +10096, O10096 +10097, O10097 +10098, O10098 +10099, O10099 +10100, O10100 +10101, O10101 +10102, O10102 +10103, O10103 +10104, O10104 +10105, O10105 +10106, O10106 +10107, O10107 +10108, O10108 +10109, O10109 +10110, O10110 +10111, O10111 +10112, O10112 +10113, O10113 +10114, O10114 +10115, O10115 +10116, O10116 +10117, O10117 +10118, O10118 +10119, O10119 +10120, O10120 +10121, O10121 +10122, O10122 +10123, O10123 +10124, O10124 +10125, O10125 +10126, O10126 +10127, O10127 +10128, O10128 +10129, O10129 +10130, O10130 +10131, O10131 +10132, O10132 +10133, O10133 +10134, O10134 +10135, O10135 +10136, O10136 +10137, O10137 +10138, O10138 +10139, O10139 +10140, O10140 +10141, O10141 +10142, O10142 +10143, O10143 +10144, O10144 +10145, O10145 +10146, O10146 +10147, O10147 +10148, O10148 +10149, O10149 +10150, O10150 +10151, O10151 +10152, O10152 +10153, O10153 +10154, O10154 +10155, O10155 +10156, O10156 +10157, O10157 +10158, O10158 +10159, O10159 +10160, O10160 +10161, O10161 +10162, O10162 +10163, O10163 +10164, O10164 +10165, O10165 +10166, O10166 +10167, O10167 +10168, O10168 +10169, O10169 +10170, O10170 +10171, O10171 +10172, O10172 +10173, O10173 +10174, O10174 +10175, O10175 +10176, O10176 +10177, O10177 +10178, O10178 +10179, O10179 +10180, O10180 +10181, O10181 +10182, O10182 +10183, O10183 +10184, O10184 +10185, O10185 +10186, O10186 +10187, O10187 +10188, O10188 +10189, O10189 +10190, O10190 +10191, O10191 +10192, O10192 +10193, O10193 +10194, O10194 +10195, O10195 +10196, O10196 +10197, O10197 +10198, O10198 +10199, O10199 +10200, O10200 +10201, O10201 +10202, O10202 +10203, O10203 +10204, O10204 +10205, O10205 +10206, O10206 +10207, O10207 +10208, O10208 +10209, O10209 +10210, O10210 +10211, O10211 +10212, O10212 +10213, O10213 +10214, O10214 +10215, O10215 +10216, O10216 +10217, O10217 +10218, O10218 +10219, O10219 +10220, O10220 +10221, O10221 +10222, O10222 +10223, O10223 +10224, O10224 +10225, O10225 +10226, O10226 +10227, O10227 +10228, O10228 +10229, O10229 +10230, O10230 +10231, O10231 +10232, O10232 +10233, O10233 +10234, O10234 +10235, O10235 +10236, O10236 +10237, O10237 +10238, O10238 +10239, O10239 +10240, O10240 +10241, O10241 +10242, O10242 +10243, O10243 +10244, O10244 +10245, O10245 +10246, O10246 +10247, O10247 +10248, O10248 +10249, O10249 +10250, O10250 +10251, O10251 +10252, O10252 +10253, O10253 +10254, O10254 +10255, O10255 +10256, O10256 +10257, O10257 +10258, O10258 +10259, O10259 +10260, O10260 +10261, O10261 +10262, O10262 +10263, O10263 +10264, O10264 +10265, O10265 +10266, O10266 +10267, O10267 +10268, O10268 +10269, O10269 +10270, O10270 +10271, O10271 +10272, O10272 +10273, O10273 +10274, O10274 +10275, O10275 +10276, O10276 +10277, O10277 +10278, O10278 +10279, O10279 +10280, O10280 +10281, O10281 +10282, O10282 +10283, O10283 +10284, O10284 +10285, O10285 +10286, O10286 +10287, O10287 +10288, O10288 +10289, O10289 +10290, O10290 +10291, O10291 +10292, O10292 +10293, O10293 +10294, O10294 +10295, O10295 +10296, O10296 +10297, O10297 +10298, O10298 +10299, O10299 +10300, O10300 +10301, O10301 +10302, O10302 +10303, O10303 +10304, O10304 +10305, O10305 +10306, O10306 +10307, O10307 +10308, O10308 +10309, O10309 +10310, O10310 +10311, O10311 +10312, O10312 +10313, O10313 +10314, O10314 +10315, O10315 +10316, O10316 +10317, O10317 +10318, O10318 +10319, O10319 +10320, O10320 +10321, O10321 +10322, O10322 +10323, O10323 +10324, O10324 +10325, O10325 +10326, O10326 +10327, O10327 +10328, O10328 +10329, O10329 +10330, O10330 +10331, O10331 +10332, O10332 +10333, O10333 +10334, O10334 +10335, O10335 +10336, O10336 +10337, O10337 +10338, O10338 +10339, O10339 +10340, O10340 +10341, O10341 +10342, O10342 +10343, O10343 +10344, O10344 +10345, O10345 +10346, O10346 +10347, O10347 +10348, O10348 +10349, O10349 +10350, O10350 +10351, O10351 +10352, O10352 +10353, O10353 +10354, O10354 +10355, O10355 +10356, O10356 +10357, O10357 +10358, O10358 +10359, O10359 +10360, O10360 +10361, O10361 +10362, O10362 +10363, O10363 +10364, O10364 +10365, O10365 +10366, O10366 +10367, O10367 +10368, O10368 +10369, O10369 +10370, O10370 +10371, O10371 +10372, O10372 +10373, O10373 +10374, O10374 +10375, O10375 +10376, O10376 +10377, O10377 +10378, O10378 +10379, O10379 +10380, O10380 +10381, O10381 +10382, O10382 +10383, O10383 +10384, O10384 +10385, O10385 +10386, O10386 +10387, O10387 +10388, O10388 +10389, O10389 +10390, O10390 +10391, O10391 +10392, O10392 +10393, O10393 +10394, O10394 +10395, O10395 +10396, O10396 +10397, O10397 +10398, O10398 +10399, O10399 +10400, O10400 +10401, O10401 +10402, O10402 +10403, O10403 +10404, O10404 +10405, O10405 +10406, O10406 +10407, O10407 +10408, O10408 +10409, O10409 +10410, O10410 +10411, O10411 +10412, O10412 +10413, O10413 +10414, O10414 +10415, O10415 +10416, O10416 +10417, O10417 +10418, O10418 +10419, O10419 +10420, O10420 +10421, O10421 +10422, O10422 +10423, O10423 +10424, O10424 +10425, O10425 +10426, O10426 +10427, O10427 +10428, O10428 +10429, O10429 +10430, O10430 +10431, O10431 +10432, O10432 +10433, O10433 +10434, O10434 +10435, O10435 +10436, O10436 +10437, O10437 +10438, O10438 +10439, O10439 +10440, O10440 +10441, O10441 +10442, O10442 +10443, O10443 +10444, O10444 +10445, O10445 +10446, O10446 +10447, O10447 +10448, O10448 +10449, O10449 +10450, O10450 +10451, O10451 +10452, O10452 +10453, O10453 +10454, O10454 +10455, O10455 +10456, O10456 +10457, O10457 +10458, O10458 +10459, O10459 +10460, O10460 +10461, O10461 +10462, O10462 +10463, O10463 +10464, O10464 +10465, O10465 +10466, O10466 +10467, O10467 +10468, O10468 +10469, O10469 +10470, O10470 +10471, O10471 +10472, O10472 +10473, O10473 +10474, O10474 +10475, O10475 +10476, O10476 +10477, O10477 +10478, O10478 +10479, O10479 +10480, O10480 +10481, O10481 +10482, O10482 +10483, O10483 +10484, O10484 +10485, O10485 +10486, O10486 +10487, O10487 +10488, O10488 +10489, O10489 +10490, O10490 +10491, O10491 +10492, O10492 +10493, O10493 +10494, O10494 +10495, O10495 +10496, O10496 +10497, O10497 +10498, O10498 +10499, O10499 +10500, O10500 +10501, O10501 +10502, O10502 +10503, O10503 +10504, O10504 +10505, O10505 +10506, O10506 +10507, O10507 +10508, O10508 +10509, O10509 +10510, O10510 +10511, O10511 +10512, O10512 +10513, O10513 +10514, O10514 +10515, O10515 +10516, O10516 +10517, O10517 +10518, O10518 +10519, O10519 +10520, O10520 +10521, O10521 +10522, O10522 +10523, O10523 +10524, O10524 +10525, O10525 +10526, O10526 +10527, O10527 +10528, O10528 +10529, O10529 +10530, O10530 +10531, O10531 +10532, O10532 +10533, O10533 +10534, O10534 +10535, O10535 +10536, O10536 +10537, O10537 +10538, O10538 +10539, O10539 +10540, O10540 +10541, O10541 +10542, O10542 +10543, O10543 +10544, O10544 +10545, O10545 +10546, O10546 +10547, O10547 +10548, O10548 +10549, O10549 +10550, O10550 +10551, O10551 +10552, O10552 +10553, O10553 +10554, O10554 +10555, O10555 +10556, O10556 +10557, O10557 +10558, O10558 +10559, O10559 +10560, O10560 +10561, O10561 +10562, O10562 +10563, O10563 +10564, O10564 +10565, O10565 +10566, O10566 +10567, O10567 +10568, O10568 +10569, O10569 +10570, O10570 +10571, O10571 +10572, O10572 +10573, O10573 +10574, O10574 +10575, O10575 +10576, O10576 +10577, O10577 +10578, O10578 +10579, O10579 +10580, O10580 +10581, O10581 +10582, O10582 +10583, O10583 +10584, O10584 +10585, O10585 +10586, O10586 +10587, O10587 +10588, O10588 +10589, O10589 +10590, O10590 +10591, O10591 +10592, O10592 +10593, O10593 +10594, O10594 +10595, O10595 +10596, O10596 +10597, O10597 +10598, O10598 +10599, O10599 +10600, O10600 +10601, O10601 +10602, O10602 +10603, O10603 +10604, O10604 +10605, O10605 +10606, O10606 +10607, O10607 +10608, O10608 +10609, O10609 +10610, O10610 +10611, O10611 +10612, O10612 +10613, O10613 +10614, O10614 +10615, O10615 +10616, O10616 +10617, O10617 +10618, O10618 +10619, O10619 +10620, O10620 +10621, O10621 +10622, O10622 +10623, O10623 +10624, O10624 +10625, O10625 +10626, O10626 +10627, O10627 +10628, O10628 +10629, O10629 +10630, O10630 +10631, O10631 +10632, O10632 +10633, O10633 +10634, O10634 +10635, O10635 +10636, O10636 +10637, O10637 +10638, O10638 +10639, O10639 +10640, O10640 +10641, O10641 +10642, O10642 +10643, O10643 +10644, O10644 +10645, O10645 +10646, O10646 +10647, O10647 +10648, O10648 +10649, O10649 +10650, O10650 +10651, O10651 +10652, O10652 +10653, O10653 +10654, O10654 +10655, O10655 +10656, O10656 +10657, O10657 +10658, O10658 +10659, O10659 +10660, O10660 +10661, O10661 +10662, O10662 +10663, O10663 +10664, O10664 +10665, O10665 +10666, O10666 +10667, O10667 +10668, O10668 +10669, O10669 +10670, O10670 +10671, O10671 +10672, O10672 +10673, O10673 +10674, O10674 +10675, O10675 +10676, O10676 +10677, O10677 +10678, O10678 +10679, O10679 +10680, O10680 +10681, O10681 +10682, O10682 +10683, O10683 +10684, O10684 +10685, O10685 +10686, O10686 +10687, O10687 +10688, O10688 +10689, O10689 +10690, O10690 +10691, O10691 +10692, O10692 +10693, O10693 +10694, O10694 +10695, O10695 +10696, O10696 +10697, O10697 +10698, O10698 +10699, O10699 +10700, O10700 +10701, O10701 +10702, O10702 +10703, O10703 +10704, O10704 +10705, O10705 +10706, O10706 +10707, O10707 +10708, O10708 +10709, O10709 +10710, O10710 +10711, O10711 +10712, O10712 +10713, O10713 +10714, O10714 +10715, O10715 +10716, O10716 +10717, O10717 +10718, O10718 +10719, O10719 +10720, O10720 +10721, O10721 +10722, O10722 +10723, O10723 +10724, O10724 +10725, O10725 +10726, O10726 +10727, O10727 +10728, O10728 +10729, O10729 +10730, O10730 +10731, O10731 +10732, O10732 +10733, O10733 +10734, O10734 +10735, O10735 +10736, O10736 +10737, O10737 +10738, O10738 +10739, O10739 +10740, O10740 +10741, O10741 +10742, O10742 +10743, O10743 +10744, O10744 +10745, O10745 +10746, O10746 +10747, O10747 +10748, O10748 +10749, O10749 +10750, O10750 +10751, O10751 +10752, O10752 +10753, O10753 +10754, O10754 +10755, O10755 +10756, O10756 +10757, O10757 +10758, O10758 +10759, O10759 +10760, O10760 +10761, O10761 +10762, O10762 +10763, O10763 +10764, O10764 +10765, O10765 +10766, O10766 +10767, O10767 +10768, O10768 +10769, O10769 +10770, O10770 +10771, O10771 +10772, O10772 +10773, O10773 +10774, O10774 +10775, O10775 +10776, O10776 +10777, O10777 +10778, O10778 +10779, O10779 +10780, O10780 +10781, O10781 +10782, O10782 +10783, O10783 +10784, O10784 +10785, O10785 +10786, O10786 +10787, O10787 +10788, O10788 +10789, O10789 +10790, O10790 +10791, O10791 +10792, O10792 +10793, O10793 +10794, O10794 +10795, O10795 +10796, O10796 +10797, O10797 +10798, O10798 +10799, O10799 +10800, O10800 +10801, O10801 +10802, O10802 +10803, O10803 +10804, O10804 +10805, O10805 +10806, O10806 +10807, O10807 +10808, O10808 +10809, O10809 +10810, O10810 +10811, O10811 +10812, O10812 +10813, O10813 +10814, O10814 +10815, O10815 +10816, O10816 +10817, O10817 +10818, O10818 +10819, O10819 +10820, O10820 +10821, O10821 +10822, O10822 +10823, O10823 +10824, O10824 +10825, O10825 +10826, O10826 +10827, O10827 +10828, O10828 +10829, O10829 +10830, O10830 +10831, O10831 +10832, O10832 +10833, O10833 +10834, O10834 +10835, O10835 +10836, O10836 +10837, O10837 +10838, O10838 +10839, O10839 +10840, O10840 +10841, O10841 +10842, O10842 +10843, O10843 +10844, O10844 +10845, O10845 +10846, O10846 +10847, O10847 +10848, O10848 +10849, O10849 +10850, O10850 +10851, O10851 +10852, O10852 +10853, O10853 +10854, O10854 +10855, O10855 +10856, O10856 +10857, O10857 +10858, O10858 +10859, O10859 +10860, O10860 +10861, O10861 +10862, O10862 +10863, O10863 +10864, O10864 +10865, O10865 +10866, O10866 +10867, O10867 +10868, O10868 +10869, O10869 +10870, O10870 +10871, O10871 +10872, O10872 +10873, O10873 +10874, O10874 +10875, O10875 +10876, O10876 +10877, O10877 +10878, O10878 +10879, O10879 +10880, O10880 +10881, O10881 +10882, O10882 +10883, O10883 +10884, O10884 +10885, O10885 +10886, O10886 +10887, O10887 +10888, O10888 +10889, O10889 +10890, O10890 +10891, O10891 +10892, O10892 +10893, O10893 +10894, O10894 +10895, O10895 +10896, O10896 +10897, O10897 +10898, O10898 +10899, O10899 +10900, O10900 +10901, O10901 +10902, O10902 +10903, O10903 +10904, O10904 +10905, O10905 +10906, O10906 +10907, O10907 +10908, O10908 +10909, O10909 +10910, O10910 +10911, O10911 +10912, O10912 +10913, O10913 +10914, O10914 +10915, O10915 +10916, O10916 +10917, O10917 +10918, O10918 +10919, O10919 +10920, O10920 +10921, O10921 +10922, O10922 +10923, O10923 +10924, O10924 +10925, O10925 +10926, O10926 +10927, O10927 +10928, O10928 +10929, O10929 +10930, O10930 +10931, O10931 +10932, O10932 +10933, O10933 +10934, O10934 +10935, O10935 +10936, O10936 +10937, O10937 +10938, O10938 +10939, O10939 +10940, O10940 +10941, O10941 +10942, O10942 +10943, O10943 +10944, O10944 +10945, O10945 +10946, O10946 +10947, O10947 +10948, O10948 +10949, O10949 +10950, O10950 +10951, O10951 +10952, O10952 +10953, O10953 +10954, O10954 +10955, O10955 +10956, O10956 +10957, O10957 +10958, O10958 +10959, O10959 +10960, O10960 +10961, O10961 +10962, O10962 +10963, O10963 +10964, O10964 +10965, O10965 +10966, O10966 +10967, O10967 +10968, O10968 +10969, O10969 +10970, O10970 +10971, O10971 +10972, O10972 +10973, O10973 +10974, O10974 +10975, O10975 +10976, O10976 +10977, O10977 +10978, O10978 +10979, O10979 +10980, O10980 +10981, O10981 +10982, O10982 +10983, O10983 +10984, O10984 +10985, O10985 +10986, O10986 +10987, O10987 +10988, O10988 +10989, O10989 +10990, O10990 +10991, O10991 +10992, O10992 +10993, O10993 +10994, O10994 +10995, O10995 +10996, O10996 +10997, O10997 +10998, O10998 +10999, O10999 +11000, O11000 +11001, O11001 +11002, O11002 +11003, O11003 +11004, O11004 +11005, O11005 +11006, O11006 +11007, O11007 +11008, O11008 +11009, O11009 +11010, O11010 +11011, O11011 +11012, O11012 +11013, O11013 +11014, O11014 +11015, O11015 +11016, O11016 +11017, O11017 +11018, O11018 +11019, O11019 +11020, O11020 +11021, O11021 +11022, O11022 +11023, O11023 +11024, O11024 +11025, O11025 +11026, O11026 +11027, O11027 +11028, O11028 +11029, O11029 +11030, O11030 +11031, O11031 +11032, O11032 +11033, O11033 +11034, O11034 +11035, O11035 +11036, O11036 +11037, O11037 +11038, O11038 +11039, O11039 +11040, O11040 +11041, O11041 +11042, O11042 +11043, O11043 +11044, O11044 +11045, O11045 +11046, O11046 +11047, O11047 +11048, O11048 +11049, O11049 +11050, O11050 +11051, O11051 +11052, O11052 +11053, O11053 +11054, O11054 +11055, O11055 +11056, O11056 +11057, O11057 +11058, O11058 +11059, O11059 +11060, O11060 +11061, O11061 +11062, O11062 +11063, O11063 +11064, O11064 +11065, O11065 +11066, O11066 +11067, O11067 +11068, O11068 +11069, O11069 +11070, O11070 +11071, O11071 +11072, O11072 +11073, O11073 +11074, O11074 +11075, O11075 +11076, O11076 +11077, O11077 +11078, O11078 +11079, O11079 +11080, O11080 +11081, O11081 +11082, O11082 +11083, O11083 +11084, O11084 +11085, O11085 +11086, O11086 +11087, O11087 +11088, O11088 +11089, O11089 +11090, O11090 +11091, O11091 +11092, O11092 +11093, O11093 +11094, O11094 +11095, O11095 +11096, O11096 +11097, O11097 +11098, O11098 +11099, O11099 +11100, O11100 +11101, O11101 +11102, O11102 +11103, O11103 +11104, O11104 +11105, O11105 +11106, O11106 +11107, O11107 +11108, O11108 +11109, O11109 +11110, O11110 +11111, O11111 +11112, O11112 +11113, O11113 +11114, O11114 +11115, O11115 +11116, O11116 +11117, O11117 +11118, O11118 +11119, O11119 +11120, O11120 +11121, O11121 +11122, O11122 +11123, O11123 +11124, O11124 +11125, O11125 +11126, O11126 +11127, O11127 +11128, O11128 +11129, O11129 +11130, O11130 +11131, O11131 +11132, O11132 +11133, O11133 +11134, O11134 +11135, O11135 +11136, O11136 +11137, O11137 +11138, O11138 +11139, O11139 +11140, O11140 +11141, O11141 +11142, O11142 +11143, O11143 +11144, O11144 +11145, O11145 +11146, O11146 +11147, O11147 +11148, O11148 +11149, O11149 +11150, O11150 +11151, O11151 +11152, O11152 +11153, O11153 +11154, O11154 +11155, O11155 +11156, O11156 +11157, O11157 +11158, O11158 +11159, O11159 +11160, O11160 +11161, O11161 +11162, O11162 +11163, O11163 +11164, O11164 +11165, O11165 +11166, O11166 +11167, O11167 +11168, O11168 +11169, O11169 +11170, O11170 +11171, O11171 +11172, O11172 +11173, O11173 +11174, O11174 +11175, O11175 +11176, O11176 +11177, O11177 +11178, O11178 +11179, O11179 +11180, O11180 +11181, O11181 +11182, O11182 +11183, O11183 +11184, O11184 +11185, O11185 +11186, O11186 +11187, O11187 +11188, O11188 +11189, O11189 +11190, O11190 +11191, O11191 +11192, O11192 +11193, O11193 +11194, O11194 +11195, O11195 +11196, O11196 +11197, O11197 +11198, O11198 +11199, O11199 +11200, O11200 +11201, O11201 +11202, O11202 +11203, O11203 +11204, O11204 +11205, O11205 +11206, O11206 +11207, O11207 +11208, O11208 +11209, O11209 +11210, O11210 +11211, O11211 +11212, O11212 +11213, O11213 +11214, O11214 +11215, O11215 +11216, O11216 +11217, O11217 +11218, O11218 +11219, O11219 +11220, O11220 +11221, O11221 +11222, O11222 +11223, O11223 +11224, O11224 +11225, O11225 +11226, O11226 +11227, O11227 +11228, O11228 +11229, O11229 +11230, O11230 +11231, O11231 +11232, O11232 +11233, O11233 +11234, O11234 +11235, O11235 +11236, O11236 +11237, O11237 +11238, O11238 +11239, O11239 +11240, O11240 +11241, O11241 +11242, O11242 +11243, O11243 +11244, O11244 +11245, O11245 +11246, O11246 +11247, O11247 +11248, O11248 +11249, O11249 +11250, O11250 +11251, O11251 +11252, O11252 +11253, O11253 +11254, O11254 +11255, O11255 +11256, O11256 +11257, O11257 +11258, O11258 +11259, O11259 +11260, O11260 +11261, O11261 +11262, O11262 +11263, O11263 +11264, O11264 +11265, O11265 +11266, O11266 +11267, O11267 +11268, O11268 +11269, O11269 +11270, O11270 +11271, O11271 +11272, O11272 +11273, O11273 +11274, O11274 +11275, O11275 +11276, O11276 +11277, O11277 +11278, O11278 +11279, O11279 +11280, O11280 +11281, O11281 +11282, O11282 +11283, O11283 +11284, O11284 +11285, O11285 +11286, O11286 +11287, O11287 +11288, O11288 +11289, O11289 +11290, O11290 +11291, O11291 +11292, O11292 +11293, O11293 +11294, O11294 +11295, O11295 +11296, O11296 +11297, O11297 +11298, O11298 +11299, O11299 +11300, O11300 +11301, O11301 +11302, O11302 +11303, O11303 +11304, O11304 +11305, O11305 +11306, O11306 +11307, O11307 +11308, O11308 +11309, O11309 +11310, O11310 +11311, O11311 +11312, O11312 +11313, O11313 +11314, O11314 +11315, O11315 +11316, O11316 +11317, O11317 +11318, O11318 +11319, O11319 +11320, O11320 +11321, O11321 +11322, O11322 +11323, O11323 +11324, O11324 +11325, O11325 +11326, O11326 +11327, O11327 +11328, O11328 +11329, O11329 +11330, O11330 +11331, O11331 +11332, O11332 +11333, O11333 +11334, O11334 +11335, O11335 +11336, O11336 +11337, O11337 +11338, O11338 +11339, O11339 +11340, O11340 +11341, O11341 +11342, O11342 +11343, O11343 +11344, O11344 +11345, O11345 +11346, O11346 +11347, O11347 +11348, O11348 +11349, O11349 +11350, O11350 +11351, O11351 +11352, O11352 +11353, O11353 +11354, O11354 +11355, O11355 +11356, O11356 +11357, O11357 +11358, O11358 +11359, O11359 +11360, O11360 +11361, O11361 +11362, O11362 +11363, O11363 +11364, O11364 +11365, O11365 +11366, O11366 +11367, O11367 +11368, O11368 +11369, O11369 +11370, O11370 +11371, O11371 +11372, O11372 +11373, O11373 +11374, O11374 +11375, O11375 +11376, O11376 +11377, O11377 +11378, O11378 +11379, O11379 +11380, O11380 +11381, O11381 +11382, O11382 +11383, O11383 +11384, O11384 +11385, O11385 +11386, O11386 +11387, O11387 +11388, O11388 +11389, O11389 +11390, O11390 +11391, O11391 +11392, O11392 +11393, O11393 +11394, O11394 +11395, O11395 +11396, O11396 +11397, O11397 +11398, O11398 +11399, O11399 +11400, O11400 +11401, O11401 +11402, O11402 +11403, O11403 +11404, O11404 +11405, O11405 +11406, O11406 +11407, O11407 +11408, O11408 +11409, O11409 +11410, O11410 +11411, O11411 +11412, O11412 +11413, O11413 +11414, O11414 +11415, O11415 +11416, O11416 +11417, O11417 +11418, O11418 +11419, O11419 +11420, O11420 +11421, O11421 +11422, O11422 +11423, O11423 +11424, O11424 +11425, O11425 +11426, O11426 +11427, O11427 +11428, O11428 +11429, O11429 +11430, O11430 +11431, O11431 +11432, O11432 +11433, O11433 +11434, O11434 +11435, O11435 +11436, O11436 +11437, O11437 +11438, O11438 +11439, O11439 +11440, O11440 +11441, O11441 +11442, O11442 +11443, O11443 +11444, O11444 +11445, O11445 +11446, O11446 +11447, O11447 +11448, O11448 +11449, O11449 +11450, O11450 +11451, O11451 +11452, O11452 +11453, O11453 +11454, O11454 +11455, O11455 +11456, O11456 +11457, O11457 +11458, O11458 +11459, O11459 +11460, O11460 +11461, O11461 +11462, O11462 +11463, O11463 +11464, O11464 +11465, O11465 +11466, O11466 +11467, O11467 +11468, O11468 +11469, O11469 +11470, O11470 +11471, O11471 +11472, O11472 +11473, O11473 +11474, O11474 +11475, O11475 +11476, O11476 +11477, O11477 +11478, O11478 +11479, O11479 +11480, O11480 +11481, O11481 +11482, O11482 +11483, O11483 +11484, O11484 +11485, O11485 +11486, O11486 +11487, O11487 +11488, O11488 +11489, O11489 +11490, O11490 +11491, O11491 +11492, O11492 +11493, O11493 +11494, O11494 +11495, O11495 +11496, O11496 +11497, O11497 +11498, O11498 +11499, O11499 +11500, O11500 +11501, O11501 +11502, O11502 +11503, O11503 +11504, O11504 +11505, O11505 +11506, O11506 +11507, O11507 +11508, O11508 +11509, O11509 +11510, O11510 +11511, O11511 +11512, O11512 +11513, O11513 +11514, O11514 +11515, O11515 +11516, O11516 +11517, O11517 +11518, O11518 +11519, O11519 +11520, O11520 +11521, O11521 +11522, O11522 +11523, O11523 +11524, O11524 +11525, O11525 +11526, O11526 +11527, O11527 +11528, O11528 +11529, O11529 +11530, O11530 +11531, O11531 +11532, O11532 +11533, O11533 +11534, O11534 +11535, O11535 +11536, O11536 +11537, O11537 +11538, O11538 +11539, O11539 +11540, O11540 +11541, O11541 +11542, O11542 +11543, O11543 +11544, O11544 +11545, O11545 +11546, O11546 +11547, O11547 +11548, O11548 +11549, O11549 +11550, O11550 +11551, O11551 +11552, O11552 +11553, O11553 +11554, O11554 +11555, O11555 +11556, O11556 +11557, O11557 +11558, O11558 +11559, O11559 +11560, O11560 +11561, O11561 +11562, O11562 +11563, O11563 +11564, O11564 +11565, O11565 +11566, O11566 +11567, O11567 +11568, O11568 +11569, O11569 +11570, O11570 +11571, O11571 +11572, O11572 +11573, O11573 +11574, O11574 +11575, O11575 +11576, O11576 +11577, O11577 +11578, O11578 +11579, O11579 +11580, O11580 +11581, O11581 +11582, O11582 +11583, O11583 +11584, O11584 +11585, O11585 +11586, O11586 +11587, O11587 +11588, O11588 +11589, O11589 +11590, O11590 +11591, O11591 +11592, O11592 +11593, O11593 +11594, O11594 +11595, O11595 +11596, O11596 +11597, O11597 +11598, O11598 +11599, O11599 +11600, O11600 +11601, O11601 +11602, O11602 +11603, O11603 +11604, O11604 +11605, O11605 +11606, O11606 +11607, O11607 +11608, O11608 +11609, O11609 +11610, O11610 +11611, O11611 +11612, O11612 +11613, O11613 +11614, O11614 +11615, O11615 +11616, O11616 +11617, O11617 +11618, O11618 +11619, O11619 +11620, O11620 +11621, O11621 +11622, O11622 +11623, O11623 +11624, O11624 +11625, O11625 +11626, O11626 +11627, O11627 +11628, O11628 +11629, O11629 +11630, O11630 +11631, O11631 +11632, O11632 +11633, O11633 +11634, O11634 +11635, O11635 +11636, O11636 +11637, O11637 +11638, O11638 +11639, O11639 +11640, O11640 +11641, O11641 +11642, O11642 +11643, O11643 +11644, O11644 +11645, O11645 +11646, O11646 +11647, O11647 +11648, O11648 +11649, O11649 +11650, O11650 +11651, O11651 +11652, O11652 +11653, O11653 +11654, O11654 +11655, O11655 +11656, O11656 +11657, O11657 +11658, O11658 +11659, O11659 +11660, O11660 +11661, O11661 +11662, O11662 +11663, O11663 +11664, O11664 +11665, O11665 +11666, O11666 +11667, O11667 +11668, O11668 +11669, O11669 +11670, O11670 +11671, O11671 +11672, O11672 +11673, O11673 +11674, O11674 +11675, O11675 +11676, O11676 +11677, O11677 +11678, O11678 +11679, O11679 +11680, O11680 +11681, O11681 +11682, O11682 +11683, O11683 +11684, O11684 +11685, O11685 +11686, O11686 +11687, O11687 +11688, O11688 +11689, O11689 +11690, O11690 +11691, O11691 +11692, O11692 +11693, O11693 +11694, O11694 +11695, O11695 +11696, O11696 +11697, O11697 +11698, O11698 +11699, O11699 +11700, O11700 +11701, O11701 +11702, O11702 +11703, O11703 +11704, O11704 +11705, O11705 +11706, O11706 +11707, O11707 +11708, O11708 +11709, O11709 +11710, O11710 +11711, O11711 +11712, O11712 +11713, O11713 +11714, O11714 +11715, O11715 +11716, O11716 +11717, O11717 +11718, O11718 +11719, O11719 +11720, O11720 +11721, O11721 +11722, O11722 +11723, O11723 +11724, O11724 +11725, O11725 +11726, O11726 +11727, O11727 +11728, O11728 +11729, O11729 +11730, O11730 +11731, O11731 +11732, O11732 +11733, O11733 +11734, O11734 +11735, O11735 +11736, O11736 +11737, O11737 +11738, O11738 +11739, O11739 +11740, O11740 +11741, O11741 +11742, O11742 +11743, O11743 +11744, O11744 +11745, O11745 +11746, O11746 +11747, O11747 +11748, O11748 +11749, O11749 +11750, O11750 +11751, O11751 +11752, O11752 +11753, O11753 +11754, O11754 +11755, O11755 +11756, O11756 +11757, O11757 +11758, O11758 +11759, O11759 +11760, O11760 +11761, O11761 +11762, O11762 +11763, O11763 +11764, O11764 +11765, O11765 +11766, O11766 +11767, O11767 +11768, O11768 +11769, O11769 +11770, O11770 +11771, O11771 +11772, O11772 +11773, O11773 +11774, O11774 +11775, O11775 +11776, O11776 +11777, O11777 +11778, O11778 +11779, O11779 +11780, O11780 +11781, O11781 +11782, O11782 +11783, O11783 +11784, O11784 +11785, O11785 +11786, O11786 +11787, O11787 +11788, O11788 +11789, O11789 +11790, O11790 +11791, O11791 +11792, O11792 +11793, O11793 +11794, O11794 +11795, O11795 +11796, O11796 +11797, O11797 +11798, O11798 +11799, O11799 +11800, O11800 +11801, O11801 +11802, O11802 +11803, O11803 +11804, O11804 +11805, O11805 +11806, O11806 +11807, O11807 +11808, O11808 +11809, O11809 +11810, O11810 +11811, O11811 +11812, O11812 +11813, O11813 +11814, O11814 +11815, O11815 +11816, O11816 +11817, O11817 +11818, O11818 +11819, O11819 +11820, O11820 +11821, O11821 +11822, O11822 +11823, O11823 +11824, O11824 +11825, O11825 +11826, O11826 +11827, O11827 +11828, O11828 +11829, O11829 +11830, O11830 +11831, O11831 +11832, O11832 +11833, O11833 +11834, O11834 +11835, O11835 +11836, O11836 +11837, O11837 +11838, O11838 +11839, O11839 +11840, O11840 +11841, O11841 +11842, O11842 +11843, O11843 +11844, O11844 +11845, O11845 +11846, O11846 +11847, O11847 +11848, O11848 +11849, O11849 +11850, O11850 +11851, O11851 +11852, O11852 +11853, O11853 +11854, O11854 +11855, O11855 +11856, O11856 +11857, O11857 +11858, O11858 +11859, O11859 +11860, O11860 +11861, O11861 +11862, O11862 +11863, O11863 +11864, O11864 +11865, O11865 +11866, O11866 +11867, O11867 +11868, O11868 +11869, O11869 +11870, O11870 +11871, O11871 +11872, O11872 +11873, O11873 +11874, O11874 +11875, O11875 +11876, O11876 +11877, O11877 +11878, O11878 +11879, O11879 +11880, O11880 +11881, O11881 +11882, O11882 +11883, O11883 +11884, O11884 +11885, O11885 +11886, O11886 +11887, O11887 +11888, O11888 +11889, O11889 +11890, O11890 +11891, O11891 +11892, O11892 +11893, O11893 +11894, O11894 +11895, O11895 +11896, O11896 +11897, O11897 +11898, O11898 +11899, O11899 +11900, O11900 +11901, O11901 +11902, O11902 +11903, O11903 +11904, O11904 +11905, O11905 +11906, O11906 +11907, O11907 +11908, O11908 +11909, O11909 +11910, O11910 +11911, O11911 +11912, O11912 +11913, O11913 +11914, O11914 +11915, O11915 +11916, O11916 +11917, O11917 +11918, O11918 +11919, O11919 +11920, O11920 +11921, O11921 +11922, O11922 +11923, O11923 +11924, O11924 +11925, O11925 +11926, O11926 +11927, O11927 +11928, O11928 +11929, O11929 +11930, O11930 +11931, O11931 +11932, O11932 +11933, O11933 +11934, O11934 +11935, O11935 +11936, O11936 +11937, O11937 +11938, O11938 +11939, O11939 +11940, O11940 +11941, O11941 +11942, O11942 +11943, O11943 +11944, O11944 +11945, O11945 +11946, O11946 +11947, O11947 +11948, O11948 +11949, O11949 +11950, O11950 +11951, O11951 +11952, O11952 +11953, O11953 +11954, O11954 +11955, O11955 +11956, O11956 +11957, O11957 +11958, O11958 +11959, O11959 +11960, O11960 +11961, O11961 +11962, O11962 +11963, O11963 +11964, O11964 +11965, O11965 +11966, O11966 +11967, O11967 +11968, O11968 +11969, O11969 +11970, O11970 +11971, O11971 +11972, O11972 +11973, O11973 +11974, O11974 +11975, O11975 +11976, O11976 +11977, O11977 +11978, O11978 +11979, O11979 +11980, O11980 +11981, O11981 +11982, O11982 +11983, O11983 +11984, O11984 +11985, O11985 +11986, O11986 +11987, O11987 +11988, O11988 +11989, O11989 +11990, O11990 +11991, O11991 +11992, O11992 +11993, O11993 +11994, O11994 +11995, O11995 +11996, O11996 +11997, O11997 +11998, O11998 +11999, O11999 +12000, O12000 +12001, O12001 +12002, O12002 +12003, O12003 +12004, O12004 +12005, O12005 +12006, O12006 +12007, O12007 +12008, O12008 +12009, O12009 +12010, O12010 +12011, O12011 +12012, O12012 +12013, O12013 +12014, O12014 +12015, O12015 +12016, O12016 +12017, O12017 +12018, O12018 +12019, O12019 +12020, O12020 +12021, O12021 +12022, O12022 +12023, O12023 +12024, O12024 +12025, O12025 +12026, O12026 +12027, O12027 +12028, O12028 +12029, O12029 +12030, O12030 +12031, O12031 +12032, O12032 +12033, O12033 +12034, O12034 +12035, O12035 +12036, O12036 +12037, O12037 +12038, O12038 +12039, O12039 +12040, O12040 +12041, O12041 +12042, O12042 +12043, O12043 +12044, O12044 +12045, O12045 +12046, O12046 +12047, O12047 +12048, O12048 +12049, O12049 +12050, O12050 +12051, O12051 +12052, O12052 +12053, O12053 +12054, O12054 +12055, O12055 +12056, O12056 +12057, O12057 +12058, O12058 +12059, O12059 +12060, O12060 +12061, O12061 +12062, O12062 +12063, O12063 +12064, O12064 +12065, O12065 +12066, O12066 +12067, O12067 +12068, O12068 +12069, O12069 +12070, O12070 +12071, O12071 +12072, O12072 +12073, O12073 +12074, O12074 +12075, O12075 +12076, O12076 +12077, O12077 +12078, O12078 +12079, O12079 +12080, O12080 +12081, O12081 +12082, O12082 +12083, O12083 +12084, O12084 +12085, O12085 +12086, O12086 +12087, O12087 +12088, O12088 +12089, O12089 +12090, O12090 +12091, O12091 +12092, O12092 +12093, O12093 +12094, O12094 +12095, O12095 +12096, O12096 +12097, O12097 +12098, O12098 +12099, O12099 +12100, O12100 +12101, O12101 +12102, O12102 +12103, O12103 +12104, O12104 +12105, O12105 +12106, O12106 +12107, O12107 +12108, O12108 +12109, O12109 +12110, O12110 +12111, O12111 +12112, O12112 +12113, O12113 +12114, O12114 +12115, O12115 +12116, O12116 +12117, O12117 +12118, O12118 +12119, O12119 +12120, O12120 +12121, O12121 +12122, O12122 +12123, O12123 +12124, O12124 +12125, O12125 +12126, O12126 +12127, O12127 +12128, O12128 +12129, O12129 +12130, O12130 +12131, O12131 +12132, O12132 +12133, O12133 +12134, O12134 +12135, O12135 +12136, O12136 +12137, O12137 +12138, O12138 +12139, O12139 +12140, O12140 +12141, O12141 +12142, O12142 +12143, O12143 +12144, O12144 +12145, O12145 +12146, O12146 +12147, O12147 +12148, O12148 +12149, O12149 +12150, O12150 +12151, O12151 +12152, O12152 +12153, O12153 +12154, O12154 +12155, O12155 +12156, O12156 +12157, O12157 +12158, O12158 +12159, O12159 +12160, O12160 +12161, O12161 +12162, O12162 +12163, O12163 +12164, O12164 +12165, O12165 +12166, O12166 +12167, O12167 +12168, O12168 +12169, O12169 +12170, O12170 +12171, O12171 +12172, O12172 +12173, O12173 +12174, O12174 +12175, O12175 +12176, O12176 +12177, O12177 +12178, O12178 +12179, O12179 +12180, O12180 +12181, O12181 +12182, O12182 +12183, O12183 +12184, O12184 +12185, O12185 +12186, O12186 +12187, O12187 +12188, O12188 +12189, O12189 +12190, O12190 +12191, O12191 +12192, O12192 +12193, O12193 +12194, O12194 +12195, O12195 +12196, O12196 +12197, O12197 +12198, O12198 +12199, O12199 +12200, O12200 +12201, O12201 +12202, O12202 +12203, O12203 +12204, O12204 +12205, O12205 +12206, O12206 +12207, O12207 +12208, O12208 +12209, O12209 +12210, O12210 +12211, O12211 +12212, O12212 +12213, O12213 +12214, O12214 +12215, O12215 +12216, O12216 +12217, O12217 +12218, O12218 +12219, O12219 +12220, O12220 +12221, O12221 +12222, O12222 +12223, O12223 +12224, O12224 +12225, O12225 +12226, O12226 +12227, O12227 +12228, O12228 +12229, O12229 +12230, O12230 +12231, O12231 +12232, O12232 +12233, O12233 +12234, O12234 +12235, O12235 +12236, O12236 +12237, O12237 +12238, O12238 +12239, O12239 +12240, O12240 +12241, O12241 +12242, O12242 +12243, O12243 +12244, O12244 +12245, O12245 +12246, O12246 +12247, O12247 +12248, O12248 +12249, O12249 +12250, O12250 +12251, O12251 +12252, O12252 +12253, O12253 +12254, O12254 +12255, O12255 +12256, O12256 +12257, O12257 +12258, O12258 +12259, O12259 +12260, O12260 +12261, O12261 +12262, O12262 +12263, O12263 +12264, O12264 +12265, O12265 +12266, O12266 +12267, O12267 +12268, O12268 +12269, O12269 +12270, O12270 +12271, O12271 +12272, O12272 +12273, O12273 +12274, O12274 +12275, O12275 +12276, O12276 +12277, O12277 +12278, O12278 +12279, O12279 +12280, O12280 +12281, O12281 +12282, O12282 +12283, O12283 +12284, O12284 +12285, O12285 +12286, O12286 +12287, O12287 +12288, O12288 +12289, O12289 +12290, O12290 +12291, O12291 +12292, O12292 +12293, O12293 +12294, O12294 +12295, O12295 +12296, O12296 +12297, O12297 +12298, O12298 +12299, O12299 +12300, O12300 +12301, O12301 +12302, O12302 +12303, O12303 +12304, O12304 +12305, O12305 +12306, O12306 +12307, O12307 +12308, O12308 +12309, O12309 +12310, O12310 +12311, O12311 +12312, O12312 +12313, O12313 +12314, O12314 +12315, O12315 +12316, O12316 +12317, O12317 +12318, O12318 +12319, O12319 +12320, O12320 +12321, O12321 +12322, O12322 +12323, O12323 +12324, O12324 +12325, O12325 +12326, O12326 +12327, O12327 +12328, O12328 +12329, O12329 +12330, O12330 +12331, O12331 +12332, O12332 +12333, O12333 +12334, O12334 +12335, O12335 +12336, O12336 +12337, O12337 +12338, O12338 +12339, O12339 +12340, O12340 +12341, O12341 +12342, O12342 +12343, O12343 +12344, O12344 +12345, O12345 +12346, O12346 +12347, O12347 +12348, O12348 +12349, O12349 +12350, O12350 +12351, O12351 +12352, O12352 +12353, O12353 +12354, O12354 +12355, O12355 +12356, O12356 +12357, O12357 +12358, O12358 +12359, O12359 +12360, O12360 +12361, O12361 +12362, O12362 +12363, O12363 +12364, O12364 +12365, O12365 +12366, O12366 +12367, O12367 +12368, O12368 +12369, O12369 +12370, O12370 +12371, O12371 +12372, O12372 +12373, O12373 +12374, O12374 +12375, O12375 +12376, O12376 +12377, O12377 +12378, O12378 +12379, O12379 +12380, O12380 +12381, O12381 +12382, O12382 +12383, O12383 +12384, O12384 +12385, O12385 +12386, O12386 +12387, O12387 +12388, O12388 +12389, O12389 +12390, O12390 +12391, O12391 +12392, O12392 +12393, O12393 +12394, O12394 +12395, O12395 +12396, O12396 +12397, O12397 +12398, O12398 +12399, O12399 +12400, O12400 +12401, O12401 +12402, O12402 +12403, O12403 +12404, O12404 +12405, O12405 +12406, O12406 +12407, O12407 +12408, O12408 +12409, O12409 +12410, O12410 +12411, O12411 +12412, O12412 +12413, O12413 +12414, O12414 +12415, O12415 +12416, O12416 +12417, O12417 +12418, O12418 +12419, O12419 +12420, O12420 +12421, O12421 +12422, O12422 +12423, O12423 +12424, O12424 +12425, O12425 +12426, O12426 +12427, O12427 +12428, O12428 +12429, O12429 +12430, O12430 +12431, O12431 +12432, O12432 +12433, O12433 +12434, O12434 +12435, O12435 +12436, O12436 +12437, O12437 +12438, O12438 +12439, O12439 +12440, O12440 +12441, O12441 +12442, O12442 +12443, O12443 +12444, O12444 +12445, O12445 +12446, O12446 +12447, O12447 +12448, O12448 +12449, O12449 +12450, O12450 +12451, O12451 +12452, O12452 +12453, O12453 +12454, O12454 +12455, O12455 +12456, O12456 +12457, O12457 +12458, O12458 +12459, O12459 +12460, O12460 +12461, O12461 +12462, O12462 +12463, O12463 +12464, O12464 +12465, O12465 +12466, O12466 +12467, O12467 +12468, O12468 +12469, O12469 +12470, O12470 +12471, O12471 +12472, O12472 +12473, O12473 +12474, O12474 +12475, O12475 +12476, O12476 +12477, O12477 +12478, O12478 +12479, O12479 +12480, O12480 +12481, O12481 +12482, O12482 +12483, O12483 +12484, O12484 +12485, O12485 +12486, O12486 +12487, O12487 +12488, O12488 +12489, O12489 +12490, O12490 +12491, O12491 +12492, O12492 +12493, O12493 +12494, O12494 +12495, O12495 +12496, O12496 +12497, O12497 +12498, O12498 +12499, O12499 +12500, O12500 +12501, O12501 +12502, O12502 +12503, O12503 +12504, O12504 +12505, O12505 +12506, O12506 +12507, O12507 +12508, O12508 +12509, O12509 +12510, O12510 +12511, O12511 +12512, O12512 +12513, O12513 +12514, O12514 +12515, O12515 +12516, O12516 +12517, O12517 +12518, O12518 +12519, O12519 +12520, O12520 +12521, O12521 +12522, O12522 +12523, O12523 +12524, O12524 +12525, O12525 +12526, O12526 +12527, O12527 +12528, O12528 +12529, O12529 +12530, O12530 +12531, O12531 +12532, O12532 +12533, O12533 +12534, O12534 +12535, O12535 +12536, O12536 +12537, O12537 +12538, O12538 +12539, O12539 +12540, O12540 +12541, O12541 +12542, O12542 +12543, O12543 +12544, O12544 +12545, O12545 +12546, O12546 +12547, O12547 +12548, O12548 +12549, O12549 +12550, O12550 +12551, O12551 +12552, O12552 +12553, O12553 +12554, O12554 +12555, O12555 +12556, O12556 +12557, O12557 +12558, O12558 +12559, O12559 +12560, O12560 +12561, O12561 +12562, O12562 +12563, O12563 +12564, O12564 +12565, O12565 +12566, O12566 +12567, O12567 +12568, O12568 +12569, O12569 +12570, O12570 +12571, O12571 +12572, O12572 +12573, O12573 +12574, O12574 +12575, O12575 +12576, O12576 +12577, O12577 +12578, O12578 +12579, O12579 +12580, O12580 +12581, O12581 +12582, O12582 +12583, O12583 +12584, O12584 +12585, O12585 +12586, O12586 +12587, O12587 +12588, O12588 +12589, O12589 +12590, O12590 +12591, O12591 +12592, O12592 +12593, O12593 +12594, O12594 +12595, O12595 +12596, O12596 +12597, O12597 +12598, O12598 +12599, O12599 +12600, O12600 +12601, O12601 +12602, O12602 +12603, O12603 +12604, O12604 +12605, O12605 +12606, O12606 +12607, O12607 +12608, O12608 +12609, O12609 +12610, O12610 +12611, O12611 +12612, O12612 +12613, O12613 +12614, O12614 +12615, O12615 +12616, O12616 +12617, O12617 +12618, O12618 +12619, O12619 +12620, O12620 +12621, O12621 +12622, O12622 +12623, O12623 +12624, O12624 +12625, O12625 +12626, O12626 +12627, O12627 +12628, O12628 +12629, O12629 +12630, O12630 +12631, O12631 +12632, O12632 +12633, O12633 +12634, O12634 +12635, O12635 +12636, O12636 +12637, O12637 +12638, O12638 +12639, O12639 +12640, O12640 +12641, O12641 +12642, O12642 +12643, O12643 +12644, O12644 +12645, O12645 +12646, O12646 +12647, O12647 +12648, O12648 +12649, O12649 +12650, O12650 +12651, O12651 +12652, O12652 +12653, O12653 +12654, O12654 +12655, O12655 +12656, O12656 +12657, O12657 +12658, O12658 +12659, O12659 +12660, O12660 +12661, O12661 +12662, O12662 +12663, O12663 +12664, O12664 +12665, O12665 +12666, O12666 +12667, O12667 +12668, O12668 +12669, O12669 +12670, O12670 +12671, O12671 +12672, O12672 +12673, O12673 +12674, O12674 +12675, O12675 +12676, O12676 +12677, O12677 +12678, O12678 +12679, O12679 +12680, O12680 +12681, O12681 +12682, O12682 +12683, O12683 +12684, O12684 +12685, O12685 +12686, O12686 +12687, O12687 +12688, O12688 +12689, O12689 +12690, O12690 +12691, O12691 +12692, O12692 +12693, O12693 +12694, O12694 +12695, O12695 +12696, O12696 +12697, O12697 +12698, O12698 +12699, O12699 +12700, O12700 +12701, O12701 +12702, O12702 +12703, O12703 +12704, O12704 +12705, O12705 +12706, O12706 +12707, O12707 +12708, O12708 +12709, O12709 +12710, O12710 +12711, O12711 +12712, O12712 +12713, O12713 +12714, O12714 +12715, O12715 +12716, O12716 +12717, O12717 +12718, O12718 +12719, O12719 +12720, O12720 +12721, O12721 +12722, O12722 +12723, O12723 +12724, O12724 +12725, O12725 +12726, O12726 +12727, O12727 +12728, O12728 +12729, O12729 +12730, O12730 +12731, O12731 +12732, O12732 +12733, O12733 +12734, O12734 +12735, O12735 +12736, O12736 +12737, O12737 +12738, O12738 +12739, O12739 +12740, O12740 +12741, O12741 +12742, O12742 +12743, O12743 +12744, O12744 +12745, O12745 +12746, O12746 +12747, O12747 +12748, O12748 +12749, O12749 +12750, O12750 +12751, O12751 +12752, O12752 +12753, O12753 +12754, O12754 +12755, O12755 +12756, O12756 +12757, O12757 +12758, O12758 +12759, O12759 +12760, O12760 +12761, O12761 +12762, O12762 +12763, O12763 +12764, O12764 +12765, O12765 +12766, O12766 +12767, O12767 +12768, O12768 +12769, O12769 +12770, O12770 +12771, O12771 +12772, O12772 +12773, O12773 +12774, O12774 +12775, O12775 +12776, O12776 +12777, O12777 +12778, O12778 +12779, O12779 +12780, O12780 +12781, O12781 +12782, O12782 +12783, O12783 +12784, O12784 +12785, O12785 +12786, O12786 +12787, O12787 +12788, O12788 +12789, O12789 +12790, O12790 +12791, O12791 +12792, O12792 +12793, O12793 +12794, O12794 +12795, O12795 +12796, O12796 +12797, O12797 +12798, O12798 +12799, O12799 +12800, O12800 +12801, O12801 +12802, O12802 +12803, O12803 +12804, O12804 +12805, O12805 +12806, O12806 +12807, O12807 +12808, O12808 +12809, O12809 +12810, O12810 +12811, O12811 +12812, O12812 +12813, O12813 +12814, O12814 +12815, O12815 +12816, O12816 +12817, O12817 +12818, O12818 +12819, O12819 +12820, O12820 +12821, O12821 +12822, O12822 +12823, O12823 +12824, O12824 +12825, O12825 +12826, O12826 +12827, O12827 +12828, O12828 +12829, O12829 +12830, O12830 +12831, O12831 +12832, O12832 +12833, O12833 +12834, O12834 +12835, O12835 +12836, O12836 +12837, O12837 +12838, O12838 +12839, O12839 +12840, O12840 +12841, O12841 +12842, O12842 +12843, O12843 +12844, O12844 +12845, O12845 +12846, O12846 +12847, O12847 +12848, O12848 +12849, O12849 +12850, O12850 +12851, O12851 +12852, O12852 +12853, O12853 +12854, O12854 +12855, O12855 +12856, O12856 +12857, O12857 +12858, O12858 +12859, O12859 +12860, O12860 +12861, O12861 +12862, O12862 +12863, O12863 +12864, O12864 +12865, O12865 +12866, O12866 +12867, O12867 +12868, O12868 +12869, O12869 +12870, O12870 +12871, O12871 +12872, O12872 +12873, O12873 +12874, O12874 +12875, O12875 +12876, O12876 +12877, O12877 +12878, O12878 +12879, O12879 +12880, O12880 +12881, O12881 +12882, O12882 +12883, O12883 +12884, O12884 +12885, O12885 +12886, O12886 +12887, O12887 +12888, O12888 +12889, O12889 +12890, O12890 +12891, O12891 +12892, O12892 +12893, O12893 +12894, O12894 +12895, O12895 +12896, O12896 +12897, O12897 +12898, O12898 +12899, O12899 +12900, O12900 +12901, O12901 +12902, O12902 +12903, O12903 +12904, O12904 +12905, O12905 +12906, O12906 +12907, O12907 +12908, O12908 +12909, O12909 +12910, O12910 +12911, O12911 +12912, O12912 +12913, O12913 +12914, O12914 +12915, O12915 +12916, O12916 +12917, O12917 +12918, O12918 +12919, O12919 +12920, O12920 +12921, O12921 +12922, O12922 +12923, O12923 +12924, O12924 +12925, O12925 +12926, O12926 +12927, O12927 +12928, O12928 +12929, O12929 +12930, O12930 +12931, O12931 +12932, O12932 +12933, O12933 +12934, O12934 +12935, O12935 +12936, O12936 +12937, O12937 +12938, O12938 +12939, O12939 +12940, O12940 +12941, O12941 +12942, O12942 +12943, O12943 +12944, O12944 +12945, O12945 +12946, O12946 +12947, O12947 +12948, O12948 +12949, O12949 +12950, O12950 +12951, O12951 +12952, O12952 +12953, O12953 +12954, O12954 +12955, O12955 +12956, O12956 +12957, O12957 +12958, O12958 +12959, O12959 +12960, O12960 +12961, O12961 +12962, O12962 +12963, O12963 +12964, O12964 +12965, O12965 +12966, O12966 +12967, O12967 +12968, O12968 +12969, O12969 +12970, O12970 +12971, O12971 +12972, O12972 +12973, O12973 +12974, O12974 +12975, O12975 +12976, O12976 +12977, O12977 +12978, O12978 +12979, O12979 +12980, O12980 +12981, O12981 +12982, O12982 +12983, O12983 +12984, O12984 +12985, O12985 +12986, O12986 +12987, O12987 +12988, O12988 +12989, O12989 +12990, O12990 +12991, O12991 +12992, O12992 +12993, O12993 +12994, O12994 +12995, O12995 +12996, O12996 +12997, O12997 +12998, O12998 +12999, O12999 +13000, O13000 +13001, O13001 +13002, O13002 +13003, O13003 +13004, O13004 +13005, O13005 +13006, O13006 +13007, O13007 +13008, O13008 +13009, O13009 +13010, O13010 +13011, O13011 +13012, O13012 +13013, O13013 +13014, O13014 +13015, O13015 +13016, O13016 +13017, O13017 +13018, O13018 +13019, O13019 +13020, O13020 +13021, O13021 +13022, O13022 +13023, O13023 +13024, O13024 +13025, O13025 +13026, O13026 +13027, O13027 +13028, O13028 +13029, O13029 +13030, O13030 +13031, O13031 +13032, O13032 +13033, O13033 +13034, O13034 +13035, O13035 +13036, O13036 +13037, O13037 +13038, O13038 +13039, O13039 +13040, O13040 +13041, O13041 +13042, O13042 +13043, O13043 +13044, O13044 +13045, O13045 +13046, O13046 +13047, O13047 +13048, O13048 +13049, O13049 +13050, O13050 +13051, O13051 +13052, O13052 +13053, O13053 +13054, O13054 +13055, O13055 +13056, O13056 +13057, O13057 +13058, O13058 +13059, O13059 +13060, O13060 +13061, O13061 +13062, O13062 +13063, O13063 +13064, O13064 +13065, O13065 +13066, O13066 +13067, O13067 +13068, O13068 +13069, O13069 +13070, O13070 +13071, O13071 +13072, O13072 +13073, O13073 +13074, O13074 +13075, O13075 +13076, O13076 +13077, O13077 +13078, O13078 +13079, O13079 +13080, O13080 +13081, O13081 +13082, O13082 +13083, O13083 +13084, O13084 +13085, O13085 +13086, O13086 +13087, O13087 +13088, O13088 +13089, O13089 +13090, O13090 +13091, O13091 +13092, O13092 +13093, O13093 +13094, O13094 +13095, O13095 +13096, O13096 +13097, O13097 +13098, O13098 +13099, O13099 +13100, O13100 +13101, O13101 +13102, O13102 +13103, O13103 +13104, O13104 +13105, O13105 +13106, O13106 +13107, O13107 +13108, O13108 +13109, O13109 +13110, O13110 +13111, O13111 +13112, O13112 +13113, O13113 +13114, O13114 +13115, O13115 +13116, O13116 +13117, O13117 +13118, O13118 +13119, O13119 +13120, O13120 +13121, O13121 +13122, O13122 +13123, O13123 +13124, O13124 +13125, O13125 +13126, O13126 +13127, O13127 +13128, O13128 +13129, O13129 +13130, O13130 +13131, O13131 +13132, O13132 +13133, O13133 +13134, O13134 +13135, O13135 +13136, O13136 +13137, O13137 +13138, O13138 +13139, O13139 +13140, O13140 +13141, O13141 +13142, O13142 +13143, O13143 +13144, O13144 +13145, O13145 +13146, O13146 +13147, O13147 +13148, O13148 +13149, O13149 +13150, O13150 +13151, O13151 +13152, O13152 +13153, O13153 +13154, O13154 +13155, O13155 +13156, O13156 +13157, O13157 +13158, O13158 +13159, O13159 +13160, O13160 +13161, O13161 +13162, O13162 +13163, O13163 +13164, O13164 +13165, O13165 +13166, O13166 +13167, O13167 +13168, O13168 +13169, O13169 +13170, O13170 +13171, O13171 +13172, O13172 +13173, O13173 +13174, O13174 +13175, O13175 +13176, O13176 +13177, O13177 +13178, O13178 +13179, O13179 +13180, O13180 +13181, O13181 +13182, O13182 +13183, O13183 +13184, O13184 +13185, O13185 +13186, O13186 +13187, O13187 +13188, O13188 +13189, O13189 +13190, O13190 +13191, O13191 +13192, O13192 +13193, O13193 +13194, O13194 +13195, O13195 +13196, O13196 +13197, O13197 +13198, O13198 +13199, O13199 +13200, O13200 +13201, O13201 +13202, O13202 +13203, O13203 +13204, O13204 +13205, O13205 +13206, O13206 +13207, O13207 +13208, O13208 +13209, O13209 +13210, O13210 +13211, O13211 +13212, O13212 +13213, O13213 +13214, O13214 +13215, O13215 +13216, O13216 +13217, O13217 +13218, O13218 +13219, O13219 +13220, O13220 +13221, O13221 +13222, O13222 +13223, O13223 +13224, O13224 +13225, O13225 +13226, O13226 +13227, O13227 +13228, O13228 +13229, O13229 +13230, O13230 +13231, O13231 +13232, O13232 +13233, O13233 +13234, O13234 +13235, O13235 +13236, O13236 +13237, O13237 +13238, O13238 +13239, O13239 +13240, O13240 +13241, O13241 +13242, O13242 +13243, O13243 +13244, O13244 +13245, O13245 +13246, O13246 +13247, O13247 +13248, O13248 +13249, O13249 +13250, O13250 +13251, O13251 +13252, O13252 +13253, O13253 +13254, O13254 +13255, O13255 +13256, O13256 +13257, O13257 +13258, O13258 +13259, O13259 +13260, O13260 +13261, O13261 +13262, O13262 +13263, O13263 +13264, O13264 +13265, O13265 +13266, O13266 +13267, O13267 +13268, O13268 +13269, O13269 +13270, O13270 +13271, O13271 +13272, O13272 +13273, O13273 +13274, O13274 +13275, O13275 +13276, O13276 +13277, O13277 +13278, O13278 +13279, O13279 +13280, O13280 +13281, O13281 +13282, O13282 +13283, O13283 +13284, O13284 +13285, O13285 +13286, O13286 +13287, O13287 +13288, O13288 +13289, O13289 +13290, O13290 +13291, O13291 +13292, O13292 +13293, O13293 +13294, O13294 +13295, O13295 +13296, O13296 +13297, O13297 +13298, O13298 +13299, O13299 +13300, O13300 +13301, O13301 +13302, O13302 +13303, O13303 +13304, O13304 +13305, O13305 +13306, O13306 +13307, O13307 +13308, O13308 +13309, O13309 +13310, O13310 +13311, O13311 +13312, O13312 +13313, O13313 +13314, O13314 +13315, O13315 +13316, O13316 +13317, O13317 +13318, O13318 +13319, O13319 +13320, O13320 +13321, O13321 +13322, O13322 +13323, O13323 +13324, O13324 +13325, O13325 +13326, O13326 +13327, O13327 +13328, O13328 +13329, O13329 +13330, O13330 +13331, O13331 +13332, O13332 +13333, O13333 +13334, O13334 +13335, O13335 +13336, O13336 +13337, O13337 +13338, O13338 +13339, O13339 +13340, O13340 +13341, O13341 +13342, O13342 +13343, O13343 +13344, O13344 +13345, O13345 +13346, O13346 +13347, O13347 +13348, O13348 +13349, O13349 +13350, O13350 +13351, O13351 +13352, O13352 +13353, O13353 +13354, O13354 +13355, O13355 +13356, O13356 +13357, O13357 +13358, O13358 +13359, O13359 +13360, O13360 +13361, O13361 +13362, O13362 +13363, O13363 +13364, O13364 +13365, O13365 +13366, O13366 +13367, O13367 +13368, O13368 +13369, O13369 +13370, O13370 +13371, O13371 +13372, O13372 +13373, O13373 +13374, O13374 +13375, O13375 +13376, O13376 +13377, O13377 +13378, O13378 +13379, O13379 +13380, O13380 +13381, O13381 +13382, O13382 +13383, O13383 +13384, O13384 +13385, O13385 +13386, O13386 +13387, O13387 +13388, O13388 +13389, O13389 +13390, O13390 +13391, O13391 +13392, O13392 +13393, O13393 +13394, O13394 +13395, O13395 +13396, O13396 +13397, O13397 +13398, O13398 +13399, O13399 +13400, O13400 +13401, O13401 +13402, O13402 +13403, O13403 +13404, O13404 +13405, O13405 +13406, O13406 +13407, O13407 +13408, O13408 +13409, O13409 +13410, O13410 +13411, O13411 +13412, O13412 +13413, O13413 +13414, O13414 +13415, O13415 +13416, O13416 +13417, O13417 +13418, O13418 +13419, O13419 +13420, O13420 +13421, O13421 +13422, O13422 +13423, O13423 +13424, O13424 +13425, O13425 +13426, O13426 +13427, O13427 +13428, O13428 +13429, O13429 +13430, O13430 +13431, O13431 +13432, O13432 +13433, O13433 +13434, O13434 +13435, O13435 +13436, O13436 +13437, O13437 +13438, O13438 +13439, O13439 +13440, O13440 +13441, O13441 +13442, O13442 +13443, O13443 +13444, O13444 +13445, O13445 +13446, O13446 +13447, O13447 +13448, O13448 +13449, O13449 +13450, O13450 +13451, O13451 +13452, O13452 +13453, O13453 +13454, O13454 +13455, O13455 +13456, O13456 +13457, O13457 +13458, O13458 +13459, O13459 +13460, O13460 +13461, O13461 +13462, O13462 +13463, O13463 +13464, O13464 +13465, O13465 +13466, O13466 +13467, O13467 +13468, O13468 +13469, O13469 +13470, O13470 +13471, O13471 +13472, O13472 +13473, O13473 +13474, O13474 +13475, O13475 +13476, O13476 +13477, O13477 +13478, O13478 +13479, O13479 +13480, O13480 +13481, O13481 +13482, O13482 +13483, O13483 +13484, O13484 +13485, O13485 +13486, O13486 +13487, O13487 +13488, O13488 +13489, O13489 +13490, O13490 +13491, O13491 +13492, O13492 +13493, O13493 +13494, O13494 +13495, O13495 +13496, O13496 +13497, O13497 +13498, O13498 +13499, O13499 +13500, O13500 +13501, O13501 +13502, O13502 +13503, O13503 +13504, O13504 +13505, O13505 +13506, O13506 +13507, O13507 +13508, O13508 +13509, O13509 +13510, O13510 +13511, O13511 +13512, O13512 +13513, O13513 +13514, O13514 +13515, O13515 +13516, O13516 +13517, O13517 +13518, O13518 +13519, O13519 +13520, O13520 +13521, O13521 +13522, O13522 +13523, O13523 +13524, O13524 +13525, O13525 +13526, O13526 +13527, O13527 +13528, O13528 +13529, O13529 +13530, O13530 +13531, O13531 +13532, O13532 +13533, O13533 +13534, O13534 +13535, O13535 +13536, O13536 +13537, O13537 +13538, O13538 +13539, O13539 +13540, O13540 +13541, O13541 +13542, O13542 +13543, O13543 +13544, O13544 +13545, O13545 +13546, O13546 +13547, O13547 +13548, O13548 +13549, O13549 +13550, O13550 +13551, O13551 +13552, O13552 +13553, O13553 +13554, O13554 +13555, O13555 +13556, O13556 +13557, O13557 +13558, O13558 +13559, O13559 +13560, O13560 +13561, O13561 +13562, O13562 +13563, O13563 +13564, O13564 +13565, O13565 +13566, O13566 +13567, O13567 +13568, O13568 +13569, O13569 +13570, O13570 +13571, O13571 +13572, O13572 +13573, O13573 +13574, O13574 +13575, O13575 +13576, O13576 +13577, O13577 +13578, O13578 +13579, O13579 +13580, O13580 +13581, O13581 +13582, O13582 +13583, O13583 +13584, O13584 +13585, O13585 +13586, O13586 +13587, O13587 +13588, O13588 +13589, O13589 +13590, O13590 +13591, O13591 +13592, O13592 +13593, O13593 +13594, O13594 +13595, O13595 +13596, O13596 +13597, O13597 +13598, O13598 +13599, O13599 +13600, O13600 +13601, O13601 +13602, O13602 +13603, O13603 +13604, O13604 +13605, O13605 +13606, O13606 +13607, O13607 +13608, O13608 +13609, O13609 +13610, O13610 +13611, O13611 +13612, O13612 +13613, O13613 +13614, O13614 +13615, O13615 +13616, O13616 +13617, O13617 +13618, O13618 +13619, O13619 +13620, O13620 +13621, O13621 +13622, O13622 +13623, O13623 +13624, O13624 +13625, O13625 +13626, O13626 +13627, O13627 +13628, O13628 +13629, O13629 +13630, O13630 +13631, O13631 +13632, O13632 +13633, O13633 +13634, O13634 +13635, O13635 +13636, O13636 +13637, O13637 +13638, O13638 +13639, O13639 +13640, O13640 +13641, O13641 +13642, O13642 +13643, O13643 +13644, O13644 +13645, O13645 +13646, O13646 +13647, O13647 +13648, O13648 +13649, O13649 +13650, O13650 +13651, O13651 +13652, O13652 +13653, O13653 +13654, O13654 +13655, O13655 +13656, O13656 +13657, O13657 +13658, O13658 +13659, O13659 +13660, O13660 +13661, O13661 +13662, O13662 +13663, O13663 +13664, O13664 +13665, O13665 +13666, O13666 +13667, O13667 +13668, O13668 +13669, O13669 +13670, O13670 +13671, O13671 +13672, O13672 +13673, O13673 +13674, O13674 +13675, O13675 +13676, O13676 +13677, O13677 +13678, O13678 +13679, O13679 +13680, O13680 +13681, O13681 +13682, O13682 +13683, O13683 +13684, O13684 +13685, O13685 +13686, O13686 +13687, O13687 +13688, O13688 +13689, O13689 +13690, O13690 +13691, O13691 +13692, O13692 +13693, O13693 +13694, O13694 +13695, O13695 +13696, O13696 +13697, O13697 +13698, O13698 +13699, O13699 +13700, O13700 +13701, O13701 +13702, O13702 +13703, O13703 +13704, O13704 +13705, O13705 +13706, O13706 +13707, O13707 +13708, O13708 +13709, O13709 +13710, O13710 +13711, O13711 +13712, O13712 +13713, O13713 +13714, O13714 +13715, O13715 +13716, O13716 +13717, O13717 +13718, O13718 +13719, O13719 +13720, O13720 +13721, O13721 +13722, O13722 +13723, O13723 +13724, O13724 +13725, O13725 +13726, O13726 +13727, O13727 +13728, O13728 +13729, O13729 +13730, O13730 +13731, O13731 +13732, O13732 +13733, O13733 +13734, O13734 +13735, O13735 +13736, O13736 +13737, O13737 +13738, O13738 +13739, O13739 +13740, O13740 +13741, O13741 +13742, O13742 +13743, O13743 +13744, O13744 +13745, O13745 +13746, O13746 +13747, O13747 +13748, O13748 +13749, O13749 +13750, O13750 +13751, O13751 +13752, O13752 +13753, O13753 +13754, O13754 +13755, O13755 +13756, O13756 +13757, O13757 +13758, O13758 +13759, O13759 +13760, O13760 +13761, O13761 +13762, O13762 +13763, O13763 +13764, O13764 +13765, O13765 +13766, O13766 +13767, O13767 +13768, O13768 +13769, O13769 +13770, O13770 +13771, O13771 +13772, O13772 +13773, O13773 +13774, O13774 +13775, O13775 +13776, O13776 +13777, O13777 +13778, O13778 +13779, O13779 +13780, O13780 +13781, O13781 +13782, O13782 +13783, O13783 +13784, O13784 +13785, O13785 +13786, O13786 +13787, O13787 +13788, O13788 +13789, O13789 +13790, O13790 +13791, O13791 +13792, O13792 +13793, O13793 +13794, O13794 +13795, O13795 +13796, O13796 +13797, O13797 +13798, O13798 +13799, O13799 +13800, O13800 +13801, O13801 +13802, O13802 +13803, O13803 +13804, O13804 +13805, O13805 +13806, O13806 +13807, O13807 +13808, O13808 +13809, O13809 +13810, O13810 +13811, O13811 +13812, O13812 +13813, O13813 +13814, O13814 +13815, O13815 +13816, O13816 +13817, O13817 +13818, O13818 +13819, O13819 +13820, O13820 +13821, O13821 +13822, O13822 +13823, O13823 +13824, O13824 +13825, O13825 +13826, O13826 +13827, O13827 +13828, O13828 +13829, O13829 +13830, O13830 +13831, O13831 +13832, O13832 +13833, O13833 +13834, O13834 +13835, O13835 +13836, O13836 +13837, O13837 +13838, O13838 +13839, O13839 +13840, O13840 +13841, O13841 +13842, O13842 +13843, O13843 +13844, O13844 +13845, O13845 +13846, O13846 +13847, O13847 +13848, O13848 +13849, O13849 +13850, O13850 +13851, O13851 +13852, O13852 +13853, O13853 +13854, O13854 +13855, O13855 +13856, O13856 +13857, O13857 +13858, O13858 +13859, O13859 +13860, O13860 +13861, O13861 +13862, O13862 +13863, O13863 +13864, O13864 +13865, O13865 +13866, O13866 +13867, O13867 +13868, O13868 +13869, O13869 +13870, O13870 +13871, O13871 +13872, O13872 +13873, O13873 +13874, O13874 +13875, O13875 +13876, O13876 +13877, O13877 +13878, O13878 +13879, O13879 +13880, O13880 +13881, O13881 +13882, O13882 +13883, O13883 +13884, O13884 +13885, O13885 +13886, O13886 +13887, O13887 +13888, O13888 +13889, O13889 +13890, O13890 +13891, O13891 +13892, O13892 +13893, O13893 +13894, O13894 +13895, O13895 +13896, O13896 +13897, O13897 +13898, O13898 +13899, O13899 +13900, O13900 +13901, O13901 +13902, O13902 +13903, O13903 +13904, O13904 +13905, O13905 +13906, O13906 +13907, O13907 +13908, O13908 +13909, O13909 +13910, O13910 +13911, O13911 +13912, O13912 +13913, O13913 +13914, O13914 +13915, O13915 +13916, O13916 +13917, O13917 +13918, O13918 +13919, O13919 +13920, O13920 +13921, O13921 +13922, O13922 +13923, O13923 +13924, O13924 +13925, O13925 +13926, O13926 +13927, O13927 +13928, O13928 +13929, O13929 +13930, O13930 +13931, O13931 +13932, O13932 +13933, O13933 +13934, O13934 +13935, O13935 +13936, O13936 +13937, O13937 +13938, O13938 +13939, O13939 +13940, O13940 +13941, O13941 +13942, O13942 +13943, O13943 +13944, O13944 +13945, O13945 +13946, O13946 +13947, O13947 +13948, O13948 +13949, O13949 +13950, O13950 +13951, O13951 +13952, O13952 +13953, O13953 +13954, O13954 +13955, O13955 +13956, O13956 +13957, O13957 +13958, O13958 +13959, O13959 +13960, O13960 +13961, O13961 +13962, O13962 +13963, O13963 +13964, O13964 +13965, O13965 +13966, O13966 +13967, O13967 +13968, O13968 +13969, O13969 +13970, O13970 +13971, O13971 +13972, O13972 +13973, O13973 +13974, O13974 +13975, O13975 +13976, O13976 +13977, O13977 +13978, O13978 +13979, O13979 +13980, O13980 +13981, O13981 +13982, O13982 +13983, O13983 +13984, O13984 +13985, O13985 +13986, O13986 +13987, O13987 +13988, O13988 +13989, O13989 +13990, O13990 +13991, O13991 +13992, O13992 +13993, O13993 +13994, O13994 +13995, O13995 +13996, O13996 +13997, O13997 +13998, O13998 +13999, O13999 +14000, O14000 +14001, O14001 +14002, O14002 +14003, O14003 +14004, O14004 +14005, O14005 +14006, O14006 +14007, O14007 +14008, O14008 +14009, O14009 +14010, O14010 +14011, O14011 +14012, O14012 +14013, O14013 +14014, O14014 +14015, O14015 +14016, O14016 +14017, O14017 +14018, O14018 +14019, O14019 +14020, O14020 +14021, O14021 +14022, O14022 +14023, O14023 +14024, O14024 +14025, O14025 +14026, O14026 +14027, O14027 +14028, O14028 +14029, O14029 +14030, O14030 +14031, O14031 +14032, O14032 +14033, O14033 +14034, O14034 +14035, O14035 +14036, O14036 +14037, O14037 +14038, O14038 +14039, O14039 +14040, O14040 +14041, O14041 +14042, O14042 +14043, O14043 +14044, O14044 +14045, O14045 +14046, O14046 +14047, O14047 +14048, O14048 +14049, O14049 +14050, O14050 +14051, O14051 +14052, O14052 +14053, O14053 +14054, O14054 +14055, O14055 +14056, O14056 +14057, O14057 +14058, O14058 +14059, O14059 +14060, O14060 +14061, O14061 +14062, O14062 +14063, O14063 +14064, O14064 +14065, O14065 +14066, O14066 +14067, O14067 +14068, O14068 +14069, O14069 +14070, O14070 +14071, O14071 +14072, O14072 +14073, O14073 +14074, O14074 +14075, O14075 +14076, O14076 +14077, O14077 +14078, O14078 +14079, O14079 +14080, O14080 +14081, O14081 +14082, O14082 +14083, O14083 +14084, O14084 +14085, O14085 +14086, O14086 +14087, O14087 +14088, O14088 +14089, O14089 +14090, O14090 +14091, O14091 +14092, O14092 +14093, O14093 +14094, O14094 +14095, O14095 +14096, O14096 +14097, O14097 +14098, O14098 +14099, O14099 +14100, O14100 +14101, O14101 +14102, O14102 +14103, O14103 +14104, O14104 +14105, O14105 +14106, O14106 +14107, O14107 +14108, O14108 +14109, O14109 +14110, O14110 +14111, O14111 +14112, O14112 +14113, O14113 +14114, O14114 +14115, O14115 +14116, O14116 +14117, O14117 +14118, O14118 +14119, O14119 +14120, O14120 +14121, O14121 +14122, O14122 +14123, O14123 +14124, O14124 +14125, O14125 +14126, O14126 +14127, O14127 +14128, O14128 +14129, O14129 +14130, O14130 +14131, O14131 +14132, O14132 +14133, O14133 +14134, O14134 +14135, O14135 +14136, O14136 +14137, O14137 +14138, O14138 +14139, O14139 +14140, O14140 +14141, O14141 +14142, O14142 +14143, O14143 +14144, O14144 +14145, O14145 +14146, O14146 +14147, O14147 +14148, O14148 +14149, O14149 +14150, O14150 +14151, O14151 +14152, O14152 +14153, O14153 +14154, O14154 +14155, O14155 +14156, O14156 +14157, O14157 +14158, O14158 +14159, O14159 +14160, O14160 +14161, O14161 +14162, O14162 +14163, O14163 +14164, O14164 +14165, O14165 +14166, O14166 +14167, O14167 +14168, O14168 +14169, O14169 +14170, O14170 +14171, O14171 +14172, O14172 +14173, O14173 +14174, O14174 +14175, O14175 +14176, O14176 +14177, O14177 +14178, O14178 +14179, O14179 +14180, O14180 +14181, O14181 +14182, O14182 +14183, O14183 +14184, O14184 +14185, O14185 +14186, O14186 +14187, O14187 +14188, O14188 +14189, O14189 +14190, O14190 +14191, O14191 +14192, O14192 +14193, O14193 +14194, O14194 +14195, O14195 +14196, O14196 +14197, O14197 +14198, O14198 +14199, O14199 +14200, O14200 +14201, O14201 +14202, O14202 +14203, O14203 +14204, O14204 +14205, O14205 +14206, O14206 +14207, O14207 +14208, O14208 +14209, O14209 +14210, O14210 +14211, O14211 +14212, O14212 +14213, O14213 +14214, O14214 +14215, O14215 +14216, O14216 +14217, O14217 +14218, O14218 +14219, O14219 +14220, O14220 +14221, O14221 +14222, O14222 +14223, O14223 +14224, O14224 +14225, O14225 +14226, O14226 +14227, O14227 +14228, O14228 +14229, O14229 +14230, O14230 +14231, O14231 +14232, O14232 +14233, O14233 +14234, O14234 +14235, O14235 +14236, O14236 +14237, O14237 +14238, O14238 +14239, O14239 +14240, O14240 +14241, O14241 +14242, O14242 +14243, O14243 +14244, O14244 +14245, O14245 +14246, O14246 +14247, O14247 +14248, O14248 +14249, O14249 +14250, O14250 +14251, O14251 +14252, O14252 +14253, O14253 +14254, O14254 +14255, O14255 +14256, O14256 +14257, O14257 +14258, O14258 +14259, O14259 +14260, O14260 +14261, O14261 +14262, O14262 +14263, O14263 +14264, O14264 +14265, O14265 +14266, O14266 +14267, O14267 +14268, O14268 +14269, O14269 +14270, O14270 +14271, O14271 +14272, O14272 +14273, O14273 +14274, O14274 +14275, O14275 +14276, O14276 +14277, O14277 +14278, O14278 +14279, O14279 +14280, O14280 +14281, O14281 +14282, O14282 +14283, O14283 +14284, O14284 +14285, O14285 +14286, O14286 +14287, O14287 +14288, O14288 +14289, O14289 +14290, O14290 +14291, O14291 +14292, O14292 +14293, O14293 +14294, O14294 +14295, O14295 +14296, O14296 +14297, O14297 +14298, O14298 +14299, O14299 +14300, O14300 +14301, O14301 +14302, O14302 +14303, O14303 +14304, O14304 +14305, O14305 +14306, O14306 +14307, O14307 +14308, O14308 +14309, O14309 +14310, O14310 +14311, O14311 +14312, O14312 +14313, O14313 +14314, O14314 +14315, O14315 +14316, O14316 +14317, O14317 +14318, O14318 +14319, O14319 +14320, O14320 +14321, O14321 +14322, O14322 +14323, O14323 +14324, O14324 +14325, O14325 +14326, O14326 +14327, O14327 +14328, O14328 +14329, O14329 +14330, O14330 +14331, O14331 +14332, O14332 +14333, O14333 +14334, O14334 +14335, O14335 +14336, O14336 +14337, O14337 +14338, O14338 +14339, O14339 +14340, O14340 +14341, O14341 +14342, O14342 +14343, O14343 +14344, O14344 +14345, O14345 +14346, O14346 +14347, O14347 +14348, O14348 +14349, O14349 +14350, O14350 +14351, O14351 +14352, O14352 +14353, O14353 +14354, O14354 +14355, O14355 +14356, O14356 +14357, O14357 +14358, O14358 +14359, O14359 +14360, O14360 +14361, O14361 +14362, O14362 +14363, O14363 +14364, O14364 +14365, O14365 +14366, O14366 +14367, O14367 +14368, O14368 +14369, O14369 +14370, O14370 +14371, O14371 +14372, O14372 +14373, O14373 +14374, O14374 +14375, O14375 +14376, O14376 +14377, O14377 +14378, O14378 +14379, O14379 +14380, O14380 +14381, O14381 +14382, O14382 +14383, O14383 +14384, O14384 +14385, O14385 +14386, O14386 +14387, O14387 +14388, O14388 +14389, O14389 +14390, O14390 +14391, O14391 +14392, O14392 +14393, O14393 +14394, O14394 +14395, O14395 +14396, O14396 +14397, O14397 +14398, O14398 +14399, O14399 +14400, O14400 +14401, O14401 +14402, O14402 +14403, O14403 +14404, O14404 +14405, O14405 +14406, O14406 +14407, O14407 +14408, O14408 +14409, O14409 +14410, O14410 +14411, O14411 +14412, O14412 +14413, O14413 +14414, O14414 +14415, O14415 +14416, O14416 +14417, O14417 +14418, O14418 +14419, O14419 +14420, O14420 +14421, O14421 +14422, O14422 +14423, O14423 +14424, O14424 +14425, O14425 +14426, O14426 +14427, O14427 +14428, O14428 +14429, O14429 +14430, O14430 +14431, O14431 +14432, O14432 +14433, O14433 +14434, O14434 +14435, O14435 +14436, O14436 +14437, O14437 +14438, O14438 +14439, O14439 +14440, O14440 +14441, O14441 +14442, O14442 +14443, O14443 +14444, O14444 +14445, O14445 +14446, O14446 +14447, O14447 +14448, O14448 +14449, O14449 +14450, O14450 +14451, O14451 +14452, O14452 +14453, O14453 +14454, O14454 +14455, O14455 +14456, O14456 +14457, O14457 +14458, O14458 +14459, O14459 +14460, O14460 +14461, O14461 +14462, O14462 +14463, O14463 +14464, O14464 +14465, O14465 +14466, O14466 +14467, O14467 +14468, O14468 +14469, O14469 +14470, O14470 +14471, O14471 +14472, O14472 +14473, O14473 +14474, O14474 +14475, O14475 +14476, O14476 +14477, O14477 +14478, O14478 +14479, O14479 +14480, O14480 +14481, O14481 +14482, O14482 +14483, O14483 +14484, O14484 +14485, O14485 +14486, O14486 +14487, O14487 +14488, O14488 +14489, O14489 +14490, O14490 +14491, O14491 +14492, O14492 +14493, O14493 +14494, O14494 +14495, O14495 +14496, O14496 +14497, O14497 +14498, O14498 +14499, O14499 +14500, O14500 +14501, O14501 +14502, O14502 +14503, O14503 +14504, O14504 +14505, O14505 +14506, O14506 +14507, O14507 +14508, O14508 +14509, O14509 +14510, O14510 +14511, O14511 +14512, O14512 +14513, O14513 +14514, O14514 +14515, O14515 +14516, O14516 +14517, O14517 +14518, O14518 +14519, O14519 +14520, O14520 +14521, O14521 +14522, O14522 +14523, O14523 +14524, O14524 +14525, O14525 +14526, O14526 +14527, O14527 +14528, O14528 +14529, O14529 +14530, O14530 +14531, O14531 +14532, O14532 +14533, O14533 +14534, O14534 +14535, O14535 +14536, O14536 +14537, O14537 +14538, O14538 +14539, O14539 +14540, O14540 +14541, O14541 +14542, O14542 +14543, O14543 +14544, O14544 +14545, O14545 +14546, O14546 +14547, O14547 +14548, O14548 +14549, O14549 +14550, O14550 +14551, O14551 +14552, O14552 +14553, O14553 +14554, O14554 +14555, O14555 +14556, O14556 +14557, O14557 +14558, O14558 +14559, O14559 +14560, O14560 +14561, O14561 +14562, O14562 +14563, O14563 +14564, O14564 +14565, O14565 +14566, O14566 +14567, O14567 +14568, O14568 +14569, O14569 +14570, O14570 +14571, O14571 +14572, O14572 +14573, O14573 +14574, O14574 +14575, O14575 +14576, O14576 +14577, O14577 +14578, O14578 +14579, O14579 +14580, O14580 +14581, O14581 +14582, O14582 +14583, O14583 +14584, O14584 +14585, O14585 +14586, O14586 +14587, O14587 +14588, O14588 +14589, O14589 +14590, O14590 +14591, O14591 +14592, O14592 +14593, O14593 +14594, O14594 +14595, O14595 +14596, O14596 +14597, O14597 +14598, O14598 +14599, O14599 +14600, O14600 +14601, O14601 +14602, O14602 +14603, O14603 +14604, O14604 +14605, O14605 +14606, O14606 +14607, O14607 +14608, O14608 +14609, O14609 +14610, O14610 +14611, O14611 +14612, O14612 +14613, O14613 +14614, O14614 +14615, O14615 +14616, O14616 +14617, O14617 +14618, O14618 +14619, O14619 +14620, O14620 +14621, O14621 +14622, O14622 +14623, O14623 +14624, O14624 +14625, O14625 +14626, O14626 +14627, O14627 +14628, O14628 +14629, O14629 +14630, O14630 +14631, O14631 +14632, O14632 +14633, O14633 +14634, O14634 +14635, O14635 +14636, O14636 +14637, O14637 +14638, O14638 +14639, O14639 +14640, O14640 +14641, O14641 +14642, O14642 +14643, O14643 +14644, O14644 +14645, O14645 +14646, O14646 +14647, O14647 +14648, O14648 +14649, O14649 +14650, O14650 +14651, O14651 +14652, O14652 +14653, O14653 +14654, O14654 +14655, O14655 +14656, O14656 +14657, O14657 +14658, O14658 +14659, O14659 +14660, O14660 +14661, O14661 +14662, O14662 +14663, O14663 +14664, O14664 +14665, O14665 +14666, O14666 +14667, O14667 +14668, O14668 +14669, O14669 +14670, O14670 +14671, O14671 +14672, O14672 +14673, O14673 +14674, O14674 +14675, O14675 +14676, O14676 +14677, O14677 +14678, O14678 +14679, O14679 +14680, O14680 +14681, O14681 +14682, O14682 +14683, O14683 +14684, O14684 +14685, O14685 +14686, O14686 +14687, O14687 +14688, O14688 +14689, O14689 +14690, O14690 +14691, O14691 +14692, O14692 +14693, O14693 +14694, O14694 +14695, O14695 +14696, O14696 +14697, O14697 +14698, O14698 +14699, O14699 +14700, O14700 +14701, O14701 +14702, O14702 +14703, O14703 +14704, O14704 +14705, O14705 +14706, O14706 +14707, O14707 +14708, O14708 +14709, O14709 +14710, O14710 +14711, O14711 +14712, O14712 +14713, O14713 +14714, O14714 +14715, O14715 +14716, O14716 +14717, O14717 +14718, O14718 +14719, O14719 +14720, O14720 +14721, O14721 +14722, O14722 +14723, O14723 +14724, O14724 +14725, O14725 +14726, O14726 +14727, O14727 +14728, O14728 +14729, O14729 +14730, O14730 +14731, O14731 +14732, O14732 +14733, O14733 +14734, O14734 +14735, O14735 +14736, O14736 +14737, O14737 +14738, O14738 +14739, O14739 +14740, O14740 +14741, O14741 +14742, O14742 +14743, O14743 +14744, O14744 +14745, O14745 +14746, O14746 +14747, O14747 +14748, O14748 +14749, O14749 +14750, O14750 +14751, O14751 +14752, O14752 +14753, O14753 +14754, O14754 +14755, O14755 +14756, O14756 +14757, O14757 +14758, O14758 +14759, O14759 +14760, O14760 +14761, O14761 +14762, O14762 +14763, O14763 +14764, O14764 +14765, O14765 +14766, O14766 +14767, O14767 +14768, O14768 +14769, O14769 +14770, O14770 +14771, O14771 +14772, O14772 +14773, O14773 +14774, O14774 +14775, O14775 +14776, O14776 +14777, O14777 +14778, O14778 +14779, O14779 +14780, O14780 +14781, O14781 +14782, O14782 +14783, O14783 +14784, O14784 +14785, O14785 +14786, O14786 +14787, O14787 +14788, O14788 +14789, O14789 +14790, O14790 +14791, O14791 +14792, O14792 +14793, O14793 +14794, O14794 +14795, O14795 +14796, O14796 +14797, O14797 +14798, O14798 +14799, O14799 +14800, O14800 +14801, O14801 +14802, O14802 +14803, O14803 +14804, O14804 +14805, O14805 +14806, O14806 +14807, O14807 +14808, O14808 +14809, O14809 +14810, O14810 +14811, O14811 +14812, O14812 +14813, O14813 +14814, O14814 +14815, O14815 +14816, O14816 +14817, O14817 +14818, O14818 +14819, O14819 +14820, O14820 +14821, O14821 +14822, O14822 +14823, O14823 +14824, O14824 +14825, O14825 +14826, O14826 +14827, O14827 +14828, O14828 +14829, O14829 +14830, O14830 +14831, O14831 +14832, O14832 +14833, O14833 +14834, O14834 +14835, O14835 +14836, O14836 +14837, O14837 +14838, O14838 +14839, O14839 +14840, O14840 +14841, O14841 +14842, O14842 +14843, O14843 +14844, O14844 +14845, O14845 +14846, O14846 +14847, O14847 +14848, O14848 +14849, O14849 +14850, O14850 +14851, O14851 +14852, O14852 +14853, O14853 +14854, O14854 +14855, O14855 +14856, O14856 +14857, O14857 +14858, O14858 +14859, O14859 +14860, O14860 +14861, O14861 +14862, O14862 +14863, O14863 +14864, O14864 +14865, O14865 +14866, O14866 +14867, O14867 +14868, O14868 +14869, O14869 +14870, O14870 +14871, O14871 +14872, O14872 +14873, O14873 +14874, O14874 +14875, O14875 +14876, O14876 +14877, O14877 +14878, O14878 +14879, O14879 +14880, O14880 +14881, O14881 +14882, O14882 +14883, O14883 +14884, O14884 +14885, O14885 +14886, O14886 +14887, O14887 +14888, O14888 +14889, O14889 +14890, O14890 +14891, O14891 +14892, O14892 +14893, O14893 +14894, O14894 +14895, O14895 +14896, O14896 +14897, O14897 +14898, O14898 +14899, O14899 +14900, O14900 +14901, O14901 +14902, O14902 +14903, O14903 +14904, O14904 +14905, O14905 +14906, O14906 +14907, O14907 +14908, O14908 +14909, O14909 +14910, O14910 +14911, O14911 +14912, O14912 +14913, O14913 +14914, O14914 +14915, O14915 +14916, O14916 +14917, O14917 +14918, O14918 +14919, O14919 +14920, O14920 +14921, O14921 +14922, O14922 +14923, O14923 +14924, O14924 +14925, O14925 +14926, O14926 +14927, O14927 +14928, O14928 +14929, O14929 +14930, O14930 +14931, O14931 +14932, O14932 +14933, O14933 +14934, O14934 +14935, O14935 +14936, O14936 +14937, O14937 +14938, O14938 +14939, O14939 +14940, O14940 +14941, O14941 +14942, O14942 +14943, O14943 +14944, O14944 +14945, O14945 +14946, O14946 +14947, O14947 +14948, O14948 +14949, O14949 +14950, O14950 +14951, O14951 +14952, O14952 +14953, O14953 +14954, O14954 +14955, O14955 +14956, O14956 +14957, O14957 +14958, O14958 +14959, O14959 +14960, O14960 +14961, O14961 +14962, O14962 +14963, O14963 +14964, O14964 +14965, O14965 +14966, O14966 +14967, O14967 +14968, O14968 +14969, O14969 +14970, O14970 +14971, O14971 +14972, O14972 +14973, O14973 +14974, O14974 +14975, O14975 +14976, O14976 +14977, O14977 +14978, O14978 +14979, O14979 +14980, O14980 +14981, O14981 +14982, O14982 +14983, O14983 +14984, O14984 +14985, O14985 +14986, O14986 +14987, O14987 +14988, O14988 +14989, O14989 +14990, O14990 +14991, O14991 +14992, O14992 +14993, O14993 +14994, O14994 +14995, O14995 +14996, O14996 +14997, O14997 +14998, O14998 +14999, O14999 +15000, O15000 +15001, O15001 +15002, O15002 +15003, O15003 +15004, O15004 +15005, O15005 +15006, O15006 +15007, O15007 +15008, O15008 +15009, O15009 +15010, O15010 +15011, O15011 +15012, O15012 +15013, O15013 +15014, O15014 +15015, O15015 +15016, O15016 +15017, O15017 +15018, O15018 +15019, O15019 +15020, O15020 +15021, O15021 +15022, O15022 +15023, O15023 +15024, O15024 +15025, O15025 +15026, O15026 +15027, O15027 +15028, O15028 +15029, O15029 +15030, O15030 +15031, O15031 +15032, O15032 +15033, O15033 +15034, O15034 +15035, O15035 +15036, O15036 +15037, O15037 +15038, O15038 +15039, O15039 +15040, O15040 +15041, O15041 +15042, O15042 +15043, O15043 +15044, O15044 +15045, O15045 +15046, O15046 +15047, O15047 +15048, O15048 +15049, O15049 +15050, O15050 +15051, O15051 +15052, O15052 +15053, O15053 +15054, O15054 +15055, O15055 +15056, O15056 +15057, O15057 +15058, O15058 +15059, O15059 +15060, O15060 +15061, O15061 +15062, O15062 +15063, O15063 +15064, O15064 +15065, O15065 +15066, O15066 +15067, O15067 +15068, O15068 +15069, O15069 +15070, O15070 +15071, O15071 +15072, O15072 +15073, O15073 +15074, O15074 +15075, O15075 +15076, O15076 +15077, O15077 +15078, O15078 +15079, O15079 +15080, O15080 +15081, O15081 +15082, O15082 +15083, O15083 +15084, O15084 +15085, O15085 +15086, O15086 +15087, O15087 +15088, O15088 +15089, O15089 +15090, O15090 +15091, O15091 +15092, O15092 +15093, O15093 +15094, O15094 +15095, O15095 +15096, O15096 +15097, O15097 +15098, O15098 +15099, O15099 +15100, O15100 +15101, O15101 +15102, O15102 +15103, O15103 +15104, O15104 +15105, O15105 +15106, O15106 +15107, O15107 +15108, O15108 +15109, O15109 +15110, O15110 +15111, O15111 +15112, O15112 +15113, O15113 +15114, O15114 +15115, O15115 +15116, O15116 +15117, O15117 +15118, O15118 +15119, O15119 +15120, O15120 +15121, O15121 +15122, O15122 +15123, O15123 +15124, O15124 +15125, O15125 +15126, O15126 +15127, O15127 +15128, O15128 +15129, O15129 +15130, O15130 +15131, O15131 +15132, O15132 +15133, O15133 +15134, O15134 +15135, O15135 +15136, O15136 +15137, O15137 +15138, O15138 +15139, O15139 +15140, O15140 +15141, O15141 +15142, O15142 +15143, O15143 +15144, O15144 +15145, O15145 +15146, O15146 +15147, O15147 +15148, O15148 +15149, O15149 +15150, O15150 +15151, O15151 +15152, O15152 +15153, O15153 +15154, O15154 +15155, O15155 +15156, O15156 +15157, O15157 +15158, O15158 +15159, O15159 +15160, O15160 +15161, O15161 +15162, O15162 +15163, O15163 +15164, O15164 +15165, O15165 +15166, O15166 +15167, O15167 +15168, O15168 +15169, O15169 +15170, O15170 +15171, O15171 +15172, O15172 +15173, O15173 +15174, O15174 +15175, O15175 +15176, O15176 +15177, O15177 +15178, O15178 +15179, O15179 +15180, O15180 +15181, O15181 +15182, O15182 +15183, O15183 +15184, O15184 +15185, O15185 +15186, O15186 +15187, O15187 +15188, O15188 +15189, O15189 +15190, O15190 +15191, O15191 +15192, O15192 +15193, O15193 +15194, O15194 +15195, O15195 +15196, O15196 +15197, O15197 +15198, O15198 +15199, O15199 +15200, O15200 +15201, O15201 +15202, O15202 +15203, O15203 +15204, O15204 +15205, O15205 +15206, O15206 +15207, O15207 +15208, O15208 +15209, O15209 +15210, O15210 +15211, O15211 +15212, O15212 +15213, O15213 +15214, O15214 +15215, O15215 +15216, O15216 +15217, O15217 +15218, O15218 +15219, O15219 +15220, O15220 +15221, O15221 +15222, O15222 +15223, O15223 +15224, O15224 +15225, O15225 +15226, O15226 +15227, O15227 +15228, O15228 +15229, O15229 +15230, O15230 +15231, O15231 +15232, O15232 +15233, O15233 +15234, O15234 +15235, O15235 +15236, O15236 +15237, O15237 +15238, O15238 +15239, O15239 +15240, O15240 +15241, O15241 +15242, O15242 +15243, O15243 +15244, O15244 +15245, O15245 +15246, O15246 +15247, O15247 +15248, O15248 +15249, O15249 +15250, O15250 +15251, O15251 +15252, O15252 +15253, O15253 +15254, O15254 +15255, O15255 +15256, O15256 +15257, O15257 +15258, O15258 +15259, O15259 +15260, O15260 +15261, O15261 +15262, O15262 +15263, O15263 +15264, O15264 +15265, O15265 +15266, O15266 +15267, O15267 +15268, O15268 +15269, O15269 +15270, O15270 +15271, O15271 +15272, O15272 +15273, O15273 +15274, O15274 +15275, O15275 +15276, O15276 +15277, O15277 +15278, O15278 +15279, O15279 +15280, O15280 +15281, O15281 +15282, O15282 +15283, O15283 +15284, O15284 +15285, O15285 +15286, O15286 +15287, O15287 +15288, O15288 +15289, O15289 +15290, O15290 +15291, O15291 +15292, O15292 +15293, O15293 +15294, O15294 +15295, O15295 +15296, O15296 +15297, O15297 +15298, O15298 +15299, O15299 +15300, O15300 +15301, O15301 +15302, O15302 +15303, O15303 +15304, O15304 +15305, O15305 +15306, O15306 +15307, O15307 +15308, O15308 +15309, O15309 +15310, O15310 +15311, O15311 +15312, O15312 +15313, O15313 +15314, O15314 +15315, O15315 +15316, O15316 +15317, O15317 +15318, O15318 +15319, O15319 +15320, O15320 +15321, O15321 +15322, O15322 +15323, O15323 +15324, O15324 +15325, O15325 +15326, O15326 +15327, O15327 +15328, O15328 +15329, O15329 +15330, O15330 +15331, O15331 +15332, O15332 +15333, O15333 +15334, O15334 +15335, O15335 +15336, O15336 +15337, O15337 +15338, O15338 +15339, O15339 +15340, O15340 +15341, O15341 +15342, O15342 +15343, O15343 +15344, O15344 +15345, O15345 +15346, O15346 +15347, O15347 +15348, O15348 +15349, O15349 +15350, O15350 +15351, O15351 +15352, O15352 +15353, O15353 +15354, O15354 +15355, O15355 +15356, O15356 +15357, O15357 +15358, O15358 +15359, O15359 +15360, O15360 +15361, O15361 +15362, O15362 +15363, O15363 +15364, O15364 +15365, O15365 +15366, O15366 +15367, O15367 +15368, O15368 +15369, O15369 +15370, O15370 +15371, O15371 +15372, O15372 +15373, O15373 +15374, O15374 +15375, O15375 +15376, O15376 +15377, O15377 +15378, O15378 +15379, O15379 +15380, O15380 +15381, O15381 +15382, O15382 +15383, O15383 +15384, O15384 +15385, O15385 +15386, O15386 +15387, O15387 +15388, O15388 +15389, O15389 +15390, O15390 +15391, O15391 +15392, O15392 +15393, O15393 +15394, O15394 +15395, O15395 +15396, O15396 +15397, O15397 +15398, O15398 +15399, O15399 +15400, O15400 +15401, O15401 +15402, O15402 +15403, O15403 +15404, O15404 +15405, O15405 +15406, O15406 +15407, O15407 +15408, O15408 +15409, O15409 +15410, O15410 +15411, O15411 +15412, O15412 +15413, O15413 +15414, O15414 +15415, O15415 +15416, O15416 +15417, O15417 +15418, O15418 +15419, O15419 +15420, O15420 +15421, O15421 +15422, O15422 +15423, O15423 +15424, O15424 +15425, O15425 +15426, O15426 +15427, O15427 +15428, O15428 +15429, O15429 +15430, O15430 +15431, O15431 +15432, O15432 +15433, O15433 +15434, O15434 +15435, O15435 +15436, O15436 +15437, O15437 +15438, O15438 +15439, O15439 +15440, O15440 +15441, O15441 +15442, O15442 +15443, O15443 +15444, O15444 +15445, O15445 +15446, O15446 +15447, O15447 +15448, O15448 +15449, O15449 +15450, O15450 +15451, O15451 +15452, O15452 +15453, O15453 +15454, O15454 +15455, O15455 +15456, O15456 +15457, O15457 +15458, O15458 +15459, O15459 +15460, O15460 +15461, O15461 +15462, O15462 +15463, O15463 +15464, O15464 +15465, O15465 +15466, O15466 +15467, O15467 +15468, O15468 +15469, O15469 +15470, O15470 +15471, O15471 +15472, O15472 +15473, O15473 +15474, O15474 +15475, O15475 +15476, O15476 +15477, O15477 +15478, O15478 +15479, O15479 +15480, O15480 +15481, O15481 +15482, O15482 +15483, O15483 +15484, O15484 +15485, O15485 +15486, O15486 +15487, O15487 +15488, O15488 +15489, O15489 +15490, O15490 +15491, O15491 +15492, O15492 +15493, O15493 +15494, O15494 +15495, O15495 +15496, O15496 +15497, O15497 +15498, O15498 +15499, O15499 +15500, O15500 +15501, O15501 +15502, O15502 +15503, O15503 +15504, O15504 +15505, O15505 +15506, O15506 +15507, O15507 +15508, O15508 +15509, O15509 +15510, O15510 +15511, O15511 +15512, O15512 +15513, O15513 +15514, O15514 +15515, O15515 +15516, O15516 +15517, O15517 +15518, O15518 +15519, O15519 +15520, O15520 +15521, O15521 +15522, O15522 +15523, O15523 +15524, O15524 +15525, O15525 +15526, O15526 +15527, O15527 +15528, O15528 +15529, O15529 +15530, O15530 +15531, O15531 +15532, O15532 +15533, O15533 +15534, O15534 +15535, O15535 +15536, O15536 +15537, O15537 +15538, O15538 +15539, O15539 +15540, O15540 +15541, O15541 +15542, O15542 +15543, O15543 +15544, O15544 +15545, O15545 +15546, O15546 +15547, O15547 +15548, O15548 +15549, O15549 +15550, O15550 +15551, O15551 +15552, O15552 +15553, O15553 +15554, O15554 +15555, O15555 +15556, O15556 +15557, O15557 +15558, O15558 +15559, O15559 +15560, O15560 +15561, O15561 +15562, O15562 +15563, O15563 +15564, O15564 +15565, O15565 +15566, O15566 +15567, O15567 +15568, O15568 +15569, O15569 +15570, O15570 +15571, O15571 +15572, O15572 +15573, O15573 +15574, O15574 +15575, O15575 +15576, O15576 +15577, O15577 +15578, O15578 +15579, O15579 +15580, O15580 +15581, O15581 +15582, O15582 +15583, O15583 +15584, O15584 +15585, O15585 +15586, O15586 +15587, O15587 +15588, O15588 +15589, O15589 +15590, O15590 +15591, O15591 +15592, O15592 +15593, O15593 +15594, O15594 +15595, O15595 +15596, O15596 +15597, O15597 +15598, O15598 +15599, O15599 +15600, O15600 +15601, O15601 +15602, O15602 +15603, O15603 +15604, O15604 +15605, O15605 +15606, O15606 +15607, O15607 +15608, O15608 +15609, O15609 +15610, O15610 +15611, O15611 +15612, O15612 +15613, O15613 +15614, O15614 +15615, O15615 +15616, O15616 +15617, O15617 +15618, O15618 +15619, O15619 +15620, O15620 +15621, O15621 +15622, O15622 +15623, O15623 +15624, O15624 +15625, O15625 +15626, O15626 +15627, O15627 +15628, O15628 +15629, O15629 +15630, O15630 +15631, O15631 +15632, O15632 +15633, O15633 +15634, O15634 +15635, O15635 +15636, O15636 +15637, O15637 +15638, O15638 +15639, O15639 +15640, O15640 +15641, O15641 +15642, O15642 +15643, O15643 +15644, O15644 +15645, O15645 +15646, O15646 +15647, O15647 +15648, O15648 +15649, O15649 +15650, O15650 +15651, O15651 +15652, O15652 +15653, O15653 +15654, O15654 +15655, O15655 +15656, O15656 +15657, O15657 +15658, O15658 +15659, O15659 +15660, O15660 +15661, O15661 +15662, O15662 +15663, O15663 +15664, O15664 +15665, O15665 +15666, O15666 +15667, O15667 +15668, O15668 +15669, O15669 +15670, O15670 +15671, O15671 +15672, O15672 +15673, O15673 +15674, O15674 +15675, O15675 +15676, O15676 +15677, O15677 +15678, O15678 +15679, O15679 +15680, O15680 +15681, O15681 +15682, O15682 +15683, O15683 +15684, O15684 +15685, O15685 +15686, O15686 +15687, O15687 +15688, O15688 +15689, O15689 +15690, O15690 +15691, O15691 +15692, O15692 +15693, O15693 +15694, O15694 +15695, O15695 +15696, O15696 +15697, O15697 +15698, O15698 +15699, O15699 +15700, O15700 +15701, O15701 +15702, O15702 +15703, O15703 +15704, O15704 +15705, O15705 +15706, O15706 +15707, O15707 +15708, O15708 +15709, O15709 +15710, O15710 +15711, O15711 +15712, O15712 +15713, O15713 +15714, O15714 +15715, O15715 +15716, O15716 +15717, O15717 +15718, O15718 +15719, O15719 +15720, O15720 +15721, O15721 +15722, O15722 +15723, O15723 +15724, O15724 +15725, O15725 +15726, O15726 +15727, O15727 +15728, O15728 +15729, O15729 +15730, O15730 +15731, O15731 +15732, O15732 +15733, O15733 +15734, O15734 +15735, O15735 +15736, O15736 +15737, O15737 +15738, O15738 +15739, O15739 +15740, O15740 +15741, O15741 +15742, O15742 +15743, O15743 +15744, O15744 +15745, O15745 +15746, O15746 +15747, O15747 +15748, O15748 +15749, O15749 +15750, O15750 +15751, O15751 +15752, O15752 +15753, O15753 +15754, O15754 +15755, O15755 +15756, O15756 +15757, O15757 +15758, O15758 +15759, O15759 +15760, O15760 +15761, O15761 +15762, O15762 +15763, O15763 +15764, O15764 +15765, O15765 +15766, O15766 +15767, O15767 +15768, O15768 +15769, O15769 +15770, O15770 +15771, O15771 +15772, O15772 +15773, O15773 +15774, O15774 +15775, O15775 +15776, O15776 +15777, O15777 +15778, O15778 +15779, O15779 +15780, O15780 +15781, O15781 +15782, O15782 +15783, O15783 +15784, O15784 +15785, O15785 +15786, O15786 +15787, O15787 +15788, O15788 +15789, O15789 +15790, O15790 +15791, O15791 +15792, O15792 +15793, O15793 +15794, O15794 +15795, O15795 +15796, O15796 +15797, O15797 +15798, O15798 +15799, O15799 +15800, O15800 +15801, O15801 +15802, O15802 +15803, O15803 +15804, O15804 +15805, O15805 +15806, O15806 +15807, O15807 +15808, O15808 +15809, O15809 +15810, O15810 +15811, O15811 +15812, O15812 +15813, O15813 +15814, O15814 +15815, O15815 +15816, O15816 +15817, O15817 +15818, O15818 +15819, O15819 +15820, O15820 +15821, O15821 +15822, O15822 +15823, O15823 +15824, O15824 +15825, O15825 +15826, O15826 +15827, O15827 +15828, O15828 +15829, O15829 +15830, O15830 +15831, O15831 +15832, O15832 +15833, O15833 +15834, O15834 +15835, O15835 +15836, O15836 +15837, O15837 +15838, O15838 +15839, O15839 +15840, O15840 +15841, O15841 +15842, O15842 +15843, O15843 +15844, O15844 +15845, O15845 +15846, O15846 +15847, O15847 +15848, O15848 +15849, O15849 +15850, O15850 +15851, O15851 +15852, O15852 +15853, O15853 +15854, O15854 +15855, O15855 +15856, O15856 +15857, O15857 +15858, O15858 +15859, O15859 +15860, O15860 +15861, O15861 +15862, O15862 +15863, O15863 +15864, O15864 +15865, O15865 +15866, O15866 +15867, O15867 +15868, O15868 +15869, O15869 +15870, O15870 +15871, O15871 +15872, O15872 +15873, O15873 +15874, O15874 +15875, O15875 +15876, O15876 +15877, O15877 +15878, O15878 +15879, O15879 +15880, O15880 +15881, O15881 +15882, O15882 +15883, O15883 +15884, O15884 +15885, O15885 +15886, O15886 +15887, O15887 +15888, O15888 +15889, O15889 +15890, O15890 +15891, O15891 +15892, O15892 +15893, O15893 +15894, O15894 +15895, O15895 +15896, O15896 +15897, O15897 +15898, O15898 +15899, O15899 +15900, O15900 +15901, O15901 +15902, O15902 +15903, O15903 +15904, O15904 +15905, O15905 +15906, O15906 +15907, O15907 +15908, O15908 +15909, O15909 +15910, O15910 +15911, O15911 +15912, O15912 +15913, O15913 +15914, O15914 +15915, O15915 +15916, O15916 +15917, O15917 +15918, O15918 +15919, O15919 +15920, O15920 +15921, O15921 +15922, O15922 +15923, O15923 +15924, O15924 +15925, O15925 +15926, O15926 +15927, O15927 +15928, O15928 +15929, O15929 +15930, O15930 +15931, O15931 +15932, O15932 +15933, O15933 +15934, O15934 +15935, O15935 +15936, O15936 +15937, O15937 +15938, O15938 +15939, O15939 +15940, O15940 +15941, O15941 +15942, O15942 +15943, O15943 +15944, O15944 +15945, O15945 +15946, O15946 +15947, O15947 +15948, O15948 +15949, O15949 +15950, O15950 +15951, O15951 +15952, O15952 +15953, O15953 +15954, O15954 +15955, O15955 +15956, O15956 +15957, O15957 +15958, O15958 +15959, O15959 +15960, O15960 +15961, O15961 +15962, O15962 +15963, O15963 +15964, O15964 +15965, O15965 +15966, O15966 +15967, O15967 +15968, O15968 +15969, O15969 +15970, O15970 +15971, O15971 +15972, O15972 +15973, O15973 +15974, O15974 +15975, O15975 +15976, O15976 +15977, O15977 +15978, O15978 +15979, O15979 +15980, O15980 +15981, O15981 +15982, O15982 +15983, O15983 +15984, O15984 +15985, O15985 +15986, O15986 +15987, O15987 +15988, O15988 +15989, O15989 +15990, O15990 +15991, O15991 +15992, O15992 +15993, O15993 +15994, O15994 +15995, O15995 +15996, O15996 +15997, O15997 +15998, O15998 +15999, O15999 +16000, O16000 +16001, O16001 +16002, O16002 +16003, O16003 +16004, O16004 +16005, O16005 +16006, O16006 +16007, O16007 +16008, O16008 +16009, O16009 +16010, O16010 +16011, O16011 +16012, O16012 +16013, O16013 +16014, O16014 +16015, O16015 +16016, O16016 +16017, O16017 +16018, O16018 +16019, O16019 +16020, O16020 +16021, O16021 +16022, O16022 +16023, O16023 +16024, O16024 +16025, O16025 +16026, O16026 +16027, O16027 +16028, O16028 +16029, O16029 +16030, O16030 +16031, O16031 +16032, O16032 +16033, O16033 +16034, O16034 +16035, O16035 +16036, O16036 +16037, O16037 +16038, O16038 +16039, O16039 +16040, O16040 +16041, O16041 +16042, O16042 +16043, O16043 +16044, O16044 +16045, O16045 +16046, O16046 +16047, O16047 +16048, O16048 +16049, O16049 +16050, O16050 +16051, O16051 +16052, O16052 +16053, O16053 +16054, O16054 +16055, O16055 +16056, O16056 +16057, O16057 +16058, O16058 +16059, O16059 +16060, O16060 +16061, O16061 +16062, O16062 +16063, O16063 +16064, O16064 +16065, O16065 +16066, O16066 +16067, O16067 +16068, O16068 +16069, O16069 +16070, O16070 +16071, O16071 +16072, O16072 +16073, O16073 +16074, O16074 +16075, O16075 +16076, O16076 +16077, O16077 +16078, O16078 +16079, O16079 +16080, O16080 +16081, O16081 +16082, O16082 +16083, O16083 +16084, O16084 +16085, O16085 +16086, O16086 +16087, O16087 +16088, O16088 +16089, O16089 +16090, O16090 +16091, O16091 +16092, O16092 +16093, O16093 +16094, O16094 +16095, O16095 +16096, O16096 +16097, O16097 +16098, O16098 +16099, O16099 +16100, O16100 +16101, O16101 +16102, O16102 +16103, O16103 +16104, O16104 +16105, O16105 +16106, O16106 +16107, O16107 +16108, O16108 +16109, O16109 +16110, O16110 +16111, O16111 +16112, O16112 +16113, O16113 +16114, O16114 +16115, O16115 +16116, O16116 +16117, O16117 +16118, O16118 +16119, O16119 +16120, O16120 +16121, O16121 +16122, O16122 +16123, O16123 +16124, O16124 +16125, O16125 +16126, O16126 +16127, O16127 +16128, O16128 +16129, O16129 +16130, O16130 +16131, O16131 +16132, O16132 +16133, O16133 +16134, O16134 +16135, O16135 +16136, O16136 +16137, O16137 +16138, O16138 +16139, O16139 +16140, O16140 +16141, O16141 +16142, O16142 +16143, O16143 +16144, O16144 +16145, O16145 +16146, O16146 +16147, O16147 +16148, O16148 +16149, O16149 +16150, O16150 +16151, O16151 +16152, O16152 +16153, O16153 +16154, O16154 +16155, O16155 +16156, O16156 +16157, O16157 +16158, O16158 +16159, O16159 +16160, O16160 +16161, O16161 +16162, O16162 +16163, O16163 +16164, O16164 +16165, O16165 +16166, O16166 +16167, O16167 +16168, O16168 +16169, O16169 +16170, O16170 +16171, O16171 +16172, O16172 +16173, O16173 +16174, O16174 +16175, O16175 +16176, O16176 +16177, O16177 +16178, O16178 +16179, O16179 +16180, O16180 +16181, O16181 +16182, O16182 +16183, O16183 +16184, O16184 +16185, O16185 +16186, O16186 +16187, O16187 +16188, O16188 +16189, O16189 +16190, O16190 +16191, O16191 +16192, O16192 +16193, O16193 +16194, O16194 +16195, O16195 +16196, O16196 +16197, O16197 +16198, O16198 +16199, O16199 +16200, O16200 +16201, O16201 +16202, O16202 +16203, O16203 +16204, O16204 +16205, O16205 +16206, O16206 +16207, O16207 +16208, O16208 +16209, O16209 +16210, O16210 +16211, O16211 +16212, O16212 +16213, O16213 +16214, O16214 +16215, O16215 +16216, O16216 +16217, O16217 +16218, O16218 +16219, O16219 +16220, O16220 +16221, O16221 +16222, O16222 +16223, O16223 +16224, O16224 +16225, O16225 +16226, O16226 +16227, O16227 +16228, O16228 +16229, O16229 +16230, O16230 +16231, O16231 +16232, O16232 +16233, O16233 +16234, O16234 +16235, O16235 +16236, O16236 +16237, O16237 +16238, O16238 +16239, O16239 +16240, O16240 +16241, O16241 +16242, O16242 +16243, O16243 +16244, O16244 +16245, O16245 +16246, O16246 +16247, O16247 +16248, O16248 +16249, O16249 +16250, O16250 +16251, O16251 +16252, O16252 +16253, O16253 +16254, O16254 +16255, O16255 +16256, O16256 +16257, O16257 +16258, O16258 +16259, O16259 +16260, O16260 +16261, O16261 +16262, O16262 +16263, O16263 +16264, O16264 +16265, O16265 +16266, O16266 +16267, O16267 +16268, O16268 +16269, O16269 +16270, O16270 +16271, O16271 +16272, O16272 +16273, O16273 +16274, O16274 +16275, O16275 +16276, O16276 +16277, O16277 +16278, O16278 +16279, O16279 +16280, O16280 +16281, O16281 +16282, O16282 +16283, O16283 +16284, O16284 +16285, O16285 +16286, O16286 +16287, O16287 +16288, O16288 +16289, O16289 +16290, O16290 +16291, O16291 +16292, O16292 +16293, O16293 +16294, O16294 +16295, O16295 +16296, O16296 +16297, O16297 +16298, O16298 +16299, O16299 +16300, O16300 +16301, O16301 +16302, O16302 +16303, O16303 +16304, O16304 +16305, O16305 +16306, O16306 +16307, O16307 +16308, O16308 +16309, O16309 +16310, O16310 +16311, O16311 +16312, O16312 +16313, O16313 +16314, O16314 +16315, O16315 +16316, O16316 +16317, O16317 +16318, O16318 +16319, O16319 +16320, O16320 +16321, O16321 +16322, O16322 +16323, O16323 +16324, O16324 +16325, O16325 +16326, O16326 +16327, O16327 +16328, O16328 +16329, O16329 +16330, O16330 +16331, O16331 +16332, O16332 +16333, O16333 +16334, O16334 +16335, O16335 +16336, O16336 +16337, O16337 +16338, O16338 +16339, O16339 +16340, O16340 +16341, O16341 +16342, O16342 +16343, O16343 +16344, O16344 +16345, O16345 +16346, O16346 +16347, O16347 +16348, O16348 +16349, O16349 +16350, O16350 +16351, O16351 +16352, O16352 +16353, O16353 +16354, O16354 +16355, O16355 +16356, O16356 +16357, O16357 +16358, O16358 +16359, O16359 +16360, O16360 +16361, O16361 +16362, O16362 +16363, O16363 +16364, O16364 +16365, O16365 +16366, O16366 +16367, O16367 +16368, O16368 +16369, O16369 +16370, O16370 +16371, O16371 +16372, O16372 +16373, O16373 +16374, O16374 +16375, O16375 +16376, O16376 +16377, O16377 +16378, O16378 +16379, O16379 +16380, O16380 +16381, O16381 +16382, O16382 +16383, O16383 +16384, O16384 +16385, O16385 +16386, O16386 +16387, O16387 +16388, O16388 +16389, O16389 +16390, O16390 +16391, O16391 +16392, O16392 +16393, O16393 +16394, O16394 +16395, O16395 +16396, O16396 +16397, O16397 +16398, O16398 +16399, O16399 +16400, O16400 +16401, O16401 +16402, O16402 +16403, O16403 +16404, O16404 +16405, O16405 +16406, O16406 +16407, O16407 +16408, O16408 +16409, O16409 +16410, O16410 +16411, O16411 +16412, O16412 +16413, O16413 +16414, O16414 +16415, O16415 +16416, O16416 +16417, O16417 +16418, O16418 +16419, O16419 +16420, O16420 +16421, O16421 +16422, O16422 +16423, O16423 +16424, O16424 +16425, O16425 +16426, O16426 +16427, O16427 +16428, O16428 +16429, O16429 +16430, O16430 +16431, O16431 +16432, O16432 +16433, O16433 +16434, O16434 +16435, O16435 +16436, O16436 +16437, O16437 +16438, O16438 +16439, O16439 +16440, O16440 +16441, O16441 +16442, O16442 +16443, O16443 +16444, O16444 +16445, O16445 +16446, O16446 +16447, O16447 +16448, O16448 +16449, O16449 +16450, O16450 +16451, O16451 +16452, O16452 +16453, O16453 +16454, O16454 +16455, O16455 +16456, O16456 +16457, O16457 +16458, O16458 +16459, O16459 +16460, O16460 +16461, O16461 +16462, O16462 +16463, O16463 +16464, O16464 +16465, O16465 +16466, O16466 +16467, O16467 +16468, O16468 +16469, O16469 +16470, O16470 +16471, O16471 +16472, O16472 +16473, O16473 +16474, O16474 +16475, O16475 +16476, O16476 +16477, O16477 +16478, O16478 +16479, O16479 +16480, O16480 +16481, O16481 +16482, O16482 +16483, O16483 +16484, O16484 +16485, O16485 +16486, O16486 +16487, O16487 +16488, O16488 +16489, O16489 +16490, O16490 +16491, O16491 +16492, O16492 +16493, O16493 +16494, O16494 +16495, O16495 +16496, O16496 +16497, O16497 +16498, O16498 +16499, O16499 +16500, O16500 +16501, O16501 +16502, O16502 +16503, O16503 +16504, O16504 +16505, O16505 +16506, O16506 +16507, O16507 +16508, O16508 +16509, O16509 +16510, O16510 +16511, O16511 +16512, O16512 +16513, O16513 +16514, O16514 +16515, O16515 +16516, O16516 +16517, O16517 +16518, O16518 +16519, O16519 +16520, O16520 +16521, O16521 +16522, O16522 +16523, O16523 +16524, O16524 +16525, O16525 +16526, O16526 +16527, O16527 +16528, O16528 +16529, O16529 +16530, O16530 +16531, O16531 +16532, O16532 +16533, O16533 +16534, O16534 +16535, O16535 +16536, O16536 +16537, O16537 +16538, O16538 +16539, O16539 +16540, O16540 +16541, O16541 +16542, O16542 +16543, O16543 +16544, O16544 +16545, O16545 +16546, O16546 +16547, O16547 +16548, O16548 +16549, O16549 +16550, O16550 +16551, O16551 +16552, O16552 +16553, O16553 +16554, O16554 +16555, O16555 +16556, O16556 +16557, O16557 +16558, O16558 +16559, O16559 +16560, O16560 +16561, O16561 +16562, O16562 +16563, O16563 +16564, O16564 +16565, O16565 +16566, O16566 +16567, O16567 +16568, O16568 +16569, O16569 +16570, O16570 +16571, O16571 +16572, O16572 +16573, O16573 +16574, O16574 +16575, O16575 +16576, O16576 +16577, O16577 +16578, O16578 +16579, O16579 +16580, O16580 +16581, O16581 +16582, O16582 +16583, O16583 +16584, O16584 +16585, O16585 +16586, O16586 +16587, O16587 +16588, O16588 +16589, O16589 +16590, O16590 +16591, O16591 +16592, O16592 +16593, O16593 +16594, O16594 +16595, O16595 +16596, O16596 +16597, O16597 +16598, O16598 +16599, O16599 +16600, O16600 +16601, O16601 +16602, O16602 +16603, O16603 +16604, O16604 +16605, O16605 +16606, O16606 +16607, O16607 +16608, O16608 +16609, O16609 +16610, O16610 +16611, O16611 +16612, O16612 +16613, O16613 +16614, O16614 +16615, O16615 +16616, O16616 +16617, O16617 +16618, O16618 +16619, O16619 +16620, O16620 +16621, O16621 +16622, O16622 +16623, O16623 +16624, O16624 +16625, O16625 +16626, O16626 +16627, O16627 +16628, O16628 +16629, O16629 +16630, O16630 +16631, O16631 +16632, O16632 +16633, O16633 +16634, O16634 +16635, O16635 +16636, O16636 +16637, O16637 +16638, O16638 +16639, O16639 +16640, O16640 +16641, O16641 +16642, O16642 +16643, O16643 +16644, O16644 +16645, O16645 +16646, O16646 +16647, O16647 +16648, O16648 +16649, O16649 +16650, O16650 +16651, O16651 +16652, O16652 +16653, O16653 +16654, O16654 +16655, O16655 +16656, O16656 +16657, O16657 +16658, O16658 +16659, O16659 +16660, O16660 +16661, O16661 +16662, O16662 +16663, O16663 +16664, O16664 +16665, O16665 +16666, O16666 +16667, O16667 +16668, O16668 +16669, O16669 +16670, O16670 +16671, O16671 +16672, O16672 +16673, O16673 +16674, O16674 +16675, O16675 +16676, O16676 +16677, O16677 +16678, O16678 +16679, O16679 +16680, O16680 +16681, O16681 +16682, O16682 +16683, O16683 +16684, O16684 +16685, O16685 +16686, O16686 +16687, O16687 +16688, O16688 +16689, O16689 +16690, O16690 +16691, O16691 +16692, O16692 +16693, O16693 +16694, O16694 +16695, O16695 +16696, O16696 +16697, O16697 +16698, O16698 +16699, O16699 +16700, O16700 +16701, O16701 +16702, O16702 +16703, O16703 +16704, O16704 +16705, O16705 +16706, O16706 +16707, O16707 +16708, O16708 +16709, O16709 +16710, O16710 +16711, O16711 +16712, O16712 +16713, O16713 +16714, O16714 +16715, O16715 +16716, O16716 +16717, O16717 +16718, O16718 +16719, O16719 +16720, O16720 +16721, O16721 +16722, O16722 +16723, O16723 +16724, O16724 +16725, O16725 +16726, O16726 +16727, O16727 +16728, O16728 +16729, O16729 +16730, O16730 +16731, O16731 +16732, O16732 +16733, O16733 +16734, O16734 +16735, O16735 +16736, O16736 +16737, O16737 +16738, O16738 +16739, O16739 +16740, O16740 +16741, O16741 +16742, O16742 +16743, O16743 +16744, O16744 +16745, O16745 +16746, O16746 +16747, O16747 +16748, O16748 +16749, O16749 +16750, O16750 +16751, O16751 +16752, O16752 +16753, O16753 +16754, O16754 +16755, O16755 +16756, O16756 +16757, O16757 +16758, O16758 +16759, O16759 +16760, O16760 +16761, O16761 +16762, O16762 +16763, O16763 +16764, O16764 +16765, O16765 +16766, O16766 +16767, O16767 +16768, O16768 +16769, O16769 +16770, O16770 +16771, O16771 +16772, O16772 +16773, O16773 +16774, O16774 +16775, O16775 +16776, O16776 +16777, O16777 +16778, O16778 +16779, O16779 +16780, O16780 +16781, O16781 +16782, O16782 +16783, O16783 +16784, O16784 +16785, O16785 +16786, O16786 +16787, O16787 +16788, O16788 +16789, O16789 +16790, O16790 +16791, O16791 +16792, O16792 +16793, O16793 +16794, O16794 +16795, O16795 +16796, O16796 +16797, O16797 +16798, O16798 +16799, O16799 +16800, O16800 +16801, O16801 +16802, O16802 +16803, O16803 +16804, O16804 +16805, O16805 +16806, O16806 +16807, O16807 +16808, O16808 +16809, O16809 +16810, O16810 +16811, O16811 +16812, O16812 +16813, O16813 +16814, O16814 +16815, O16815 +16816, O16816 +16817, O16817 +16818, O16818 +16819, O16819 +16820, O16820 +16821, O16821 +16822, O16822 +16823, O16823 +16824, O16824 +16825, O16825 +16826, O16826 +16827, O16827 +16828, O16828 +16829, O16829 +16830, O16830 +16831, O16831 +16832, O16832 +16833, O16833 +16834, O16834 +16835, O16835 +16836, O16836 +16837, O16837 +16838, O16838 +16839, O16839 +16840, O16840 +16841, O16841 +16842, O16842 +16843, O16843 +16844, O16844 +16845, O16845 +16846, O16846 +16847, O16847 +16848, O16848 +16849, O16849 +16850, O16850 +16851, O16851 +16852, O16852 +16853, O16853 +16854, O16854 +16855, O16855 +16856, O16856 +16857, O16857 +16858, O16858 +16859, O16859 +16860, O16860 +16861, O16861 +16862, O16862 +16863, O16863 +16864, O16864 +16865, O16865 +16866, O16866 +16867, O16867 +16868, O16868 +16869, O16869 +16870, O16870 +16871, O16871 +16872, O16872 +16873, O16873 +16874, O16874 +16875, O16875 +16876, O16876 +16877, O16877 +16878, O16878 +16879, O16879 +16880, O16880 +16881, O16881 +16882, O16882 +16883, O16883 +16884, O16884 +16885, O16885 +16886, O16886 +16887, O16887 +16888, O16888 +16889, O16889 +16890, O16890 +16891, O16891 +16892, O16892 +16893, O16893 +16894, O16894 +16895, O16895 +16896, O16896 +16897, O16897 +16898, O16898 +16899, O16899 +16900, O16900 +16901, O16901 +16902, O16902 +16903, O16903 +16904, O16904 +16905, O16905 +16906, O16906 +16907, O16907 +16908, O16908 +16909, O16909 +16910, O16910 +16911, O16911 +16912, O16912 +16913, O16913 +16914, O16914 +16915, O16915 +16916, O16916 +16917, O16917 +16918, O16918 +16919, O16919 +16920, O16920 +16921, O16921 +16922, O16922 +16923, O16923 +16924, O16924 +16925, O16925 +16926, O16926 +16927, O16927 +16928, O16928 +16929, O16929 +16930, O16930 +16931, O16931 +16932, O16932 +16933, O16933 +16934, O16934 +16935, O16935 +16936, O16936 +16937, O16937 +16938, O16938 +16939, O16939 +16940, O16940 +16941, O16941 +16942, O16942 +16943, O16943 +16944, O16944 +16945, O16945 +16946, O16946 +16947, O16947 +16948, O16948 +16949, O16949 +16950, O16950 +16951, O16951 +16952, O16952 +16953, O16953 +16954, O16954 +16955, O16955 +16956, O16956 +16957, O16957 +16958, O16958 +16959, O16959 +16960, O16960 +16961, O16961 +16962, O16962 +16963, O16963 +16964, O16964 +16965, O16965 +16966, O16966 +16967, O16967 +16968, O16968 +16969, O16969 +16970, O16970 +16971, O16971 +16972, O16972 +16973, O16973 +16974, O16974 +16975, O16975 +16976, O16976 +16977, O16977 +16978, O16978 +16979, O16979 +16980, O16980 +16981, O16981 +16982, O16982 +16983, O16983 +16984, O16984 +16985, O16985 +16986, O16986 +16987, O16987 +16988, O16988 +16989, O16989 +16990, O16990 +16991, O16991 +16992, O16992 +16993, O16993 +16994, O16994 +16995, O16995 +16996, O16996 +16997, O16997 +16998, O16998 +16999, O16999 +17000, O17000 +17001, O17001 +17002, O17002 +17003, O17003 +17004, O17004 +17005, O17005 +17006, O17006 +17007, O17007 +17008, O17008 +17009, O17009 +17010, O17010 +17011, O17011 +17012, O17012 +17013, O17013 +17014, O17014 +17015, O17015 +17016, O17016 +17017, O17017 +17018, O17018 +17019, O17019 +17020, O17020 +17021, O17021 +17022, O17022 +17023, O17023 +17024, O17024 +17025, O17025 +17026, O17026 +17027, O17027 +17028, O17028 +17029, O17029 +17030, O17030 +17031, O17031 +17032, O17032 +17033, O17033 +17034, O17034 +17035, O17035 +17036, O17036 +17037, O17037 +17038, O17038 +17039, O17039 +17040, O17040 +17041, O17041 +17042, O17042 +17043, O17043 +17044, O17044 +17045, O17045 +17046, O17046 +17047, O17047 +17048, O17048 +17049, O17049 +17050, O17050 +17051, O17051 +17052, O17052 +17053, O17053 +17054, O17054 +17055, O17055 +17056, O17056 +17057, O17057 +17058, O17058 +17059, O17059 +17060, O17060 +17061, O17061 +17062, O17062 +17063, O17063 +17064, O17064 +17065, O17065 +17066, O17066 +17067, O17067 +17068, O17068 +17069, O17069 +17070, O17070 +17071, O17071 +17072, O17072 +17073, O17073 +17074, O17074 +17075, O17075 +17076, O17076 +17077, O17077 +17078, O17078 +17079, O17079 +17080, O17080 +17081, O17081 +17082, O17082 +17083, O17083 +17084, O17084 +17085, O17085 +17086, O17086 +17087, O17087 +17088, O17088 +17089, O17089 +17090, O17090 +17091, O17091 +17092, O17092 +17093, O17093 +17094, O17094 +17095, O17095 +17096, O17096 +17097, O17097 +17098, O17098 +17099, O17099 +17100, O17100 +17101, O17101 +17102, O17102 +17103, O17103 +17104, O17104 +17105, O17105 +17106, O17106 +17107, O17107 +17108, O17108 +17109, O17109 +17110, O17110 +17111, O17111 +17112, O17112 +17113, O17113 +17114, O17114 +17115, O17115 +17116, O17116 +17117, O17117 +17118, O17118 +17119, O17119 +17120, O17120 +17121, O17121 +17122, O17122 +17123, O17123 +17124, O17124 +17125, O17125 +17126, O17126 +17127, O17127 +17128, O17128 +17129, O17129 +17130, O17130 +17131, O17131 +17132, O17132 +17133, O17133 +17134, O17134 +17135, O17135 +17136, O17136 +17137, O17137 +17138, O17138 +17139, O17139 +17140, O17140 +17141, O17141 +17142, O17142 +17143, O17143 +17144, O17144 +17145, O17145 +17146, O17146 +17147, O17147 +17148, O17148 +17149, O17149 +17150, O17150 +17151, O17151 +17152, O17152 +17153, O17153 +17154, O17154 +17155, O17155 +17156, O17156 +17157, O17157 +17158, O17158 +17159, O17159 +17160, O17160 +17161, O17161 +17162, O17162 +17163, O17163 +17164, O17164 +17165, O17165 +17166, O17166 +17167, O17167 +17168, O17168 +17169, O17169 +17170, O17170 +17171, O17171 +17172, O17172 +17173, O17173 +17174, O17174 +17175, O17175 +17176, O17176 +17177, O17177 +17178, O17178 +17179, O17179 +17180, O17180 +17181, O17181 +17182, O17182 +17183, O17183 +17184, O17184 +17185, O17185 +17186, O17186 +17187, O17187 +17188, O17188 +17189, O17189 +17190, O17190 +17191, O17191 +17192, O17192 +17193, O17193 +17194, O17194 +17195, O17195 +17196, O17196 +17197, O17197 +17198, O17198 +17199, O17199 +17200, O17200 +17201, O17201 +17202, O17202 +17203, O17203 +17204, O17204 +17205, O17205 +17206, O17206 +17207, O17207 +17208, O17208 +17209, O17209 +17210, O17210 +17211, O17211 +17212, O17212 +17213, O17213 +17214, O17214 +17215, O17215 +17216, O17216 +17217, O17217 +17218, O17218 +17219, O17219 +17220, O17220 +17221, O17221 +17222, O17222 +17223, O17223 +17224, O17224 +17225, O17225 +17226, O17226 +17227, O17227 +17228, O17228 +17229, O17229 +17230, O17230 +17231, O17231 +17232, O17232 +17233, O17233 +17234, O17234 +17235, O17235 +17236, O17236 +17237, O17237 +17238, O17238 +17239, O17239 +17240, O17240 +17241, O17241 +17242, O17242 +17243, O17243 +17244, O17244 +17245, O17245 +17246, O17246 +17247, O17247 +17248, O17248 +17249, O17249 +17250, O17250 +17251, O17251 +17252, O17252 +17253, O17253 +17254, O17254 +17255, O17255 +17256, O17256 +17257, O17257 +17258, O17258 +17259, O17259 +17260, O17260 +17261, O17261 +17262, O17262 +17263, O17263 +17264, O17264 +17265, O17265 +17266, O17266 +17267, O17267 +17268, O17268 +17269, O17269 +17270, O17270 +17271, O17271 +17272, O17272 +17273, O17273 +17274, O17274 +17275, O17275 +17276, O17276 +17277, O17277 +17278, O17278 +17279, O17279 +17280, O17280 +17281, O17281 +17282, O17282 +17283, O17283 +17284, O17284 +17285, O17285 +17286, O17286 +17287, O17287 +17288, O17288 +17289, O17289 +17290, O17290 +17291, O17291 +17292, O17292 +17293, O17293 +17294, O17294 +17295, O17295 +17296, O17296 +17297, O17297 +17298, O17298 +17299, O17299 +17300, O17300 +17301, O17301 +17302, O17302 +17303, O17303 +17304, O17304 +17305, O17305 +17306, O17306 +17307, O17307 +17308, O17308 +17309, O17309 +17310, O17310 +17311, O17311 +17312, O17312 +17313, O17313 +17314, O17314 +17315, O17315 +17316, O17316 +17317, O17317 +17318, O17318 +17319, O17319 +17320, O17320 +17321, O17321 +17322, O17322 +17323, O17323 +17324, O17324 +17325, O17325 +17326, O17326 +17327, O17327 +17328, O17328 +17329, O17329 +17330, O17330 +17331, O17331 +17332, O17332 +17333, O17333 +17334, O17334 +17335, O17335 +17336, O17336 +17337, O17337 +17338, O17338 +17339, O17339 +17340, O17340 +17341, O17341 +17342, O17342 +17343, O17343 +17344, O17344 +17345, O17345 +17346, O17346 +17347, O17347 +17348, O17348 +17349, O17349 +17350, O17350 +17351, O17351 +17352, O17352 +17353, O17353 +17354, O17354 +17355, O17355 +17356, O17356 +17357, O17357 +17358, O17358 +17359, O17359 +17360, O17360 +17361, O17361 +17362, O17362 +17363, O17363 +17364, O17364 +17365, O17365 +17366, O17366 +17367, O17367 +17368, O17368 +17369, O17369 +17370, O17370 +17371, O17371 +17372, O17372 +17373, O17373 +17374, O17374 +17375, O17375 +17376, O17376 +17377, O17377 +17378, O17378 +17379, O17379 +17380, O17380 +17381, O17381 +17382, O17382 +17383, O17383 +17384, O17384 +17385, O17385 +17386, O17386 +17387, O17387 +17388, O17388 +17389, O17389 +17390, O17390 +17391, O17391 +17392, O17392 +17393, O17393 +17394, O17394 +17395, O17395 +17396, O17396 +17397, O17397 +17398, O17398 +17399, O17399 +17400, O17400 +17401, O17401 +17402, O17402 +17403, O17403 +17404, O17404 +17405, O17405 +17406, O17406 +17407, O17407 +17408, O17408 +17409, O17409 +17410, O17410 +17411, O17411 +17412, O17412 +17413, O17413 +17414, O17414 +17415, O17415 +17416, O17416 +17417, O17417 +17418, O17418 +17419, O17419 +17420, O17420 +17421, O17421 +17422, O17422 +17423, O17423 +17424, O17424 +17425, O17425 +17426, O17426 +17427, O17427 +17428, O17428 +17429, O17429 +17430, O17430 +17431, O17431 +17432, O17432 +17433, O17433 +17434, O17434 +17435, O17435 +17436, O17436 +17437, O17437 +17438, O17438 +17439, O17439 +17440, O17440 +17441, O17441 +17442, O17442 +17443, O17443 +17444, O17444 +17445, O17445 +17446, O17446 +17447, O17447 +17448, O17448 +17449, O17449 +17450, O17450 +17451, O17451 +17452, O17452 +17453, O17453 +17454, O17454 +17455, O17455 +17456, O17456 +17457, O17457 +17458, O17458 +17459, O17459 +17460, O17460 +17461, O17461 +17462, O17462 +17463, O17463 +17464, O17464 +17465, O17465 +17466, O17466 +17467, O17467 +17468, O17468 +17469, O17469 +17470, O17470 +17471, O17471 +17472, O17472 +17473, O17473 +17474, O17474 +17475, O17475 +17476, O17476 +17477, O17477 +17478, O17478 +17479, O17479 +17480, O17480 +17481, O17481 +17482, O17482 +17483, O17483 +17484, O17484 +17485, O17485 +17486, O17486 +17487, O17487 +17488, O17488 +17489, O17489 +17490, O17490 +17491, O17491 +17492, O17492 +17493, O17493 +17494, O17494 +17495, O17495 +17496, O17496 +17497, O17497 +17498, O17498 +17499, O17499 +17500, O17500 +17501, O17501 +17502, O17502 +17503, O17503 +17504, O17504 +17505, O17505 +17506, O17506 +17507, O17507 +17508, O17508 +17509, O17509 +17510, O17510 +17511, O17511 +17512, O17512 +17513, O17513 +17514, O17514 +17515, O17515 +17516, O17516 +17517, O17517 +17518, O17518 +17519, O17519 +17520, O17520 +17521, O17521 +17522, O17522 +17523, O17523 +17524, O17524 +17525, O17525 +17526, O17526 +17527, O17527 +17528, O17528 +17529, O17529 +17530, O17530 +17531, O17531 +17532, O17532 +17533, O17533 +17534, O17534 +17535, O17535 +17536, O17536 +17537, O17537 +17538, O17538 +17539, O17539 +17540, O17540 +17541, O17541 +17542, O17542 +17543, O17543 +17544, O17544 +17545, O17545 +17546, O17546 +17547, O17547 +17548, O17548 +17549, O17549 +17550, O17550 +17551, O17551 +17552, O17552 +17553, O17553 +17554, O17554 +17555, O17555 +17556, O17556 +17557, O17557 +17558, O17558 +17559, O17559 +17560, O17560 +17561, O17561 +17562, O17562 +17563, O17563 +17564, O17564 +17565, O17565 +17566, O17566 +17567, O17567 +17568, O17568 +17569, O17569 +17570, O17570 +17571, O17571 +17572, O17572 +17573, O17573 +17574, O17574 +17575, O17575 +17576, O17576 +17577, O17577 +17578, O17578 +17579, O17579 +17580, O17580 +17581, O17581 +17582, O17582 +17583, O17583 +17584, O17584 +17585, O17585 +17586, O17586 +17587, O17587 +17588, O17588 +17589, O17589 +17590, O17590 +17591, O17591 +17592, O17592 +17593, O17593 +17594, O17594 +17595, O17595 +17596, O17596 +17597, O17597 +17598, O17598 +17599, O17599 +17600, O17600 +17601, O17601 +17602, O17602 +17603, O17603 +17604, O17604 +17605, O17605 +17606, O17606 +17607, O17607 +17608, O17608 +17609, O17609 +17610, O17610 +17611, O17611 +17612, O17612 +17613, O17613 +17614, O17614 +17615, O17615 +17616, O17616 +17617, O17617 +17618, O17618 +17619, O17619 +17620, O17620 +17621, O17621 +17622, O17622 +17623, O17623 +17624, O17624 +17625, O17625 +17626, O17626 +17627, O17627 +17628, O17628 +17629, O17629 +17630, O17630 +17631, O17631 +17632, O17632 +17633, O17633 +17634, O17634 +17635, O17635 +17636, O17636 +17637, O17637 +17638, O17638 +17639, O17639 +17640, O17640 +17641, O17641 +17642, O17642 +17643, O17643 +17644, O17644 +17645, O17645 +17646, O17646 +17647, O17647 +17648, O17648 +17649, O17649 +17650, O17650 +17651, O17651 +17652, O17652 +17653, O17653 +17654, O17654 +17655, O17655 +17656, O17656 +17657, O17657 +17658, O17658 +17659, O17659 +17660, O17660 +17661, O17661 +17662, O17662 +17663, O17663 +17664, O17664 +17665, O17665 +17666, O17666 +17667, O17667 +17668, O17668 +17669, O17669 +17670, O17670 +17671, O17671 +17672, O17672 +17673, O17673 +17674, O17674 +17675, O17675 +17676, O17676 +17677, O17677 +17678, O17678 +17679, O17679 +17680, O17680 +17681, O17681 +17682, O17682 +17683, O17683 +17684, O17684 +17685, O17685 +17686, O17686 +17687, O17687 +17688, O17688 +17689, O17689 +17690, O17690 +17691, O17691 +17692, O17692 +17693, O17693 +17694, O17694 +17695, O17695 +17696, O17696 +17697, O17697 +17698, O17698 +17699, O17699 +17700, O17700 +17701, O17701 +17702, O17702 +17703, O17703 +17704, O17704 +17705, O17705 +17706, O17706 +17707, O17707 +17708, O17708 +17709, O17709 +17710, O17710 +17711, O17711 +17712, O17712 +17713, O17713 +17714, O17714 +17715, O17715 +17716, O17716 +17717, O17717 +17718, O17718 +17719, O17719 +17720, O17720 +17721, O17721 +17722, O17722 +17723, O17723 +17724, O17724 +17725, O17725 +17726, O17726 +17727, O17727 +17728, O17728 +17729, O17729 +17730, O17730 +17731, O17731 +17732, O17732 +17733, O17733 +17734, O17734 +17735, O17735 +17736, O17736 +17737, O17737 +17738, O17738 +17739, O17739 +17740, O17740 +17741, O17741 +17742, O17742 +17743, O17743 +17744, O17744 +17745, O17745 +17746, O17746 +17747, O17747 +17748, O17748 +17749, O17749 +17750, O17750 +17751, O17751 +17752, O17752 +17753, O17753 +17754, O17754 +17755, O17755 +17756, O17756 +17757, O17757 +17758, O17758 +17759, O17759 +17760, O17760 +17761, O17761 +17762, O17762 +17763, O17763 +17764, O17764 +17765, O17765 +17766, O17766 +17767, O17767 +17768, O17768 +17769, O17769 +17770, O17770 +17771, O17771 +17772, O17772 +17773, O17773 +17774, O17774 +17775, O17775 +17776, O17776 +17777, O17777 +17778, O17778 +17779, O17779 +17780, O17780 +17781, O17781 +17782, O17782 +17783, O17783 +17784, O17784 +17785, O17785 +17786, O17786 +17787, O17787 +17788, O17788 +17789, O17789 +17790, O17790 +17791, O17791 +17792, O17792 +17793, O17793 +17794, O17794 +17795, O17795 +17796, O17796 +17797, O17797 +17798, O17798 +17799, O17799 +17800, O17800 +17801, O17801 +17802, O17802 +17803, O17803 +17804, O17804 +17805, O17805 +17806, O17806 +17807, O17807 +17808, O17808 +17809, O17809 +17810, O17810 +17811, O17811 +17812, O17812 +17813, O17813 +17814, O17814 +17815, O17815 +17816, O17816 +17817, O17817 +17818, O17818 +17819, O17819 +17820, O17820 +17821, O17821 +17822, O17822 +17823, O17823 +17824, O17824 +17825, O17825 +17826, O17826 +17827, O17827 +17828, O17828 +17829, O17829 +17830, O17830 +17831, O17831 +17832, O17832 +17833, O17833 +17834, O17834 +17835, O17835 +17836, O17836 +17837, O17837 +17838, O17838 +17839, O17839 +17840, O17840 +17841, O17841 +17842, O17842 +17843, O17843 +17844, O17844 +17845, O17845 +17846, O17846 +17847, O17847 +17848, O17848 +17849, O17849 +17850, O17850 +17851, O17851 +17852, O17852 +17853, O17853 +17854, O17854 +17855, O17855 +17856, O17856 +17857, O17857 +17858, O17858 +17859, O17859 +17860, O17860 +17861, O17861 +17862, O17862 +17863, O17863 +17864, O17864 +17865, O17865 +17866, O17866 +17867, O17867 +17868, O17868 +17869, O17869 +17870, O17870 +17871, O17871 +17872, O17872 +17873, O17873 +17874, O17874 +17875, O17875 +17876, O17876 +17877, O17877 +17878, O17878 +17879, O17879 +17880, O17880 +17881, O17881 +17882, O17882 +17883, O17883 +17884, O17884 +17885, O17885 +17886, O17886 +17887, O17887 +17888, O17888 +17889, O17889 +17890, O17890 +17891, O17891 +17892, O17892 +17893, O17893 +17894, O17894 +17895, O17895 +17896, O17896 +17897, O17897 +17898, O17898 +17899, O17899 +17900, O17900 +17901, O17901 +17902, O17902 +17903, O17903 +17904, O17904 +17905, O17905 +17906, O17906 +17907, O17907 +17908, O17908 +17909, O17909 +17910, O17910 +17911, O17911 +17912, O17912 +17913, O17913 +17914, O17914 +17915, O17915 +17916, O17916 +17917, O17917 +17918, O17918 +17919, O17919 +17920, O17920 +17921, O17921 +17922, O17922 +17923, O17923 +17924, O17924 +17925, O17925 +17926, O17926 +17927, O17927 +17928, O17928 +17929, O17929 +17930, O17930 +17931, O17931 +17932, O17932 +17933, O17933 +17934, O17934 +17935, O17935 +17936, O17936 +17937, O17937 +17938, O17938 +17939, O17939 +17940, O17940 +17941, O17941 +17942, O17942 +17943, O17943 +17944, O17944 +17945, O17945 +17946, O17946 +17947, O17947 +17948, O17948 +17949, O17949 +17950, O17950 +17951, O17951 +17952, O17952 +17953, O17953 +17954, O17954 +17955, O17955 +17956, O17956 +17957, O17957 +17958, O17958 +17959, O17959 +17960, O17960 +17961, O17961 +17962, O17962 +17963, O17963 +17964, O17964 +17965, O17965 +17966, O17966 +17967, O17967 +17968, O17968 +17969, O17969 +17970, O17970 +17971, O17971 +17972, O17972 +17973, O17973 +17974, O17974 +17975, O17975 +17976, O17976 +17977, O17977 +17978, O17978 +17979, O17979 +17980, O17980 +17981, O17981 +17982, O17982 +17983, O17983 +17984, O17984 +17985, O17985 +17986, O17986 +17987, O17987 +17988, O17988 +17989, O17989 +17990, O17990 +17991, O17991 +17992, O17992 +17993, O17993 +17994, O17994 +17995, O17995 +17996, O17996 +17997, O17997 +17998, O17998 +17999, O17999 +18000, O18000 +18001, O18001 +18002, O18002 +18003, O18003 +18004, O18004 +18005, O18005 +18006, O18006 +18007, O18007 +18008, O18008 +18009, O18009 +18010, O18010 +18011, O18011 +18012, O18012 +18013, O18013 +18014, O18014 +18015, O18015 +18016, O18016 +18017, O18017 +18018, O18018 +18019, O18019 +18020, O18020 +18021, O18021 +18022, O18022 +18023, O18023 +18024, O18024 +18025, O18025 +18026, O18026 +18027, O18027 +18028, O18028 +18029, O18029 +18030, O18030 +18031, O18031 +18032, O18032 +18033, O18033 +18034, O18034 +18035, O18035 +18036, O18036 +18037, O18037 +18038, O18038 +18039, O18039 +18040, O18040 +18041, O18041 +18042, O18042 +18043, O18043 +18044, O18044 +18045, O18045 +18046, O18046 +18047, O18047 +18048, O18048 +18049, O18049 +18050, O18050 +18051, O18051 +18052, O18052 +18053, O18053 +18054, O18054 +18055, O18055 +18056, O18056 +18057, O18057 +18058, O18058 +18059, O18059 +18060, O18060 +18061, O18061 +18062, O18062 +18063, O18063 +18064, O18064 +18065, O18065 +18066, O18066 +18067, O18067 +18068, O18068 +18069, O18069 +18070, O18070 +18071, O18071 +18072, O18072 +18073, O18073 +18074, O18074 +18075, O18075 +18076, O18076 +18077, O18077 +18078, O18078 +18079, O18079 +18080, O18080 +18081, O18081 +18082, O18082 +18083, O18083 +18084, O18084 +18085, O18085 +18086, O18086 +18087, O18087 +18088, O18088 +18089, O18089 +18090, O18090 +18091, O18091 +18092, O18092 +18093, O18093 +18094, O18094 +18095, O18095 +18096, O18096 +18097, O18097 +18098, O18098 +18099, O18099 +18100, O18100 +18101, O18101 +18102, O18102 +18103, O18103 +18104, O18104 +18105, O18105 +18106, O18106 +18107, O18107 +18108, O18108 +18109, O18109 +18110, O18110 +18111, O18111 +18112, O18112 +18113, O18113 +18114, O18114 +18115, O18115 +18116, O18116 +18117, O18117 +18118, O18118 +18119, O18119 +18120, O18120 +18121, O18121 +18122, O18122 +18123, O18123 +18124, O18124 +18125, O18125 +18126, O18126 +18127, O18127 +18128, O18128 +18129, O18129 +18130, O18130 +18131, O18131 +18132, O18132 +18133, O18133 +18134, O18134 +18135, O18135 +18136, O18136 +18137, O18137 +18138, O18138 +18139, O18139 +18140, O18140 +18141, O18141 +18142, O18142 +18143, O18143 +18144, O18144 +18145, O18145 +18146, O18146 +18147, O18147 +18148, O18148 +18149, O18149 +18150, O18150 +18151, O18151 +18152, O18152 +18153, O18153 +18154, O18154 +18155, O18155 +18156, O18156 +18157, O18157 +18158, O18158 +18159, O18159 +18160, O18160 +18161, O18161 +18162, O18162 +18163, O18163 +18164, O18164 +18165, O18165 +18166, O18166 +18167, O18167 +18168, O18168 +18169, O18169 +18170, O18170 +18171, O18171 +18172, O18172 +18173, O18173 +18174, O18174 +18175, O18175 +18176, O18176 +18177, O18177 +18178, O18178 +18179, O18179 +18180, O18180 +18181, O18181 +18182, O18182 +18183, O18183 +18184, O18184 +18185, O18185 +18186, O18186 +18187, O18187 +18188, O18188 +18189, O18189 +18190, O18190 +18191, O18191 +18192, O18192 +18193, O18193 +18194, O18194 +18195, O18195 +18196, O18196 +18197, O18197 +18198, O18198 +18199, O18199 +18200, O18200 +18201, O18201 +18202, O18202 +18203, O18203 +18204, O18204 +18205, O18205 +18206, O18206 +18207, O18207 +18208, O18208 +18209, O18209 +18210, O18210 +18211, O18211 +18212, O18212 +18213, O18213 +18214, O18214 +18215, O18215 +18216, O18216 +18217, O18217 +18218, O18218 +18219, O18219 +18220, O18220 +18221, O18221 +18222, O18222 +18223, O18223 +18224, O18224 +18225, O18225 +18226, O18226 +18227, O18227 +18228, O18228 +18229, O18229 +18230, O18230 +18231, O18231 +18232, O18232 +18233, O18233 +18234, O18234 +18235, O18235 +18236, O18236 +18237, O18237 +18238, O18238 +18239, O18239 +18240, O18240 +18241, O18241 +18242, O18242 +18243, O18243 +18244, O18244 +18245, O18245 +18246, O18246 +18247, O18247 +18248, O18248 +18249, O18249 +18250, O18250 +18251, O18251 +18252, O18252 +18253, O18253 +18254, O18254 +18255, O18255 +18256, O18256 +18257, O18257 +18258, O18258 +18259, O18259 +18260, O18260 +18261, O18261 +18262, O18262 +18263, O18263 +18264, O18264 +18265, O18265 +18266, O18266 +18267, O18267 +18268, O18268 +18269, O18269 +18270, O18270 +18271, O18271 +18272, O18272 +18273, O18273 +18274, O18274 +18275, O18275 +18276, O18276 +18277, O18277 +18278, O18278 +18279, O18279 +18280, O18280 +18281, O18281 +18282, O18282 +18283, O18283 +18284, O18284 +18285, O18285 +18286, O18286 +18287, O18287 +18288, O18288 +18289, O18289 +18290, O18290 +18291, O18291 +18292, O18292 +18293, O18293 +18294, O18294 +18295, O18295 +18296, O18296 +18297, O18297 +18298, O18298 +18299, O18299 +18300, O18300 +18301, O18301 +18302, O18302 +18303, O18303 +18304, O18304 +18305, O18305 +18306, O18306 +18307, O18307 +18308, O18308 +18309, O18309 +18310, O18310 +18311, O18311 +18312, O18312 +18313, O18313 +18314, O18314 +18315, O18315 +18316, O18316 +18317, O18317 +18318, O18318 +18319, O18319 +18320, O18320 +18321, O18321 +18322, O18322 +18323, O18323 +18324, O18324 +18325, O18325 +18326, O18326 +18327, O18327 +18328, O18328 +18329, O18329 +18330, O18330 +18331, O18331 +18332, O18332 +18333, O18333 +18334, O18334 +18335, O18335 +18336, O18336 +18337, O18337 +18338, O18338 +18339, O18339 +18340, O18340 +18341, O18341 +18342, O18342 +18343, O18343 +18344, O18344 +18345, O18345 +18346, O18346 +18347, O18347 +18348, O18348 +18349, O18349 +18350, O18350 +18351, O18351 +18352, O18352 +18353, O18353 +18354, O18354 +18355, O18355 +18356, O18356 +18357, O18357 +18358, O18358 +18359, O18359 +18360, O18360 +18361, O18361 +18362, O18362 +18363, O18363 +18364, O18364 +18365, O18365 +18366, O18366 +18367, O18367 +18368, O18368 +18369, O18369 +18370, O18370 +18371, O18371 +18372, O18372 +18373, O18373 +18374, O18374 +18375, O18375 +18376, O18376 +18377, O18377 +18378, O18378 +18379, O18379 +18380, O18380 +18381, O18381 +18382, O18382 +18383, O18383 +18384, O18384 +18385, O18385 +18386, O18386 +18387, O18387 +18388, O18388 +18389, O18389 +18390, O18390 +18391, O18391 +18392, O18392 +18393, O18393 +18394, O18394 +18395, O18395 +18396, O18396 +18397, O18397 +18398, O18398 +18399, O18399 +18400, O18400 +18401, O18401 +18402, O18402 +18403, O18403 +18404, O18404 +18405, O18405 +18406, O18406 +18407, O18407 +18408, O18408 +18409, O18409 +18410, O18410 +18411, O18411 +18412, O18412 +18413, O18413 +18414, O18414 +18415, O18415 +18416, O18416 +18417, O18417 +18418, O18418 +18419, O18419 +18420, O18420 +18421, O18421 +18422, O18422 +18423, O18423 +18424, O18424 +18425, O18425 +18426, O18426 +18427, O18427 +18428, O18428 +18429, O18429 +18430, O18430 +18431, O18431 +18432, O18432 +18433, O18433 +18434, O18434 +18435, O18435 +18436, O18436 +18437, O18437 +18438, O18438 +18439, O18439 +18440, O18440 +18441, O18441 +18442, O18442 +18443, O18443 +18444, O18444 +18445, O18445 +18446, O18446 +18447, O18447 +18448, O18448 +18449, O18449 +18450, O18450 +18451, O18451 +18452, O18452 +18453, O18453 +18454, O18454 +18455, O18455 +18456, O18456 +18457, O18457 +18458, O18458 +18459, O18459 +18460, O18460 +18461, O18461 +18462, O18462 +18463, O18463 +18464, O18464 +18465, O18465 +18466, O18466 +18467, O18467 +18468, O18468 +18469, O18469 +18470, O18470 +18471, O18471 +18472, O18472 +18473, O18473 +18474, O18474 +18475, O18475 +18476, O18476 +18477, O18477 +18478, O18478 +18479, O18479 +18480, O18480 +18481, O18481 +18482, O18482 +18483, O18483 +18484, O18484 +18485, O18485 +18486, O18486 +18487, O18487 +18488, O18488 +18489, O18489 +18490, O18490 +18491, O18491 +18492, O18492 +18493, O18493 +18494, O18494 +18495, O18495 +18496, O18496 +18497, O18497 +18498, O18498 +18499, O18499 +18500, O18500 +18501, O18501 +18502, O18502 +18503, O18503 +18504, O18504 +18505, O18505 +18506, O18506 +18507, O18507 +18508, O18508 +18509, O18509 +18510, O18510 +18511, O18511 +18512, O18512 +18513, O18513 +18514, O18514 +18515, O18515 +18516, O18516 +18517, O18517 +18518, O18518 +18519, O18519 +18520, O18520 +18521, O18521 +18522, O18522 +18523, O18523 +18524, O18524 +18525, O18525 +18526, O18526 +18527, O18527 +18528, O18528 +18529, O18529 +18530, O18530 +18531, O18531 +18532, O18532 +18533, O18533 +18534, O18534 +18535, O18535 +18536, O18536 +18537, O18537 +18538, O18538 +18539, O18539 +18540, O18540 +18541, O18541 +18542, O18542 +18543, O18543 +18544, O18544 +18545, O18545 +18546, O18546 +18547, O18547 +18548, O18548 +18549, O18549 +18550, O18550 +18551, O18551 +18552, O18552 +18553, O18553 +18554, O18554 +18555, O18555 +18556, O18556 +18557, O18557 +18558, O18558 +18559, O18559 +18560, O18560 +18561, O18561 +18562, O18562 +18563, O18563 +18564, O18564 +18565, O18565 +18566, O18566 +18567, O18567 +18568, O18568 +18569, O18569 +18570, O18570 +18571, O18571 +18572, O18572 +18573, O18573 +18574, O18574 +18575, O18575 +18576, O18576 +18577, O18577 +18578, O18578 +18579, O18579 +18580, O18580 +18581, O18581 +18582, O18582 +18583, O18583 +18584, O18584 +18585, O18585 +18586, O18586 +18587, O18587 +18588, O18588 +18589, O18589 +18590, O18590 +18591, O18591 +18592, O18592 +18593, O18593 +18594, O18594 +18595, O18595 +18596, O18596 +18597, O18597 +18598, O18598 +18599, O18599 +18600, O18600 +18601, O18601 +18602, O18602 +18603, O18603 +18604, O18604 +18605, O18605 +18606, O18606 +18607, O18607 +18608, O18608 +18609, O18609 +18610, O18610 +18611, O18611 +18612, O18612 +18613, O18613 +18614, O18614 +18615, O18615 +18616, O18616 +18617, O18617 +18618, O18618 +18619, O18619 +18620, O18620 +18621, O18621 +18622, O18622 +18623, O18623 +18624, O18624 +18625, O18625 +18626, O18626 +18627, O18627 +18628, O18628 +18629, O18629 +18630, O18630 +18631, O18631 +18632, O18632 +18633, O18633 +18634, O18634 +18635, O18635 +18636, O18636 +18637, O18637 +18638, O18638 +18639, O18639 +18640, O18640 +18641, O18641 +18642, O18642 +18643, O18643 +18644, O18644 +18645, O18645 +18646, O18646 +18647, O18647 +18648, O18648 +18649, O18649 +18650, O18650 +18651, O18651 +18652, O18652 +18653, O18653 +18654, O18654 +18655, O18655 +18656, O18656 +18657, O18657 +18658, O18658 +18659, O18659 +18660, O18660 +18661, O18661 +18662, O18662 +18663, O18663 +18664, O18664 +18665, O18665 +18666, O18666 +18667, O18667 +18668, O18668 +18669, O18669 +18670, O18670 +18671, O18671 +18672, O18672 +18673, O18673 +18674, O18674 +18675, O18675 +18676, O18676 +18677, O18677 +18678, O18678 +18679, O18679 +18680, O18680 +18681, O18681 +18682, O18682 +18683, O18683 +18684, O18684 +18685, O18685 +18686, O18686 +18687, O18687 +18688, O18688 +18689, O18689 +18690, O18690 +18691, O18691 +18692, O18692 +18693, O18693 +18694, O18694 +18695, O18695 +18696, O18696 +18697, O18697 +18698, O18698 +18699, O18699 +18700, O18700 +18701, O18701 +18702, O18702 +18703, O18703 +18704, O18704 +18705, O18705 +18706, O18706 +18707, O18707 +18708, O18708 +18709, O18709 +18710, O18710 +18711, O18711 +18712, O18712 +18713, O18713 +18714, O18714 +18715, O18715 +18716, O18716 +18717, O18717 +18718, O18718 +18719, O18719 +18720, O18720 +18721, O18721 +18722, O18722 +18723, O18723 +18724, O18724 +18725, O18725 +18726, O18726 +18727, O18727 +18728, O18728 +18729, O18729 +18730, O18730 +18731, O18731 +18732, O18732 +18733, O18733 +18734, O18734 +18735, O18735 +18736, O18736 +18737, O18737 +18738, O18738 +18739, O18739 +18740, O18740 +18741, O18741 +18742, O18742 +18743, O18743 +18744, O18744 +18745, O18745 +18746, O18746 +18747, O18747 +18748, O18748 +18749, O18749 +18750, O18750 +18751, O18751 +18752, O18752 +18753, O18753 +18754, O18754 +18755, O18755 +18756, O18756 +18757, O18757 +18758, O18758 +18759, O18759 +18760, O18760 +18761, O18761 +18762, O18762 +18763, O18763 +18764, O18764 +18765, O18765 +18766, O18766 +18767, O18767 +18768, O18768 +18769, O18769 +18770, O18770 +18771, O18771 +18772, O18772 +18773, O18773 +18774, O18774 +18775, O18775 +18776, O18776 +18777, O18777 +18778, O18778 +18779, O18779 +18780, O18780 +18781, O18781 +18782, O18782 +18783, O18783 +18784, O18784 +18785, O18785 +18786, O18786 +18787, O18787 +18788, O18788 +18789, O18789 +18790, O18790 +18791, O18791 +18792, O18792 +18793, O18793 +18794, O18794 +18795, O18795 +18796, O18796 +18797, O18797 +18798, O18798 +18799, O18799 +18800, O18800 +18801, O18801 +18802, O18802 +18803, O18803 +18804, O18804 +18805, O18805 +18806, O18806 +18807, O18807 +18808, O18808 +18809, O18809 +18810, O18810 +18811, O18811 +18812, O18812 +18813, O18813 +18814, O18814 +18815, O18815 +18816, O18816 +18817, O18817 +18818, O18818 +18819, O18819 +18820, O18820 +18821, O18821 +18822, O18822 +18823, O18823 +18824, O18824 +18825, O18825 +18826, O18826 +18827, O18827 +18828, O18828 +18829, O18829 +18830, O18830 +18831, O18831 +18832, O18832 +18833, O18833 +18834, O18834 +18835, O18835 +18836, O18836 +18837, O18837 +18838, O18838 +18839, O18839 +18840, O18840 +18841, O18841 +18842, O18842 +18843, O18843 +18844, O18844 +18845, O18845 +18846, O18846 +18847, O18847 +18848, O18848 +18849, O18849 +18850, O18850 +18851, O18851 +18852, O18852 +18853, O18853 +18854, O18854 +18855, O18855 +18856, O18856 +18857, O18857 +18858, O18858 +18859, O18859 +18860, O18860 +18861, O18861 +18862, O18862 +18863, O18863 +18864, O18864 +18865, O18865 +18866, O18866 +18867, O18867 +18868, O18868 +18869, O18869 +18870, O18870 +18871, O18871 +18872, O18872 +18873, O18873 +18874, O18874 +18875, O18875 +18876, O18876 +18877, O18877 +18878, O18878 +18879, O18879 +18880, O18880 +18881, O18881 +18882, O18882 +18883, O18883 +18884, O18884 +18885, O18885 +18886, O18886 +18887, O18887 +18888, O18888 +18889, O18889 +18890, O18890 +18891, O18891 +18892, O18892 +18893, O18893 +18894, O18894 +18895, O18895 +18896, O18896 +18897, O18897 +18898, O18898 +18899, O18899 +18900, O18900 +18901, O18901 +18902, O18902 +18903, O18903 +18904, O18904 +18905, O18905 +18906, O18906 +18907, O18907 +18908, O18908 +18909, O18909 +18910, O18910 +18911, O18911 +18912, O18912 +18913, O18913 +18914, O18914 +18915, O18915 +18916, O18916 +18917, O18917 +18918, O18918 +18919, O18919 +18920, O18920 +18921, O18921 +18922, O18922 +18923, O18923 +18924, O18924 +18925, O18925 +18926, O18926 +18927, O18927 +18928, O18928 +18929, O18929 +18930, O18930 +18931, O18931 +18932, O18932 +18933, O18933 +18934, O18934 +18935, O18935 +18936, O18936 +18937, O18937 +18938, O18938 +18939, O18939 +18940, O18940 +18941, O18941 +18942, O18942 +18943, O18943 +18944, O18944 +18945, O18945 +18946, O18946 +18947, O18947 +18948, O18948 +18949, O18949 +18950, O18950 +18951, O18951 +18952, O18952 +18953, O18953 +18954, O18954 +18955, O18955 +18956, O18956 +18957, O18957 +18958, O18958 +18959, O18959 +18960, O18960 +18961, O18961 +18962, O18962 +18963, O18963 +18964, O18964 +18965, O18965 +18966, O18966 +18967, O18967 +18968, O18968 +18969, O18969 +18970, O18970 +18971, O18971 +18972, O18972 +18973, O18973 +18974, O18974 +18975, O18975 +18976, O18976 +18977, O18977 +18978, O18978 +18979, O18979 +18980, O18980 +18981, O18981 +18982, O18982 +18983, O18983 +18984, O18984 +18985, O18985 +18986, O18986 +18987, O18987 +18988, O18988 +18989, O18989 +18990, O18990 +18991, O18991 +18992, O18992 +18993, O18993 +18994, O18994 +18995, O18995 +18996, O18996 +18997, O18997 +18998, O18998 +18999, O18999 +19000, O19000 +19001, O19001 +19002, O19002 +19003, O19003 +19004, O19004 +19005, O19005 +19006, O19006 +19007, O19007 +19008, O19008 +19009, O19009 +19010, O19010 +19011, O19011 +19012, O19012 +19013, O19013 +19014, O19014 +19015, O19015 +19016, O19016 +19017, O19017 +19018, O19018 +19019, O19019 +19020, O19020 +19021, O19021 +19022, O19022 +19023, O19023 +19024, O19024 +19025, O19025 +19026, O19026 +19027, O19027 +19028, O19028 +19029, O19029 +19030, O19030 +19031, O19031 +19032, O19032 +19033, O19033 +19034, O19034 +19035, O19035 +19036, O19036 +19037, O19037 +19038, O19038 +19039, O19039 +19040, O19040 +19041, O19041 +19042, O19042 +19043, O19043 +19044, O19044 +19045, O19045 +19046, O19046 +19047, O19047 +19048, O19048 +19049, O19049 +19050, O19050 +19051, O19051 +19052, O19052 +19053, O19053 +19054, O19054 +19055, O19055 +19056, O19056 +19057, O19057 +19058, O19058 +19059, O19059 +19060, O19060 +19061, O19061 +19062, O19062 +19063, O19063 +19064, O19064 +19065, O19065 +19066, O19066 +19067, O19067 +19068, O19068 +19069, O19069 +19070, O19070 +19071, O19071 +19072, O19072 +19073, O19073 +19074, O19074 +19075, O19075 +19076, O19076 +19077, O19077 +19078, O19078 +19079, O19079 +19080, O19080 +19081, O19081 +19082, O19082 +19083, O19083 +19084, O19084 +19085, O19085 +19086, O19086 +19087, O19087 +19088, O19088 +19089, O19089 +19090, O19090 +19091, O19091 +19092, O19092 +19093, O19093 +19094, O19094 +19095, O19095 +19096, O19096 +19097, O19097 +19098, O19098 +19099, O19099 +19100, O19100 +19101, O19101 +19102, O19102 +19103, O19103 +19104, O19104 +19105, O19105 +19106, O19106 +19107, O19107 +19108, O19108 +19109, O19109 +19110, O19110 +19111, O19111 +19112, O19112 +19113, O19113 +19114, O19114 +19115, O19115 +19116, O19116 +19117, O19117 +19118, O19118 +19119, O19119 +19120, O19120 +19121, O19121 +19122, O19122 +19123, O19123 +19124, O19124 +19125, O19125 +19126, O19126 +19127, O19127 +19128, O19128 +19129, O19129 +19130, O19130 +19131, O19131 +19132, O19132 +19133, O19133 +19134, O19134 +19135, O19135 +19136, O19136 +19137, O19137 +19138, O19138 +19139, O19139 +19140, O19140 +19141, O19141 +19142, O19142 +19143, O19143 +19144, O19144 +19145, O19145 +19146, O19146 +19147, O19147 +19148, O19148 +19149, O19149 +19150, O19150 +19151, O19151 +19152, O19152 +19153, O19153 +19154, O19154 +19155, O19155 +19156, O19156 +19157, O19157 +19158, O19158 +19159, O19159 +19160, O19160 +19161, O19161 +19162, O19162 +19163, O19163 +19164, O19164 +19165, O19165 +19166, O19166 +19167, O19167 +19168, O19168 +19169, O19169 +19170, O19170 +19171, O19171 +19172, O19172 +19173, O19173 +19174, O19174 +19175, O19175 +19176, O19176 +19177, O19177 +19178, O19178 +19179, O19179 +19180, O19180 +19181, O19181 +19182, O19182 +19183, O19183 +19184, O19184 +19185, O19185 +19186, O19186 +19187, O19187 +19188, O19188 +19189, O19189 +19190, O19190 +19191, O19191 +19192, O19192 +19193, O19193 +19194, O19194 +19195, O19195 +19196, O19196 +19197, O19197 +19198, O19198 +19199, O19199 +19200, O19200 +19201, O19201 +19202, O19202 +19203, O19203 +19204, O19204 +19205, O19205 +19206, O19206 +19207, O19207 +19208, O19208 +19209, O19209 +19210, O19210 +19211, O19211 +19212, O19212 +19213, O19213 +19214, O19214 +19215, O19215 +19216, O19216 +19217, O19217 +19218, O19218 +19219, O19219 +19220, O19220 +19221, O19221 +19222, O19222 +19223, O19223 +19224, O19224 +19225, O19225 +19226, O19226 +19227, O19227 +19228, O19228 +19229, O19229 +19230, O19230 +19231, O19231 +19232, O19232 +19233, O19233 +19234, O19234 +19235, O19235 +19236, O19236 +19237, O19237 +19238, O19238 +19239, O19239 +19240, O19240 +19241, O19241 +19242, O19242 +19243, O19243 +19244, O19244 +19245, O19245 +19246, O19246 +19247, O19247 +19248, O19248 +19249, O19249 +19250, O19250 +19251, O19251 +19252, O19252 +19253, O19253 +19254, O19254 +19255, O19255 +19256, O19256 +19257, O19257 +19258, O19258 +19259, O19259 +19260, O19260 +19261, O19261 +19262, O19262 +19263, O19263 +19264, O19264 +19265, O19265 +19266, O19266 +19267, O19267 +19268, O19268 +19269, O19269 +19270, O19270 +19271, O19271 +19272, O19272 +19273, O19273 +19274, O19274 +19275, O19275 +19276, O19276 +19277, O19277 +19278, O19278 +19279, O19279 +19280, O19280 +19281, O19281 +19282, O19282 +19283, O19283 +19284, O19284 +19285, O19285 +19286, O19286 +19287, O19287 +19288, O19288 +19289, O19289 +19290, O19290 +19291, O19291 +19292, O19292 +19293, O19293 +19294, O19294 +19295, O19295 +19296, O19296 +19297, O19297 +19298, O19298 +19299, O19299 +19300, O19300 +19301, O19301 +19302, O19302 +19303, O19303 +19304, O19304 +19305, O19305 +19306, O19306 +19307, O19307 +19308, O19308 +19309, O19309 +19310, O19310 +19311, O19311 +19312, O19312 +19313, O19313 +19314, O19314 +19315, O19315 +19316, O19316 +19317, O19317 +19318, O19318 +19319, O19319 +19320, O19320 +19321, O19321 +19322, O19322 +19323, O19323 +19324, O19324 +19325, O19325 +19326, O19326 +19327, O19327 +19328, O19328 +19329, O19329 +19330, O19330 +19331, O19331 +19332, O19332 +19333, O19333 +19334, O19334 +19335, O19335 +19336, O19336 +19337, O19337 +19338, O19338 +19339, O19339 +19340, O19340 +19341, O19341 +19342, O19342 +19343, O19343 +19344, O19344 +19345, O19345 +19346, O19346 +19347, O19347 +19348, O19348 +19349, O19349 +19350, O19350 +19351, O19351 +19352, O19352 +19353, O19353 +19354, O19354 +19355, O19355 +19356, O19356 +19357, O19357 +19358, O19358 +19359, O19359 +19360, O19360 +19361, O19361 +19362, O19362 +19363, O19363 +19364, O19364 +19365, O19365 +19366, O19366 +19367, O19367 +19368, O19368 +19369, O19369 +19370, O19370 +19371, O19371 +19372, O19372 +19373, O19373 +19374, O19374 +19375, O19375 +19376, O19376 +19377, O19377 +19378, O19378 +19379, O19379 +19380, O19380 +19381, O19381 +19382, O19382 +19383, O19383 +19384, O19384 +19385, O19385 +19386, O19386 +19387, O19387 +19388, O19388 +19389, O19389 +19390, O19390 +19391, O19391 +19392, O19392 +19393, O19393 +19394, O19394 +19395, O19395 +19396, O19396 +19397, O19397 +19398, O19398 +19399, O19399 +19400, O19400 +19401, O19401 +19402, O19402 +19403, O19403 +19404, O19404 +19405, O19405 +19406, O19406 +19407, O19407 +19408, O19408 +19409, O19409 +19410, O19410 +19411, O19411 +19412, O19412 +19413, O19413 +19414, O19414 +19415, O19415 +19416, O19416 +19417, O19417 +19418, O19418 +19419, O19419 +19420, O19420 +19421, O19421 +19422, O19422 +19423, O19423 +19424, O19424 +19425, O19425 +19426, O19426 +19427, O19427 +19428, O19428 +19429, O19429 +19430, O19430 +19431, O19431 +19432, O19432 +19433, O19433 +19434, O19434 +19435, O19435 +19436, O19436 +19437, O19437 +19438, O19438 +19439, O19439 +19440, O19440 +19441, O19441 +19442, O19442 +19443, O19443 +19444, O19444 +19445, O19445 +19446, O19446 +19447, O19447 +19448, O19448 +19449, O19449 +19450, O19450 +19451, O19451 +19452, O19452 +19453, O19453 +19454, O19454 +19455, O19455 +19456, O19456 +19457, O19457 +19458, O19458 +19459, O19459 +19460, O19460 +19461, O19461 +19462, O19462 +19463, O19463 +19464, O19464 +19465, O19465 +19466, O19466 +19467, O19467 +19468, O19468 +19469, O19469 +19470, O19470 +19471, O19471 +19472, O19472 +19473, O19473 +19474, O19474 +19475, O19475 +19476, O19476 +19477, O19477 +19478, O19478 +19479, O19479 +19480, O19480 +19481, O19481 +19482, O19482 +19483, O19483 +19484, O19484 +19485, O19485 +19486, O19486 +19487, O19487 +19488, O19488 +19489, O19489 +19490, O19490 +19491, O19491 +19492, O19492 +19493, O19493 +19494, O19494 +19495, O19495 +19496, O19496 +19497, O19497 +19498, O19498 +19499, O19499 +19500, O19500 +19501, O19501 +19502, O19502 +19503, O19503 +19504, O19504 +19505, O19505 +19506, O19506 +19507, O19507 +19508, O19508 +19509, O19509 +19510, O19510 +19511, O19511 +19512, O19512 +19513, O19513 +19514, O19514 +19515, O19515 +19516, O19516 +19517, O19517 +19518, O19518 +19519, O19519 +19520, O19520 +19521, O19521 +19522, O19522 +19523, O19523 +19524, O19524 +19525, O19525 +19526, O19526 +19527, O19527 +19528, O19528 +19529, O19529 +19530, O19530 +19531, O19531 +19532, O19532 +19533, O19533 +19534, O19534 +19535, O19535 +19536, O19536 +19537, O19537 +19538, O19538 +19539, O19539 +19540, O19540 +19541, O19541 +19542, O19542 +19543, O19543 +19544, O19544 +19545, O19545 +19546, O19546 +19547, O19547 +19548, O19548 +19549, O19549 +19550, O19550 +19551, O19551 +19552, O19552 +19553, O19553 +19554, O19554 +19555, O19555 +19556, O19556 +19557, O19557 +19558, O19558 +19559, O19559 +19560, O19560 +19561, O19561 +19562, O19562 +19563, O19563 +19564, O19564 +19565, O19565 +19566, O19566 +19567, O19567 +19568, O19568 +19569, O19569 +19570, O19570 +19571, O19571 +19572, O19572 +19573, O19573 +19574, O19574 +19575, O19575 +19576, O19576 +19577, O19577 +19578, O19578 +19579, O19579 +19580, O19580 +19581, O19581 +19582, O19582 +19583, O19583 +19584, O19584 +19585, O19585 +19586, O19586 +19587, O19587 +19588, O19588 +19589, O19589 +19590, O19590 +19591, O19591 +19592, O19592 +19593, O19593 +19594, O19594 +19595, O19595 +19596, O19596 +19597, O19597 +19598, O19598 +19599, O19599 +19600, O19600 +19601, O19601 +19602, O19602 +19603, O19603 +19604, O19604 +19605, O19605 +19606, O19606 +19607, O19607 +19608, O19608 +19609, O19609 +19610, O19610 +19611, O19611 +19612, O19612 +19613, O19613 +19614, O19614 +19615, O19615 +19616, O19616 +19617, O19617 +19618, O19618 +19619, O19619 +19620, O19620 +19621, O19621 +19622, O19622 +19623, O19623 +19624, O19624 +19625, O19625 +19626, O19626 +19627, O19627 +19628, O19628 +19629, O19629 +19630, O19630 +19631, O19631 +19632, O19632 +19633, O19633 +19634, O19634 +19635, O19635 +19636, O19636 +19637, O19637 +19638, O19638 +19639, O19639 +19640, O19640 +19641, O19641 +19642, O19642 +19643, O19643 +19644, O19644 +19645, O19645 +19646, O19646 +19647, O19647 +19648, O19648 +19649, O19649 +19650, O19650 +19651, O19651 +19652, O19652 +19653, O19653 +19654, O19654 +19655, O19655 +19656, O19656 +19657, O19657 +19658, O19658 +19659, O19659 +19660, O19660 +19661, O19661 +19662, O19662 +19663, O19663 +19664, O19664 +19665, O19665 +19666, O19666 +19667, O19667 +19668, O19668 +19669, O19669 +19670, O19670 +19671, O19671 +19672, O19672 +19673, O19673 +19674, O19674 +19675, O19675 +19676, O19676 +19677, O19677 +19678, O19678 +19679, O19679 +19680, O19680 +19681, O19681 +19682, O19682 +19683, O19683 +19684, O19684 +19685, O19685 +19686, O19686 +19687, O19687 +19688, O19688 +19689, O19689 +19690, O19690 +19691, O19691 +19692, O19692 +19693, O19693 +19694, O19694 +19695, O19695 +19696, O19696 +19697, O19697 +19698, O19698 +19699, O19699 +19700, O19700 +19701, O19701 +19702, O19702 +19703, O19703 +19704, O19704 +19705, O19705 +19706, O19706 +19707, O19707 +19708, O19708 +19709, O19709 +19710, O19710 +19711, O19711 +19712, O19712 +19713, O19713 +19714, O19714 +19715, O19715 +19716, O19716 +19717, O19717 +19718, O19718 +19719, O19719 +19720, O19720 +19721, O19721 +19722, O19722 +19723, O19723 +19724, O19724 +19725, O19725 +19726, O19726 +19727, O19727 +19728, O19728 +19729, O19729 +19730, O19730 +19731, O19731 +19732, O19732 +19733, O19733 +19734, O19734 +19735, O19735 +19736, O19736 +19737, O19737 +19738, O19738 +19739, O19739 +19740, O19740 +19741, O19741 +19742, O19742 +19743, O19743 +19744, O19744 +19745, O19745 +19746, O19746 +19747, O19747 +19748, O19748 +19749, O19749 +19750, O19750 +19751, O19751 +19752, O19752 +19753, O19753 +19754, O19754 +19755, O19755 +19756, O19756 +19757, O19757 +19758, O19758 +19759, O19759 +19760, O19760 +19761, O19761 +19762, O19762 +19763, O19763 +19764, O19764 +19765, O19765 +19766, O19766 +19767, O19767 +19768, O19768 +19769, O19769 +19770, O19770 +19771, O19771 +19772, O19772 +19773, O19773 +19774, O19774 +19775, O19775 +19776, O19776 +19777, O19777 +19778, O19778 +19779, O19779 +19780, O19780 +19781, O19781 +19782, O19782 +19783, O19783 +19784, O19784 +19785, O19785 +19786, O19786 +19787, O19787 +19788, O19788 +19789, O19789 +19790, O19790 +19791, O19791 +19792, O19792 +19793, O19793 +19794, O19794 +19795, O19795 +19796, O19796 +19797, O19797 +19798, O19798 +19799, O19799 +19800, O19800 +19801, O19801 +19802, O19802 +19803, O19803 +19804, O19804 +19805, O19805 +19806, O19806 +19807, O19807 +19808, O19808 +19809, O19809 +19810, O19810 +19811, O19811 +19812, O19812 +19813, O19813 +19814, O19814 +19815, O19815 +19816, O19816 +19817, O19817 +19818, O19818 +19819, O19819 +19820, O19820 +19821, O19821 +19822, O19822 +19823, O19823 +19824, O19824 +19825, O19825 +19826, O19826 +19827, O19827 +19828, O19828 +19829, O19829 +19830, O19830 +19831, O19831 +19832, O19832 +19833, O19833 +19834, O19834 +19835, O19835 +19836, O19836 +19837, O19837 +19838, O19838 +19839, O19839 +19840, O19840 +19841, O19841 +19842, O19842 +19843, O19843 +19844, O19844 +19845, O19845 +19846, O19846 +19847, O19847 +19848, O19848 +19849, O19849 +19850, O19850 +19851, O19851 +19852, O19852 +19853, O19853 +19854, O19854 +19855, O19855 +19856, O19856 +19857, O19857 +19858, O19858 +19859, O19859 +19860, O19860 +19861, O19861 +19862, O19862 +19863, O19863 +19864, O19864 +19865, O19865 +19866, O19866 +19867, O19867 +19868, O19868 +19869, O19869 +19870, O19870 +19871, O19871 +19872, O19872 +19873, O19873 +19874, O19874 +19875, O19875 +19876, O19876 +19877, O19877 +19878, O19878 +19879, O19879 +19880, O19880 +19881, O19881 +19882, O19882 +19883, O19883 +19884, O19884 +19885, O19885 +19886, O19886 +19887, O19887 +19888, O19888 +19889, O19889 +19890, O19890 +19891, O19891 +19892, O19892 +19893, O19893 +19894, O19894 +19895, O19895 +19896, O19896 +19897, O19897 +19898, O19898 +19899, O19899 +19900, O19900 +19901, O19901 +19902, O19902 +19903, O19903 +19904, O19904 +19905, O19905 +19906, O19906 +19907, O19907 +19908, O19908 +19909, O19909 +19910, O19910 +19911, O19911 +19912, O19912 +19913, O19913 +19914, O19914 +19915, O19915 +19916, O19916 +19917, O19917 +19918, O19918 +19919, O19919 +19920, O19920 +19921, O19921 +19922, O19922 +19923, O19923 +19924, O19924 +19925, O19925 +19926, O19926 +19927, O19927 +19928, O19928 +19929, O19929 +19930, O19930 +19931, O19931 +19932, O19932 +19933, O19933 +19934, O19934 +19935, O19935 +19936, O19936 +19937, O19937 +19938, O19938 +19939, O19939 +19940, O19940 +19941, O19941 +19942, O19942 +19943, O19943 +19944, O19944 +19945, O19945 +19946, O19946 +19947, O19947 +19948, O19948 +19949, O19949 +19950, O19950 +19951, O19951 +19952, O19952 +19953, O19953 +19954, O19954 +19955, O19955 +19956, O19956 +19957, O19957 +19958, O19958 +19959, O19959 +19960, O19960 +19961, O19961 +19962, O19962 +19963, O19963 +19964, O19964 +19965, O19965 +19966, O19966 +19967, O19967 +19968, O19968 +19969, O19969 +19970, O19970 +19971, O19971 +19972, O19972 +19973, O19973 +19974, O19974 +19975, O19975 +19976, O19976 +19977, O19977 +19978, O19978 +19979, O19979 +19980, O19980 +19981, O19981 +19982, O19982 +19983, O19983 +19984, O19984 +19985, O19985 +19986, O19986 +19987, O19987 +19988, O19988 +19989, O19989 +19990, O19990 +19991, O19991 +19992, O19992 +19993, O19993 +19994, O19994 +19995, O19995 +19996, O19996 +19997, O19997 +19998, O19998 +19999, O19999 +20000, O20000 +20001, O20001 +20002, O20002 +20003, O20003 +20004, O20004 +20005, O20005 +20006, O20006 +20007, O20007 +20008, O20008 +20009, O20009 +20010, O20010 +20011, O20011 +20012, O20012 +20013, O20013 +20014, O20014 +20015, O20015 +20016, O20016 +20017, O20017 +20018, O20018 +20019, O20019 +20020, O20020 +20021, O20021 +20022, O20022 +20023, O20023 +20024, O20024 +20025, O20025 +20026, O20026 +20027, O20027 +20028, O20028 +20029, O20029 +20030, O20030 +20031, O20031 +20032, O20032 +20033, O20033 +20034, O20034 +20035, O20035 +20036, O20036 +20037, O20037 +20038, O20038 +20039, O20039 +20040, O20040 +20041, O20041 +20042, O20042 +20043, O20043 +20044, O20044 +20045, O20045 +20046, O20046 +20047, O20047 +20048, O20048 +20049, O20049 +20050, O20050 +20051, O20051 +20052, O20052 +20053, O20053 +20054, O20054 +20055, O20055 +20056, O20056 +20057, O20057 +20058, O20058 +20059, O20059 +20060, O20060 +20061, O20061 +20062, O20062 +20063, O20063 +20064, O20064 +20065, O20065 +20066, O20066 +20067, O20067 +20068, O20068 +20069, O20069 +20070, O20070 +20071, O20071 +20072, O20072 +20073, O20073 +20074, O20074 +20075, O20075 +20076, O20076 +20077, O20077 +20078, O20078 +20079, O20079 +20080, O20080 +20081, O20081 +20082, O20082 +20083, O20083 +20084, O20084 +20085, O20085 +20086, O20086 +20087, O20087 +20088, O20088 +20089, O20089 +20090, O20090 +20091, O20091 +20092, O20092 +20093, O20093 +20094, O20094 +20095, O20095 +20096, O20096 +20097, O20097 +20098, O20098 +20099, O20099 +20100, O20100 +20101, O20101 +20102, O20102 +20103, O20103 +20104, O20104 +20105, O20105 +20106, O20106 +20107, O20107 +20108, O20108 +20109, O20109 +20110, O20110 +20111, O20111 +20112, O20112 +20113, O20113 +20114, O20114 +20115, O20115 +20116, O20116 +20117, O20117 +20118, O20118 +20119, O20119 +20120, O20120 +20121, O20121 +20122, O20122 +20123, O20123 +20124, O20124 +20125, O20125 +20126, O20126 +20127, O20127 +20128, O20128 +20129, O20129 +20130, O20130 +20131, O20131 +20132, O20132 +20133, O20133 +20134, O20134 +20135, O20135 +20136, O20136 +20137, O20137 +20138, O20138 +20139, O20139 +20140, O20140 +20141, O20141 +20142, O20142 +20143, O20143 +20144, O20144 +20145, O20145 +20146, O20146 +20147, O20147 +20148, O20148 +20149, O20149 +20150, O20150 +20151, O20151 +20152, O20152 +20153, O20153 +20154, O20154 +20155, O20155 +20156, O20156 +20157, O20157 +20158, O20158 +20159, O20159 +20160, O20160 +20161, O20161 +20162, O20162 +20163, O20163 +20164, O20164 +20165, O20165 +20166, O20166 +20167, O20167 +20168, O20168 +20169, O20169 +20170, O20170 +20171, O20171 +20172, O20172 +20173, O20173 +20174, O20174 +20175, O20175 +20176, O20176 +20177, O20177 +20178, O20178 +20179, O20179 +20180, O20180 +20181, O20181 +20182, O20182 +20183, O20183 +20184, O20184 +20185, O20185 +20186, O20186 +20187, O20187 +20188, O20188 +20189, O20189 +20190, O20190 +20191, O20191 +20192, O20192 +20193, O20193 +20194, O20194 +20195, O20195 +20196, O20196 +20197, O20197 +20198, O20198 +20199, O20199 +20200, O20200 +20201, O20201 +20202, O20202 +20203, O20203 +20204, O20204 +20205, O20205 +20206, O20206 +20207, O20207 +20208, O20208 +20209, O20209 +20210, O20210 +20211, O20211 +20212, O20212 +20213, O20213 +20214, O20214 +20215, O20215 +20216, O20216 +20217, O20217 +20218, O20218 +20219, O20219 +20220, O20220 +20221, O20221 +20222, O20222 +20223, O20223 +20224, O20224 +20225, O20225 +20226, O20226 +20227, O20227 +20228, O20228 +20229, O20229 +20230, O20230 +20231, O20231 +20232, O20232 +20233, O20233 +20234, O20234 +20235, O20235 +20236, O20236 +20237, O20237 +20238, O20238 +20239, O20239 +20240, O20240 +20241, O20241 +20242, O20242 +20243, O20243 +20244, O20244 +20245, O20245 +20246, O20246 +20247, O20247 +20248, O20248 +20249, O20249 +20250, O20250 +20251, O20251 +20252, O20252 +20253, O20253 +20254, O20254 +20255, O20255 +20256, O20256 +20257, O20257 +20258, O20258 +20259, O20259 +20260, O20260 +20261, O20261 +20262, O20262 +20263, O20263 +20264, O20264 +20265, O20265 +20266, O20266 +20267, O20267 +20268, O20268 +20269, O20269 +20270, O20270 +20271, O20271 +20272, O20272 +20273, O20273 +20274, O20274 +20275, O20275 +20276, O20276 +20277, O20277 +20278, O20278 +20279, O20279 +20280, O20280 +20281, O20281 +20282, O20282 +20283, O20283 +20284, O20284 +20285, O20285 +20286, O20286 +20287, O20287 +20288, O20288 +20289, O20289 +20290, O20290 +20291, O20291 +20292, O20292 +20293, O20293 +20294, O20294 +20295, O20295 +20296, O20296 +20297, O20297 +20298, O20298 +20299, O20299 +20300, O20300 +20301, O20301 +20302, O20302 +20303, O20303 +20304, O20304 +20305, O20305 +20306, O20306 +20307, O20307 +20308, O20308 +20309, O20309 +20310, O20310 +20311, O20311 +20312, O20312 +20313, O20313 +20314, O20314 +20315, O20315 +20316, O20316 +20317, O20317 +20318, O20318 +20319, O20319 +20320, O20320 +20321, O20321 +20322, O20322 +20323, O20323 +20324, O20324 +20325, O20325 +20326, O20326 +20327, O20327 +20328, O20328 +20329, O20329 +20330, O20330 +20331, O20331 +20332, O20332 +20333, O20333 +20334, O20334 +20335, O20335 +20336, O20336 +20337, O20337 +20338, O20338 +20339, O20339 +20340, O20340 +20341, O20341 +20342, O20342 +20343, O20343 +20344, O20344 +20345, O20345 +20346, O20346 +20347, O20347 +20348, O20348 +20349, O20349 +20350, O20350 +20351, O20351 +20352, O20352 +20353, O20353 +20354, O20354 +20355, O20355 +20356, O20356 +20357, O20357 +20358, O20358 +20359, O20359 +20360, O20360 +20361, O20361 +20362, O20362 +20363, O20363 +20364, O20364 +20365, O20365 +20366, O20366 +20367, O20367 +20368, O20368 +20369, O20369 +20370, O20370 +20371, O20371 +20372, O20372 +20373, O20373 +20374, O20374 +20375, O20375 +20376, O20376 +20377, O20377 +20378, O20378 +20379, O20379 +20380, O20380 +20381, O20381 +20382, O20382 +20383, O20383 +20384, O20384 +20385, O20385 +20386, O20386 +20387, O20387 +20388, O20388 +20389, O20389 +20390, O20390 +20391, O20391 +20392, O20392 +20393, O20393 +20394, O20394 +20395, O20395 +20396, O20396 +20397, O20397 +20398, O20398 +20399, O20399 +20400, O20400 +20401, O20401 +20402, O20402 +20403, O20403 +20404, O20404 +20405, O20405 +20406, O20406 +20407, O20407 +20408, O20408 +20409, O20409 +20410, O20410 +20411, O20411 +20412, O20412 +20413, O20413 +20414, O20414 +20415, O20415 +20416, O20416 +20417, O20417 +20418, O20418 +20419, O20419 +20420, O20420 +20421, O20421 +20422, O20422 +20423, O20423 +20424, O20424 +20425, O20425 +20426, O20426 +20427, O20427 +20428, O20428 +20429, O20429 +20430, O20430 +20431, O20431 +20432, O20432 +20433, O20433 +20434, O20434 +20435, O20435 +20436, O20436 +20437, O20437 +20438, O20438 +20439, O20439 +20440, O20440 +20441, O20441 +20442, O20442 +20443, O20443 +20444, O20444 +20445, O20445 +20446, O20446 +20447, O20447 +20448, O20448 +20449, O20449 +20450, O20450 +20451, O20451 +20452, O20452 +20453, O20453 +20454, O20454 +20455, O20455 +20456, O20456 +20457, O20457 +20458, O20458 +20459, O20459 +20460, O20460 +20461, O20461 +20462, O20462 +20463, O20463 +20464, O20464 +20465, O20465 +20466, O20466 +20467, O20467 +20468, O20468 +20469, O20469 +20470, O20470 +20471, O20471 +20472, O20472 +20473, O20473 +20474, O20474 +20475, O20475 +20476, O20476 +20477, O20477 +20478, O20478 +20479, O20479 +20480, O20480 +20481, O20481 +20482, O20482 +20483, O20483 +20484, O20484 +20485, O20485 +20486, O20486 +20487, O20487 +20488, O20488 +20489, O20489 +20490, O20490 +20491, O20491 +20492, O20492 +20493, O20493 +20494, O20494 +20495, O20495 +20496, O20496 +20497, O20497 +20498, O20498 +20499, O20499 +20500, O20500 +20501, O20501 +20502, O20502 +20503, O20503 +20504, O20504 +20505, O20505 +20506, O20506 +20507, O20507 +20508, O20508 +20509, O20509 +20510, O20510 +20511, O20511 +20512, O20512 +20513, O20513 +20514, O20514 +20515, O20515 +20516, O20516 +20517, O20517 +20518, O20518 +20519, O20519 +20520, O20520 +20521, O20521 +20522, O20522 +20523, O20523 +20524, O20524 +20525, O20525 +20526, O20526 +20527, O20527 +20528, O20528 +20529, O20529 +20530, O20530 +20531, O20531 +20532, O20532 +20533, O20533 +20534, O20534 +20535, O20535 +20536, O20536 +20537, O20537 +20538, O20538 +20539, O20539 +20540, O20540 +20541, O20541 +20542, O20542 +20543, O20543 +20544, O20544 +20545, O20545 +20546, O20546 +20547, O20547 +20548, O20548 +20549, O20549 +20550, O20550 +20551, O20551 +20552, O20552 +20553, O20553 +20554, O20554 +20555, O20555 +20556, O20556 +20557, O20557 +20558, O20558 +20559, O20559 +20560, O20560 +20561, O20561 +20562, O20562 +20563, O20563 +20564, O20564 +20565, O20565 +20566, O20566 +20567, O20567 +20568, O20568 +20569, O20569 +20570, O20570 +20571, O20571 +20572, O20572 +20573, O20573 +20574, O20574 +20575, O20575 +20576, O20576 +20577, O20577 +20578, O20578 +20579, O20579 +20580, O20580 +20581, O20581 +20582, O20582 +20583, O20583 +20584, O20584 +20585, O20585 +20586, O20586 +20587, O20587 +20588, O20588 +20589, O20589 +20590, O20590 +20591, O20591 +20592, O20592 +20593, O20593 +20594, O20594 +20595, O20595 +20596, O20596 +20597, O20597 +20598, O20598 +20599, O20599 +20600, O20600 +20601, O20601 +20602, O20602 +20603, O20603 +20604, O20604 +20605, O20605 +20606, O20606 +20607, O20607 +20608, O20608 +20609, O20609 +20610, O20610 +20611, O20611 +20612, O20612 +20613, O20613 +20614, O20614 +20615, O20615 +20616, O20616 +20617, O20617 +20618, O20618 +20619, O20619 +20620, O20620 +20621, O20621 +20622, O20622 +20623, O20623 +20624, O20624 +20625, O20625 +20626, O20626 +20627, O20627 +20628, O20628 +20629, O20629 +20630, O20630 +20631, O20631 +20632, O20632 +20633, O20633 +20634, O20634 +20635, O20635 +20636, O20636 +20637, O20637 +20638, O20638 +20639, O20639 +20640, O20640 +20641, O20641 +20642, O20642 +20643, O20643 +20644, O20644 +20645, O20645 +20646, O20646 +20647, O20647 +20648, O20648 +20649, O20649 +20650, O20650 +20651, O20651 +20652, O20652 +20653, O20653 +20654, O20654 +20655, O20655 +20656, O20656 +20657, O20657 +20658, O20658 +20659, O20659 +20660, O20660 +20661, O20661 +20662, O20662 +20663, O20663 +20664, O20664 +20665, O20665 +20666, O20666 +20667, O20667 +20668, O20668 +20669, O20669 +20670, O20670 +20671, O20671 +20672, O20672 +20673, O20673 +20674, O20674 +20675, O20675 +20676, O20676 +20677, O20677 +20678, O20678 +20679, O20679 +20680, O20680 +20681, O20681 +20682, O20682 +20683, O20683 +20684, O20684 +20685, O20685 +20686, O20686 +20687, O20687 +20688, O20688 +20689, O20689 +20690, O20690 +20691, O20691 +20692, O20692 +20693, O20693 +20694, O20694 +20695, O20695 +20696, O20696 +20697, O20697 +20698, O20698 +20699, O20699 +20700, O20700 +20701, O20701 +20702, O20702 +20703, O20703 +20704, O20704 +20705, O20705 +20706, O20706 +20707, O20707 +20708, O20708 +20709, O20709 +20710, O20710 +20711, O20711 +20712, O20712 +20713, O20713 +20714, O20714 +20715, O20715 +20716, O20716 +20717, O20717 +20718, O20718 +20719, O20719 +20720, O20720 +20721, O20721 +20722, O20722 +20723, O20723 +20724, O20724 +20725, O20725 +20726, O20726 +20727, O20727 +20728, O20728 +20729, O20729 +20730, O20730 +20731, O20731 +20732, O20732 +20733, O20733 +20734, O20734 +20735, O20735 +20736, O20736 +20737, O20737 +20738, O20738 +20739, O20739 +20740, O20740 +20741, O20741 +20742, O20742 +20743, O20743 +20744, O20744 +20745, O20745 +20746, O20746 +20747, O20747 +20748, O20748 +20749, O20749 +20750, O20750 +20751, O20751 +20752, O20752 +20753, O20753 +20754, O20754 +20755, O20755 +20756, O20756 +20757, O20757 +20758, O20758 +20759, O20759 +20760, O20760 +20761, O20761 +20762, O20762 +20763, O20763 +20764, O20764 +20765, O20765 +20766, O20766 +20767, O20767 +20768, O20768 +20769, O20769 +20770, O20770 +20771, O20771 +20772, O20772 +20773, O20773 +20774, O20774 +20775, O20775 +20776, O20776 +20777, O20777 +20778, O20778 +20779, O20779 +20780, O20780 +20781, O20781 +20782, O20782 +20783, O20783 +20784, O20784 +20785, O20785 +20786, O20786 +20787, O20787 +20788, O20788 +20789, O20789 +20790, O20790 +20791, O20791 +20792, O20792 +20793, O20793 +20794, O20794 +20795, O20795 +20796, O20796 +20797, O20797 +20798, O20798 +20799, O20799 +20800, O20800 +20801, O20801 +20802, O20802 +20803, O20803 +20804, O20804 +20805, O20805 +20806, O20806 +20807, O20807 +20808, O20808 +20809, O20809 +20810, O20810 +20811, O20811 +20812, O20812 +20813, O20813 +20814, O20814 +20815, O20815 +20816, O20816 +20817, O20817 +20818, O20818 +20819, O20819 +20820, O20820 +20821, O20821 +20822, O20822 +20823, O20823 +20824, O20824 +20825, O20825 +20826, O20826 +20827, O20827 +20828, O20828 +20829, O20829 +20830, O20830 +20831, O20831 +20832, O20832 +20833, O20833 +20834, O20834 +20835, O20835 +20836, O20836 +20837, O20837 +20838, O20838 +20839, O20839 +20840, O20840 +20841, O20841 +20842, O20842 +20843, O20843 +20844, O20844 +20845, O20845 +20846, O20846 +20847, O20847 +20848, O20848 +20849, O20849 +20850, O20850 +20851, O20851 +20852, O20852 +20853, O20853 +20854, O20854 +20855, O20855 +20856, O20856 +20857, O20857 +20858, O20858 +20859, O20859 +20860, O20860 +20861, O20861 +20862, O20862 +20863, O20863 +20864, O20864 +20865, O20865 +20866, O20866 +20867, O20867 +20868, O20868 +20869, O20869 +20870, O20870 +20871, O20871 +20872, O20872 +20873, O20873 +20874, O20874 +20875, O20875 +20876, O20876 +20877, O20877 +20878, O20878 +20879, O20879 +20880, O20880 +20881, O20881 +20882, O20882 +20883, O20883 +20884, O20884 +20885, O20885 +20886, O20886 +20887, O20887 +20888, O20888 +20889, O20889 +20890, O20890 +20891, O20891 +20892, O20892 +20893, O20893 +20894, O20894 +20895, O20895 +20896, O20896 +20897, O20897 +20898, O20898 +20899, O20899 +20900, O20900 +20901, O20901 +20902, O20902 +20903, O20903 +20904, O20904 +20905, O20905 +20906, O20906 +20907, O20907 +20908, O20908 +20909, O20909 +20910, O20910 +20911, O20911 +20912, O20912 +20913, O20913 +20914, O20914 +20915, O20915 +20916, O20916 +20917, O20917 +20918, O20918 +20919, O20919 +20920, O20920 +20921, O20921 +20922, O20922 +20923, O20923 +20924, O20924 +20925, O20925 +20926, O20926 +20927, O20927 +20928, O20928 +20929, O20929 +20930, O20930 +20931, O20931 +20932, O20932 +20933, O20933 +20934, O20934 +20935, O20935 +20936, O20936 +20937, O20937 +20938, O20938 +20939, O20939 +20940, O20940 +20941, O20941 +20942, O20942 +20943, O20943 +20944, O20944 +20945, O20945 +20946, O20946 +20947, O20947 +20948, O20948 +20949, O20949 +20950, O20950 +20951, O20951 +20952, O20952 +20953, O20953 +20954, O20954 +20955, O20955 +20956, O20956 +20957, O20957 +20958, O20958 +20959, O20959 +20960, O20960 +20961, O20961 +20962, O20962 +20963, O20963 +20964, O20964 +20965, O20965 +20966, O20966 +20967, O20967 +20968, O20968 +20969, O20969 +20970, O20970 +20971, O20971 +20972, O20972 +20973, O20973 +20974, O20974 +20975, O20975 +20976, O20976 +20977, O20977 +20978, O20978 +20979, O20979 +20980, O20980 +20981, O20981 +20982, O20982 +20983, O20983 +20984, O20984 +20985, O20985 +20986, O20986 +20987, O20987 +20988, O20988 +20989, O20989 +20990, O20990 +20991, O20991 +20992, O20992 +20993, O20993 +20994, O20994 +20995, O20995 +20996, O20996 +20997, O20997 +20998, O20998 +20999, O20999 +21000, O21000 +21001, O21001 +21002, O21002 +21003, O21003 +21004, O21004 +21005, O21005 +21006, O21006 +21007, O21007 +21008, O21008 +21009, O21009 +21010, O21010 +21011, O21011 +21012, O21012 +21013, O21013 +21014, O21014 +21015, O21015 +21016, O21016 +21017, O21017 +21018, O21018 +21019, O21019 +21020, O21020 +21021, O21021 +21022, O21022 +21023, O21023 +21024, O21024 +21025, O21025 +21026, O21026 +21027, O21027 +21028, O21028 +21029, O21029 +21030, O21030 +21031, O21031 +21032, O21032 +21033, O21033 +21034, O21034 +21035, O21035 +21036, O21036 +21037, O21037 +21038, O21038 +21039, O21039 +21040, O21040 +21041, O21041 +21042, O21042 +21043, O21043 +21044, O21044 +21045, O21045 +21046, O21046 +21047, O21047 +21048, O21048 +21049, O21049 +21050, O21050 +21051, O21051 +21052, O21052 +21053, O21053 +21054, O21054 +21055, O21055 +21056, O21056 +21057, O21057 +21058, O21058 +21059, O21059 +21060, O21060 +21061, O21061 +21062, O21062 +21063, O21063 +21064, O21064 +21065, O21065 +21066, O21066 +21067, O21067 +21068, O21068 +21069, O21069 +21070, O21070 +21071, O21071 +21072, O21072 +21073, O21073 +21074, O21074 +21075, O21075 +21076, O21076 +21077, O21077 +21078, O21078 +21079, O21079 +21080, O21080 +21081, O21081 +21082, O21082 +21083, O21083 +21084, O21084 +21085, O21085 +21086, O21086 +21087, O21087 +21088, O21088 +21089, O21089 +21090, O21090 +21091, O21091 +21092, O21092 +21093, O21093 +21094, O21094 +21095, O21095 +21096, O21096 +21097, O21097 +21098, O21098 +21099, O21099 +21100, O21100 +21101, O21101 +21102, O21102 +21103, O21103 +21104, O21104 +21105, O21105 +21106, O21106 +21107, O21107 +21108, O21108 +21109, O21109 +21110, O21110 +21111, O21111 +21112, O21112 +21113, O21113 +21114, O21114 +21115, O21115 +21116, O21116 +21117, O21117 +21118, O21118 +21119, O21119 +21120, O21120 +21121, O21121 +21122, O21122 +21123, O21123 +21124, O21124 +21125, O21125 +21126, O21126 +21127, O21127 +21128, O21128 +21129, O21129 +21130, O21130 +21131, O21131 +21132, O21132 +21133, O21133 +21134, O21134 +21135, O21135 +21136, O21136 +21137, O21137 +21138, O21138 +21139, O21139 +21140, O21140 +21141, O21141 +21142, O21142 +21143, O21143 +21144, O21144 +21145, O21145 +21146, O21146 +21147, O21147 +21148, O21148 +21149, O21149 +21150, O21150 +21151, O21151 +21152, O21152 +21153, O21153 +21154, O21154 +21155, O21155 +21156, O21156 +21157, O21157 +21158, O21158 +21159, O21159 +21160, O21160 +21161, O21161 +21162, O21162 +21163, O21163 +21164, O21164 +21165, O21165 +21166, O21166 +21167, O21167 +21168, O21168 +21169, O21169 +21170, O21170 +21171, O21171 +21172, O21172 +21173, O21173 +21174, O21174 +21175, O21175 +21176, O21176 +21177, O21177 +21178, O21178 +21179, O21179 +21180, O21180 +21181, O21181 +21182, O21182 +21183, O21183 +21184, O21184 +21185, O21185 +21186, O21186 +21187, O21187 +21188, O21188 +21189, O21189 +21190, O21190 +21191, O21191 +21192, O21192 +21193, O21193 +21194, O21194 +21195, O21195 +21196, O21196 +21197, O21197 +21198, O21198 +21199, O21199 +21200, O21200 +21201, O21201 +21202, O21202 +21203, O21203 +21204, O21204 +21205, O21205 +21206, O21206 +21207, O21207 +21208, O21208 +21209, O21209 +21210, O21210 +21211, O21211 +21212, O21212 +21213, O21213 +21214, O21214 +21215, O21215 +21216, O21216 +21217, O21217 +21218, O21218 +21219, O21219 +21220, O21220 +21221, O21221 +21222, O21222 +21223, O21223 +21224, O21224 +21225, O21225 +21226, O21226 +21227, O21227 +21228, O21228 +21229, O21229 +21230, O21230 +21231, O21231 +21232, O21232 +21233, O21233 +21234, O21234 +21235, O21235 +21236, O21236 +21237, O21237 +21238, O21238 +21239, O21239 +21240, O21240 +21241, O21241 +21242, O21242 +21243, O21243 +21244, O21244 +21245, O21245 +21246, O21246 +21247, O21247 +21248, O21248 +21249, O21249 +21250, O21250 +21251, O21251 +21252, O21252 +21253, O21253 +21254, O21254 +21255, O21255 +21256, O21256 +21257, O21257 +21258, O21258 +21259, O21259 +21260, O21260 +21261, O21261 +21262, O21262 +21263, O21263 +21264, O21264 +21265, O21265 +21266, O21266 +21267, O21267 +21268, O21268 +21269, O21269 +21270, O21270 +21271, O21271 +21272, O21272 +21273, O21273 +21274, O21274 +21275, O21275 +21276, O21276 +21277, O21277 +21278, O21278 +21279, O21279 +21280, O21280 +21281, O21281 +21282, O21282 +21283, O21283 +21284, O21284 +21285, O21285 +21286, O21286 +21287, O21287 +21288, O21288 +21289, O21289 +21290, O21290 +21291, O21291 +21292, O21292 +21293, O21293 +21294, O21294 +21295, O21295 +21296, O21296 +21297, O21297 +21298, O21298 +21299, O21299 +21300, O21300 +21301, O21301 +21302, O21302 +21303, O21303 +21304, O21304 +21305, O21305 +21306, O21306 +21307, O21307 +21308, O21308 +21309, O21309 +21310, O21310 +21311, O21311 +21312, O21312 +21313, O21313 +21314, O21314 +21315, O21315 +21316, O21316 +21317, O21317 +21318, O21318 +21319, O21319 +21320, O21320 +21321, O21321 +21322, O21322 +21323, O21323 +21324, O21324 +21325, O21325 +21326, O21326 +21327, O21327 +21328, O21328 +21329, O21329 +21330, O21330 +21331, O21331 +21332, O21332 +21333, O21333 +21334, O21334 +21335, O21335 +21336, O21336 +21337, O21337 +21338, O21338 +21339, O21339 +21340, O21340 +21341, O21341 +21342, O21342 +21343, O21343 +21344, O21344 +21345, O21345 +21346, O21346 +21347, O21347 +21348, O21348 +21349, O21349 +21350, O21350 +21351, O21351 +21352, O21352 +21353, O21353 +21354, O21354 +21355, O21355 +21356, O21356 +21357, O21357 +21358, O21358 +21359, O21359 +21360, O21360 +21361, O21361 +21362, O21362 +21363, O21363 +21364, O21364 +21365, O21365 +21366, O21366 +21367, O21367 +21368, O21368 +21369, O21369 +21370, O21370 +21371, O21371 +21372, O21372 +21373, O21373 +21374, O21374 +21375, O21375 +21376, O21376 +21377, O21377 +21378, O21378 +21379, O21379 +21380, O21380 +21381, O21381 +21382, O21382 +21383, O21383 +21384, O21384 +21385, O21385 +21386, O21386 +21387, O21387 +21388, O21388 +21389, O21389 +21390, O21390 +21391, O21391 +21392, O21392 +21393, O21393 +21394, O21394 +21395, O21395 +21396, O21396 +21397, O21397 +21398, O21398 +21399, O21399 +21400, O21400 +21401, O21401 +21402, O21402 +21403, O21403 +21404, O21404 +21405, O21405 +21406, O21406 +21407, O21407 +21408, O21408 +21409, O21409 +21410, O21410 +21411, O21411 +21412, O21412 +21413, O21413 +21414, O21414 +21415, O21415 +21416, O21416 +21417, O21417 +21418, O21418 +21419, O21419 +21420, O21420 +21421, O21421 +21422, O21422 +21423, O21423 +21424, O21424 +21425, O21425 +21426, O21426 +21427, O21427 +21428, O21428 +21429, O21429 +21430, O21430 +21431, O21431 +21432, O21432 +21433, O21433 +21434, O21434 +21435, O21435 +21436, O21436 +21437, O21437 +21438, O21438 +21439, O21439 +21440, O21440 +21441, O21441 +21442, O21442 +21443, O21443 +21444, O21444 +21445, O21445 +21446, O21446 +21447, O21447 +21448, O21448 +21449, O21449 +21450, O21450 +21451, O21451 +21452, O21452 +21453, O21453 +21454, O21454 +21455, O21455 +21456, O21456 +21457, O21457 +21458, O21458 +21459, O21459 +21460, O21460 +21461, O21461 +21462, O21462 +21463, O21463 +21464, O21464 +21465, O21465 +21466, O21466 +21467, O21467 +21468, O21468 +21469, O21469 +21470, O21470 +21471, O21471 +21472, O21472 +21473, O21473 +21474, O21474 +21475, O21475 +21476, O21476 +21477, O21477 +21478, O21478 +21479, O21479 +21480, O21480 +21481, O21481 +21482, O21482 +21483, O21483 +21484, O21484 +21485, O21485 +21486, O21486 +21487, O21487 +21488, O21488 +21489, O21489 +21490, O21490 +21491, O21491 +21492, O21492 +21493, O21493 +21494, O21494 +21495, O21495 +21496, O21496 +21497, O21497 +21498, O21498 +21499, O21499 +21500, O21500 +21501, O21501 +21502, O21502 +21503, O21503 +21504, O21504 +21505, O21505 +21506, O21506 +21507, O21507 +21508, O21508 +21509, O21509 +21510, O21510 +21511, O21511 +21512, O21512 +21513, O21513 +21514, O21514 +21515, O21515 +21516, O21516 +21517, O21517 +21518, O21518 +21519, O21519 +21520, O21520 +21521, O21521 +21522, O21522 +21523, O21523 +21524, O21524 +21525, O21525 +21526, O21526 +21527, O21527 +21528, O21528 +21529, O21529 +21530, O21530 +21531, O21531 +21532, O21532 +21533, O21533 +21534, O21534 +21535, O21535 +21536, O21536 +21537, O21537 +21538, O21538 +21539, O21539 +21540, O21540 +21541, O21541 +21542, O21542 +21543, O21543 +21544, O21544 +21545, O21545 +21546, O21546 +21547, O21547 +21548, O21548 +21549, O21549 +21550, O21550 +21551, O21551 +21552, O21552 +21553, O21553 +21554, O21554 +21555, O21555 +21556, O21556 +21557, O21557 +21558, O21558 +21559, O21559 +21560, O21560 +21561, O21561 +21562, O21562 +21563, O21563 +21564, O21564 +21565, O21565 +21566, O21566 +21567, O21567 +21568, O21568 +21569, O21569 +21570, O21570 +21571, O21571 +21572, O21572 +21573, O21573 +21574, O21574 +21575, O21575 +21576, O21576 +21577, O21577 +21578, O21578 +21579, O21579 +21580, O21580 +21581, O21581 +21582, O21582 +21583, O21583 +21584, O21584 +21585, O21585 +21586, O21586 +21587, O21587 +21588, O21588 +21589, O21589 +21590, O21590 +21591, O21591 +21592, O21592 +21593, O21593 +21594, O21594 +21595, O21595 +21596, O21596 +21597, O21597 +21598, O21598 +21599, O21599 +21600, O21600 +21601, O21601 +21602, O21602 +21603, O21603 +21604, O21604 +21605, O21605 +21606, O21606 +21607, O21607 +21608, O21608 +21609, O21609 +21610, O21610 +21611, O21611 +21612, O21612 +21613, O21613 +21614, O21614 +21615, O21615 +21616, O21616 +21617, O21617 +21618, O21618 +21619, O21619 +21620, O21620 +21621, O21621 +21622, O21622 +21623, O21623 +21624, O21624 +21625, O21625 +21626, O21626 +21627, O21627 +21628, O21628 +21629, O21629 +21630, O21630 +21631, O21631 +21632, O21632 +21633, O21633 +21634, O21634 +21635, O21635 +21636, O21636 +21637, O21637 +21638, O21638 +21639, O21639 +21640, O21640 +21641, O21641 +21642, O21642 +21643, O21643 +21644, O21644 +21645, O21645 +21646, O21646 +21647, O21647 +21648, O21648 +21649, O21649 +21650, O21650 +21651, O21651 +21652, O21652 +21653, O21653 +21654, O21654 +21655, O21655 +21656, O21656 +21657, O21657 +21658, O21658 +21659, O21659 +21660, O21660 +21661, O21661 +21662, O21662 +21663, O21663 +21664, O21664 +21665, O21665 +21666, O21666 +21667, O21667 +21668, O21668 +21669, O21669 +21670, O21670 +21671, O21671 +21672, O21672 +21673, O21673 +21674, O21674 +21675, O21675 +21676, O21676 +21677, O21677 +21678, O21678 +21679, O21679 +21680, O21680 +21681, O21681 +21682, O21682 +21683, O21683 +21684, O21684 +21685, O21685 +21686, O21686 +21687, O21687 +21688, O21688 +21689, O21689 +21690, O21690 +21691, O21691 +21692, O21692 +21693, O21693 +21694, O21694 +21695, O21695 +21696, O21696 +21697, O21697 +21698, O21698 +21699, O21699 +21700, O21700 +21701, O21701 +21702, O21702 +21703, O21703 +21704, O21704 +21705, O21705 +21706, O21706 +21707, O21707 +21708, O21708 +21709, O21709 +21710, O21710 +21711, O21711 +21712, O21712 +21713, O21713 +21714, O21714 +21715, O21715 +21716, O21716 +21717, O21717 +21718, O21718 +21719, O21719 +21720, O21720 +21721, O21721 +21722, O21722 +21723, O21723 +21724, O21724 +21725, O21725 +21726, O21726 +21727, O21727 +21728, O21728 +21729, O21729 +21730, O21730 +21731, O21731 +21732, O21732 +21733, O21733 +21734, O21734 +21735, O21735 +21736, O21736 +21737, O21737 +21738, O21738 +21739, O21739 +21740, O21740 +21741, O21741 +21742, O21742 +21743, O21743 +21744, O21744 +21745, O21745 +21746, O21746 +21747, O21747 +21748, O21748 +21749, O21749 +21750, O21750 +21751, O21751 +21752, O21752 +21753, O21753 +21754, O21754 +21755, O21755 +21756, O21756 +21757, O21757 +21758, O21758 +21759, O21759 +21760, O21760 +21761, O21761 +21762, O21762 +21763, O21763 +21764, O21764 +21765, O21765 +21766, O21766 +21767, O21767 +21768, O21768 +21769, O21769 +21770, O21770 +21771, O21771 +21772, O21772 +21773, O21773 +21774, O21774 +21775, O21775 +21776, O21776 +21777, O21777 +21778, O21778 +21779, O21779 +21780, O21780 +21781, O21781 +21782, O21782 +21783, O21783 +21784, O21784 +21785, O21785 +21786, O21786 +21787, O21787 +21788, O21788 +21789, O21789 +21790, O21790 +21791, O21791 +21792, O21792 +21793, O21793 +21794, O21794 +21795, O21795 +21796, O21796 +21797, O21797 +21798, O21798 +21799, O21799 +21800, O21800 +21801, O21801 +21802, O21802 +21803, O21803 +21804, O21804 +21805, O21805 +21806, O21806 +21807, O21807 +21808, O21808 +21809, O21809 +21810, O21810 +21811, O21811 +21812, O21812 +21813, O21813 +21814, O21814 +21815, O21815 +21816, O21816 +21817, O21817 +21818, O21818 +21819, O21819 +21820, O21820 +21821, O21821 +21822, O21822 +21823, O21823 +21824, O21824 +21825, O21825 +21826, O21826 +21827, O21827 +21828, O21828 +21829, O21829 +21830, O21830 +21831, O21831 +21832, O21832 +21833, O21833 +21834, O21834 +21835, O21835 +21836, O21836 +21837, O21837 +21838, O21838 +21839, O21839 +21840, O21840 +21841, O21841 +21842, O21842 +21843, O21843 +21844, O21844 +21845, O21845 +21846, O21846 +21847, O21847 +21848, O21848 +21849, O21849 +21850, O21850 +21851, O21851 +21852, O21852 +21853, O21853 +21854, O21854 +21855, O21855 +21856, O21856 +21857, O21857 +21858, O21858 +21859, O21859 +21860, O21860 +21861, O21861 +21862, O21862 +21863, O21863 +21864, O21864 +21865, O21865 +21866, O21866 +21867, O21867 +21868, O21868 +21869, O21869 +21870, O21870 +21871, O21871 +21872, O21872 +21873, O21873 +21874, O21874 +21875, O21875 +21876, O21876 +21877, O21877 +21878, O21878 +21879, O21879 +21880, O21880 +21881, O21881 +21882, O21882 +21883, O21883 +21884, O21884 +21885, O21885 +21886, O21886 +21887, O21887 +21888, O21888 +21889, O21889 +21890, O21890 +21891, O21891 +21892, O21892 +21893, O21893 +21894, O21894 +21895, O21895 +21896, O21896 +21897, O21897 +21898, O21898 +21899, O21899 +21900, O21900 +21901, O21901 +21902, O21902 +21903, O21903 +21904, O21904 +21905, O21905 +21906, O21906 +21907, O21907 +21908, O21908 +21909, O21909 +21910, O21910 +21911, O21911 +21912, O21912 +21913, O21913 +21914, O21914 +21915, O21915 +21916, O21916 +21917, O21917 +21918, O21918 +21919, O21919 +21920, O21920 +21921, O21921 +21922, O21922 +21923, O21923 +21924, O21924 +21925, O21925 +21926, O21926 +21927, O21927 +21928, O21928 +21929, O21929 +21930, O21930 +21931, O21931 +21932, O21932 +21933, O21933 +21934, O21934 +21935, O21935 +21936, O21936 +21937, O21937 +21938, O21938 +21939, O21939 +21940, O21940 +21941, O21941 +21942, O21942 +21943, O21943 +21944, O21944 +21945, O21945 +21946, O21946 +21947, O21947 +21948, O21948 +21949, O21949 +21950, O21950 +21951, O21951 +21952, O21952 +21953, O21953 +21954, O21954 +21955, O21955 +21956, O21956 +21957, O21957 +21958, O21958 +21959, O21959 +21960, O21960 +21961, O21961 +21962, O21962 +21963, O21963 +21964, O21964 +21965, O21965 +21966, O21966 +21967, O21967 +21968, O21968 +21969, O21969 +21970, O21970 +21971, O21971 +21972, O21972 +21973, O21973 +21974, O21974 +21975, O21975 +21976, O21976 +21977, O21977 +21978, O21978 +21979, O21979 +21980, O21980 +21981, O21981 +21982, O21982 +21983, O21983 +21984, O21984 +21985, O21985 +21986, O21986 +21987, O21987 +21988, O21988 +21989, O21989 +21990, O21990 +21991, O21991 +21992, O21992 +21993, O21993 +21994, O21994 +21995, O21995 +21996, O21996 +21997, O21997 +21998, O21998 +21999, O21999 +22000, O22000 +22001, O22001 +22002, O22002 +22003, O22003 +22004, O22004 +22005, O22005 +22006, O22006 +22007, O22007 +22008, O22008 +22009, O22009 +22010, O22010 +22011, O22011 +22012, O22012 +22013, O22013 +22014, O22014 +22015, O22015 +22016, O22016 +22017, O22017 +22018, O22018 +22019, O22019 +22020, O22020 +22021, O22021 +22022, O22022 +22023, O22023 +22024, O22024 +22025, O22025 +22026, O22026 +22027, O22027 +22028, O22028 +22029, O22029 +22030, O22030 +22031, O22031 +22032, O22032 +22033, O22033 +22034, O22034 +22035, O22035 +22036, O22036 +22037, O22037 +22038, O22038 +22039, O22039 +22040, O22040 +22041, O22041 +22042, O22042 +22043, O22043 +22044, O22044 +22045, O22045 +22046, O22046 +22047, O22047 +22048, O22048 +22049, O22049 +22050, O22050 +22051, O22051 +22052, O22052 +22053, O22053 +22054, O22054 +22055, O22055 +22056, O22056 +22057, O22057 +22058, O22058 +22059, O22059 +22060, O22060 +22061, O22061 +22062, O22062 +22063, O22063 +22064, O22064 +22065, O22065 +22066, O22066 +22067, O22067 +22068, O22068 +22069, O22069 +22070, O22070 +22071, O22071 +22072, O22072 +22073, O22073 +22074, O22074 +22075, O22075 +22076, O22076 +22077, O22077 +22078, O22078 +22079, O22079 +22080, O22080 +22081, O22081 +22082, O22082 +22083, O22083 +22084, O22084 +22085, O22085 +22086, O22086 +22087, O22087 +22088, O22088 +22089, O22089 +22090, O22090 +22091, O22091 +22092, O22092 +22093, O22093 +22094, O22094 +22095, O22095 +22096, O22096 +22097, O22097 +22098, O22098 +22099, O22099 +22100, O22100 +22101, O22101 +22102, O22102 +22103, O22103 +22104, O22104 +22105, O22105 +22106, O22106 +22107, O22107 +22108, O22108 +22109, O22109 +22110, O22110 +22111, O22111 +22112, O22112 +22113, O22113 +22114, O22114 +22115, O22115 +22116, O22116 +22117, O22117 +22118, O22118 +22119, O22119 +22120, O22120 +22121, O22121 +22122, O22122 +22123, O22123 +22124, O22124 +22125, O22125 +22126, O22126 +22127, O22127 +22128, O22128 +22129, O22129 +22130, O22130 +22131, O22131 +22132, O22132 +22133, O22133 +22134, O22134 +22135, O22135 +22136, O22136 +22137, O22137 +22138, O22138 +22139, O22139 +22140, O22140 +22141, O22141 +22142, O22142 +22143, O22143 +22144, O22144 +22145, O22145 +22146, O22146 +22147, O22147 +22148, O22148 +22149, O22149 +22150, O22150 +22151, O22151 +22152, O22152 +22153, O22153 +22154, O22154 +22155, O22155 +22156, O22156 +22157, O22157 +22158, O22158 +22159, O22159 +22160, O22160 +22161, O22161 +22162, O22162 +22163, O22163 +22164, O22164 +22165, O22165 +22166, O22166 +22167, O22167 +22168, O22168 +22169, O22169 +22170, O22170 +22171, O22171 +22172, O22172 +22173, O22173 +22174, O22174 +22175, O22175 +22176, O22176 +22177, O22177 +22178, O22178 +22179, O22179 +22180, O22180 +22181, O22181 +22182, O22182 +22183, O22183 +22184, O22184 +22185, O22185 +22186, O22186 +22187, O22187 +22188, O22188 +22189, O22189 +22190, O22190 +22191, O22191 +22192, O22192 +22193, O22193 +22194, O22194 +22195, O22195 +22196, O22196 +22197, O22197 +22198, O22198 +22199, O22199 +22200, O22200 +22201, O22201 +22202, O22202 +22203, O22203 +22204, O22204 +22205, O22205 +22206, O22206 +22207, O22207 +22208, O22208 +22209, O22209 +22210, O22210 +22211, O22211 +22212, O22212 +22213, O22213 +22214, O22214 +22215, O22215 +22216, O22216 +22217, O22217 +22218, O22218 +22219, O22219 +22220, O22220 +22221, O22221 +22222, O22222 +22223, O22223 +22224, O22224 +22225, O22225 +22226, O22226 +22227, O22227 +22228, O22228 +22229, O22229 +22230, O22230 +22231, O22231 +22232, O22232 +22233, O22233 +22234, O22234 +22235, O22235 +22236, O22236 +22237, O22237 +22238, O22238 +22239, O22239 +22240, O22240 +22241, O22241 +22242, O22242 +22243, O22243 +22244, O22244 +22245, O22245 +22246, O22246 +22247, O22247 +22248, O22248 +22249, O22249 +22250, O22250 +22251, O22251 +22252, O22252 +22253, O22253 +22254, O22254 +22255, O22255 +22256, O22256 +22257, O22257 +22258, O22258 +22259, O22259 +22260, O22260 +22261, O22261 +22262, O22262 +22263, O22263 +22264, O22264 +22265, O22265 +22266, O22266 +22267, O22267 +22268, O22268 +22269, O22269 +22270, O22270 +22271, O22271 +22272, O22272 +22273, O22273 +22274, O22274 +22275, O22275 +22276, O22276 +22277, O22277 +22278, O22278 +22279, O22279 +22280, O22280 +22281, O22281 +22282, O22282 +22283, O22283 +22284, O22284 +22285, O22285 +22286, O22286 +22287, O22287 +22288, O22288 +22289, O22289 +22290, O22290 +22291, O22291 +22292, O22292 +22293, O22293 +22294, O22294 +22295, O22295 +22296, O22296 +22297, O22297 +22298, O22298 +22299, O22299 +22300, O22300 +22301, O22301 +22302, O22302 +22303, O22303 +22304, O22304 +22305, O22305 +22306, O22306 +22307, O22307 +22308, O22308 +22309, O22309 +22310, O22310 +22311, O22311 +22312, O22312 +22313, O22313 +22314, O22314 +22315, O22315 +22316, O22316 +22317, O22317 +22318, O22318 +22319, O22319 +22320, O22320 +22321, O22321 +22322, O22322 +22323, O22323 +22324, O22324 +22325, O22325 +22326, O22326 +22327, O22327 +22328, O22328 +22329, O22329 +22330, O22330 +22331, O22331 +22332, O22332 +22333, O22333 +22334, O22334 +22335, O22335 +22336, O22336 +22337, O22337 +22338, O22338 +22339, O22339 +22340, O22340 +22341, O22341 +22342, O22342 +22343, O22343 +22344, O22344 +22345, O22345 +22346, O22346 +22347, O22347 +22348, O22348 +22349, O22349 +22350, O22350 +22351, O22351 +22352, O22352 +22353, O22353 +22354, O22354 +22355, O22355 +22356, O22356 +22357, O22357 +22358, O22358 +22359, O22359 +22360, O22360 +22361, O22361 +22362, O22362 +22363, O22363 +22364, O22364 +22365, O22365 +22366, O22366 +22367, O22367 +22368, O22368 +22369, O22369 +22370, O22370 +22371, O22371 +22372, O22372 +22373, O22373 +22374, O22374 +22375, O22375 +22376, O22376 +22377, O22377 +22378, O22378 +22379, O22379 +22380, O22380 +22381, O22381 +22382, O22382 +22383, O22383 +22384, O22384 +22385, O22385 +22386, O22386 +22387, O22387 +22388, O22388 +22389, O22389 +22390, O22390 +22391, O22391 +22392, O22392 +22393, O22393 +22394, O22394 +22395, O22395 +22396, O22396 +22397, O22397 +22398, O22398 +22399, O22399 +22400, O22400 +22401, O22401 +22402, O22402 +22403, O22403 +22404, O22404 +22405, O22405 +22406, O22406 +22407, O22407 +22408, O22408 +22409, O22409 +22410, O22410 +22411, O22411 +22412, O22412 +22413, O22413 +22414, O22414 +22415, O22415 +22416, O22416 +22417, O22417 +22418, O22418 +22419, O22419 +22420, O22420 +22421, O22421 +22422, O22422 +22423, O22423 +22424, O22424 +22425, O22425 +22426, O22426 +22427, O22427 +22428, O22428 +22429, O22429 +22430, O22430 +22431, O22431 +22432, O22432 +22433, O22433 +22434, O22434 +22435, O22435 +22436, O22436 +22437, O22437 +22438, O22438 +22439, O22439 +22440, O22440 +22441, O22441 +22442, O22442 +22443, O22443 +22444, O22444 +22445, O22445 +22446, O22446 +22447, O22447 +22448, O22448 +22449, O22449 +22450, O22450 +22451, O22451 +22452, O22452 +22453, O22453 +22454, O22454 +22455, O22455 +22456, O22456 +22457, O22457 +22458, O22458 +22459, O22459 +22460, O22460 +22461, O22461 +22462, O22462 +22463, O22463 +22464, O22464 +22465, O22465 +22466, O22466 +22467, O22467 +22468, O22468 +22469, O22469 +22470, O22470 +22471, O22471 +22472, O22472 +22473, O22473 +22474, O22474 +22475, O22475 +22476, O22476 +22477, O22477 +22478, O22478 +22479, O22479 +22480, O22480 +22481, O22481 +22482, O22482 +22483, O22483 +22484, O22484 +22485, O22485 +22486, O22486 +22487, O22487 +22488, O22488 +22489, O22489 +22490, O22490 +22491, O22491 +22492, O22492 +22493, O22493 +22494, O22494 +22495, O22495 +22496, O22496 +22497, O22497 +22498, O22498 +22499, O22499 +22500, O22500 +22501, O22501 +22502, O22502 +22503, O22503 +22504, O22504 +22505, O22505 +22506, O22506 +22507, O22507 +22508, O22508 +22509, O22509 +22510, O22510 +22511, O22511 +22512, O22512 +22513, O22513 +22514, O22514 +22515, O22515 +22516, O22516 +22517, O22517 +22518, O22518 +22519, O22519 +22520, O22520 +22521, O22521 +22522, O22522 +22523, O22523 +22524, O22524 +22525, O22525 +22526, O22526 +22527, O22527 +22528, O22528 +22529, O22529 +22530, O22530 +22531, O22531 +22532, O22532 +22533, O22533 +22534, O22534 +22535, O22535 +22536, O22536 +22537, O22537 +22538, O22538 +22539, O22539 +22540, O22540 +22541, O22541 +22542, O22542 +22543, O22543 +22544, O22544 +22545, O22545 +22546, O22546 +22547, O22547 +22548, O22548 +22549, O22549 +22550, O22550 +22551, O22551 +22552, O22552 +22553, O22553 +22554, O22554 +22555, O22555 +22556, O22556 +22557, O22557 +22558, O22558 +22559, O22559 +22560, O22560 +22561, O22561 +22562, O22562 +22563, O22563 +22564, O22564 +22565, O22565 +22566, O22566 +22567, O22567 +22568, O22568 +22569, O22569 +22570, O22570 +22571, O22571 +22572, O22572 +22573, O22573 +22574, O22574 +22575, O22575 +22576, O22576 +22577, O22577 +22578, O22578 +22579, O22579 +22580, O22580 +22581, O22581 +22582, O22582 +22583, O22583 +22584, O22584 +22585, O22585 +22586, O22586 +22587, O22587 +22588, O22588 +22589, O22589 +22590, O22590 +22591, O22591 +22592, O22592 +22593, O22593 +22594, O22594 +22595, O22595 +22596, O22596 +22597, O22597 +22598, O22598 +22599, O22599 +22600, O22600 +22601, O22601 +22602, O22602 +22603, O22603 +22604, O22604 +22605, O22605 +22606, O22606 +22607, O22607 +22608, O22608 +22609, O22609 +22610, O22610 +22611, O22611 +22612, O22612 +22613, O22613 +22614, O22614 +22615, O22615 +22616, O22616 +22617, O22617 +22618, O22618 +22619, O22619 +22620, O22620 +22621, O22621 +22622, O22622 +22623, O22623 +22624, O22624 +22625, O22625 +22626, O22626 +22627, O22627 +22628, O22628 +22629, O22629 +22630, O22630 +22631, O22631 +22632, O22632 +22633, O22633 +22634, O22634 +22635, O22635 +22636, O22636 +22637, O22637 +22638, O22638 +22639, O22639 +22640, O22640 +22641, O22641 +22642, O22642 +22643, O22643 +22644, O22644 +22645, O22645 +22646, O22646 +22647, O22647 +22648, O22648 +22649, O22649 +22650, O22650 +22651, O22651 +22652, O22652 +22653, O22653 +22654, O22654 +22655, O22655 +22656, O22656 +22657, O22657 +22658, O22658 +22659, O22659 +22660, O22660 +22661, O22661 +22662, O22662 +22663, O22663 +22664, O22664 +22665, O22665 +22666, O22666 +22667, O22667 +22668, O22668 +22669, O22669 +22670, O22670 +22671, O22671 +22672, O22672 +22673, O22673 +22674, O22674 +22675, O22675 +22676, O22676 +22677, O22677 +22678, O22678 +22679, O22679 +22680, O22680 +22681, O22681 +22682, O22682 +22683, O22683 +22684, O22684 +22685, O22685 +22686, O22686 +22687, O22687 +22688, O22688 +22689, O22689 +22690, O22690 +22691, O22691 +22692, O22692 +22693, O22693 +22694, O22694 +22695, O22695 +22696, O22696 +22697, O22697 +22698, O22698 +22699, O22699 +22700, O22700 +22701, O22701 +22702, O22702 +22703, O22703 +22704, O22704 +22705, O22705 +22706, O22706 +22707, O22707 +22708, O22708 +22709, O22709 +22710, O22710 +22711, O22711 +22712, O22712 +22713, O22713 +22714, O22714 +22715, O22715 +22716, O22716 +22717, O22717 +22718, O22718 +22719, O22719 +22720, O22720 +22721, O22721 +22722, O22722 +22723, O22723 +22724, O22724 +22725, O22725 +22726, O22726 +22727, O22727 +22728, O22728 +22729, O22729 +22730, O22730 +22731, O22731 +22732, O22732 +22733, O22733 +22734, O22734 +22735, O22735 +22736, O22736 +22737, O22737 +22738, O22738 +22739, O22739 +22740, O22740 +22741, O22741 +22742, O22742 +22743, O22743 +22744, O22744 +22745, O22745 +22746, O22746 +22747, O22747 +22748, O22748 +22749, O22749 +22750, O22750 +22751, O22751 +22752, O22752 +22753, O22753 +22754, O22754 +22755, O22755 +22756, O22756 +22757, O22757 +22758, O22758 +22759, O22759 +22760, O22760 +22761, O22761 +22762, O22762 +22763, O22763 +22764, O22764 +22765, O22765 +22766, O22766 +22767, O22767 +22768, O22768 +22769, O22769 +22770, O22770 +22771, O22771 +22772, O22772 +22773, O22773 +22774, O22774 +22775, O22775 +22776, O22776 +22777, O22777 +22778, O22778 +22779, O22779 +22780, O22780 +22781, O22781 +22782, O22782 +22783, O22783 +22784, O22784 +22785, O22785 +22786, O22786 +22787, O22787 +22788, O22788 +22789, O22789 +22790, O22790 +22791, O22791 +22792, O22792 +22793, O22793 +22794, O22794 +22795, O22795 +22796, O22796 +22797, O22797 +22798, O22798 +22799, O22799 +22800, O22800 +22801, O22801 +22802, O22802 +22803, O22803 +22804, O22804 +22805, O22805 +22806, O22806 +22807, O22807 +22808, O22808 +22809, O22809 +22810, O22810 +22811, O22811 +22812, O22812 +22813, O22813 +22814, O22814 +22815, O22815 +22816, O22816 +22817, O22817 +22818, O22818 +22819, O22819 +22820, O22820 +22821, O22821 +22822, O22822 +22823, O22823 +22824, O22824 +22825, O22825 +22826, O22826 +22827, O22827 +22828, O22828 +22829, O22829 +22830, O22830 +22831, O22831 +22832, O22832 +22833, O22833 +22834, O22834 +22835, O22835 +22836, O22836 +22837, O22837 +22838, O22838 +22839, O22839 +22840, O22840 +22841, O22841 +22842, O22842 +22843, O22843 +22844, O22844 +22845, O22845 +22846, O22846 +22847, O22847 +22848, O22848 +22849, O22849 +22850, O22850 +22851, O22851 +22852, O22852 +22853, O22853 +22854, O22854 +22855, O22855 +22856, O22856 +22857, O22857 +22858, O22858 +22859, O22859 +22860, O22860 +22861, O22861 +22862, O22862 +22863, O22863 +22864, O22864 +22865, O22865 +22866, O22866 +22867, O22867 +22868, O22868 +22869, O22869 +22870, O22870 +22871, O22871 +22872, O22872 +22873, O22873 +22874, O22874 +22875, O22875 +22876, O22876 +22877, O22877 +22878, O22878 +22879, O22879 +22880, O22880 +22881, O22881 +22882, O22882 +22883, O22883 +22884, O22884 +22885, O22885 +22886, O22886 +22887, O22887 +22888, O22888 +22889, O22889 +22890, O22890 +22891, O22891 +22892, O22892 +22893, O22893 +22894, O22894 +22895, O22895 +22896, O22896 +22897, O22897 +22898, O22898 +22899, O22899 +22900, O22900 +22901, O22901 +22902, O22902 +22903, O22903 +22904, O22904 +22905, O22905 +22906, O22906 +22907, O22907 +22908, O22908 +22909, O22909 +22910, O22910 +22911, O22911 +22912, O22912 +22913, O22913 +22914, O22914 +22915, O22915 +22916, O22916 +22917, O22917 +22918, O22918 +22919, O22919 +22920, O22920 +22921, O22921 +22922, O22922 +22923, O22923 +22924, O22924 +22925, O22925 +22926, O22926 +22927, O22927 +22928, O22928 +22929, O22929 +22930, O22930 +22931, O22931 +22932, O22932 +22933, O22933 +22934, O22934 +22935, O22935 +22936, O22936 +22937, O22937 +22938, O22938 +22939, O22939 +22940, O22940 +22941, O22941 +22942, O22942 +22943, O22943 +22944, O22944 +22945, O22945 +22946, O22946 +22947, O22947 +22948, O22948 +22949, O22949 +22950, O22950 +22951, O22951 +22952, O22952 +22953, O22953 +22954, O22954 +22955, O22955 +22956, O22956 +22957, O22957 +22958, O22958 +22959, O22959 +22960, O22960 +22961, O22961 +22962, O22962 +22963, O22963 +22964, O22964 +22965, O22965 +22966, O22966 +22967, O22967 +22968, O22968 +22969, O22969 +22970, O22970 +22971, O22971 +22972, O22972 +22973, O22973 +22974, O22974 +22975, O22975 +22976, O22976 +22977, O22977 +22978, O22978 +22979, O22979 +22980, O22980 +22981, O22981 +22982, O22982 +22983, O22983 +22984, O22984 +22985, O22985 +22986, O22986 +22987, O22987 +22988, O22988 +22989, O22989 +22990, O22990 +22991, O22991 +22992, O22992 +22993, O22993 +22994, O22994 +22995, O22995 +22996, O22996 +22997, O22997 +22998, O22998 +22999, O22999 +23000, O23000 +23001, O23001 +23002, O23002 +23003, O23003 +23004, O23004 +23005, O23005 +23006, O23006 +23007, O23007 +23008, O23008 +23009, O23009 +23010, O23010 +23011, O23011 +23012, O23012 +23013, O23013 +23014, O23014 +23015, O23015 +23016, O23016 +23017, O23017 +23018, O23018 +23019, O23019 +23020, O23020 +23021, O23021 +23022, O23022 +23023, O23023 +23024, O23024 +23025, O23025 +23026, O23026 +23027, O23027 +23028, O23028 +23029, O23029 +23030, O23030 +23031, O23031 +23032, O23032 +23033, O23033 +23034, O23034 +23035, O23035 +23036, O23036 +23037, O23037 +23038, O23038 +23039, O23039 +23040, O23040 +23041, O23041 +23042, O23042 +23043, O23043 +23044, O23044 +23045, O23045 +23046, O23046 +23047, O23047 +23048, O23048 +23049, O23049 +23050, O23050 +23051, O23051 +23052, O23052 +23053, O23053 +23054, O23054 +23055, O23055 +23056, O23056 +23057, O23057 +23058, O23058 +23059, O23059 +23060, O23060 +23061, O23061 +23062, O23062 +23063, O23063 +23064, O23064 +23065, O23065 +23066, O23066 +23067, O23067 +23068, O23068 +23069, O23069 +23070, O23070 +23071, O23071 +23072, O23072 +23073, O23073 +23074, O23074 +23075, O23075 +23076, O23076 +23077, O23077 +23078, O23078 +23079, O23079 +23080, O23080 +23081, O23081 +23082, O23082 +23083, O23083 +23084, O23084 +23085, O23085 +23086, O23086 +23087, O23087 +23088, O23088 +23089, O23089 +23090, O23090 +23091, O23091 +23092, O23092 +23093, O23093 +23094, O23094 +23095, O23095 +23096, O23096 +23097, O23097 +23098, O23098 +23099, O23099 +23100, O23100 +23101, O23101 +23102, O23102 +23103, O23103 +23104, O23104 +23105, O23105 +23106, O23106 +23107, O23107 +23108, O23108 +23109, O23109 +23110, O23110 +23111, O23111 +23112, O23112 +23113, O23113 +23114, O23114 +23115, O23115 +23116, O23116 +23117, O23117 +23118, O23118 +23119, O23119 +23120, O23120 +23121, O23121 +23122, O23122 +23123, O23123 +23124, O23124 +23125, O23125 +23126, O23126 +23127, O23127 +23128, O23128 +23129, O23129 +23130, O23130 +23131, O23131 +23132, O23132 +23133, O23133 +23134, O23134 +23135, O23135 +23136, O23136 +23137, O23137 +23138, O23138 +23139, O23139 +23140, O23140 +23141, O23141 +23142, O23142 +23143, O23143 +23144, O23144 +23145, O23145 +23146, O23146 +23147, O23147 +23148, O23148 +23149, O23149 +23150, O23150 +23151, O23151 +23152, O23152 +23153, O23153 +23154, O23154 +23155, O23155 +23156, O23156 +23157, O23157 +23158, O23158 +23159, O23159 +23160, O23160 +23161, O23161 +23162, O23162 +23163, O23163 +23164, O23164 +23165, O23165 +23166, O23166 +23167, O23167 +23168, O23168 +23169, O23169 +23170, O23170 +23171, O23171 +23172, O23172 +23173, O23173 +23174, O23174 +23175, O23175 +23176, O23176 +23177, O23177 +23178, O23178 +23179, O23179 +23180, O23180 +23181, O23181 +23182, O23182 +23183, O23183 +23184, O23184 +23185, O23185 +23186, O23186 +23187, O23187 +23188, O23188 +23189, O23189 +23190, O23190 +23191, O23191 +23192, O23192 +23193, O23193 +23194, O23194 +23195, O23195 +23196, O23196 +23197, O23197 +23198, O23198 +23199, O23199 +23200, O23200 +23201, O23201 +23202, O23202 +23203, O23203 +23204, O23204 +23205, O23205 +23206, O23206 +23207, O23207 +23208, O23208 +23209, O23209 +23210, O23210 +23211, O23211 +23212, O23212 +23213, O23213 +23214, O23214 +23215, O23215 +23216, O23216 +23217, O23217 +23218, O23218 +23219, O23219 +23220, O23220 +23221, O23221 +23222, O23222 +23223, O23223 +23224, O23224 +23225, O23225 +23226, O23226 +23227, O23227 +23228, O23228 +23229, O23229 +23230, O23230 +23231, O23231 +23232, O23232 +23233, O23233 +23234, O23234 +23235, O23235 +23236, O23236 +23237, O23237 +23238, O23238 +23239, O23239 +23240, O23240 +23241, O23241 +23242, O23242 +23243, O23243 +23244, O23244 +23245, O23245 +23246, O23246 +23247, O23247 +23248, O23248 +23249, O23249 +23250, O23250 +23251, O23251 +23252, O23252 +23253, O23253 +23254, O23254 +23255, O23255 +23256, O23256 +23257, O23257 +23258, O23258 +23259, O23259 +23260, O23260 +23261, O23261 +23262, O23262 +23263, O23263 +23264, O23264 +23265, O23265 +23266, O23266 +23267, O23267 +23268, O23268 +23269, O23269 +23270, O23270 +23271, O23271 +23272, O23272 +23273, O23273 +23274, O23274 +23275, O23275 +23276, O23276 +23277, O23277 +23278, O23278 +23279, O23279 +23280, O23280 +23281, O23281 +23282, O23282 +23283, O23283 +23284, O23284 +23285, O23285 +23286, O23286 +23287, O23287 +23288, O23288 +23289, O23289 +23290, O23290 +23291, O23291 +23292, O23292 +23293, O23293 +23294, O23294 +23295, O23295 +23296, O23296 +23297, O23297 +23298, O23298 +23299, O23299 +23300, O23300 +23301, O23301 +23302, O23302 +23303, O23303 +23304, O23304 +23305, O23305 +23306, O23306 +23307, O23307 +23308, O23308 +23309, O23309 +23310, O23310 +23311, O23311 +23312, O23312 +23313, O23313 +23314, O23314 +23315, O23315 +23316, O23316 +23317, O23317 +23318, O23318 +23319, O23319 +23320, O23320 +23321, O23321 +23322, O23322 +23323, O23323 +23324, O23324 +23325, O23325 +23326, O23326 +23327, O23327 +23328, O23328 +23329, O23329 +23330, O23330 +23331, O23331 +23332, O23332 +23333, O23333 +23334, O23334 +23335, O23335 +23336, O23336 +23337, O23337 +23338, O23338 +23339, O23339 +23340, O23340 +23341, O23341 +23342, O23342 +23343, O23343 +23344, O23344 +23345, O23345 +23346, O23346 +23347, O23347 +23348, O23348 +23349, O23349 +23350, O23350 +23351, O23351 +23352, O23352 +23353, O23353 +23354, O23354 +23355, O23355 +23356, O23356 +23357, O23357 +23358, O23358 +23359, O23359 +23360, O23360 +23361, O23361 +23362, O23362 +23363, O23363 +23364, O23364 +23365, O23365 +23366, O23366 +23367, O23367 +23368, O23368 +23369, O23369 +23370, O23370 +23371, O23371 +23372, O23372 +23373, O23373 +23374, O23374 +23375, O23375 +23376, O23376 +23377, O23377 +23378, O23378 +23379, O23379 +23380, O23380 +23381, O23381 +23382, O23382 +23383, O23383 +23384, O23384 +23385, O23385 +23386, O23386 +23387, O23387 +23388, O23388 +23389, O23389 +23390, O23390 +23391, O23391 +23392, O23392 +23393, O23393 +23394, O23394 +23395, O23395 +23396, O23396 +23397, O23397 +23398, O23398 +23399, O23399 +23400, O23400 +23401, O23401 +23402, O23402 +23403, O23403 +23404, O23404 +23405, O23405 +23406, O23406 +23407, O23407 +23408, O23408 +23409, O23409 +23410, O23410 +23411, O23411 +23412, O23412 +23413, O23413 +23414, O23414 +23415, O23415 +23416, O23416 +23417, O23417 +23418, O23418 +23419, O23419 +23420, O23420 +23421, O23421 +23422, O23422 +23423, O23423 +23424, O23424 +23425, O23425 +23426, O23426 +23427, O23427 +23428, O23428 +23429, O23429 +23430, O23430 +23431, O23431 +23432, O23432 +23433, O23433 +23434, O23434 +23435, O23435 +23436, O23436 +23437, O23437 +23438, O23438 +23439, O23439 +23440, O23440 +23441, O23441 +23442, O23442 +23443, O23443 +23444, O23444 +23445, O23445 +23446, O23446 +23447, O23447 +23448, O23448 +23449, O23449 +23450, O23450 +23451, O23451 +23452, O23452 +23453, O23453 +23454, O23454 +23455, O23455 +23456, O23456 +23457, O23457 +23458, O23458 +23459, O23459 +23460, O23460 +23461, O23461 +23462, O23462 +23463, O23463 +23464, O23464 +23465, O23465 +23466, O23466 +23467, O23467 +23468, O23468 +23469, O23469 +23470, O23470 +23471, O23471 +23472, O23472 +23473, O23473 +23474, O23474 +23475, O23475 +23476, O23476 +23477, O23477 +23478, O23478 +23479, O23479 +23480, O23480 +23481, O23481 +23482, O23482 +23483, O23483 +23484, O23484 +23485, O23485 +23486, O23486 +23487, O23487 +23488, O23488 +23489, O23489 +23490, O23490 +23491, O23491 +23492, O23492 +23493, O23493 +23494, O23494 +23495, O23495 +23496, O23496 +23497, O23497 +23498, O23498 +23499, O23499 +23500, O23500 +23501, O23501 +23502, O23502 +23503, O23503 +23504, O23504 +23505, O23505 +23506, O23506 +23507, O23507 +23508, O23508 +23509, O23509 +23510, O23510 +23511, O23511 +23512, O23512 +23513, O23513 +23514, O23514 +23515, O23515 +23516, O23516 +23517, O23517 +23518, O23518 +23519, O23519 +23520, O23520 +23521, O23521 +23522, O23522 +23523, O23523 +23524, O23524 +23525, O23525 +23526, O23526 +23527, O23527 +23528, O23528 +23529, O23529 +23530, O23530 +23531, O23531 +23532, O23532 +23533, O23533 +23534, O23534 +23535, O23535 +23536, O23536 +23537, O23537 +23538, O23538 +23539, O23539 +23540, O23540 +23541, O23541 +23542, O23542 +23543, O23543 +23544, O23544 +23545, O23545 +23546, O23546 +23547, O23547 +23548, O23548 +23549, O23549 +23550, O23550 +23551, O23551 +23552, O23552 +23553, O23553 +23554, O23554 +23555, O23555 +23556, O23556 +23557, O23557 +23558, O23558 +23559, O23559 +23560, O23560 +23561, O23561 +23562, O23562 +23563, O23563 +23564, O23564 +23565, O23565 +23566, O23566 +23567, O23567 +23568, O23568 +23569, O23569 +23570, O23570 +23571, O23571 +23572, O23572 +23573, O23573 +23574, O23574 +23575, O23575 +23576, O23576 +23577, O23577 +23578, O23578 +23579, O23579 +23580, O23580 +23581, O23581 +23582, O23582 +23583, O23583 +23584, O23584 +23585, O23585 +23586, O23586 +23587, O23587 +23588, O23588 +23589, O23589 +23590, O23590 +23591, O23591 +23592, O23592 +23593, O23593 +23594, O23594 +23595, O23595 +23596, O23596 +23597, O23597 +23598, O23598 +23599, O23599 +23600, O23600 +23601, O23601 +23602, O23602 +23603, O23603 +23604, O23604 +23605, O23605 +23606, O23606 +23607, O23607 +23608, O23608 +23609, O23609 +23610, O23610 +23611, O23611 +23612, O23612 +23613, O23613 +23614, O23614 +23615, O23615 +23616, O23616 +23617, O23617 +23618, O23618 +23619, O23619 +23620, O23620 +23621, O23621 +23622, O23622 +23623, O23623 +23624, O23624 +23625, O23625 +23626, O23626 +23627, O23627 +23628, O23628 +23629, O23629 +23630, O23630 +23631, O23631 +23632, O23632 +23633, O23633 +23634, O23634 +23635, O23635 +23636, O23636 +23637, O23637 +23638, O23638 +23639, O23639 +23640, O23640 +23641, O23641 +23642, O23642 +23643, O23643 +23644, O23644 +23645, O23645 +23646, O23646 +23647, O23647 +23648, O23648 +23649, O23649 +23650, O23650 +23651, O23651 +23652, O23652 +23653, O23653 +23654, O23654 +23655, O23655 +23656, O23656 +23657, O23657 +23658, O23658 +23659, O23659 +23660, O23660 +23661, O23661 +23662, O23662 +23663, O23663 +23664, O23664 +23665, O23665 +23666, O23666 +23667, O23667 +23668, O23668 +23669, O23669 +23670, O23670 +23671, O23671 +23672, O23672 +23673, O23673 +23674, O23674 +23675, O23675 +23676, O23676 +23677, O23677 +23678, O23678 +23679, O23679 +23680, O23680 +23681, O23681 +23682, O23682 +23683, O23683 +23684, O23684 +23685, O23685 +23686, O23686 +23687, O23687 +23688, O23688 +23689, O23689 +23690, O23690 +23691, O23691 +23692, O23692 +23693, O23693 +23694, O23694 +23695, O23695 +23696, O23696 +23697, O23697 +23698, O23698 +23699, O23699 +23700, O23700 +23701, O23701 +23702, O23702 +23703, O23703 +23704, O23704 +23705, O23705 +23706, O23706 +23707, O23707 +23708, O23708 +23709, O23709 +23710, O23710 +23711, O23711 +23712, O23712 +23713, O23713 +23714, O23714 +23715, O23715 +23716, O23716 +23717, O23717 +23718, O23718 +23719, O23719 +23720, O23720 +23721, O23721 +23722, O23722 +23723, O23723 +23724, O23724 +23725, O23725 +23726, O23726 +23727, O23727 +23728, O23728 +23729, O23729 +23730, O23730 +23731, O23731 +23732, O23732 +23733, O23733 +23734, O23734 +23735, O23735 +23736, O23736 +23737, O23737 +23738, O23738 +23739, O23739 +23740, O23740 +23741, O23741 +23742, O23742 +23743, O23743 +23744, O23744 +23745, O23745 +23746, O23746 +23747, O23747 +23748, O23748 +23749, O23749 +23750, O23750 +23751, O23751 +23752, O23752 +23753, O23753 +23754, O23754 +23755, O23755 +23756, O23756 +23757, O23757 +23758, O23758 +23759, O23759 +23760, O23760 +23761, O23761 +23762, O23762 +23763, O23763 +23764, O23764 +23765, O23765 +23766, O23766 +23767, O23767 +23768, O23768 +23769, O23769 +23770, O23770 +23771, O23771 +23772, O23772 +23773, O23773 +23774, O23774 +23775, O23775 +23776, O23776 +23777, O23777 +23778, O23778 +23779, O23779 +23780, O23780 +23781, O23781 +23782, O23782 +23783, O23783 +23784, O23784 +23785, O23785 +23786, O23786 +23787, O23787 +23788, O23788 +23789, O23789 +23790, O23790 +23791, O23791 +23792, O23792 +23793, O23793 +23794, O23794 +23795, O23795 +23796, O23796 +23797, O23797 +23798, O23798 +23799, O23799 +23800, O23800 +23801, O23801 +23802, O23802 +23803, O23803 +23804, O23804 +23805, O23805 +23806, O23806 +23807, O23807 +23808, O23808 +23809, O23809 +23810, O23810 +23811, O23811 +23812, O23812 +23813, O23813 +23814, O23814 +23815, O23815 +23816, O23816 +23817, O23817 +23818, O23818 +23819, O23819 +23820, O23820 +23821, O23821 +23822, O23822 +23823, O23823 +23824, O23824 +23825, O23825 +23826, O23826 +23827, O23827 +23828, O23828 +23829, O23829 +23830, O23830 +23831, O23831 +23832, O23832 +23833, O23833 +23834, O23834 +23835, O23835 +23836, O23836 +23837, O23837 +23838, O23838 +23839, O23839 +23840, O23840 +23841, O23841 +23842, O23842 +23843, O23843 +23844, O23844 +23845, O23845 +23846, O23846 +23847, O23847 +23848, O23848 +23849, O23849 +23850, O23850 +23851, O23851 +23852, O23852 +23853, O23853 +23854, O23854 +23855, O23855 +23856, O23856 +23857, O23857 +23858, O23858 +23859, O23859 +23860, O23860 +23861, O23861 +23862, O23862 +23863, O23863 +23864, O23864 +23865, O23865 +23866, O23866 +23867, O23867 +23868, O23868 +23869, O23869 +23870, O23870 +23871, O23871 +23872, O23872 +23873, O23873 +23874, O23874 +23875, O23875 +23876, O23876 +23877, O23877 +23878, O23878 +23879, O23879 +23880, O23880 +23881, O23881 +23882, O23882 +23883, O23883 +23884, O23884 +23885, O23885 +23886, O23886 +23887, O23887 +23888, O23888 +23889, O23889 +23890, O23890 +23891, O23891 +23892, O23892 +23893, O23893 +23894, O23894 +23895, O23895 +23896, O23896 +23897, O23897 +23898, O23898 +23899, O23899 +23900, O23900 +23901, O23901 +23902, O23902 +23903, O23903 +23904, O23904 +23905, O23905 +23906, O23906 +23907, O23907 +23908, O23908 +23909, O23909 +23910, O23910 +23911, O23911 +23912, O23912 +23913, O23913 +23914, O23914 +23915, O23915 +23916, O23916 +23917, O23917 +23918, O23918 +23919, O23919 +23920, O23920 +23921, O23921 +23922, O23922 +23923, O23923 +23924, O23924 +23925, O23925 +23926, O23926 +23927, O23927 +23928, O23928 +23929, O23929 +23930, O23930 +23931, O23931 +23932, O23932 +23933, O23933 +23934, O23934 +23935, O23935 +23936, O23936 +23937, O23937 +23938, O23938 +23939, O23939 +23940, O23940 +23941, O23941 +23942, O23942 +23943, O23943 +23944, O23944 +23945, O23945 +23946, O23946 +23947, O23947 +23948, O23948 +23949, O23949 +23950, O23950 +23951, O23951 +23952, O23952 +23953, O23953 +23954, O23954 +23955, O23955 +23956, O23956 +23957, O23957 +23958, O23958 +23959, O23959 +23960, O23960 +23961, O23961 +23962, O23962 +23963, O23963 +23964, O23964 +23965, O23965 +23966, O23966 +23967, O23967 +23968, O23968 +23969, O23969 +23970, O23970 +23971, O23971 +23972, O23972 +23973, O23973 +23974, O23974 +23975, O23975 +23976, O23976 +23977, O23977 +23978, O23978 +23979, O23979 +23980, O23980 +23981, O23981 +23982, O23982 +23983, O23983 +23984, O23984 +23985, O23985 +23986, O23986 +23987, O23987 +23988, O23988 +23989, O23989 +23990, O23990 +23991, O23991 +23992, O23992 +23993, O23993 +23994, O23994 +23995, O23995 +23996, O23996 +23997, O23997 +23998, O23998 +23999, O23999 +24000, O24000 +24001, O24001 +24002, O24002 +24003, O24003 +24004, O24004 +24005, O24005 +24006, O24006 +24007, O24007 +24008, O24008 +24009, O24009 +24010, O24010 +24011, O24011 +24012, O24012 +24013, O24013 +24014, O24014 +24015, O24015 +24016, O24016 +24017, O24017 +24018, O24018 +24019, O24019 +24020, O24020 +24021, O24021 +24022, O24022 +24023, O24023 +24024, O24024 +24025, O24025 +24026, O24026 +24027, O24027 +24028, O24028 +24029, O24029 +24030, O24030 +24031, O24031 +24032, O24032 +24033, O24033 +24034, O24034 +24035, O24035 +24036, O24036 +24037, O24037 +24038, O24038 +24039, O24039 +24040, O24040 +24041, O24041 +24042, O24042 +24043, O24043 +24044, O24044 +24045, O24045 +24046, O24046 +24047, O24047 +24048, O24048 +24049, O24049 +24050, O24050 +24051, O24051 +24052, O24052 +24053, O24053 +24054, O24054 +24055, O24055 +24056, O24056 +24057, O24057 +24058, O24058 +24059, O24059 +24060, O24060 +24061, O24061 +24062, O24062 +24063, O24063 +24064, O24064 +24065, O24065 +24066, O24066 +24067, O24067 +24068, O24068 +24069, O24069 +24070, O24070 +24071, O24071 +24072, O24072 +24073, O24073 +24074, O24074 +24075, O24075 +24076, O24076 +24077, O24077 +24078, O24078 +24079, O24079 +24080, O24080 +24081, O24081 +24082, O24082 +24083, O24083 +24084, O24084 +24085, O24085 +24086, O24086 +24087, O24087 +24088, O24088 +24089, O24089 +24090, O24090 +24091, O24091 +24092, O24092 +24093, O24093 +24094, O24094 +24095, O24095 +24096, O24096 +24097, O24097 +24098, O24098 +24099, O24099 +24100, O24100 +24101, O24101 +24102, O24102 +24103, O24103 +24104, O24104 +24105, O24105 +24106, O24106 +24107, O24107 +24108, O24108 +24109, O24109 +24110, O24110 +24111, O24111 +24112, O24112 +24113, O24113 +24114, O24114 +24115, O24115 +24116, O24116 +24117, O24117 +24118, O24118 +24119, O24119 +24120, O24120 +24121, O24121 +24122, O24122 +24123, O24123 +24124, O24124 +24125, O24125 +24126, O24126 +24127, O24127 +24128, O24128 +24129, O24129 +24130, O24130 +24131, O24131 +24132, O24132 +24133, O24133 +24134, O24134 +24135, O24135 +24136, O24136 +24137, O24137 +24138, O24138 +24139, O24139 +24140, O24140 +24141, O24141 +24142, O24142 +24143, O24143 +24144, O24144 +24145, O24145 +24146, O24146 +24147, O24147 +24148, O24148 +24149, O24149 +24150, O24150 +24151, O24151 +24152, O24152 +24153, O24153 +24154, O24154 +24155, O24155 +24156, O24156 +24157, O24157 +24158, O24158 +24159, O24159 +24160, O24160 +24161, O24161 +24162, O24162 +24163, O24163 +24164, O24164 +24165, O24165 +24166, O24166 +24167, O24167 +24168, O24168 +24169, O24169 +24170, O24170 +24171, O24171 +24172, O24172 +24173, O24173 +24174, O24174 +24175, O24175 +24176, O24176 +24177, O24177 +24178, O24178 +24179, O24179 +24180, O24180 +24181, O24181 +24182, O24182 +24183, O24183 +24184, O24184 +24185, O24185 +24186, O24186 +24187, O24187 +24188, O24188 +24189, O24189 +24190, O24190 +24191, O24191 +24192, O24192 +24193, O24193 +24194, O24194 +24195, O24195 +24196, O24196 +24197, O24197 +24198, O24198 +24199, O24199 +24200, O24200 +24201, O24201 +24202, O24202 +24203, O24203 +24204, O24204 +24205, O24205 +24206, O24206 +24207, O24207 +24208, O24208 +24209, O24209 +24210, O24210 +24211, O24211 +24212, O24212 +24213, O24213 +24214, O24214 +24215, O24215 +24216, O24216 +24217, O24217 +24218, O24218 +24219, O24219 +24220, O24220 +24221, O24221 +24222, O24222 +24223, O24223 +24224, O24224 +24225, O24225 +24226, O24226 +24227, O24227 +24228, O24228 +24229, O24229 +24230, O24230 +24231, O24231 +24232, O24232 +24233, O24233 +24234, O24234 +24235, O24235 +24236, O24236 +24237, O24237 +24238, O24238 +24239, O24239 +24240, O24240 +24241, O24241 +24242, O24242 +24243, O24243 +24244, O24244 +24245, O24245 +24246, O24246 +24247, O24247 +24248, O24248 +24249, O24249 +24250, O24250 +24251, O24251 +24252, O24252 +24253, O24253 +24254, O24254 +24255, O24255 +24256, O24256 +24257, O24257 +24258, O24258 +24259, O24259 +24260, O24260 +24261, O24261 +24262, O24262 +24263, O24263 +24264, O24264 +24265, O24265 +24266, O24266 +24267, O24267 +24268, O24268 +24269, O24269 +24270, O24270 +24271, O24271 +24272, O24272 +24273, O24273 +24274, O24274 +24275, O24275 +24276, O24276 +24277, O24277 +24278, O24278 +24279, O24279 +24280, O24280 +24281, O24281 +24282, O24282 +24283, O24283 +24284, O24284 +24285, O24285 +24286, O24286 +24287, O24287 +24288, O24288 +24289, O24289 +24290, O24290 +24291, O24291 +24292, O24292 +24293, O24293 +24294, O24294 +24295, O24295 +24296, O24296 +24297, O24297 +24298, O24298 +24299, O24299 +24300, O24300 +24301, O24301 +24302, O24302 +24303, O24303 +24304, O24304 +24305, O24305 +24306, O24306 +24307, O24307 +24308, O24308 +24309, O24309 +24310, O24310 +24311, O24311 +24312, O24312 +24313, O24313 +24314, O24314 +24315, O24315 +24316, O24316 +24317, O24317 +24318, O24318 +24319, O24319 +24320, O24320 +24321, O24321 +24322, O24322 +24323, O24323 +24324, O24324 +24325, O24325 +24326, O24326 +24327, O24327 +24328, O24328 +24329, O24329 +24330, O24330 +24331, O24331 +24332, O24332 +24333, O24333 +24334, O24334 +24335, O24335 +24336, O24336 +24337, O24337 +24338, O24338 +24339, O24339 +24340, O24340 +24341, O24341 +24342, O24342 +24343, O24343 +24344, O24344 +24345, O24345 +24346, O24346 +24347, O24347 +24348, O24348 +24349, O24349 +24350, O24350 +24351, O24351 +24352, O24352 +24353, O24353 +24354, O24354 +24355, O24355 +24356, O24356 +24357, O24357 +24358, O24358 +24359, O24359 +24360, O24360 +24361, O24361 +24362, O24362 +24363, O24363 +24364, O24364 +24365, O24365 +24366, O24366 +24367, O24367 +24368, O24368 +24369, O24369 +24370, O24370 +24371, O24371 +24372, O24372 +24373, O24373 +24374, O24374 +24375, O24375 +24376, O24376 +24377, O24377 +24378, O24378 +24379, O24379 +24380, O24380 +24381, O24381 +24382, O24382 +24383, O24383 +24384, O24384 +24385, O24385 +24386, O24386 +24387, O24387 +24388, O24388 +24389, O24389 +24390, O24390 +24391, O24391 +24392, O24392 +24393, O24393 +24394, O24394 +24395, O24395 +24396, O24396 +24397, O24397 +24398, O24398 +24399, O24399 +24400, O24400 +24401, O24401 +24402, O24402 +24403, O24403 +24404, O24404 +24405, O24405 +24406, O24406 +24407, O24407 +24408, O24408 +24409, O24409 +24410, O24410 +24411, O24411 +24412, O24412 +24413, O24413 +24414, O24414 +24415, O24415 +24416, O24416 +24417, O24417 +24418, O24418 +24419, O24419 +24420, O24420 +24421, O24421 +24422, O24422 +24423, O24423 +24424, O24424 +24425, O24425 +24426, O24426 +24427, O24427 +24428, O24428 +24429, O24429 +24430, O24430 +24431, O24431 +24432, O24432 +24433, O24433 +24434, O24434 +24435, O24435 +24436, O24436 +24437, O24437 +24438, O24438 +24439, O24439 +24440, O24440 +24441, O24441 +24442, O24442 +24443, O24443 +24444, O24444 +24445, O24445 +24446, O24446 +24447, O24447 +24448, O24448 +24449, O24449 +24450, O24450 +24451, O24451 +24452, O24452 +24453, O24453 +24454, O24454 +24455, O24455 +24456, O24456 +24457, O24457 +24458, O24458 +24459, O24459 +24460, O24460 +24461, O24461 +24462, O24462 +24463, O24463 +24464, O24464 +24465, O24465 +24466, O24466 +24467, O24467 +24468, O24468 +24469, O24469 +24470, O24470 +24471, O24471 +24472, O24472 +24473, O24473 +24474, O24474 +24475, O24475 +24476, O24476 +24477, O24477 +24478, O24478 +24479, O24479 +24480, O24480 +24481, O24481 +24482, O24482 +24483, O24483 +24484, O24484 +24485, O24485 +24486, O24486 +24487, O24487 +24488, O24488 +24489, O24489 +24490, O24490 +24491, O24491 +24492, O24492 +24493, O24493 +24494, O24494 +24495, O24495 +24496, O24496 +24497, O24497 +24498, O24498 +24499, O24499 +24500, O24500 +24501, O24501 +24502, O24502 +24503, O24503 +24504, O24504 +24505, O24505 +24506, O24506 +24507, O24507 +24508, O24508 +24509, O24509 +24510, O24510 +24511, O24511 +24512, O24512 +24513, O24513 +24514, O24514 +24515, O24515 +24516, O24516 +24517, O24517 +24518, O24518 +24519, O24519 +24520, O24520 +24521, O24521 +24522, O24522 +24523, O24523 +24524, O24524 +24525, O24525 +24526, O24526 +24527, O24527 +24528, O24528 +24529, O24529 +24530, O24530 +24531, O24531 +24532, O24532 +24533, O24533 +24534, O24534 +24535, O24535 +24536, O24536 +24537, O24537 +24538, O24538 +24539, O24539 +24540, O24540 +24541, O24541 +24542, O24542 +24543, O24543 +24544, O24544 +24545, O24545 +24546, O24546 +24547, O24547 +24548, O24548 +24549, O24549 +24550, O24550 +24551, O24551 +24552, O24552 +24553, O24553 +24554, O24554 +24555, O24555 +24556, O24556 +24557, O24557 +24558, O24558 +24559, O24559 +24560, O24560 +24561, O24561 +24562, O24562 +24563, O24563 +24564, O24564 +24565, O24565 +24566, O24566 +24567, O24567 +24568, O24568 +24569, O24569 +24570, O24570 +24571, O24571 +24572, O24572 +24573, O24573 +24574, O24574 +24575, O24575 +24576, O24576 +24577, O24577 +24578, O24578 +24579, O24579 +24580, O24580 +24581, O24581 +24582, O24582 +24583, O24583 +24584, O24584 +24585, O24585 +24586, O24586 +24587, O24587 +24588, O24588 +24589, O24589 +24590, O24590 +24591, O24591 +24592, O24592 +24593, O24593 +24594, O24594 +24595, O24595 +24596, O24596 +24597, O24597 +24598, O24598 +24599, O24599 +24600, O24600 +24601, O24601 +24602, O24602 +24603, O24603 +24604, O24604 +24605, O24605 +24606, O24606 +24607, O24607 +24608, O24608 +24609, O24609 +24610, O24610 +24611, O24611 +24612, O24612 +24613, O24613 +24614, O24614 +24615, O24615 +24616, O24616 +24617, O24617 +24618, O24618 +24619, O24619 +24620, O24620 +24621, O24621 +24622, O24622 +24623, O24623 +24624, O24624 +24625, O24625 +24626, O24626 +24627, O24627 +24628, O24628 +24629, O24629 +24630, O24630 +24631, O24631 +24632, O24632 +24633, O24633 +24634, O24634 +24635, O24635 +24636, O24636 +24637, O24637 +24638, O24638 +24639, O24639 +24640, O24640 +24641, O24641 +24642, O24642 +24643, O24643 +24644, O24644 +24645, O24645 +24646, O24646 +24647, O24647 +24648, O24648 +24649, O24649 +24650, O24650 +24651, O24651 +24652, O24652 +24653, O24653 +24654, O24654 +24655, O24655 +24656, O24656 +24657, O24657 +24658, O24658 +24659, O24659 +24660, O24660 +24661, O24661 +24662, O24662 +24663, O24663 +24664, O24664 +24665, O24665 +24666, O24666 +24667, O24667 +24668, O24668 +24669, O24669 +24670, O24670 +24671, O24671 +24672, O24672 +24673, O24673 +24674, O24674 +24675, O24675 +24676, O24676 +24677, O24677 +24678, O24678 +24679, O24679 +24680, O24680 +24681, O24681 +24682, O24682 +24683, O24683 +24684, O24684 +24685, O24685 +24686, O24686 +24687, O24687 +24688, O24688 +24689, O24689 +24690, O24690 +24691, O24691 +24692, O24692 +24693, O24693 +24694, O24694 +24695, O24695 +24696, O24696 +24697, O24697 +24698, O24698 +24699, O24699 +24700, O24700 +24701, O24701 +24702, O24702 +24703, O24703 +24704, O24704 +24705, O24705 +24706, O24706 +24707, O24707 +24708, O24708 +24709, O24709 +24710, O24710 +24711, O24711 +24712, O24712 +24713, O24713 +24714, O24714 +24715, O24715 +24716, O24716 +24717, O24717 +24718, O24718 +24719, O24719 +24720, O24720 +24721, O24721 +24722, O24722 +24723, O24723 +24724, O24724 +24725, O24725 +24726, O24726 +24727, O24727 +24728, O24728 +24729, O24729 +24730, O24730 +24731, O24731 +24732, O24732 +24733, O24733 +24734, O24734 +24735, O24735 +24736, O24736 +24737, O24737 +24738, O24738 +24739, O24739 +24740, O24740 +24741, O24741 +24742, O24742 +24743, O24743 +24744, O24744 +24745, O24745 +24746, O24746 +24747, O24747 +24748, O24748 +24749, O24749 +24750, O24750 +24751, O24751 +24752, O24752 +24753, O24753 +24754, O24754 +24755, O24755 +24756, O24756 +24757, O24757 +24758, O24758 +24759, O24759 +24760, O24760 +24761, O24761 +24762, O24762 +24763, O24763 +24764, O24764 +24765, O24765 +24766, O24766 +24767, O24767 +24768, O24768 +24769, O24769 +24770, O24770 +24771, O24771 +24772, O24772 +24773, O24773 +24774, O24774 +24775, O24775 +24776, O24776 +24777, O24777 +24778, O24778 +24779, O24779 +24780, O24780 +24781, O24781 +24782, O24782 +24783, O24783 +24784, O24784 +24785, O24785 +24786, O24786 +24787, O24787 +24788, O24788 +24789, O24789 +24790, O24790 +24791, O24791 +24792, O24792 +24793, O24793 +24794, O24794 +24795, O24795 +24796, O24796 +24797, O24797 +24798, O24798 +24799, O24799 +24800, O24800 +24801, O24801 +24802, O24802 +24803, O24803 +24804, O24804 +24805, O24805 +24806, O24806 +24807, O24807 +24808, O24808 +24809, O24809 +24810, O24810 +24811, O24811 +24812, O24812 +24813, O24813 +24814, O24814 +24815, O24815 +24816, O24816 +24817, O24817 +24818, O24818 +24819, O24819 +24820, O24820 +24821, O24821 +24822, O24822 +24823, O24823 +24824, O24824 +24825, O24825 +24826, O24826 +24827, O24827 +24828, O24828 +24829, O24829 +24830, O24830 +24831, O24831 +24832, O24832 +24833, O24833 +24834, O24834 +24835, O24835 +24836, O24836 +24837, O24837 +24838, O24838 +24839, O24839 +24840, O24840 +24841, O24841 +24842, O24842 +24843, O24843 +24844, O24844 +24845, O24845 +24846, O24846 +24847, O24847 +24848, O24848 +24849, O24849 +24850, O24850 +24851, O24851 +24852, O24852 +24853, O24853 +24854, O24854 +24855, O24855 +24856, O24856 +24857, O24857 +24858, O24858 +24859, O24859 +24860, O24860 +24861, O24861 +24862, O24862 +24863, O24863 +24864, O24864 +24865, O24865 +24866, O24866 +24867, O24867 +24868, O24868 +24869, O24869 +24870, O24870 +24871, O24871 +24872, O24872 +24873, O24873 +24874, O24874 +24875, O24875 +24876, O24876 +24877, O24877 +24878, O24878 +24879, O24879 +24880, O24880 +24881, O24881 +24882, O24882 +24883, O24883 +24884, O24884 +24885, O24885 +24886, O24886 +24887, O24887 +24888, O24888 +24889, O24889 +24890, O24890 +24891, O24891 +24892, O24892 +24893, O24893 +24894, O24894 +24895, O24895 +24896, O24896 +24897, O24897 +24898, O24898 +24899, O24899 +24900, O24900 +24901, O24901 +24902, O24902 +24903, O24903 +24904, O24904 +24905, O24905 +24906, O24906 +24907, O24907 +24908, O24908 +24909, O24909 +24910, O24910 +24911, O24911 +24912, O24912 +24913, O24913 +24914, O24914 +24915, O24915 +24916, O24916 +24917, O24917 +24918, O24918 +24919, O24919 +24920, O24920 +24921, O24921 +24922, O24922 +24923, O24923 +24924, O24924 +24925, O24925 +24926, O24926 +24927, O24927 +24928, O24928 +24929, O24929 +24930, O24930 +24931, O24931 +24932, O24932 +24933, O24933 +24934, O24934 +24935, O24935 +24936, O24936 +24937, O24937 +24938, O24938 +24939, O24939 +24940, O24940 +24941, O24941 +24942, O24942 +24943, O24943 +24944, O24944 +24945, O24945 +24946, O24946 +24947, O24947 +24948, O24948 +24949, O24949 +24950, O24950 +24951, O24951 +24952, O24952 +24953, O24953 +24954, O24954 +24955, O24955 +24956, O24956 +24957, O24957 +24958, O24958 +24959, O24959 +24960, O24960 +24961, O24961 +24962, O24962 +24963, O24963 +24964, O24964 +24965, O24965 +24966, O24966 +24967, O24967 +24968, O24968 +24969, O24969 +24970, O24970 +24971, O24971 +24972, O24972 +24973, O24973 +24974, O24974 +24975, O24975 +24976, O24976 +24977, O24977 +24978, O24978 +24979, O24979 +24980, O24980 +24981, O24981 +24982, O24982 +24983, O24983 +24984, O24984 +24985, O24985 +24986, O24986 +24987, O24987 +24988, O24988 +24989, O24989 +24990, O24990 +24991, O24991 +24992, O24992 +24993, O24993 +24994, O24994 +24995, O24995 +24996, O24996 +24997, O24997 +24998, O24998 +24999, O24999 +25000, O25000 +25001, O25001 +25002, O25002 +25003, O25003 +25004, O25004 +25005, O25005 +25006, O25006 +25007, O25007 +25008, O25008 +25009, O25009 +25010, O25010 +25011, O25011 +25012, O25012 +25013, O25013 +25014, O25014 +25015, O25015 +25016, O25016 +25017, O25017 +25018, O25018 +25019, O25019 +25020, O25020 +25021, O25021 +25022, O25022 +25023, O25023 +25024, O25024 +25025, O25025 +25026, O25026 +25027, O25027 +25028, O25028 +25029, O25029 +25030, O25030 +25031, O25031 +25032, O25032 +25033, O25033 +25034, O25034 +25035, O25035 +25036, O25036 +25037, O25037 +25038, O25038 +25039, O25039 +25040, O25040 +25041, O25041 +25042, O25042 +25043, O25043 +25044, O25044 +25045, O25045 +25046, O25046 +25047, O25047 +25048, O25048 +25049, O25049 +25050, O25050 +25051, O25051 +25052, O25052 +25053, O25053 +25054, O25054 +25055, O25055 +25056, O25056 +25057, O25057 +25058, O25058 +25059, O25059 +25060, O25060 +25061, O25061 +25062, O25062 +25063, O25063 +25064, O25064 +25065, O25065 +25066, O25066 +25067, O25067 +25068, O25068 +25069, O25069 +25070, O25070 +25071, O25071 +25072, O25072 +25073, O25073 +25074, O25074 +25075, O25075 +25076, O25076 +25077, O25077 +25078, O25078 +25079, O25079 +25080, O25080 +25081, O25081 +25082, O25082 +25083, O25083 +25084, O25084 +25085, O25085 +25086, O25086 +25087, O25087 +25088, O25088 +25089, O25089 +25090, O25090 +25091, O25091 +25092, O25092 +25093, O25093 +25094, O25094 +25095, O25095 +25096, O25096 +25097, O25097 +25098, O25098 +25099, O25099 +25100, O25100 +25101, O25101 +25102, O25102 +25103, O25103 +25104, O25104 +25105, O25105 +25106, O25106 +25107, O25107 +25108, O25108 +25109, O25109 +25110, O25110 +25111, O25111 +25112, O25112 +25113, O25113 +25114, O25114 +25115, O25115 +25116, O25116 +25117, O25117 +25118, O25118 +25119, O25119 +25120, O25120 +25121, O25121 +25122, O25122 +25123, O25123 +25124, O25124 +25125, O25125 +25126, O25126 +25127, O25127 +25128, O25128 +25129, O25129 +25130, O25130 +25131, O25131 +25132, O25132 +25133, O25133 +25134, O25134 +25135, O25135 +25136, O25136 +25137, O25137 +25138, O25138 +25139, O25139 +25140, O25140 +25141, O25141 +25142, O25142 +25143, O25143 +25144, O25144 +25145, O25145 +25146, O25146 +25147, O25147 +25148, O25148 +25149, O25149 +25150, O25150 +25151, O25151 +25152, O25152 +25153, O25153 +25154, O25154 +25155, O25155 +25156, O25156 +25157, O25157 +25158, O25158 +25159, O25159 +25160, O25160 +25161, O25161 +25162, O25162 +25163, O25163 +25164, O25164 +25165, O25165 +25166, O25166 +25167, O25167 +25168, O25168 +25169, O25169 +25170, O25170 +25171, O25171 +25172, O25172 +25173, O25173 +25174, O25174 +25175, O25175 +25176, O25176 +25177, O25177 +25178, O25178 +25179, O25179 +25180, O25180 +25181, O25181 +25182, O25182 +25183, O25183 +25184, O25184 +25185, O25185 +25186, O25186 +25187, O25187 +25188, O25188 +25189, O25189 +25190, O25190 +25191, O25191 +25192, O25192 +25193, O25193 +25194, O25194 +25195, O25195 +25196, O25196 +25197, O25197 +25198, O25198 +25199, O25199 +25200, O25200 +25201, O25201 +25202, O25202 +25203, O25203 +25204, O25204 +25205, O25205 +25206, O25206 +25207, O25207 +25208, O25208 +25209, O25209 +25210, O25210 +25211, O25211 +25212, O25212 +25213, O25213 +25214, O25214 +25215, O25215 +25216, O25216 +25217, O25217 +25218, O25218 +25219, O25219 +25220, O25220 +25221, O25221 +25222, O25222 +25223, O25223 +25224, O25224 +25225, O25225 +25226, O25226 +25227, O25227 +25228, O25228 +25229, O25229 +25230, O25230 +25231, O25231 +25232, O25232 +25233, O25233 +25234, O25234 +25235, O25235 +25236, O25236 +25237, O25237 +25238, O25238 +25239, O25239 +25240, O25240 +25241, O25241 +25242, O25242 +25243, O25243 +25244, O25244 +25245, O25245 +25246, O25246 +25247, O25247 +25248, O25248 +25249, O25249 +25250, O25250 +25251, O25251 +25252, O25252 +25253, O25253 +25254, O25254 +25255, O25255 +25256, O25256 +25257, O25257 +25258, O25258 +25259, O25259 +25260, O25260 +25261, O25261 +25262, O25262 +25263, O25263 +25264, O25264 +25265, O25265 +25266, O25266 +25267, O25267 +25268, O25268 +25269, O25269 +25270, O25270 +25271, O25271 +25272, O25272 +25273, O25273 +25274, O25274 +25275, O25275 +25276, O25276 +25277, O25277 +25278, O25278 +25279, O25279 +25280, O25280 +25281, O25281 +25282, O25282 +25283, O25283 +25284, O25284 +25285, O25285 +25286, O25286 +25287, O25287 +25288, O25288 +25289, O25289 +25290, O25290 +25291, O25291 +25292, O25292 +25293, O25293 +25294, O25294 +25295, O25295 +25296, O25296 +25297, O25297 +25298, O25298 +25299, O25299 +25300, O25300 +25301, O25301 +25302, O25302 +25303, O25303 +25304, O25304 +25305, O25305 +25306, O25306 +25307, O25307 +25308, O25308 +25309, O25309 +25310, O25310 +25311, O25311 +25312, O25312 +25313, O25313 +25314, O25314 +25315, O25315 +25316, O25316 +25317, O25317 +25318, O25318 +25319, O25319 +25320, O25320 +25321, O25321 +25322, O25322 +25323, O25323 +25324, O25324 +25325, O25325 +25326, O25326 +25327, O25327 +25328, O25328 +25329, O25329 +25330, O25330 +25331, O25331 +25332, O25332 +25333, O25333 +25334, O25334 +25335, O25335 +25336, O25336 +25337, O25337 +25338, O25338 +25339, O25339 +25340, O25340 +25341, O25341 +25342, O25342 +25343, O25343 +25344, O25344 +25345, O25345 +25346, O25346 +25347, O25347 +25348, O25348 +25349, O25349 +25350, O25350 +25351, O25351 +25352, O25352 +25353, O25353 +25354, O25354 +25355, O25355 +25356, O25356 +25357, O25357 +25358, O25358 +25359, O25359 +25360, O25360 +25361, O25361 +25362, O25362 +25363, O25363 +25364, O25364 +25365, O25365 +25366, O25366 +25367, O25367 +25368, O25368 +25369, O25369 +25370, O25370 +25371, O25371 +25372, O25372 +25373, O25373 +25374, O25374 +25375, O25375 +25376, O25376 +25377, O25377 +25378, O25378 +25379, O25379 +25380, O25380 +25381, O25381 +25382, O25382 +25383, O25383 +25384, O25384 +25385, O25385 +25386, O25386 +25387, O25387 +25388, O25388 +25389, O25389 +25390, O25390 +25391, O25391 +25392, O25392 +25393, O25393 +25394, O25394 +25395, O25395 +25396, O25396 +25397, O25397 +25398, O25398 +25399, O25399 +25400, O25400 +25401, O25401 +25402, O25402 +25403, O25403 +25404, O25404 +25405, O25405 +25406, O25406 +25407, O25407 +25408, O25408 +25409, O25409 +25410, O25410 +25411, O25411 +25412, O25412 +25413, O25413 +25414, O25414 +25415, O25415 +25416, O25416 +25417, O25417 +25418, O25418 +25419, O25419 +25420, O25420 +25421, O25421 +25422, O25422 +25423, O25423 +25424, O25424 +25425, O25425 +25426, O25426 +25427, O25427 +25428, O25428 +25429, O25429 +25430, O25430 +25431, O25431 +25432, O25432 +25433, O25433 +25434, O25434 +25435, O25435 +25436, O25436 +25437, O25437 +25438, O25438 +25439, O25439 +25440, O25440 +25441, O25441 +25442, O25442 +25443, O25443 +25444, O25444 +25445, O25445 +25446, O25446 +25447, O25447 +25448, O25448 +25449, O25449 +25450, O25450 +25451, O25451 +25452, O25452 +25453, O25453 +25454, O25454 +25455, O25455 +25456, O25456 +25457, O25457 +25458, O25458 +25459, O25459 +25460, O25460 +25461, O25461 +25462, O25462 +25463, O25463 +25464, O25464 +25465, O25465 +25466, O25466 +25467, O25467 +25468, O25468 +25469, O25469 +25470, O25470 +25471, O25471 +25472, O25472 +25473, O25473 +25474, O25474 +25475, O25475 +25476, O25476 +25477, O25477 +25478, O25478 +25479, O25479 +25480, O25480 +25481, O25481 +25482, O25482 +25483, O25483 +25484, O25484 +25485, O25485 +25486, O25486 +25487, O25487 +25488, O25488 +25489, O25489 +25490, O25490 +25491, O25491 +25492, O25492 +25493, O25493 +25494, O25494 +25495, O25495 +25496, O25496 +25497, O25497 +25498, O25498 +25499, O25499 +25500, O25500 +25501, O25501 +25502, O25502 +25503, O25503 +25504, O25504 +25505, O25505 +25506, O25506 +25507, O25507 +25508, O25508 +25509, O25509 +25510, O25510 +25511, O25511 +25512, O25512 +25513, O25513 +25514, O25514 +25515, O25515 +25516, O25516 +25517, O25517 +25518, O25518 +25519, O25519 +25520, O25520 +25521, O25521 +25522, O25522 +25523, O25523 +25524, O25524 +25525, O25525 +25526, O25526 +25527, O25527 +25528, O25528 +25529, O25529 +25530, O25530 +25531, O25531 +25532, O25532 +25533, O25533 +25534, O25534 +25535, O25535 +25536, O25536 +25537, O25537 +25538, O25538 +25539, O25539 +25540, O25540 +25541, O25541 +25542, O25542 +25543, O25543 +25544, O25544 +25545, O25545 +25546, O25546 +25547, O25547 +25548, O25548 +25549, O25549 +25550, O25550 +25551, O25551 +25552, O25552 +25553, O25553 +25554, O25554 +25555, O25555 +25556, O25556 +25557, O25557 +25558, O25558 +25559, O25559 +25560, O25560 +25561, O25561 +25562, O25562 +25563, O25563 +25564, O25564 +25565, O25565 +25566, O25566 +25567, O25567 +25568, O25568 +25569, O25569 +25570, O25570 +25571, O25571 +25572, O25572 +25573, O25573 +25574, O25574 +25575, O25575 +25576, O25576 +25577, O25577 +25578, O25578 +25579, O25579 +25580, O25580 +25581, O25581 +25582, O25582 +25583, O25583 +25584, O25584 +25585, O25585 +25586, O25586 +25587, O25587 +25588, O25588 +25589, O25589 +25590, O25590 +25591, O25591 +25592, O25592 +25593, O25593 +25594, O25594 +25595, O25595 +25596, O25596 +25597, O25597 +25598, O25598 +25599, O25599 +25600, O25600 +25601, O25601 +25602, O25602 +25603, O25603 +25604, O25604 +25605, O25605 +25606, O25606 +25607, O25607 +25608, O25608 +25609, O25609 +25610, O25610 +25611, O25611 +25612, O25612 +25613, O25613 +25614, O25614 +25615, O25615 +25616, O25616 +25617, O25617 +25618, O25618 +25619, O25619 +25620, O25620 +25621, O25621 +25622, O25622 +25623, O25623 +25624, O25624 +25625, O25625 +25626, O25626 +25627, O25627 +25628, O25628 +25629, O25629 +25630, O25630 +25631, O25631 +25632, O25632 +25633, O25633 +25634, O25634 +25635, O25635 +25636, O25636 +25637, O25637 +25638, O25638 +25639, O25639 +25640, O25640 +25641, O25641 +25642, O25642 +25643, O25643 +25644, O25644 +25645, O25645 +25646, O25646 +25647, O25647 +25648, O25648 +25649, O25649 +25650, O25650 +25651, O25651 +25652, O25652 +25653, O25653 +25654, O25654 +25655, O25655 +25656, O25656 +25657, O25657 +25658, O25658 +25659, O25659 +25660, O25660 +25661, O25661 +25662, O25662 +25663, O25663 +25664, O25664 +25665, O25665 +25666, O25666 +25667, O25667 +25668, O25668 +25669, O25669 +25670, O25670 +25671, O25671 +25672, O25672 +25673, O25673 +25674, O25674 +25675, O25675 +25676, O25676 +25677, O25677 +25678, O25678 +25679, O25679 +25680, O25680 +25681, O25681 +25682, O25682 +25683, O25683 +25684, O25684 +25685, O25685 +25686, O25686 +25687, O25687 +25688, O25688 +25689, O25689 +25690, O25690 +25691, O25691 +25692, O25692 +25693, O25693 +25694, O25694 +25695, O25695 +25696, O25696 +25697, O25697 +25698, O25698 +25699, O25699 +25700, O25700 +25701, O25701 +25702, O25702 +25703, O25703 +25704, O25704 +25705, O25705 +25706, O25706 +25707, O25707 +25708, O25708 +25709, O25709 +25710, O25710 +25711, O25711 +25712, O25712 +25713, O25713 +25714, O25714 +25715, O25715 +25716, O25716 +25717, O25717 +25718, O25718 +25719, O25719 +25720, O25720 +25721, O25721 +25722, O25722 +25723, O25723 +25724, O25724 +25725, O25725 +25726, O25726 +25727, O25727 +25728, O25728 +25729, O25729 +25730, O25730 +25731, O25731 +25732, O25732 +25733, O25733 +25734, O25734 +25735, O25735 +25736, O25736 +25737, O25737 +25738, O25738 +25739, O25739 +25740, O25740 +25741, O25741 +25742, O25742 +25743, O25743 +25744, O25744 +25745, O25745 +25746, O25746 +25747, O25747 +25748, O25748 +25749, O25749 +25750, O25750 +25751, O25751 +25752, O25752 +25753, O25753 +25754, O25754 +25755, O25755 +25756, O25756 +25757, O25757 +25758, O25758 +25759, O25759 +25760, O25760 +25761, O25761 +25762, O25762 +25763, O25763 +25764, O25764 +25765, O25765 +25766, O25766 +25767, O25767 +25768, O25768 +25769, O25769 +25770, O25770 +25771, O25771 +25772, O25772 +25773, O25773 +25774, O25774 +25775, O25775 +25776, O25776 +25777, O25777 +25778, O25778 +25779, O25779 +25780, O25780 +25781, O25781 +25782, O25782 +25783, O25783 +25784, O25784 +25785, O25785 +25786, O25786 +25787, O25787 +25788, O25788 +25789, O25789 +25790, O25790 +25791, O25791 +25792, O25792 +25793, O25793 +25794, O25794 +25795, O25795 +25796, O25796 +25797, O25797 +25798, O25798 +25799, O25799 +25800, O25800 +25801, O25801 +25802, O25802 +25803, O25803 +25804, O25804 +25805, O25805 +25806, O25806 +25807, O25807 +25808, O25808 +25809, O25809 +25810, O25810 +25811, O25811 +25812, O25812 +25813, O25813 +25814, O25814 +25815, O25815 +25816, O25816 +25817, O25817 +25818, O25818 +25819, O25819 +25820, O25820 +25821, O25821 +25822, O25822 +25823, O25823 +25824, O25824 +25825, O25825 +25826, O25826 +25827, O25827 +25828, O25828 +25829, O25829 +25830, O25830 +25831, O25831 +25832, O25832 +25833, O25833 +25834, O25834 +25835, O25835 +25836, O25836 +25837, O25837 +25838, O25838 +25839, O25839 +25840, O25840 +25841, O25841 +25842, O25842 +25843, O25843 +25844, O25844 +25845, O25845 +25846, O25846 +25847, O25847 +25848, O25848 +25849, O25849 +25850, O25850 +25851, O25851 +25852, O25852 +25853, O25853 +25854, O25854 +25855, O25855 +25856, O25856 +25857, O25857 +25858, O25858 +25859, O25859 +25860, O25860 +25861, O25861 +25862, O25862 +25863, O25863 +25864, O25864 +25865, O25865 +25866, O25866 +25867, O25867 +25868, O25868 +25869, O25869 +25870, O25870 +25871, O25871 +25872, O25872 +25873, O25873 +25874, O25874 +25875, O25875 +25876, O25876 +25877, O25877 +25878, O25878 +25879, O25879 +25880, O25880 +25881, O25881 +25882, O25882 +25883, O25883 +25884, O25884 +25885, O25885 +25886, O25886 +25887, O25887 +25888, O25888 +25889, O25889 +25890, O25890 +25891, O25891 +25892, O25892 +25893, O25893 +25894, O25894 +25895, O25895 +25896, O25896 +25897, O25897 +25898, O25898 +25899, O25899 +25900, O25900 +25901, O25901 +25902, O25902 +25903, O25903 +25904, O25904 +25905, O25905 +25906, O25906 +25907, O25907 +25908, O25908 +25909, O25909 +25910, O25910 +25911, O25911 +25912, O25912 +25913, O25913 +25914, O25914 +25915, O25915 +25916, O25916 +25917, O25917 +25918, O25918 +25919, O25919 +25920, O25920 +25921, O25921 +25922, O25922 +25923, O25923 +25924, O25924 +25925, O25925 +25926, O25926 +25927, O25927 +25928, O25928 +25929, O25929 +25930, O25930 +25931, O25931 +25932, O25932 +25933, O25933 +25934, O25934 +25935, O25935 +25936, O25936 +25937, O25937 +25938, O25938 +25939, O25939 +25940, O25940 +25941, O25941 +25942, O25942 +25943, O25943 +25944, O25944 +25945, O25945 +25946, O25946 +25947, O25947 +25948, O25948 +25949, O25949 +25950, O25950 +25951, O25951 +25952, O25952 +25953, O25953 +25954, O25954 +25955, O25955 +25956, O25956 +25957, O25957 +25958, O25958 +25959, O25959 +25960, O25960 +25961, O25961 +25962, O25962 +25963, O25963 +25964, O25964 +25965, O25965 +25966, O25966 +25967, O25967 +25968, O25968 +25969, O25969 +25970, O25970 +25971, O25971 +25972, O25972 +25973, O25973 +25974, O25974 +25975, O25975 +25976, O25976 +25977, O25977 +25978, O25978 +25979, O25979 +25980, O25980 +25981, O25981 +25982, O25982 +25983, O25983 +25984, O25984 +25985, O25985 +25986, O25986 +25987, O25987 +25988, O25988 +25989, O25989 +25990, O25990 +25991, O25991 +25992, O25992 +25993, O25993 +25994, O25994 +25995, O25995 +25996, O25996 +25997, O25997 +25998, O25998 +25999, O25999 +26000, O26000 +26001, O26001 +26002, O26002 +26003, O26003 +26004, O26004 +26005, O26005 +26006, O26006 +26007, O26007 +26008, O26008 +26009, O26009 +26010, O26010 +26011, O26011 +26012, O26012 +26013, O26013 +26014, O26014 +26015, O26015 +26016, O26016 +26017, O26017 +26018, O26018 +26019, O26019 +26020, O26020 +26021, O26021 +26022, O26022 +26023, O26023 +26024, O26024 +26025, O26025 +26026, O26026 +26027, O26027 +26028, O26028 +26029, O26029 +26030, O26030 +26031, O26031 +26032, O26032 +26033, O26033 +26034, O26034 +26035, O26035 +26036, O26036 +26037, O26037 +26038, O26038 +26039, O26039 +26040, O26040 +26041, O26041 +26042, O26042 +26043, O26043 +26044, O26044 +26045, O26045 +26046, O26046 +26047, O26047 +26048, O26048 +26049, O26049 +26050, O26050 +26051, O26051 +26052, O26052 +26053, O26053 +26054, O26054 +26055, O26055 +26056, O26056 +26057, O26057 +26058, O26058 +26059, O26059 +26060, O26060 +26061, O26061 +26062, O26062 +26063, O26063 +26064, O26064 +26065, O26065 +26066, O26066 +26067, O26067 +26068, O26068 +26069, O26069 +26070, O26070 +26071, O26071 +26072, O26072 +26073, O26073 +26074, O26074 +26075, O26075 +26076, O26076 +26077, O26077 +26078, O26078 +26079, O26079 +26080, O26080 +26081, O26081 +26082, O26082 +26083, O26083 +26084, O26084 +26085, O26085 +26086, O26086 +26087, O26087 +26088, O26088 +26089, O26089 +26090, O26090 +26091, O26091 +26092, O26092 +26093, O26093 +26094, O26094 +26095, O26095 +26096, O26096 +26097, O26097 +26098, O26098 +26099, O26099 +26100, O26100 +26101, O26101 +26102, O26102 +26103, O26103 +26104, O26104 +26105, O26105 +26106, O26106 +26107, O26107 +26108, O26108 +26109, O26109 +26110, O26110 +26111, O26111 +26112, O26112 +26113, O26113 +26114, O26114 +26115, O26115 +26116, O26116 +26117, O26117 +26118, O26118 +26119, O26119 +26120, O26120 +26121, O26121 +26122, O26122 +26123, O26123 +26124, O26124 +26125, O26125 +26126, O26126 +26127, O26127 +26128, O26128 +26129, O26129 +26130, O26130 +26131, O26131 +26132, O26132 +26133, O26133 +26134, O26134 +26135, O26135 +26136, O26136 +26137, O26137 +26138, O26138 +26139, O26139 +26140, O26140 +26141, O26141 +26142, O26142 +26143, O26143 +26144, O26144 +26145, O26145 +26146, O26146 +26147, O26147 +26148, O26148 +26149, O26149 +26150, O26150 +26151, O26151 +26152, O26152 +26153, O26153 +26154, O26154 +26155, O26155 +26156, O26156 +26157, O26157 +26158, O26158 +26159, O26159 +26160, O26160 +26161, O26161 +26162, O26162 +26163, O26163 +26164, O26164 +26165, O26165 +26166, O26166 +26167, O26167 +26168, O26168 +26169, O26169 +26170, O26170 +26171, O26171 +26172, O26172 +26173, O26173 +26174, O26174 +26175, O26175 +26176, O26176 +26177, O26177 +26178, O26178 +26179, O26179 +26180, O26180 +26181, O26181 +26182, O26182 +26183, O26183 +26184, O26184 +26185, O26185 +26186, O26186 +26187, O26187 +26188, O26188 +26189, O26189 +26190, O26190 +26191, O26191 +26192, O26192 +26193, O26193 +26194, O26194 +26195, O26195 +26196, O26196 +26197, O26197 +26198, O26198 +26199, O26199 +26200, O26200 +26201, O26201 +26202, O26202 +26203, O26203 +26204, O26204 +26205, O26205 +26206, O26206 +26207, O26207 +26208, O26208 +26209, O26209 +26210, O26210 +26211, O26211 +26212, O26212 +26213, O26213 +26214, O26214 +26215, O26215 +26216, O26216 +26217, O26217 +26218, O26218 +26219, O26219 +26220, O26220 +26221, O26221 +26222, O26222 +26223, O26223 +26224, O26224 +26225, O26225 +26226, O26226 +26227, O26227 +26228, O26228 +26229, O26229 +26230, O26230 +26231, O26231 +26232, O26232 +26233, O26233 +26234, O26234 +26235, O26235 +26236, O26236 +26237, O26237 +26238, O26238 +26239, O26239 +26240, O26240 +26241, O26241 +26242, O26242 +26243, O26243 +26244, O26244 +26245, O26245 +26246, O26246 +26247, O26247 +26248, O26248 +26249, O26249 +26250, O26250 +26251, O26251 +26252, O26252 +26253, O26253 +26254, O26254 +26255, O26255 +26256, O26256 +26257, O26257 +26258, O26258 +26259, O26259 +26260, O26260 +26261, O26261 +26262, O26262 +26263, O26263 +26264, O26264 +26265, O26265 +26266, O26266 +26267, O26267 +26268, O26268 +26269, O26269 +26270, O26270 +26271, O26271 +26272, O26272 +26273, O26273 +26274, O26274 +26275, O26275 +26276, O26276 +26277, O26277 +26278, O26278 +26279, O26279 +26280, O26280 +26281, O26281 +26282, O26282 +26283, O26283 +26284, O26284 +26285, O26285 +26286, O26286 +26287, O26287 +26288, O26288 +26289, O26289 +26290, O26290 +26291, O26291 +26292, O26292 +26293, O26293 +26294, O26294 +26295, O26295 +26296, O26296 +26297, O26297 +26298, O26298 +26299, O26299 +26300, O26300 +26301, O26301 +26302, O26302 +26303, O26303 +26304, O26304 +26305, O26305 +26306, O26306 +26307, O26307 +26308, O26308 +26309, O26309 +26310, O26310 +26311, O26311 +26312, O26312 +26313, O26313 +26314, O26314 +26315, O26315 +26316, O26316 +26317, O26317 +26318, O26318 +26319, O26319 +26320, O26320 +26321, O26321 +26322, O26322 +26323, O26323 +26324, O26324 +26325, O26325 +26326, O26326 +26327, O26327 +26328, O26328 +26329, O26329 +26330, O26330 +26331, O26331 +26332, O26332 +26333, O26333 +26334, O26334 +26335, O26335 +26336, O26336 +26337, O26337 +26338, O26338 +26339, O26339 +26340, O26340 +26341, O26341 +26342, O26342 +26343, O26343 +26344, O26344 +26345, O26345 +26346, O26346 +26347, O26347 +26348, O26348 +26349, O26349 +26350, O26350 +26351, O26351 +26352, O26352 +26353, O26353 +26354, O26354 +26355, O26355 +26356, O26356 +26357, O26357 +26358, O26358 +26359, O26359 +26360, O26360 +26361, O26361 +26362, O26362 +26363, O26363 +26364, O26364 +26365, O26365 +26366, O26366 +26367, O26367 +26368, O26368 +26369, O26369 +26370, O26370 +26371, O26371 +26372, O26372 +26373, O26373 +26374, O26374 +26375, O26375 +26376, O26376 +26377, O26377 +26378, O26378 +26379, O26379 +26380, O26380 +26381, O26381 +26382, O26382 +26383, O26383 +26384, O26384 +26385, O26385 +26386, O26386 +26387, O26387 +26388, O26388 +26389, O26389 +26390, O26390 +26391, O26391 +26392, O26392 +26393, O26393 +26394, O26394 +26395, O26395 +26396, O26396 +26397, O26397 +26398, O26398 +26399, O26399 +26400, O26400 +26401, O26401 +26402, O26402 +26403, O26403 +26404, O26404 +26405, O26405 +26406, O26406 +26407, O26407 +26408, O26408 +26409, O26409 +26410, O26410 +26411, O26411 +26412, O26412 +26413, O26413 +26414, O26414 +26415, O26415 +26416, O26416 +26417, O26417 +26418, O26418 +26419, O26419 +26420, O26420 +26421, O26421 +26422, O26422 +26423, O26423 +26424, O26424 +26425, O26425 +26426, O26426 +26427, O26427 +26428, O26428 +26429, O26429 +26430, O26430 +26431, O26431 +26432, O26432 +26433, O26433 +26434, O26434 +26435, O26435 +26436, O26436 +26437, O26437 +26438, O26438 +26439, O26439 +26440, O26440 +26441, O26441 +26442, O26442 +26443, O26443 +26444, O26444 +26445, O26445 +26446, O26446 +26447, O26447 +26448, O26448 +26449, O26449 +26450, O26450 +26451, O26451 +26452, O26452 +26453, O26453 +26454, O26454 +26455, O26455 +26456, O26456 +26457, O26457 +26458, O26458 +26459, O26459 +26460, O26460 +26461, O26461 +26462, O26462 +26463, O26463 +26464, O26464 +26465, O26465 +26466, O26466 +26467, O26467 +26468, O26468 +26469, O26469 +26470, O26470 +26471, O26471 +26472, O26472 +26473, O26473 +26474, O26474 +26475, O26475 +26476, O26476 +26477, O26477 +26478, O26478 +26479, O26479 +26480, O26480 +26481, O26481 +26482, O26482 +26483, O26483 +26484, O26484 +26485, O26485 +26486, O26486 +26487, O26487 +26488, O26488 +26489, O26489 +26490, O26490 +26491, O26491 +26492, O26492 +26493, O26493 +26494, O26494 +26495, O26495 +26496, O26496 +26497, O26497 +26498, O26498 +26499, O26499 +26500, O26500 +26501, O26501 +26502, O26502 +26503, O26503 +26504, O26504 +26505, O26505 +26506, O26506 +26507, O26507 +26508, O26508 +26509, O26509 +26510, O26510 +26511, O26511 +26512, O26512 +26513, O26513 +26514, O26514 +26515, O26515 +26516, O26516 +26517, O26517 +26518, O26518 +26519, O26519 +26520, O26520 +26521, O26521 +26522, O26522 +26523, O26523 +26524, O26524 +26525, O26525 +26526, O26526 +26527, O26527 +26528, O26528 +26529, O26529 +26530, O26530 +26531, O26531 +26532, O26532 +26533, O26533 +26534, O26534 +26535, O26535 +26536, O26536 +26537, O26537 +26538, O26538 +26539, O26539 +26540, O26540 +26541, O26541 +26542, O26542 +26543, O26543 +26544, O26544 +26545, O26545 +26546, O26546 +26547, O26547 +26548, O26548 +26549, O26549 +26550, O26550 +26551, O26551 +26552, O26552 +26553, O26553 +26554, O26554 +26555, O26555 +26556, O26556 +26557, O26557 +26558, O26558 +26559, O26559 +26560, O26560 +26561, O26561 +26562, O26562 +26563, O26563 +26564, O26564 +26565, O26565 +26566, O26566 +26567, O26567 +26568, O26568 +26569, O26569 +26570, O26570 +26571, O26571 +26572, O26572 +26573, O26573 +26574, O26574 +26575, O26575 +26576, O26576 +26577, O26577 +26578, O26578 +26579, O26579 +26580, O26580 +26581, O26581 +26582, O26582 +26583, O26583 +26584, O26584 +26585, O26585 +26586, O26586 +26587, O26587 +26588, O26588 +26589, O26589 +26590, O26590 +26591, O26591 +26592, O26592 +26593, O26593 +26594, O26594 +26595, O26595 +26596, O26596 +26597, O26597 +26598, O26598 +26599, O26599 +26600, O26600 +26601, O26601 +26602, O26602 +26603, O26603 +26604, O26604 +26605, O26605 +26606, O26606 +26607, O26607 +26608, O26608 +26609, O26609 +26610, O26610 +26611, O26611 +26612, O26612 +26613, O26613 +26614, O26614 +26615, O26615 +26616, O26616 +26617, O26617 +26618, O26618 +26619, O26619 +26620, O26620 +26621, O26621 +26622, O26622 +26623, O26623 +26624, O26624 +26625, O26625 +26626, O26626 +26627, O26627 +26628, O26628 +26629, O26629 +26630, O26630 +26631, O26631 +26632, O26632 +26633, O26633 +26634, O26634 +26635, O26635 +26636, O26636 +26637, O26637 +26638, O26638 +26639, O26639 +26640, O26640 +26641, O26641 +26642, O26642 +26643, O26643 +26644, O26644 +26645, O26645 +26646, O26646 +26647, O26647 +26648, O26648 +26649, O26649 +26650, O26650 +26651, O26651 +26652, O26652 +26653, O26653 +26654, O26654 +26655, O26655 +26656, O26656 +26657, O26657 +26658, O26658 +26659, O26659 +26660, O26660 +26661, O26661 +26662, O26662 +26663, O26663 +26664, O26664 +26665, O26665 +26666, O26666 +26667, O26667 +26668, O26668 +26669, O26669 +26670, O26670 +26671, O26671 +26672, O26672 +26673, O26673 +26674, O26674 +26675, O26675 +26676, O26676 +26677, O26677 +26678, O26678 +26679, O26679 +26680, O26680 +26681, O26681 +26682, O26682 +26683, O26683 +26684, O26684 +26685, O26685 +26686, O26686 +26687, O26687 +26688, O26688 +26689, O26689 +26690, O26690 +26691, O26691 +26692, O26692 +26693, O26693 +26694, O26694 +26695, O26695 +26696, O26696 +26697, O26697 +26698, O26698 +26699, O26699 +26700, O26700 +26701, O26701 +26702, O26702 +26703, O26703 +26704, O26704 +26705, O26705 +26706, O26706 +26707, O26707 +26708, O26708 +26709, O26709 +26710, O26710 +26711, O26711 +26712, O26712 +26713, O26713 +26714, O26714 +26715, O26715 +26716, O26716 +26717, O26717 +26718, O26718 +26719, O26719 +26720, O26720 +26721, O26721 +26722, O26722 +26723, O26723 +26724, O26724 +26725, O26725 +26726, O26726 +26727, O26727 +26728, O26728 +26729, O26729 +26730, O26730 +26731, O26731 +26732, O26732 +26733, O26733 +26734, O26734 +26735, O26735 +26736, O26736 +26737, O26737 +26738, O26738 +26739, O26739 +26740, O26740 +26741, O26741 +26742, O26742 +26743, O26743 +26744, O26744 +26745, O26745 +26746, O26746 +26747, O26747 +26748, O26748 +26749, O26749 +26750, O26750 +26751, O26751 +26752, O26752 +26753, O26753 +26754, O26754 +26755, O26755 +26756, O26756 +26757, O26757 +26758, O26758 +26759, O26759 +26760, O26760 +26761, O26761 +26762, O26762 +26763, O26763 +26764, O26764 +26765, O26765 +26766, O26766 +26767, O26767 +26768, O26768 +26769, O26769 +26770, O26770 +26771, O26771 +26772, O26772 +26773, O26773 +26774, O26774 +26775, O26775 +26776, O26776 +26777, O26777 +26778, O26778 +26779, O26779 +26780, O26780 +26781, O26781 +26782, O26782 +26783, O26783 +26784, O26784 +26785, O26785 +26786, O26786 +26787, O26787 +26788, O26788 +26789, O26789 +26790, O26790 +26791, O26791 +26792, O26792 +26793, O26793 +26794, O26794 +26795, O26795 +26796, O26796 +26797, O26797 +26798, O26798 +26799, O26799 +26800, O26800 +26801, O26801 +26802, O26802 +26803, O26803 +26804, O26804 +26805, O26805 +26806, O26806 +26807, O26807 +26808, O26808 +26809, O26809 +26810, O26810 +26811, O26811 +26812, O26812 +26813, O26813 +26814, O26814 +26815, O26815 +26816, O26816 +26817, O26817 +26818, O26818 +26819, O26819 +26820, O26820 +26821, O26821 +26822, O26822 +26823, O26823 +26824, O26824 +26825, O26825 +26826, O26826 +26827, O26827 +26828, O26828 +26829, O26829 +26830, O26830 +26831, O26831 +26832, O26832 +26833, O26833 +26834, O26834 +26835, O26835 +26836, O26836 +26837, O26837 +26838, O26838 +26839, O26839 +26840, O26840 +26841, O26841 +26842, O26842 +26843, O26843 +26844, O26844 +26845, O26845 +26846, O26846 +26847, O26847 +26848, O26848 +26849, O26849 +26850, O26850 +26851, O26851 +26852, O26852 +26853, O26853 +26854, O26854 +26855, O26855 +26856, O26856 +26857, O26857 +26858, O26858 +26859, O26859 +26860, O26860 +26861, O26861 +26862, O26862 +26863, O26863 +26864, O26864 +26865, O26865 +26866, O26866 +26867, O26867 +26868, O26868 +26869, O26869 +26870, O26870 +26871, O26871 +26872, O26872 +26873, O26873 +26874, O26874 +26875, O26875 +26876, O26876 +26877, O26877 +26878, O26878 +26879, O26879 +26880, O26880 +26881, O26881 +26882, O26882 +26883, O26883 +26884, O26884 +26885, O26885 +26886, O26886 +26887, O26887 +26888, O26888 +26889, O26889 +26890, O26890 +26891, O26891 +26892, O26892 +26893, O26893 +26894, O26894 +26895, O26895 +26896, O26896 +26897, O26897 +26898, O26898 +26899, O26899 +26900, O26900 +26901, O26901 +26902, O26902 +26903, O26903 +26904, O26904 +26905, O26905 +26906, O26906 +26907, O26907 +26908, O26908 +26909, O26909 +26910, O26910 +26911, O26911 +26912, O26912 +26913, O26913 +26914, O26914 +26915, O26915 +26916, O26916 +26917, O26917 +26918, O26918 +26919, O26919 +26920, O26920 +26921, O26921 +26922, O26922 +26923, O26923 +26924, O26924 +26925, O26925 +26926, O26926 +26927, O26927 +26928, O26928 +26929, O26929 +26930, O26930 +26931, O26931 +26932, O26932 +26933, O26933 +26934, O26934 +26935, O26935 +26936, O26936 +26937, O26937 +26938, O26938 +26939, O26939 +26940, O26940 +26941, O26941 +26942, O26942 +26943, O26943 +26944, O26944 +26945, O26945 +26946, O26946 +26947, O26947 +26948, O26948 +26949, O26949 +26950, O26950 +26951, O26951 +26952, O26952 +26953, O26953 +26954, O26954 +26955, O26955 +26956, O26956 +26957, O26957 +26958, O26958 +26959, O26959 +26960, O26960 +26961, O26961 +26962, O26962 +26963, O26963 +26964, O26964 +26965, O26965 +26966, O26966 +26967, O26967 +26968, O26968 +26969, O26969 +26970, O26970 +26971, O26971 +26972, O26972 +26973, O26973 +26974, O26974 +26975, O26975 +26976, O26976 +26977, O26977 +26978, O26978 +26979, O26979 +26980, O26980 +26981, O26981 +26982, O26982 +26983, O26983 +26984, O26984 +26985, O26985 +26986, O26986 +26987, O26987 +26988, O26988 +26989, O26989 +26990, O26990 +26991, O26991 +26992, O26992 +26993, O26993 +26994, O26994 +26995, O26995 +26996, O26996 +26997, O26997 +26998, O26998 +26999, O26999 +27000, O27000 +27001, O27001 +27002, O27002 +27003, O27003 +27004, O27004 +27005, O27005 +27006, O27006 +27007, O27007 +27008, O27008 +27009, O27009 +27010, O27010 +27011, O27011 +27012, O27012 +27013, O27013 +27014, O27014 +27015, O27015 +27016, O27016 +27017, O27017 +27018, O27018 +27019, O27019 +27020, O27020 +27021, O27021 +27022, O27022 +27023, O27023 +27024, O27024 +27025, O27025 +27026, O27026 +27027, O27027 +27028, O27028 +27029, O27029 +27030, O27030 +27031, O27031 +27032, O27032 +27033, O27033 +27034, O27034 +27035, O27035 +27036, O27036 +27037, O27037 +27038, O27038 +27039, O27039 +27040, O27040 +27041, O27041 +27042, O27042 +27043, O27043 +27044, O27044 +27045, O27045 +27046, O27046 +27047, O27047 +27048, O27048 +27049, O27049 +27050, O27050 +27051, O27051 +27052, O27052 +27053, O27053 +27054, O27054 +27055, O27055 +27056, O27056 +27057, O27057 +27058, O27058 +27059, O27059 +27060, O27060 +27061, O27061 +27062, O27062 +27063, O27063 +27064, O27064 +27065, O27065 +27066, O27066 +27067, O27067 +27068, O27068 +27069, O27069 +27070, O27070 +27071, O27071 +27072, O27072 +27073, O27073 +27074, O27074 +27075, O27075 +27076, O27076 +27077, O27077 +27078, O27078 +27079, O27079 +27080, O27080 +27081, O27081 +27082, O27082 +27083, O27083 +27084, O27084 +27085, O27085 +27086, O27086 +27087, O27087 +27088, O27088 +27089, O27089 +27090, O27090 +27091, O27091 +27092, O27092 +27093, O27093 +27094, O27094 +27095, O27095 +27096, O27096 +27097, O27097 +27098, O27098 +27099, O27099 +27100, O27100 +27101, O27101 +27102, O27102 +27103, O27103 +27104, O27104 +27105, O27105 +27106, O27106 +27107, O27107 +27108, O27108 +27109, O27109 +27110, O27110 +27111, O27111 +27112, O27112 +27113, O27113 +27114, O27114 +27115, O27115 +27116, O27116 +27117, O27117 +27118, O27118 +27119, O27119 +27120, O27120 +27121, O27121 +27122, O27122 +27123, O27123 +27124, O27124 +27125, O27125 +27126, O27126 +27127, O27127 +27128, O27128 +27129, O27129 +27130, O27130 +27131, O27131 +27132, O27132 +27133, O27133 +27134, O27134 +27135, O27135 +27136, O27136 +27137, O27137 +27138, O27138 +27139, O27139 +27140, O27140 +27141, O27141 +27142, O27142 +27143, O27143 +27144, O27144 +27145, O27145 +27146, O27146 +27147, O27147 +27148, O27148 +27149, O27149 +27150, O27150 +27151, O27151 +27152, O27152 +27153, O27153 +27154, O27154 +27155, O27155 +27156, O27156 +27157, O27157 +27158, O27158 +27159, O27159 +27160, O27160 +27161, O27161 +27162, O27162 +27163, O27163 +27164, O27164 +27165, O27165 +27166, O27166 +27167, O27167 +27168, O27168 +27169, O27169 +27170, O27170 +27171, O27171 +27172, O27172 +27173, O27173 +27174, O27174 +27175, O27175 +27176, O27176 +27177, O27177 +27178, O27178 +27179, O27179 +27180, O27180 +27181, O27181 +27182, O27182 +27183, O27183 +27184, O27184 +27185, O27185 +27186, O27186 +27187, O27187 +27188, O27188 +27189, O27189 +27190, O27190 +27191, O27191 +27192, O27192 +27193, O27193 +27194, O27194 +27195, O27195 +27196, O27196 +27197, O27197 +27198, O27198 +27199, O27199 +27200, O27200 +27201, O27201 +27202, O27202 +27203, O27203 +27204, O27204 +27205, O27205 +27206, O27206 +27207, O27207 +27208, O27208 +27209, O27209 +27210, O27210 +27211, O27211 +27212, O27212 +27213, O27213 +27214, O27214 +27215, O27215 +27216, O27216 +27217, O27217 +27218, O27218 +27219, O27219 +27220, O27220 +27221, O27221 +27222, O27222 +27223, O27223 +27224, O27224 +27225, O27225 +27226, O27226 +27227, O27227 +27228, O27228 +27229, O27229 +27230, O27230 +27231, O27231 +27232, O27232 +27233, O27233 +27234, O27234 +27235, O27235 +27236, O27236 +27237, O27237 +27238, O27238 +27239, O27239 +27240, O27240 +27241, O27241 +27242, O27242 +27243, O27243 +27244, O27244 +27245, O27245 +27246, O27246 +27247, O27247 +27248, O27248 +27249, O27249 +27250, O27250 +27251, O27251 +27252, O27252 +27253, O27253 +27254, O27254 +27255, O27255 +27256, O27256 +27257, O27257 +27258, O27258 +27259, O27259 +27260, O27260 +27261, O27261 +27262, O27262 +27263, O27263 +27264, O27264 +27265, O27265 +27266, O27266 +27267, O27267 +27268, O27268 +27269, O27269 +27270, O27270 +27271, O27271 +27272, O27272 +27273, O27273 +27274, O27274 +27275, O27275 +27276, O27276 +27277, O27277 +27278, O27278 +27279, O27279 +27280, O27280 +27281, O27281 +27282, O27282 +27283, O27283 +27284, O27284 +27285, O27285 +27286, O27286 +27287, O27287 +27288, O27288 +27289, O27289 +27290, O27290 +27291, O27291 +27292, O27292 +27293, O27293 +27294, O27294 +27295, O27295 +27296, O27296 +27297, O27297 +27298, O27298 +27299, O27299 +27300, O27300 +27301, O27301 +27302, O27302 +27303, O27303 +27304, O27304 +27305, O27305 +27306, O27306 +27307, O27307 +27308, O27308 +27309, O27309 +27310, O27310 +27311, O27311 +27312, O27312 +27313, O27313 +27314, O27314 +27315, O27315 +27316, O27316 +27317, O27317 +27318, O27318 +27319, O27319 +27320, O27320 +27321, O27321 +27322, O27322 +27323, O27323 +27324, O27324 +27325, O27325 +27326, O27326 +27327, O27327 +27328, O27328 +27329, O27329 +27330, O27330 +27331, O27331 +27332, O27332 +27333, O27333 +27334, O27334 +27335, O27335 +27336, O27336 +27337, O27337 +27338, O27338 +27339, O27339 +27340, O27340 +27341, O27341 +27342, O27342 +27343, O27343 +27344, O27344 +27345, O27345 +27346, O27346 +27347, O27347 +27348, O27348 +27349, O27349 +27350, O27350 +27351, O27351 +27352, O27352 +27353, O27353 +27354, O27354 +27355, O27355 +27356, O27356 +27357, O27357 +27358, O27358 +27359, O27359 +27360, O27360 +27361, O27361 +27362, O27362 +27363, O27363 +27364, O27364 +27365, O27365 +27366, O27366 +27367, O27367 +27368, O27368 +27369, O27369 +27370, O27370 +27371, O27371 +27372, O27372 +27373, O27373 +27374, O27374 +27375, O27375 +27376, O27376 +27377, O27377 +27378, O27378 +27379, O27379 +27380, O27380 +27381, O27381 +27382, O27382 +27383, O27383 +27384, O27384 +27385, O27385 +27386, O27386 +27387, O27387 +27388, O27388 +27389, O27389 +27390, O27390 +27391, O27391 +27392, O27392 +27393, O27393 +27394, O27394 +27395, O27395 +27396, O27396 +27397, O27397 +27398, O27398 +27399, O27399 +27400, O27400 +27401, O27401 +27402, O27402 +27403, O27403 +27404, O27404 +27405, O27405 +27406, O27406 +27407, O27407 +27408, O27408 +27409, O27409 +27410, O27410 +27411, O27411 +27412, O27412 +27413, O27413 +27414, O27414 +27415, O27415 +27416, O27416 +27417, O27417 +27418, O27418 +27419, O27419 +27420, O27420 +27421, O27421 +27422, O27422 +27423, O27423 +27424, O27424 +27425, O27425 +27426, O27426 +27427, O27427 +27428, O27428 +27429, O27429 +27430, O27430 +27431, O27431 +27432, O27432 +27433, O27433 +27434, O27434 +27435, O27435 +27436, O27436 +27437, O27437 +27438, O27438 +27439, O27439 +27440, O27440 +27441, O27441 +27442, O27442 +27443, O27443 +27444, O27444 +27445, O27445 +27446, O27446 +27447, O27447 +27448, O27448 +27449, O27449 +27450, O27450 +27451, O27451 +27452, O27452 +27453, O27453 +27454, O27454 +27455, O27455 +27456, O27456 +27457, O27457 +27458, O27458 +27459, O27459 +27460, O27460 +27461, O27461 +27462, O27462 +27463, O27463 +27464, O27464 +27465, O27465 +27466, O27466 +27467, O27467 +27468, O27468 +27469, O27469 +27470, O27470 +27471, O27471 +27472, O27472 +27473, O27473 +27474, O27474 +27475, O27475 +27476, O27476 +27477, O27477 +27478, O27478 +27479, O27479 +27480, O27480 +27481, O27481 +27482, O27482 +27483, O27483 +27484, O27484 +27485, O27485 +27486, O27486 +27487, O27487 +27488, O27488 +27489, O27489 +27490, O27490 +27491, O27491 +27492, O27492 +27493, O27493 +27494, O27494 +27495, O27495 +27496, O27496 +27497, O27497 +27498, O27498 +27499, O27499 +27500, O27500 +27501, O27501 +27502, O27502 +27503, O27503 +27504, O27504 +27505, O27505 +27506, O27506 +27507, O27507 +27508, O27508 +27509, O27509 +27510, O27510 +27511, O27511 +27512, O27512 +27513, O27513 +27514, O27514 +27515, O27515 +27516, O27516 +27517, O27517 +27518, O27518 +27519, O27519 +27520, O27520 +27521, O27521 +27522, O27522 +27523, O27523 +27524, O27524 +27525, O27525 +27526, O27526 +27527, O27527 +27528, O27528 +27529, O27529 +27530, O27530 +27531, O27531 +27532, O27532 +27533, O27533 +27534, O27534 +27535, O27535 +27536, O27536 +27537, O27537 +27538, O27538 +27539, O27539 +27540, O27540 +27541, O27541 +27542, O27542 +27543, O27543 +27544, O27544 +27545, O27545 +27546, O27546 +27547, O27547 +27548, O27548 +27549, O27549 +27550, O27550 +27551, O27551 +27552, O27552 +27553, O27553 +27554, O27554 +27555, O27555 +27556, O27556 +27557, O27557 +27558, O27558 +27559, O27559 +27560, O27560 +27561, O27561 +27562, O27562 +27563, O27563 +27564, O27564 +27565, O27565 +27566, O27566 +27567, O27567 +27568, O27568 +27569, O27569 +27570, O27570 +27571, O27571 +27572, O27572 +27573, O27573 +27574, O27574 +27575, O27575 +27576, O27576 +27577, O27577 +27578, O27578 +27579, O27579 +27580, O27580 +27581, O27581 +27582, O27582 +27583, O27583 +27584, O27584 +27585, O27585 +27586, O27586 +27587, O27587 +27588, O27588 +27589, O27589 +27590, O27590 +27591, O27591 +27592, O27592 +27593, O27593 +27594, O27594 +27595, O27595 +27596, O27596 +27597, O27597 +27598, O27598 +27599, O27599 +27600, O27600 +27601, O27601 +27602, O27602 +27603, O27603 +27604, O27604 +27605, O27605 +27606, O27606 +27607, O27607 +27608, O27608 +27609, O27609 +27610, O27610 +27611, O27611 +27612, O27612 +27613, O27613 +27614, O27614 +27615, O27615 +27616, O27616 +27617, O27617 +27618, O27618 +27619, O27619 +27620, O27620 +27621, O27621 +27622, O27622 +27623, O27623 +27624, O27624 +27625, O27625 +27626, O27626 +27627, O27627 +27628, O27628 +27629, O27629 +27630, O27630 +27631, O27631 +27632, O27632 +27633, O27633 +27634, O27634 +27635, O27635 +27636, O27636 +27637, O27637 +27638, O27638 +27639, O27639 +27640, O27640 +27641, O27641 +27642, O27642 +27643, O27643 +27644, O27644 +27645, O27645 +27646, O27646 +27647, O27647 +27648, O27648 +27649, O27649 +27650, O27650 +27651, O27651 +27652, O27652 +27653, O27653 +27654, O27654 +27655, O27655 +27656, O27656 +27657, O27657 +27658, O27658 +27659, O27659 +27660, O27660 +27661, O27661 +27662, O27662 +27663, O27663 +27664, O27664 +27665, O27665 +27666, O27666 +27667, O27667 +27668, O27668 +27669, O27669 +27670, O27670 +27671, O27671 +27672, O27672 +27673, O27673 +27674, O27674 +27675, O27675 +27676, O27676 +27677, O27677 +27678, O27678 +27679, O27679 +27680, O27680 +27681, O27681 +27682, O27682 +27683, O27683 +27684, O27684 +27685, O27685 +27686, O27686 +27687, O27687 +27688, O27688 +27689, O27689 +27690, O27690 +27691, O27691 +27692, O27692 +27693, O27693 +27694, O27694 +27695, O27695 +27696, O27696 +27697, O27697 +27698, O27698 +27699, O27699 +27700, O27700 +27701, O27701 +27702, O27702 +27703, O27703 +27704, O27704 +27705, O27705 +27706, O27706 +27707, O27707 +27708, O27708 +27709, O27709 +27710, O27710 +27711, O27711 +27712, O27712 +27713, O27713 +27714, O27714 +27715, O27715 +27716, O27716 +27717, O27717 +27718, O27718 +27719, O27719 +27720, O27720 +27721, O27721 +27722, O27722 +27723, O27723 +27724, O27724 +27725, O27725 +27726, O27726 +27727, O27727 +27728, O27728 +27729, O27729 +27730, O27730 +27731, O27731 +27732, O27732 +27733, O27733 +27734, O27734 +27735, O27735 +27736, O27736 +27737, O27737 +27738, O27738 +27739, O27739 +27740, O27740 +27741, O27741 +27742, O27742 +27743, O27743 +27744, O27744 +27745, O27745 +27746, O27746 +27747, O27747 +27748, O27748 +27749, O27749 +27750, O27750 +27751, O27751 +27752, O27752 +27753, O27753 +27754, O27754 +27755, O27755 +27756, O27756 +27757, O27757 +27758, O27758 +27759, O27759 +27760, O27760 +27761, O27761 +27762, O27762 +27763, O27763 +27764, O27764 +27765, O27765 +27766, O27766 +27767, O27767 +27768, O27768 +27769, O27769 +27770, O27770 +27771, O27771 +27772, O27772 +27773, O27773 +27774, O27774 +27775, O27775 +27776, O27776 +27777, O27777 +27778, O27778 +27779, O27779 +27780, O27780 +27781, O27781 +27782, O27782 +27783, O27783 +27784, O27784 +27785, O27785 +27786, O27786 +27787, O27787 +27788, O27788 +27789, O27789 +27790, O27790 +27791, O27791 +27792, O27792 +27793, O27793 +27794, O27794 +27795, O27795 +27796, O27796 +27797, O27797 +27798, O27798 +27799, O27799 +27800, O27800 +27801, O27801 +27802, O27802 +27803, O27803 +27804, O27804 +27805, O27805 +27806, O27806 +27807, O27807 +27808, O27808 +27809, O27809 +27810, O27810 +27811, O27811 +27812, O27812 +27813, O27813 +27814, O27814 +27815, O27815 +27816, O27816 +27817, O27817 +27818, O27818 +27819, O27819 +27820, O27820 +27821, O27821 +27822, O27822 +27823, O27823 +27824, O27824 +27825, O27825 +27826, O27826 +27827, O27827 +27828, O27828 +27829, O27829 +27830, O27830 +27831, O27831 +27832, O27832 +27833, O27833 +27834, O27834 +27835, O27835 +27836, O27836 +27837, O27837 +27838, O27838 +27839, O27839 +27840, O27840 +27841, O27841 +27842, O27842 +27843, O27843 +27844, O27844 +27845, O27845 +27846, O27846 +27847, O27847 +27848, O27848 +27849, O27849 +27850, O27850 +27851, O27851 +27852, O27852 +27853, O27853 +27854, O27854 +27855, O27855 +27856, O27856 +27857, O27857 +27858, O27858 +27859, O27859 +27860, O27860 +27861, O27861 +27862, O27862 +27863, O27863 +27864, O27864 +27865, O27865 +27866, O27866 +27867, O27867 +27868, O27868 +27869, O27869 +27870, O27870 +27871, O27871 +27872, O27872 +27873, O27873 +27874, O27874 +27875, O27875 +27876, O27876 +27877, O27877 +27878, O27878 +27879, O27879 +27880, O27880 +27881, O27881 +27882, O27882 +27883, O27883 +27884, O27884 +27885, O27885 +27886, O27886 +27887, O27887 +27888, O27888 +27889, O27889 +27890, O27890 +27891, O27891 +27892, O27892 +27893, O27893 +27894, O27894 +27895, O27895 +27896, O27896 +27897, O27897 +27898, O27898 +27899, O27899 +27900, O27900 +27901, O27901 +27902, O27902 +27903, O27903 +27904, O27904 +27905, O27905 +27906, O27906 +27907, O27907 +27908, O27908 +27909, O27909 +27910, O27910 +27911, O27911 +27912, O27912 +27913, O27913 +27914, O27914 +27915, O27915 +27916, O27916 +27917, O27917 +27918, O27918 +27919, O27919 +27920, O27920 +27921, O27921 +27922, O27922 +27923, O27923 +27924, O27924 +27925, O27925 +27926, O27926 +27927, O27927 +27928, O27928 +27929, O27929 +27930, O27930 +27931, O27931 +27932, O27932 +27933, O27933 +27934, O27934 +27935, O27935 +27936, O27936 +27937, O27937 +27938, O27938 +27939, O27939 +27940, O27940 +27941, O27941 +27942, O27942 +27943, O27943 +27944, O27944 +27945, O27945 +27946, O27946 +27947, O27947 +27948, O27948 +27949, O27949 +27950, O27950 +27951, O27951 +27952, O27952 +27953, O27953 +27954, O27954 +27955, O27955 +27956, O27956 +27957, O27957 +27958, O27958 +27959, O27959 +27960, O27960 +27961, O27961 +27962, O27962 +27963, O27963 +27964, O27964 +27965, O27965 +27966, O27966 +27967, O27967 +27968, O27968 +27969, O27969 +27970, O27970 +27971, O27971 +27972, O27972 +27973, O27973 +27974, O27974 +27975, O27975 +27976, O27976 +27977, O27977 +27978, O27978 +27979, O27979 +27980, O27980 +27981, O27981 +27982, O27982 +27983, O27983 +27984, O27984 +27985, O27985 +27986, O27986 +27987, O27987 +27988, O27988 +27989, O27989 +27990, O27990 +27991, O27991 +27992, O27992 +27993, O27993 +27994, O27994 +27995, O27995 +27996, O27996 +27997, O27997 +27998, O27998 +27999, O27999 +28000, O28000 +28001, O28001 +28002, O28002 +28003, O28003 +28004, O28004 +28005, O28005 +28006, O28006 +28007, O28007 +28008, O28008 +28009, O28009 +28010, O28010 +28011, O28011 +28012, O28012 +28013, O28013 +28014, O28014 +28015, O28015 +28016, O28016 +28017, O28017 +28018, O28018 +28019, O28019 +28020, O28020 +28021, O28021 +28022, O28022 +28023, O28023 +28024, O28024 +28025, O28025 +28026, O28026 +28027, O28027 +28028, O28028 +28029, O28029 +28030, O28030 +28031, O28031 +28032, O28032 +28033, O28033 +28034, O28034 +28035, O28035 +28036, O28036 +28037, O28037 +28038, O28038 +28039, O28039 +28040, O28040 +28041, O28041 +28042, O28042 +28043, O28043 +28044, O28044 +28045, O28045 +28046, O28046 +28047, O28047 +28048, O28048 +28049, O28049 +28050, O28050 +28051, O28051 +28052, O28052 +28053, O28053 +28054, O28054 +28055, O28055 +28056, O28056 +28057, O28057 +28058, O28058 +28059, O28059 +28060, O28060 +28061, O28061 +28062, O28062 +28063, O28063 +28064, O28064 +28065, O28065 +28066, O28066 +28067, O28067 +28068, O28068 +28069, O28069 +28070, O28070 +28071, O28071 +28072, O28072 +28073, O28073 +28074, O28074 +28075, O28075 +28076, O28076 +28077, O28077 +28078, O28078 +28079, O28079 +28080, O28080 +28081, O28081 +28082, O28082 +28083, O28083 +28084, O28084 +28085, O28085 +28086, O28086 +28087, O28087 +28088, O28088 +28089, O28089 +28090, O28090 +28091, O28091 +28092, O28092 +28093, O28093 +28094, O28094 +28095, O28095 +28096, O28096 +28097, O28097 +28098, O28098 +28099, O28099 +28100, O28100 +28101, O28101 +28102, O28102 +28103, O28103 +28104, O28104 +28105, O28105 +28106, O28106 +28107, O28107 +28108, O28108 +28109, O28109 +28110, O28110 +28111, O28111 +28112, O28112 +28113, O28113 +28114, O28114 +28115, O28115 +28116, O28116 +28117, O28117 +28118, O28118 +28119, O28119 +28120, O28120 +28121, O28121 +28122, O28122 +28123, O28123 +28124, O28124 +28125, O28125 +28126, O28126 +28127, O28127 +28128, O28128 +28129, O28129 +28130, O28130 +28131, O28131 +28132, O28132 +28133, O28133 +28134, O28134 +28135, O28135 +28136, O28136 +28137, O28137 +28138, O28138 +28139, O28139 +28140, O28140 +28141, O28141 +28142, O28142 +28143, O28143 +28144, O28144 +28145, O28145 +28146, O28146 +28147, O28147 +28148, O28148 +28149, O28149 +28150, O28150 +28151, O28151 +28152, O28152 +28153, O28153 +28154, O28154 +28155, O28155 +28156, O28156 +28157, O28157 +28158, O28158 +28159, O28159 +28160, O28160 +28161, O28161 +28162, O28162 +28163, O28163 +28164, O28164 +28165, O28165 +28166, O28166 +28167, O28167 +28168, O28168 +28169, O28169 +28170, O28170 +28171, O28171 +28172, O28172 +28173, O28173 +28174, O28174 +28175, O28175 +28176, O28176 +28177, O28177 +28178, O28178 +28179, O28179 +28180, O28180 +28181, O28181 +28182, O28182 +28183, O28183 +28184, O28184 +28185, O28185 +28186, O28186 +28187, O28187 +28188, O28188 +28189, O28189 +28190, O28190 +28191, O28191 +28192, O28192 +28193, O28193 +28194, O28194 +28195, O28195 +28196, O28196 +28197, O28197 +28198, O28198 +28199, O28199 +28200, O28200 +28201, O28201 +28202, O28202 +28203, O28203 +28204, O28204 +28205, O28205 +28206, O28206 +28207, O28207 +28208, O28208 +28209, O28209 +28210, O28210 +28211, O28211 +28212, O28212 +28213, O28213 +28214, O28214 +28215, O28215 +28216, O28216 +28217, O28217 +28218, O28218 +28219, O28219 +28220, O28220 +28221, O28221 +28222, O28222 +28223, O28223 +28224, O28224 +28225, O28225 +28226, O28226 +28227, O28227 +28228, O28228 +28229, O28229 +28230, O28230 +28231, O28231 +28232, O28232 +28233, O28233 +28234, O28234 +28235, O28235 +28236, O28236 +28237, O28237 +28238, O28238 +28239, O28239 +28240, O28240 +28241, O28241 +28242, O28242 +28243, O28243 +28244, O28244 +28245, O28245 +28246, O28246 +28247, O28247 +28248, O28248 +28249, O28249 +28250, O28250 +28251, O28251 +28252, O28252 +28253, O28253 +28254, O28254 +28255, O28255 +28256, O28256 +28257, O28257 +28258, O28258 +28259, O28259 +28260, O28260 +28261, O28261 +28262, O28262 +28263, O28263 +28264, O28264 +28265, O28265 +28266, O28266 +28267, O28267 +28268, O28268 +28269, O28269 +28270, O28270 +28271, O28271 +28272, O28272 +28273, O28273 +28274, O28274 +28275, O28275 +28276, O28276 +28277, O28277 +28278, O28278 +28279, O28279 +28280, O28280 +28281, O28281 +28282, O28282 +28283, O28283 +28284, O28284 +28285, O28285 +28286, O28286 +28287, O28287 +28288, O28288 +28289, O28289 +28290, O28290 +28291, O28291 +28292, O28292 +28293, O28293 +28294, O28294 +28295, O28295 +28296, O28296 +28297, O28297 +28298, O28298 +28299, O28299 +28300, O28300 +28301, O28301 +28302, O28302 +28303, O28303 +28304, O28304 +28305, O28305 +28306, O28306 +28307, O28307 +28308, O28308 +28309, O28309 +28310, O28310 +28311, O28311 +28312, O28312 +28313, O28313 +28314, O28314 +28315, O28315 +28316, O28316 +28317, O28317 +28318, O28318 +28319, O28319 +28320, O28320 +28321, O28321 +28322, O28322 +28323, O28323 +28324, O28324 +28325, O28325 +28326, O28326 +28327, O28327 +28328, O28328 +28329, O28329 +28330, O28330 +28331, O28331 +28332, O28332 +28333, O28333 +28334, O28334 +28335, O28335 +28336, O28336 +28337, O28337 +28338, O28338 +28339, O28339 +28340, O28340 +28341, O28341 +28342, O28342 +28343, O28343 +28344, O28344 +28345, O28345 +28346, O28346 +28347, O28347 +28348, O28348 +28349, O28349 +28350, O28350 +28351, O28351 +28352, O28352 +28353, O28353 +28354, O28354 +28355, O28355 +28356, O28356 +28357, O28357 +28358, O28358 +28359, O28359 +28360, O28360 +28361, O28361 +28362, O28362 +28363, O28363 +28364, O28364 +28365, O28365 +28366, O28366 +28367, O28367 +28368, O28368 +28369, O28369 +28370, O28370 +28371, O28371 +28372, O28372 +28373, O28373 +28374, O28374 +28375, O28375 +28376, O28376 +28377, O28377 +28378, O28378 +28379, O28379 +28380, O28380 +28381, O28381 +28382, O28382 +28383, O28383 +28384, O28384 +28385, O28385 +28386, O28386 +28387, O28387 +28388, O28388 +28389, O28389 +28390, O28390 +28391, O28391 +28392, O28392 +28393, O28393 +28394, O28394 +28395, O28395 +28396, O28396 +28397, O28397 +28398, O28398 +28399, O28399 +28400, O28400 +28401, O28401 +28402, O28402 +28403, O28403 +28404, O28404 +28405, O28405 +28406, O28406 +28407, O28407 +28408, O28408 +28409, O28409 +28410, O28410 +28411, O28411 +28412, O28412 +28413, O28413 +28414, O28414 +28415, O28415 +28416, O28416 +28417, O28417 +28418, O28418 +28419, O28419 +28420, O28420 +28421, O28421 +28422, O28422 +28423, O28423 +28424, O28424 +28425, O28425 +28426, O28426 +28427, O28427 +28428, O28428 +28429, O28429 +28430, O28430 +28431, O28431 +28432, O28432 +28433, O28433 +28434, O28434 +28435, O28435 +28436, O28436 +28437, O28437 +28438, O28438 +28439, O28439 +28440, O28440 +28441, O28441 +28442, O28442 +28443, O28443 +28444, O28444 +28445, O28445 +28446, O28446 +28447, O28447 +28448, O28448 +28449, O28449 +28450, O28450 +28451, O28451 +28452, O28452 +28453, O28453 +28454, O28454 +28455, O28455 +28456, O28456 +28457, O28457 +28458, O28458 +28459, O28459 +28460, O28460 +28461, O28461 +28462, O28462 +28463, O28463 +28464, O28464 +28465, O28465 +28466, O28466 +28467, O28467 +28468, O28468 +28469, O28469 +28470, O28470 +28471, O28471 +28472, O28472 +28473, O28473 +28474, O28474 +28475, O28475 +28476, O28476 +28477, O28477 +28478, O28478 +28479, O28479 +28480, O28480 +28481, O28481 +28482, O28482 +28483, O28483 +28484, O28484 +28485, O28485 +28486, O28486 +28487, O28487 +28488, O28488 +28489, O28489 +28490, O28490 +28491, O28491 +28492, O28492 +28493, O28493 +28494, O28494 +28495, O28495 +28496, O28496 +28497, O28497 +28498, O28498 +28499, O28499 +28500, O28500 +28501, O28501 +28502, O28502 +28503, O28503 +28504, O28504 +28505, O28505 +28506, O28506 +28507, O28507 +28508, O28508 +28509, O28509 +28510, O28510 +28511, O28511 +28512, O28512 +28513, O28513 +28514, O28514 +28515, O28515 +28516, O28516 +28517, O28517 +28518, O28518 +28519, O28519 +28520, O28520 +28521, O28521 +28522, O28522 +28523, O28523 +28524, O28524 +28525, O28525 +28526, O28526 +28527, O28527 +28528, O28528 +28529, O28529 +28530, O28530 +28531, O28531 +28532, O28532 +28533, O28533 +28534, O28534 +28535, O28535 +28536, O28536 +28537, O28537 +28538, O28538 +28539, O28539 +28540, O28540 +28541, O28541 +28542, O28542 +28543, O28543 +28544, O28544 +28545, O28545 +28546, O28546 +28547, O28547 +28548, O28548 +28549, O28549 +28550, O28550 +28551, O28551 +28552, O28552 +28553, O28553 +28554, O28554 +28555, O28555 +28556, O28556 +28557, O28557 +28558, O28558 +28559, O28559 +28560, O28560 +28561, O28561 +28562, O28562 +28563, O28563 +28564, O28564 +28565, O28565 +28566, O28566 +28567, O28567 +28568, O28568 +28569, O28569 +28570, O28570 +28571, O28571 +28572, O28572 +28573, O28573 +28574, O28574 +28575, O28575 +28576, O28576 +28577, O28577 +28578, O28578 +28579, O28579 +28580, O28580 +28581, O28581 +28582, O28582 +28583, O28583 +28584, O28584 +28585, O28585 +28586, O28586 +28587, O28587 +28588, O28588 +28589, O28589 +28590, O28590 +28591, O28591 +28592, O28592 +28593, O28593 +28594, O28594 +28595, O28595 +28596, O28596 +28597, O28597 +28598, O28598 +28599, O28599 +28600, O28600 +28601, O28601 +28602, O28602 +28603, O28603 +28604, O28604 +28605, O28605 +28606, O28606 +28607, O28607 +28608, O28608 +28609, O28609 +28610, O28610 +28611, O28611 +28612, O28612 +28613, O28613 +28614, O28614 +28615, O28615 +28616, O28616 +28617, O28617 +28618, O28618 +28619, O28619 +28620, O28620 +28621, O28621 +28622, O28622 +28623, O28623 +28624, O28624 +28625, O28625 +28626, O28626 +28627, O28627 +28628, O28628 +28629, O28629 +28630, O28630 +28631, O28631 +28632, O28632 +28633, O28633 +28634, O28634 +28635, O28635 +28636, O28636 +28637, O28637 +28638, O28638 +28639, O28639 +28640, O28640 +28641, O28641 +28642, O28642 +28643, O28643 +28644, O28644 +28645, O28645 +28646, O28646 +28647, O28647 +28648, O28648 +28649, O28649 +28650, O28650 +28651, O28651 +28652, O28652 +28653, O28653 +28654, O28654 +28655, O28655 +28656, O28656 +28657, O28657 +28658, O28658 +28659, O28659 +28660, O28660 +28661, O28661 +28662, O28662 +28663, O28663 +28664, O28664 +28665, O28665 +28666, O28666 +28667, O28667 +28668, O28668 +28669, O28669 +28670, O28670 +28671, O28671 +28672, O28672 +28673, O28673 +28674, O28674 +28675, O28675 +28676, O28676 +28677, O28677 +28678, O28678 +28679, O28679 +28680, O28680 +28681, O28681 +28682, O28682 +28683, O28683 +28684, O28684 +28685, O28685 +28686, O28686 +28687, O28687 +28688, O28688 +28689, O28689 +28690, O28690 +28691, O28691 +28692, O28692 +28693, O28693 +28694, O28694 +28695, O28695 +28696, O28696 +28697, O28697 +28698, O28698 +28699, O28699 +28700, O28700 +28701, O28701 +28702, O28702 +28703, O28703 +28704, O28704 +28705, O28705 +28706, O28706 +28707, O28707 +28708, O28708 +28709, O28709 +28710, O28710 +28711, O28711 +28712, O28712 +28713, O28713 +28714, O28714 +28715, O28715 +28716, O28716 +28717, O28717 +28718, O28718 +28719, O28719 +28720, O28720 +28721, O28721 +28722, O28722 +28723, O28723 +28724, O28724 +28725, O28725 +28726, O28726 +28727, O28727 +28728, O28728 +28729, O28729 +28730, O28730 +28731, O28731 +28732, O28732 +28733, O28733 +28734, O28734 +28735, O28735 +28736, O28736 +28737, O28737 +28738, O28738 +28739, O28739 +28740, O28740 +28741, O28741 +28742, O28742 +28743, O28743 +28744, O28744 +28745, O28745 +28746, O28746 +28747, O28747 +28748, O28748 +28749, O28749 +28750, O28750 +28751, O28751 +28752, O28752 +28753, O28753 +28754, O28754 +28755, O28755 +28756, O28756 +28757, O28757 +28758, O28758 +28759, O28759 +28760, O28760 +28761, O28761 +28762, O28762 +28763, O28763 +28764, O28764 +28765, O28765 +28766, O28766 +28767, O28767 +28768, O28768 +28769, O28769 +28770, O28770 +28771, O28771 +28772, O28772 +28773, O28773 +28774, O28774 +28775, O28775 +28776, O28776 +28777, O28777 +28778, O28778 +28779, O28779 +28780, O28780 +28781, O28781 +28782, O28782 +28783, O28783 +28784, O28784 +28785, O28785 +28786, O28786 +28787, O28787 +28788, O28788 +28789, O28789 +28790, O28790 +28791, O28791 +28792, O28792 +28793, O28793 +28794, O28794 +28795, O28795 +28796, O28796 +28797, O28797 +28798, O28798 +28799, O28799 +28800, O28800 +28801, O28801 +28802, O28802 +28803, O28803 +28804, O28804 +28805, O28805 +28806, O28806 +28807, O28807 +28808, O28808 +28809, O28809 +28810, O28810 +28811, O28811 +28812, O28812 +28813, O28813 +28814, O28814 +28815, O28815 +28816, O28816 +28817, O28817 +28818, O28818 +28819, O28819 +28820, O28820 +28821, O28821 +28822, O28822 +28823, O28823 +28824, O28824 +28825, O28825 +28826, O28826 +28827, O28827 +28828, O28828 +28829, O28829 +28830, O28830 +28831, O28831 +28832, O28832 +28833, O28833 +28834, O28834 +28835, O28835 +28836, O28836 +28837, O28837 +28838, O28838 +28839, O28839 +28840, O28840 +28841, O28841 +28842, O28842 +28843, O28843 +28844, O28844 +28845, O28845 +28846, O28846 +28847, O28847 +28848, O28848 +28849, O28849 +28850, O28850 +28851, O28851 +28852, O28852 +28853, O28853 +28854, O28854 +28855, O28855 +28856, O28856 +28857, O28857 +28858, O28858 +28859, O28859 +28860, O28860 +28861, O28861 +28862, O28862 +28863, O28863 +28864, O28864 +28865, O28865 +28866, O28866 +28867, O28867 +28868, O28868 +28869, O28869 +28870, O28870 +28871, O28871 +28872, O28872 +28873, O28873 +28874, O28874 +28875, O28875 +28876, O28876 +28877, O28877 +28878, O28878 +28879, O28879 +28880, O28880 +28881, O28881 +28882, O28882 +28883, O28883 +28884, O28884 +28885, O28885 +28886, O28886 +28887, O28887 +28888, O28888 +28889, O28889 +28890, O28890 +28891, O28891 +28892, O28892 +28893, O28893 +28894, O28894 +28895, O28895 +28896, O28896 +28897, O28897 +28898, O28898 +28899, O28899 +28900, O28900 +28901, O28901 +28902, O28902 +28903, O28903 +28904, O28904 +28905, O28905 +28906, O28906 +28907, O28907 +28908, O28908 +28909, O28909 +28910, O28910 +28911, O28911 +28912, O28912 +28913, O28913 +28914, O28914 +28915, O28915 +28916, O28916 +28917, O28917 +28918, O28918 +28919, O28919 +28920, O28920 +28921, O28921 +28922, O28922 +28923, O28923 +28924, O28924 +28925, O28925 +28926, O28926 +28927, O28927 +28928, O28928 +28929, O28929 +28930, O28930 +28931, O28931 +28932, O28932 +28933, O28933 +28934, O28934 +28935, O28935 +28936, O28936 +28937, O28937 +28938, O28938 +28939, O28939 +28940, O28940 +28941, O28941 +28942, O28942 +28943, O28943 +28944, O28944 +28945, O28945 +28946, O28946 +28947, O28947 +28948, O28948 +28949, O28949 +28950, O28950 +28951, O28951 +28952, O28952 +28953, O28953 +28954, O28954 +28955, O28955 +28956, O28956 +28957, O28957 +28958, O28958 +28959, O28959 +28960, O28960 +28961, O28961 +28962, O28962 +28963, O28963 +28964, O28964 +28965, O28965 +28966, O28966 +28967, O28967 +28968, O28968 +28969, O28969 +28970, O28970 +28971, O28971 +28972, O28972 +28973, O28973 +28974, O28974 +28975, O28975 +28976, O28976 +28977, O28977 +28978, O28978 +28979, O28979 +28980, O28980 +28981, O28981 +28982, O28982 +28983, O28983 +28984, O28984 +28985, O28985 +28986, O28986 +28987, O28987 +28988, O28988 +28989, O28989 +28990, O28990 +28991, O28991 +28992, O28992 +28993, O28993 +28994, O28994 +28995, O28995 +28996, O28996 +28997, O28997 +28998, O28998 +28999, O28999 +29000, O29000 +29001, O29001 +29002, O29002 +29003, O29003 +29004, O29004 +29005, O29005 +29006, O29006 +29007, O29007 +29008, O29008 +29009, O29009 +29010, O29010 +29011, O29011 +29012, O29012 +29013, O29013 +29014, O29014 +29015, O29015 +29016, O29016 +29017, O29017 +29018, O29018 +29019, O29019 +29020, O29020 +29021, O29021 +29022, O29022 +29023, O29023 +29024, O29024 +29025, O29025 +29026, O29026 +29027, O29027 +29028, O29028 +29029, O29029 +29030, O29030 +29031, O29031 +29032, O29032 +29033, O29033 +29034, O29034 +29035, O29035 +29036, O29036 +29037, O29037 +29038, O29038 +29039, O29039 +29040, O29040 +29041, O29041 +29042, O29042 +29043, O29043 +29044, O29044 +29045, O29045 +29046, O29046 +29047, O29047 +29048, O29048 +29049, O29049 +29050, O29050 +29051, O29051 +29052, O29052 +29053, O29053 +29054, O29054 +29055, O29055 +29056, O29056 +29057, O29057 +29058, O29058 +29059, O29059 +29060, O29060 +29061, O29061 +29062, O29062 +29063, O29063 +29064, O29064 +29065, O29065 +29066, O29066 +29067, O29067 +29068, O29068 +29069, O29069 +29070, O29070 +29071, O29071 +29072, O29072 +29073, O29073 +29074, O29074 +29075, O29075 +29076, O29076 +29077, O29077 +29078, O29078 +29079, O29079 +29080, O29080 +29081, O29081 +29082, O29082 +29083, O29083 +29084, O29084 +29085, O29085 +29086, O29086 +29087, O29087 +29088, O29088 +29089, O29089 +29090, O29090 +29091, O29091 +29092, O29092 +29093, O29093 +29094, O29094 +29095, O29095 +29096, O29096 +29097, O29097 +29098, O29098 +29099, O29099 +29100, O29100 +29101, O29101 +29102, O29102 +29103, O29103 +29104, O29104 +29105, O29105 +29106, O29106 +29107, O29107 +29108, O29108 +29109, O29109 +29110, O29110 +29111, O29111 +29112, O29112 +29113, O29113 +29114, O29114 +29115, O29115 +29116, O29116 +29117, O29117 +29118, O29118 +29119, O29119 +29120, O29120 +29121, O29121 +29122, O29122 +29123, O29123 +29124, O29124 +29125, O29125 +29126, O29126 +29127, O29127 +29128, O29128 +29129, O29129 +29130, O29130 +29131, O29131 +29132, O29132 +29133, O29133 +29134, O29134 +29135, O29135 +29136, O29136 +29137, O29137 +29138, O29138 +29139, O29139 +29140, O29140 +29141, O29141 +29142, O29142 +29143, O29143 +29144, O29144 +29145, O29145 +29146, O29146 +29147, O29147 +29148, O29148 +29149, O29149 +29150, O29150 +29151, O29151 +29152, O29152 +29153, O29153 +29154, O29154 +29155, O29155 +29156, O29156 +29157, O29157 +29158, O29158 +29159, O29159 +29160, O29160 +29161, O29161 +29162, O29162 +29163, O29163 +29164, O29164 +29165, O29165 +29166, O29166 +29167, O29167 +29168, O29168 +29169, O29169 +29170, O29170 +29171, O29171 +29172, O29172 +29173, O29173 +29174, O29174 +29175, O29175 +29176, O29176 +29177, O29177 +29178, O29178 +29179, O29179 +29180, O29180 +29181, O29181 +29182, O29182 +29183, O29183 +29184, O29184 +29185, O29185 +29186, O29186 +29187, O29187 +29188, O29188 +29189, O29189 +29190, O29190 +29191, O29191 +29192, O29192 +29193, O29193 +29194, O29194 +29195, O29195 +29196, O29196 +29197, O29197 +29198, O29198 +29199, O29199 +29200, O29200 +29201, O29201 +29202, O29202 +29203, O29203 +29204, O29204 +29205, O29205 +29206, O29206 +29207, O29207 +29208, O29208 +29209, O29209 +29210, O29210 +29211, O29211 +29212, O29212 +29213, O29213 +29214, O29214 +29215, O29215 +29216, O29216 +29217, O29217 +29218, O29218 +29219, O29219 +29220, O29220 +29221, O29221 +29222, O29222 +29223, O29223 +29224, O29224 +29225, O29225 +29226, O29226 +29227, O29227 +29228, O29228 +29229, O29229 +29230, O29230 +29231, O29231 +29232, O29232 +29233, O29233 +29234, O29234 +29235, O29235 +29236, O29236 +29237, O29237 +29238, O29238 +29239, O29239 +29240, O29240 +29241, O29241 +29242, O29242 +29243, O29243 +29244, O29244 +29245, O29245 +29246, O29246 +29247, O29247 +29248, O29248 +29249, O29249 +29250, O29250 +29251, O29251 +29252, O29252 +29253, O29253 +29254, O29254 +29255, O29255 +29256, O29256 +29257, O29257 +29258, O29258 +29259, O29259 +29260, O29260 +29261, O29261 +29262, O29262 +29263, O29263 +29264, O29264 +29265, O29265 +29266, O29266 +29267, O29267 +29268, O29268 +29269, O29269 +29270, O29270 +29271, O29271 +29272, O29272 +29273, O29273 +29274, O29274 +29275, O29275 +29276, O29276 +29277, O29277 +29278, O29278 +29279, O29279 +29280, O29280 +29281, O29281 +29282, O29282 +29283, O29283 +29284, O29284 +29285, O29285 +29286, O29286 +29287, O29287 +29288, O29288 +29289, O29289 +29290, O29290 +29291, O29291 +29292, O29292 +29293, O29293 +29294, O29294 +29295, O29295 +29296, O29296 +29297, O29297 +29298, O29298 +29299, O29299 +29300, O29300 +29301, O29301 +29302, O29302 +29303, O29303 +29304, O29304 +29305, O29305 +29306, O29306 +29307, O29307 +29308, O29308 +29309, O29309 +29310, O29310 +29311, O29311 +29312, O29312 +29313, O29313 +29314, O29314 +29315, O29315 +29316, O29316 +29317, O29317 +29318, O29318 +29319, O29319 +29320, O29320 +29321, O29321 +29322, O29322 +29323, O29323 +29324, O29324 +29325, O29325 +29326, O29326 +29327, O29327 +29328, O29328 +29329, O29329 +29330, O29330 +29331, O29331 +29332, O29332 +29333, O29333 +29334, O29334 +29335, O29335 +29336, O29336 +29337, O29337 +29338, O29338 +29339, O29339 +29340, O29340 +29341, O29341 +29342, O29342 +29343, O29343 +29344, O29344 +29345, O29345 +29346, O29346 +29347, O29347 +29348, O29348 +29349, O29349 +29350, O29350 +29351, O29351 +29352, O29352 +29353, O29353 +29354, O29354 +29355, O29355 +29356, O29356 +29357, O29357 +29358, O29358 +29359, O29359 +29360, O29360 +29361, O29361 +29362, O29362 +29363, O29363 +29364, O29364 +29365, O29365 +29366, O29366 +29367, O29367 +29368, O29368 +29369, O29369 +29370, O29370 +29371, O29371 +29372, O29372 +29373, O29373 +29374, O29374 +29375, O29375 +29376, O29376 +29377, O29377 +29378, O29378 +29379, O29379 +29380, O29380 +29381, O29381 +29382, O29382 +29383, O29383 +29384, O29384 +29385, O29385 +29386, O29386 +29387, O29387 +29388, O29388 +29389, O29389 +29390, O29390 +29391, O29391 +29392, O29392 +29393, O29393 +29394, O29394 +29395, O29395 +29396, O29396 +29397, O29397 +29398, O29398 +29399, O29399 +29400, O29400 +29401, O29401 +29402, O29402 +29403, O29403 +29404, O29404 +29405, O29405 +29406, O29406 +29407, O29407 +29408, O29408 +29409, O29409 +29410, O29410 +29411, O29411 +29412, O29412 +29413, O29413 +29414, O29414 +29415, O29415 +29416, O29416 +29417, O29417 +29418, O29418 +29419, O29419 +29420, O29420 +29421, O29421 +29422, O29422 +29423, O29423 +29424, O29424 +29425, O29425 +29426, O29426 +29427, O29427 +29428, O29428 +29429, O29429 +29430, O29430 +29431, O29431 +29432, O29432 +29433, O29433 +29434, O29434 +29435, O29435 +29436, O29436 +29437, O29437 +29438, O29438 +29439, O29439 +29440, O29440 +29441, O29441 +29442, O29442 +29443, O29443 +29444, O29444 +29445, O29445 +29446, O29446 +29447, O29447 +29448, O29448 +29449, O29449 +29450, O29450 +29451, O29451 +29452, O29452 +29453, O29453 +29454, O29454 +29455, O29455 +29456, O29456 +29457, O29457 +29458, O29458 +29459, O29459 +29460, O29460 +29461, O29461 +29462, O29462 +29463, O29463 +29464, O29464 +29465, O29465 +29466, O29466 +29467, O29467 +29468, O29468 +29469, O29469 +29470, O29470 +29471, O29471 +29472, O29472 +29473, O29473 +29474, O29474 +29475, O29475 +29476, O29476 +29477, O29477 +29478, O29478 +29479, O29479 +29480, O29480 +29481, O29481 +29482, O29482 +29483, O29483 +29484, O29484 +29485, O29485 +29486, O29486 +29487, O29487 +29488, O29488 +29489, O29489 +29490, O29490 +29491, O29491 +29492, O29492 +29493, O29493 +29494, O29494 +29495, O29495 +29496, O29496 +29497, O29497 +29498, O29498 +29499, O29499 +29500, O29500 +29501, O29501 +29502, O29502 +29503, O29503 +29504, O29504 +29505, O29505 +29506, O29506 +29507, O29507 +29508, O29508 +29509, O29509 +29510, O29510 +29511, O29511 +29512, O29512 +29513, O29513 +29514, O29514 +29515, O29515 +29516, O29516 +29517, O29517 +29518, O29518 +29519, O29519 +29520, O29520 +29521, O29521 +29522, O29522 +29523, O29523 +29524, O29524 +29525, O29525 +29526, O29526 +29527, O29527 +29528, O29528 +29529, O29529 +29530, O29530 +29531, O29531 +29532, O29532 +29533, O29533 +29534, O29534 +29535, O29535 +29536, O29536 +29537, O29537 +29538, O29538 +29539, O29539 +29540, O29540 +29541, O29541 +29542, O29542 +29543, O29543 +29544, O29544 +29545, O29545 +29546, O29546 +29547, O29547 +29548, O29548 +29549, O29549 +29550, O29550 +29551, O29551 +29552, O29552 +29553, O29553 +29554, O29554 +29555, O29555 +29556, O29556 +29557, O29557 +29558, O29558 +29559, O29559 +29560, O29560 +29561, O29561 +29562, O29562 +29563, O29563 +29564, O29564 +29565, O29565 +29566, O29566 +29567, O29567 +29568, O29568 +29569, O29569 +29570, O29570 +29571, O29571 +29572, O29572 +29573, O29573 +29574, O29574 +29575, O29575 +29576, O29576 +29577, O29577 +29578, O29578 +29579, O29579 +29580, O29580 +29581, O29581 +29582, O29582 +29583, O29583 +29584, O29584 +29585, O29585 +29586, O29586 +29587, O29587 +29588, O29588 +29589, O29589 +29590, O29590 +29591, O29591 +29592, O29592 +29593, O29593 +29594, O29594 +29595, O29595 +29596, O29596 +29597, O29597 +29598, O29598 +29599, O29599 +29600, O29600 +29601, O29601 +29602, O29602 +29603, O29603 +29604, O29604 +29605, O29605 +29606, O29606 +29607, O29607 +29608, O29608 +29609, O29609 +29610, O29610 +29611, O29611 +29612, O29612 +29613, O29613 +29614, O29614 +29615, O29615 +29616, O29616 +29617, O29617 +29618, O29618 +29619, O29619 +29620, O29620 +29621, O29621 +29622, O29622 +29623, O29623 +29624, O29624 +29625, O29625 +29626, O29626 +29627, O29627 +29628, O29628 +29629, O29629 +29630, O29630 +29631, O29631 +29632, O29632 +29633, O29633 +29634, O29634 +29635, O29635 +29636, O29636 +29637, O29637 +29638, O29638 +29639, O29639 +29640, O29640 +29641, O29641 +29642, O29642 +29643, O29643 +29644, O29644 +29645, O29645 +29646, O29646 +29647, O29647 +29648, O29648 +29649, O29649 +29650, O29650 +29651, O29651 +29652, O29652 +29653, O29653 +29654, O29654 +29655, O29655 +29656, O29656 +29657, O29657 +29658, O29658 +29659, O29659 +29660, O29660 +29661, O29661 +29662, O29662 +29663, O29663 +29664, O29664 +29665, O29665 +29666, O29666 +29667, O29667 +29668, O29668 +29669, O29669 +29670, O29670 +29671, O29671 +29672, O29672 +29673, O29673 +29674, O29674 +29675, O29675 +29676, O29676 +29677, O29677 +29678, O29678 +29679, O29679 +29680, O29680 +29681, O29681 +29682, O29682 +29683, O29683 +29684, O29684 +29685, O29685 +29686, O29686 +29687, O29687 +29688, O29688 +29689, O29689 +29690, O29690 +29691, O29691 +29692, O29692 +29693, O29693 +29694, O29694 +29695, O29695 +29696, O29696 +29697, O29697 +29698, O29698 +29699, O29699 +29700, O29700 +29701, O29701 +29702, O29702 +29703, O29703 +29704, O29704 +29705, O29705 +29706, O29706 +29707, O29707 +29708, O29708 +29709, O29709 +29710, O29710 +29711, O29711 +29712, O29712 +29713, O29713 +29714, O29714 +29715, O29715 +29716, O29716 +29717, O29717 +29718, O29718 +29719, O29719 +29720, O29720 +29721, O29721 +29722, O29722 +29723, O29723 +29724, O29724 +29725, O29725 +29726, O29726 +29727, O29727 +29728, O29728 +29729, O29729 +29730, O29730 +29731, O29731 +29732, O29732 +29733, O29733 +29734, O29734 +29735, O29735 +29736, O29736 +29737, O29737 +29738, O29738 +29739, O29739 +29740, O29740 +29741, O29741 +29742, O29742 +29743, O29743 +29744, O29744 +29745, O29745 +29746, O29746 +29747, O29747 +29748, O29748 +29749, O29749 +29750, O29750 +29751, O29751 +29752, O29752 +29753, O29753 +29754, O29754 +29755, O29755 +29756, O29756 +29757, O29757 +29758, O29758 +29759, O29759 +29760, O29760 +29761, O29761 +29762, O29762 +29763, O29763 +29764, O29764 +29765, O29765 +29766, O29766 +29767, O29767 +29768, O29768 +29769, O29769 +29770, O29770 +29771, O29771 +29772, O29772 +29773, O29773 +29774, O29774 +29775, O29775 +29776, O29776 +29777, O29777 +29778, O29778 +29779, O29779 +29780, O29780 +29781, O29781 +29782, O29782 +29783, O29783 +29784, O29784 +29785, O29785 +29786, O29786 +29787, O29787 +29788, O29788 +29789, O29789 +29790, O29790 +29791, O29791 +29792, O29792 +29793, O29793 +29794, O29794 +29795, O29795 +29796, O29796 +29797, O29797 +29798, O29798 +29799, O29799 +29800, O29800 +29801, O29801 +29802, O29802 +29803, O29803 +29804, O29804 +29805, O29805 +29806, O29806 +29807, O29807 +29808, O29808 +29809, O29809 +29810, O29810 +29811, O29811 +29812, O29812 +29813, O29813 +29814, O29814 +29815, O29815 +29816, O29816 +29817, O29817 +29818, O29818 +29819, O29819 +29820, O29820 +29821, O29821 +29822, O29822 +29823, O29823 +29824, O29824 +29825, O29825 +29826, O29826 +29827, O29827 +29828, O29828 +29829, O29829 +29830, O29830 +29831, O29831 +29832, O29832 +29833, O29833 +29834, O29834 +29835, O29835 +29836, O29836 +29837, O29837 +29838, O29838 +29839, O29839 +29840, O29840 +29841, O29841 +29842, O29842 +29843, O29843 +29844, O29844 +29845, O29845 +29846, O29846 +29847, O29847 +29848, O29848 +29849, O29849 +29850, O29850 +29851, O29851 +29852, O29852 +29853, O29853 +29854, O29854 +29855, O29855 +29856, O29856 +29857, O29857 +29858, O29858 +29859, O29859 +29860, O29860 +29861, O29861 +29862, O29862 +29863, O29863 +29864, O29864 +29865, O29865 +29866, O29866 +29867, O29867 +29868, O29868 +29869, O29869 +29870, O29870 +29871, O29871 +29872, O29872 +29873, O29873 +29874, O29874 +29875, O29875 +29876, O29876 +29877, O29877 +29878, O29878 +29879, O29879 +29880, O29880 +29881, O29881 +29882, O29882 +29883, O29883 +29884, O29884 +29885, O29885 +29886, O29886 +29887, O29887 +29888, O29888 +29889, O29889 +29890, O29890 +29891, O29891 +29892, O29892 +29893, O29893 +29894, O29894 +29895, O29895 +29896, O29896 +29897, O29897 +29898, O29898 +29899, O29899 +29900, O29900 +29901, O29901 +29902, O29902 +29903, O29903 +29904, O29904 +29905, O29905 +29906, O29906 +29907, O29907 +29908, O29908 +29909, O29909 +29910, O29910 +29911, O29911 +29912, O29912 +29913, O29913 +29914, O29914 +29915, O29915 +29916, O29916 +29917, O29917 +29918, O29918 +29919, O29919 +29920, O29920 +29921, O29921 +29922, O29922 +29923, O29923 +29924, O29924 +29925, O29925 +29926, O29926 +29927, O29927 +29928, O29928 +29929, O29929 +29930, O29930 +29931, O29931 +29932, O29932 +29933, O29933 +29934, O29934 +29935, O29935 +29936, O29936 +29937, O29937 +29938, O29938 +29939, O29939 +29940, O29940 +29941, O29941 +29942, O29942 +29943, O29943 +29944, O29944 +29945, O29945 +29946, O29946 +29947, O29947 +29948, O29948 +29949, O29949 +29950, O29950 +29951, O29951 +29952, O29952 +29953, O29953 +29954, O29954 +29955, O29955 +29956, O29956 +29957, O29957 +29958, O29958 +29959, O29959 +29960, O29960 +29961, O29961 +29962, O29962 +29963, O29963 +29964, O29964 +29965, O29965 +29966, O29966 +29967, O29967 +29968, O29968 +29969, O29969 +29970, O29970 +29971, O29971 +29972, O29972 +29973, O29973 +29974, O29974 +29975, O29975 +29976, O29976 +29977, O29977 +29978, O29978 +29979, O29979 +29980, O29980 +29981, O29981 +29982, O29982 +29983, O29983 +29984, O29984 +29985, O29985 +29986, O29986 +29987, O29987 +29988, O29988 +29989, O29989 +29990, O29990 +29991, O29991 +29992, O29992 +29993, O29993 +29994, O29994 +29995, O29995 +29996, O29996 +29997, O29997 +29998, O29998 +29999, O29999 +30000, O30000 +30001, O30001 +30002, O30002 +30003, O30003 +30004, O30004 +30005, O30005 +30006, O30006 +30007, O30007 +30008, O30008 +30009, O30009 +30010, O30010 +30011, O30011 +30012, O30012 +30013, O30013 +30014, O30014 +30015, O30015 +30016, O30016 +30017, O30017 +30018, O30018 +30019, O30019 +30020, O30020 +30021, O30021 +30022, O30022 +30023, O30023 +30024, O30024 +30025, O30025 +30026, O30026 +30027, O30027 +30028, O30028 +30029, O30029 +30030, O30030 +30031, O30031 +30032, O30032 +30033, O30033 +30034, O30034 +30035, O30035 +30036, O30036 +30037, O30037 +30038, O30038 +30039, O30039 +30040, O30040 +30041, O30041 +30042, O30042 +30043, O30043 +30044, O30044 +30045, O30045 +30046, O30046 +30047, O30047 +30048, O30048 +30049, O30049 +30050, O30050 +30051, O30051 +30052, O30052 +30053, O30053 +30054, O30054 +30055, O30055 +30056, O30056 +30057, O30057 +30058, O30058 +30059, O30059 +30060, O30060 +30061, O30061 +30062, O30062 +30063, O30063 +30064, O30064 +30065, O30065 +30066, O30066 +30067, O30067 +30068, O30068 +30069, O30069 +30070, O30070 +30071, O30071 +30072, O30072 +30073, O30073 +30074, O30074 +30075, O30075 +30076, O30076 +30077, O30077 +30078, O30078 +30079, O30079 +30080, O30080 +30081, O30081 +30082, O30082 +30083, O30083 +30084, O30084 +30085, O30085 +30086, O30086 +30087, O30087 +30088, O30088 +30089, O30089 +30090, O30090 +30091, O30091 +30092, O30092 +30093, O30093 +30094, O30094 +30095, O30095 +30096, O30096 +30097, O30097 +30098, O30098 +30099, O30099 +30100, O30100 +30101, O30101 +30102, O30102 +30103, O30103 +30104, O30104 +30105, O30105 +30106, O30106 +30107, O30107 +30108, O30108 +30109, O30109 +30110, O30110 +30111, O30111 +30112, O30112 +30113, O30113 +30114, O30114 +30115, O30115 +30116, O30116 +30117, O30117 +30118, O30118 +30119, O30119 +30120, O30120 +30121, O30121 +30122, O30122 +30123, O30123 +30124, O30124 +30125, O30125 +30126, O30126 +30127, O30127 +30128, O30128 +30129, O30129 +30130, O30130 +30131, O30131 +30132, O30132 +30133, O30133 +30134, O30134 +30135, O30135 +30136, O30136 +30137, O30137 +30138, O30138 +30139, O30139 +30140, O30140 +30141, O30141 +30142, O30142 +30143, O30143 +30144, O30144 +30145, O30145 +30146, O30146 +30147, O30147 +30148, O30148 +30149, O30149 +30150, O30150 +30151, O30151 +30152, O30152 +30153, O30153 +30154, O30154 +30155, O30155 +30156, O30156 +30157, O30157 +30158, O30158 +30159, O30159 +30160, O30160 +30161, O30161 +30162, O30162 +30163, O30163 +30164, O30164 +30165, O30165 +30166, O30166 +30167, O30167 +30168, O30168 +30169, O30169 +30170, O30170 +30171, O30171 +30172, O30172 +30173, O30173 +30174, O30174 +30175, O30175 +30176, O30176 +30177, O30177 +30178, O30178 +30179, O30179 +30180, O30180 +30181, O30181 +30182, O30182 +30183, O30183 +30184, O30184 +30185, O30185 +30186, O30186 +30187, O30187 +30188, O30188 +30189, O30189 +30190, O30190 +30191, O30191 +30192, O30192 +30193, O30193 +30194, O30194 +30195, O30195 +30196, O30196 +30197, O30197 +30198, O30198 +30199, O30199 +30200, O30200 +30201, O30201 +30202, O30202 +30203, O30203 +30204, O30204 +30205, O30205 +30206, O30206 +30207, O30207 +30208, O30208 +30209, O30209 +30210, O30210 +30211, O30211 +30212, O30212 +30213, O30213 +30214, O30214 +30215, O30215 +30216, O30216 +30217, O30217 +30218, O30218 +30219, O30219 +30220, O30220 +30221, O30221 +30222, O30222 +30223, O30223 +30224, O30224 +30225, O30225 +30226, O30226 +30227, O30227 +30228, O30228 +30229, O30229 +30230, O30230 +30231, O30231 +30232, O30232 +30233, O30233 +30234, O30234 +30235, O30235 +30236, O30236 +30237, O30237 +30238, O30238 +30239, O30239 +30240, O30240 +30241, O30241 +30242, O30242 +30243, O30243 +30244, O30244 +30245, O30245 +30246, O30246 +30247, O30247 +30248, O30248 +30249, O30249 +30250, O30250 +30251, O30251 +30252, O30252 +30253, O30253 +30254, O30254 +30255, O30255 +30256, O30256 +30257, O30257 +30258, O30258 +30259, O30259 +30260, O30260 +30261, O30261 +30262, O30262 +30263, O30263 +30264, O30264 +30265, O30265 +30266, O30266 +30267, O30267 +30268, O30268 +30269, O30269 +30270, O30270 +30271, O30271 +30272, O30272 +30273, O30273 +30274, O30274 +30275, O30275 +30276, O30276 +30277, O30277 +30278, O30278 +30279, O30279 +30280, O30280 +30281, O30281 +30282, O30282 +30283, O30283 +30284, O30284 +30285, O30285 +30286, O30286 +30287, O30287 +30288, O30288 +30289, O30289 +30290, O30290 +30291, O30291 +30292, O30292 +30293, O30293 +30294, O30294 +30295, O30295 +30296, O30296 +30297, O30297 +30298, O30298 +30299, O30299 +30300, O30300 +30301, O30301 +30302, O30302 +30303, O30303 +30304, O30304 +30305, O30305 +30306, O30306 +30307, O30307 +30308, O30308 +30309, O30309 +30310, O30310 +30311, O30311 +30312, O30312 +30313, O30313 +30314, O30314 +30315, O30315 +30316, O30316 +30317, O30317 +30318, O30318 +30319, O30319 +30320, O30320 +30321, O30321 +30322, O30322 +30323, O30323 +30324, O30324 +30325, O30325 +30326, O30326 +30327, O30327 +30328, O30328 +30329, O30329 +30330, O30330 +30331, O30331 +30332, O30332 +30333, O30333 +30334, O30334 +30335, O30335 +30336, O30336 +30337, O30337 +30338, O30338 +30339, O30339 +30340, O30340 +30341, O30341 +30342, O30342 +30343, O30343 +30344, O30344 +30345, O30345 +30346, O30346 +30347, O30347 +30348, O30348 +30349, O30349 +30350, O30350 +30351, O30351 +30352, O30352 +30353, O30353 +30354, O30354 +30355, O30355 +30356, O30356 +30357, O30357 +30358, O30358 +30359, O30359 +30360, O30360 +30361, O30361 +30362, O30362 +30363, O30363 +30364, O30364 +30365, O30365 +30366, O30366 +30367, O30367 +30368, O30368 +30369, O30369 +30370, O30370 +30371, O30371 +30372, O30372 +30373, O30373 +30374, O30374 +30375, O30375 +30376, O30376 +30377, O30377 +30378, O30378 +30379, O30379 +30380, O30380 +30381, O30381 +30382, O30382 +30383, O30383 +30384, O30384 +30385, O30385 +30386, O30386 +30387, O30387 +30388, O30388 +30389, O30389 +30390, O30390 +30391, O30391 +30392, O30392 +30393, O30393 +30394, O30394 +30395, O30395 +30396, O30396 +30397, O30397 +30398, O30398 +30399, O30399 +30400, O30400 +30401, O30401 +30402, O30402 +30403, O30403 +30404, O30404 +30405, O30405 +30406, O30406 +30407, O30407 +30408, O30408 +30409, O30409 +30410, O30410 +30411, O30411 +30412, O30412 +30413, O30413 +30414, O30414 +30415, O30415 +30416, O30416 +30417, O30417 +30418, O30418 +30419, O30419 +30420, O30420 +30421, O30421 +30422, O30422 +30423, O30423 +30424, O30424 +30425, O30425 +30426, O30426 +30427, O30427 +30428, O30428 +30429, O30429 +30430, O30430 +30431, O30431 +30432, O30432 +30433, O30433 +30434, O30434 +30435, O30435 +30436, O30436 +30437, O30437 +30438, O30438 +30439, O30439 +30440, O30440 +30441, O30441 +30442, O30442 +30443, O30443 +30444, O30444 +30445, O30445 +30446, O30446 +30447, O30447 +30448, O30448 +30449, O30449 +30450, O30450 +30451, O30451 +30452, O30452 +30453, O30453 +30454, O30454 +30455, O30455 +30456, O30456 +30457, O30457 +30458, O30458 +30459, O30459 +30460, O30460 +30461, O30461 +30462, O30462 +30463, O30463 +30464, O30464 +30465, O30465 +30466, O30466 +30467, O30467 +30468, O30468 +30469, O30469 +30470, O30470 +30471, O30471 +30472, O30472 +30473, O30473 +30474, O30474 +30475, O30475 +30476, O30476 +30477, O30477 +30478, O30478 +30479, O30479 +30480, O30480 +30481, O30481 +30482, O30482 +30483, O30483 +30484, O30484 +30485, O30485 +30486, O30486 +30487, O30487 +30488, O30488 +30489, O30489 +30490, O30490 +30491, O30491 +30492, O30492 +30493, O30493 +30494, O30494 +30495, O30495 +30496, O30496 +30497, O30497 +30498, O30498 +30499, O30499 +30500, O30500 +30501, O30501 +30502, O30502 +30503, O30503 +30504, O30504 +30505, O30505 +30506, O30506 +30507, O30507 +30508, O30508 +30509, O30509 +30510, O30510 +30511, O30511 +30512, O30512 +30513, O30513 +30514, O30514 +30515, O30515 +30516, O30516 +30517, O30517 +30518, O30518 +30519, O30519 +30520, O30520 +30521, O30521 +30522, O30522 +30523, O30523 +30524, O30524 +30525, O30525 +30526, O30526 +30527, O30527 +30528, O30528 +30529, O30529 +30530, O30530 +30531, O30531 +30532, O30532 +30533, O30533 +30534, O30534 +30535, O30535 +30536, O30536 +30537, O30537 +30538, O30538 +30539, O30539 +30540, O30540 +30541, O30541 +30542, O30542 +30543, O30543 +30544, O30544 +30545, O30545 +30546, O30546 +30547, O30547 +30548, O30548 +30549, O30549 +30550, O30550 +30551, O30551 +30552, O30552 +30553, O30553 +30554, O30554 +30555, O30555 +30556, O30556 +30557, O30557 +30558, O30558 +30559, O30559 +30560, O30560 +30561, O30561 +30562, O30562 +30563, O30563 +30564, O30564 +30565, O30565 +30566, O30566 +30567, O30567 +30568, O30568 +30569, O30569 +30570, O30570 +30571, O30571 +30572, O30572 +30573, O30573 +30574, O30574 +30575, O30575 +30576, O30576 +30577, O30577 +30578, O30578 +30579, O30579 +30580, O30580 +30581, O30581 +30582, O30582 +30583, O30583 +30584, O30584 +30585, O30585 +30586, O30586 +30587, O30587 +30588, O30588 +30589, O30589 +30590, O30590 +30591, O30591 +30592, O30592 +30593, O30593 +30594, O30594 +30595, O30595 +30596, O30596 +30597, O30597 +30598, O30598 +30599, O30599 +30600, O30600 +30601, O30601 +30602, O30602 +30603, O30603 +30604, O30604 +30605, O30605 +30606, O30606 +30607, O30607 +30608, O30608 +30609, O30609 +30610, O30610 +30611, O30611 +30612, O30612 +30613, O30613 +30614, O30614 +30615, O30615 +30616, O30616 +30617, O30617 +30618, O30618 +30619, O30619 +30620, O30620 +30621, O30621 +30622, O30622 +30623, O30623 +30624, O30624 +30625, O30625 +30626, O30626 +30627, O30627 +30628, O30628 +30629, O30629 +30630, O30630 +30631, O30631 +30632, O30632 +30633, O30633 +30634, O30634 +30635, O30635 +30636, O30636 +30637, O30637 +30638, O30638 +30639, O30639 +30640, O30640 +30641, O30641 +30642, O30642 +30643, O30643 +30644, O30644 +30645, O30645 +30646, O30646 +30647, O30647 +30648, O30648 +30649, O30649 +30650, O30650 +30651, O30651 +30652, O30652 +30653, O30653 +30654, O30654 +30655, O30655 +30656, O30656 +30657, O30657 +30658, O30658 +30659, O30659 +30660, O30660 +30661, O30661 +30662, O30662 +30663, O30663 +30664, O30664 +30665, O30665 +30666, O30666 +30667, O30667 +30668, O30668 +30669, O30669 +30670, O30670 +30671, O30671 +30672, O30672 +30673, O30673 +30674, O30674 +30675, O30675 +30676, O30676 +30677, O30677 +30678, O30678 +30679, O30679 +30680, O30680 +30681, O30681 +30682, O30682 +30683, O30683 +30684, O30684 +30685, O30685 +30686, O30686 +30687, O30687 +30688, O30688 +30689, O30689 +30690, O30690 +30691, O30691 +30692, O30692 +30693, O30693 +30694, O30694 +30695, O30695 +30696, O30696 +30697, O30697 +30698, O30698 +30699, O30699 +30700, O30700 +30701, O30701 +30702, O30702 +30703, O30703 +30704, O30704 +30705, O30705 +30706, O30706 +30707, O30707 +30708, O30708 +30709, O30709 +30710, O30710 +30711, O30711 +30712, O30712 +30713, O30713 +30714, O30714 +30715, O30715 +30716, O30716 +30717, O30717 +30718, O30718 +30719, O30719 +30720, O30720 +30721, O30721 +30722, O30722 +30723, O30723 +30724, O30724 +30725, O30725 +30726, O30726 +30727, O30727 +30728, O30728 +30729, O30729 +30730, O30730 +30731, O30731 +30732, O30732 +30733, O30733 +30734, O30734 +30735, O30735 +30736, O30736 +30737, O30737 +30738, O30738 +30739, O30739 +30740, O30740 +30741, O30741 +30742, O30742 +30743, O30743 +30744, O30744 +30745, O30745 +30746, O30746 +30747, O30747 +30748, O30748 +30749, O30749 +30750, O30750 +30751, O30751 +30752, O30752 +30753, O30753 +30754, O30754 +30755, O30755 +30756, O30756 +30757, O30757 +30758, O30758 +30759, O30759 +30760, O30760 +30761, O30761 +30762, O30762 +30763, O30763 +30764, O30764 +30765, O30765 +30766, O30766 +30767, O30767 +30768, O30768 +30769, O30769 +30770, O30770 +30771, O30771 +30772, O30772 +30773, O30773 +30774, O30774 +30775, O30775 +30776, O30776 +30777, O30777 +30778, O30778 +30779, O30779 +30780, O30780 +30781, O30781 +30782, O30782 +30783, O30783 +30784, O30784 +30785, O30785 +30786, O30786 +30787, O30787 +30788, O30788 +30789, O30789 +30790, O30790 +30791, O30791 +30792, O30792 +30793, O30793 +30794, O30794 +30795, O30795 +30796, O30796 +30797, O30797 +30798, O30798 +30799, O30799 +30800, O30800 +30801, O30801 +30802, O30802 +30803, O30803 +30804, O30804 +30805, O30805 +30806, O30806 +30807, O30807 +30808, O30808 +30809, O30809 +30810, O30810 +30811, O30811 +30812, O30812 +30813, O30813 +30814, O30814 +30815, O30815 +30816, O30816 +30817, O30817 +30818, O30818 +30819, O30819 +30820, O30820 +30821, O30821 +30822, O30822 +30823, O30823 +30824, O30824 +30825, O30825 +30826, O30826 +30827, O30827 +30828, O30828 +30829, O30829 +30830, O30830 +30831, O30831 +30832, O30832 +30833, O30833 +30834, O30834 +30835, O30835 +30836, O30836 +30837, O30837 +30838, O30838 +30839, O30839 +30840, O30840 +30841, O30841 +30842, O30842 +30843, O30843 +30844, O30844 +30845, O30845 +30846, O30846 +30847, O30847 +30848, O30848 +30849, O30849 +30850, O30850 +30851, O30851 +30852, O30852 +30853, O30853 +30854, O30854 +30855, O30855 +30856, O30856 +30857, O30857 +30858, O30858 +30859, O30859 +30860, O30860 +30861, O30861 +30862, O30862 +30863, O30863 +30864, O30864 +30865, O30865 +30866, O30866 +30867, O30867 +30868, O30868 +30869, O30869 +30870, O30870 +30871, O30871 +30872, O30872 +30873, O30873 +30874, O30874 +30875, O30875 +30876, O30876 +30877, O30877 +30878, O30878 +30879, O30879 +30880, O30880 +30881, O30881 +30882, O30882 +30883, O30883 +30884, O30884 +30885, O30885 +30886, O30886 +30887, O30887 +30888, O30888 +30889, O30889 +30890, O30890 +30891, O30891 +30892, O30892 +30893, O30893 +30894, O30894 +30895, O30895 +30896, O30896 +30897, O30897 +30898, O30898 +30899, O30899 +30900, O30900 +30901, O30901 +30902, O30902 +30903, O30903 +30904, O30904 +30905, O30905 +30906, O30906 +30907, O30907 +30908, O30908 +30909, O30909 +30910, O30910 +30911, O30911 +30912, O30912 +30913, O30913 +30914, O30914 +30915, O30915 +30916, O30916 +30917, O30917 +30918, O30918 +30919, O30919 +30920, O30920 +30921, O30921 +30922, O30922 +30923, O30923 +30924, O30924 +30925, O30925 +30926, O30926 +30927, O30927 +30928, O30928 +30929, O30929 +30930, O30930 +30931, O30931 +30932, O30932 +30933, O30933 +30934, O30934 +30935, O30935 +30936, O30936 +30937, O30937 +30938, O30938 +30939, O30939 +30940, O30940 +30941, O30941 +30942, O30942 +30943, O30943 +30944, O30944 +30945, O30945 +30946, O30946 +30947, O30947 +30948, O30948 +30949, O30949 +30950, O30950 +30951, O30951 +30952, O30952 +30953, O30953 +30954, O30954 +30955, O30955 +30956, O30956 +30957, O30957 +30958, O30958 +30959, O30959 +30960, O30960 +30961, O30961 +30962, O30962 +30963, O30963 +30964, O30964 +30965, O30965 +30966, O30966 +30967, O30967 +30968, O30968 +30969, O30969 +30970, O30970 +30971, O30971 +30972, O30972 +30973, O30973 +30974, O30974 +30975, O30975 +30976, O30976 +30977, O30977 +30978, O30978 +30979, O30979 +30980, O30980 +30981, O30981 +30982, O30982 +30983, O30983 +30984, O30984 +30985, O30985 +30986, O30986 +30987, O30987 +30988, O30988 +30989, O30989 +30990, O30990 +30991, O30991 +30992, O30992 +30993, O30993 +30994, O30994 +30995, O30995 +30996, O30996 +30997, O30997 +30998, O30998 +30999, O30999 +31000, O31000 +31001, O31001 +31002, O31002 +31003, O31003 +31004, O31004 +31005, O31005 +31006, O31006 +31007, O31007 +31008, O31008 +31009, O31009 +31010, O31010 +31011, O31011 +31012, O31012 +31013, O31013 +31014, O31014 +31015, O31015 +31016, O31016 +31017, O31017 +31018, O31018 +31019, O31019 +31020, O31020 +31021, O31021 +31022, O31022 +31023, O31023 +31024, O31024 +31025, O31025 +31026, O31026 +31027, O31027 +31028, O31028 +31029, O31029 +31030, O31030 +31031, O31031 +31032, O31032 +31033, O31033 +31034, O31034 +31035, O31035 +31036, O31036 +31037, O31037 +31038, O31038 +31039, O31039 +31040, O31040 +31041, O31041 +31042, O31042 +31043, O31043 +31044, O31044 +31045, O31045 +31046, O31046 +31047, O31047 +31048, O31048 +31049, O31049 +31050, O31050 +31051, O31051 +31052, O31052 +31053, O31053 +31054, O31054 +31055, O31055 +31056, O31056 +31057, O31057 +31058, O31058 +31059, O31059 +31060, O31060 +31061, O31061 +31062, O31062 +31063, O31063 +31064, O31064 +31065, O31065 +31066, O31066 +31067, O31067 +31068, O31068 +31069, O31069 +31070, O31070 +31071, O31071 +31072, O31072 +31073, O31073 +31074, O31074 +31075, O31075 +31076, O31076 +31077, O31077 +31078, O31078 +31079, O31079 +31080, O31080 +31081, O31081 +31082, O31082 +31083, O31083 +31084, O31084 +31085, O31085 +31086, O31086 +31087, O31087 +31088, O31088 +31089, O31089 +31090, O31090 +31091, O31091 +31092, O31092 +31093, O31093 +31094, O31094 +31095, O31095 +31096, O31096 +31097, O31097 +31098, O31098 +31099, O31099 +31100, O31100 +31101, O31101 +31102, O31102 +31103, O31103 +31104, O31104 +31105, O31105 +31106, O31106 +31107, O31107 +31108, O31108 +31109, O31109 +31110, O31110 +31111, O31111 +31112, O31112 +31113, O31113 +31114, O31114 +31115, O31115 +31116, O31116 +31117, O31117 +31118, O31118 +31119, O31119 +31120, O31120 +31121, O31121 +31122, O31122 +31123, O31123 +31124, O31124 +31125, O31125 +31126, O31126 +31127, O31127 +31128, O31128 +31129, O31129 +31130, O31130 +31131, O31131 +31132, O31132 +31133, O31133 +31134, O31134 +31135, O31135 +31136, O31136 +31137, O31137 +31138, O31138 +31139, O31139 +31140, O31140 +31141, O31141 +31142, O31142 +31143, O31143 +31144, O31144 +31145, O31145 +31146, O31146 +31147, O31147 +31148, O31148 +31149, O31149 +31150, O31150 +31151, O31151 +31152, O31152 +31153, O31153 +31154, O31154 +31155, O31155 +31156, O31156 +31157, O31157 +31158, O31158 +31159, O31159 +31160, O31160 +31161, O31161 +31162, O31162 +31163, O31163 +31164, O31164 +31165, O31165 +31166, O31166 +31167, O31167 +31168, O31168 +31169, O31169 +31170, O31170 +31171, O31171 +31172, O31172 +31173, O31173 +31174, O31174 +31175, O31175 +31176, O31176 +31177, O31177 +31178, O31178 +31179, O31179 +31180, O31180 +31181, O31181 +31182, O31182 +31183, O31183 +31184, O31184 +31185, O31185 +31186, O31186 +31187, O31187 +31188, O31188 +31189, O31189 +31190, O31190 +31191, O31191 +31192, O31192 +31193, O31193 +31194, O31194 +31195, O31195 +31196, O31196 +31197, O31197 +31198, O31198 +31199, O31199 +31200, O31200 +31201, O31201 +31202, O31202 +31203, O31203 +31204, O31204 +31205, O31205 +31206, O31206 +31207, O31207 +31208, O31208 +31209, O31209 +31210, O31210 +31211, O31211 +31212, O31212 +31213, O31213 +31214, O31214 +31215, O31215 +31216, O31216 +31217, O31217 +31218, O31218 +31219, O31219 +31220, O31220 +31221, O31221 +31222, O31222 +31223, O31223 +31224, O31224 +31225, O31225 +31226, O31226 +31227, O31227 +31228, O31228 +31229, O31229 +31230, O31230 +31231, O31231 +31232, O31232 +31233, O31233 +31234, O31234 +31235, O31235 +31236, O31236 +31237, O31237 +31238, O31238 +31239, O31239 +31240, O31240 +31241, O31241 +31242, O31242 +31243, O31243 +31244, O31244 +31245, O31245 +31246, O31246 +31247, O31247 +31248, O31248 +31249, O31249 +31250, O31250 +31251, O31251 +31252, O31252 +31253, O31253 +31254, O31254 +31255, O31255 +31256, O31256 +31257, O31257 +31258, O31258 +31259, O31259 +31260, O31260 +31261, O31261 +31262, O31262 +31263, O31263 +31264, O31264 +31265, O31265 +31266, O31266 +31267, O31267 +31268, O31268 +31269, O31269 +31270, O31270 +31271, O31271 +31272, O31272 +31273, O31273 +31274, O31274 +31275, O31275 +31276, O31276 +31277, O31277 +31278, O31278 +31279, O31279 +31280, O31280 +31281, O31281 +31282, O31282 +31283, O31283 +31284, O31284 +31285, O31285 +31286, O31286 +31287, O31287 +31288, O31288 +31289, O31289 +31290, O31290 +31291, O31291 +31292, O31292 +31293, O31293 +31294, O31294 +31295, O31295 +31296, O31296 +31297, O31297 +31298, O31298 +31299, O31299 +31300, O31300 +31301, O31301 +31302, O31302 +31303, O31303 +31304, O31304 +31305, O31305 +31306, O31306 +31307, O31307 +31308, O31308 +31309, O31309 +31310, O31310 +31311, O31311 +31312, O31312 +31313, O31313 +31314, O31314 +31315, O31315 +31316, O31316 +31317, O31317 +31318, O31318 +31319, O31319 +31320, O31320 +31321, O31321 +31322, O31322 +31323, O31323 +31324, O31324 +31325, O31325 +31326, O31326 +31327, O31327 +31328, O31328 +31329, O31329 +31330, O31330 +31331, O31331 +31332, O31332 +31333, O31333 +31334, O31334 +31335, O31335 +31336, O31336 +31337, O31337 +31338, O31338 +31339, O31339 +31340, O31340 +31341, O31341 +31342, O31342 +31343, O31343 +31344, O31344 +31345, O31345 +31346, O31346 +31347, O31347 +31348, O31348 +31349, O31349 +31350, O31350 +31351, O31351 +31352, O31352 +31353, O31353 +31354, O31354 +31355, O31355 +31356, O31356 +31357, O31357 +31358, O31358 +31359, O31359 +31360, O31360 +31361, O31361 +31362, O31362 +31363, O31363 +31364, O31364 +31365, O31365 +31366, O31366 +31367, O31367 +31368, O31368 +31369, O31369 +31370, O31370 +31371, O31371 +31372, O31372 +31373, O31373 +31374, O31374 +31375, O31375 +31376, O31376 +31377, O31377 +31378, O31378 +31379, O31379 +31380, O31380 +31381, O31381 +31382, O31382 +31383, O31383 +31384, O31384 +31385, O31385 +31386, O31386 +31387, O31387 +31388, O31388 +31389, O31389 +31390, O31390 +31391, O31391 +31392, O31392 +31393, O31393 +31394, O31394 +31395, O31395 +31396, O31396 +31397, O31397 +31398, O31398 +31399, O31399 +31400, O31400 +31401, O31401 +31402, O31402 +31403, O31403 +31404, O31404 +31405, O31405 +31406, O31406 +31407, O31407 +31408, O31408 +31409, O31409 +31410, O31410 +31411, O31411 +31412, O31412 +31413, O31413 +31414, O31414 +31415, O31415 +31416, O31416 +31417, O31417 +31418, O31418 +31419, O31419 +31420, O31420 +31421, O31421 +31422, O31422 +31423, O31423 +31424, O31424 +31425, O31425 +31426, O31426 +31427, O31427 +31428, O31428 +31429, O31429 +31430, O31430 +31431, O31431 +31432, O31432 +31433, O31433 +31434, O31434 +31435, O31435 +31436, O31436 +31437, O31437 +31438, O31438 +31439, O31439 +31440, O31440 +31441, O31441 +31442, O31442 +31443, O31443 +31444, O31444 +31445, O31445 +31446, O31446 +31447, O31447 +31448, O31448 +31449, O31449 +31450, O31450 +31451, O31451 +31452, O31452 +31453, O31453 +31454, O31454 +31455, O31455 +31456, O31456 +31457, O31457 +31458, O31458 +31459, O31459 +31460, O31460 +31461, O31461 +31462, O31462 +31463, O31463 +31464, O31464 +31465, O31465 +31466, O31466 +31467, O31467 +31468, O31468 +31469, O31469 +31470, O31470 +31471, O31471 +31472, O31472 +31473, O31473 +31474, O31474 +31475, O31475 +31476, O31476 +31477, O31477 +31478, O31478 +31479, O31479 +31480, O31480 +31481, O31481 +31482, O31482 +31483, O31483 +31484, O31484 +31485, O31485 +31486, O31486 +31487, O31487 +31488, O31488 +31489, O31489 +31490, O31490 +31491, O31491 +31492, O31492 +31493, O31493 +31494, O31494 +31495, O31495 +31496, O31496 +31497, O31497 +31498, O31498 +31499, O31499 +31500, O31500 +31501, O31501 +31502, O31502 +31503, O31503 +31504, O31504 +31505, O31505 +31506, O31506 +31507, O31507 +31508, O31508 +31509, O31509 +31510, O31510 +31511, O31511 +31512, O31512 +31513, O31513 +31514, O31514 +31515, O31515 +31516, O31516 +31517, O31517 +31518, O31518 +31519, O31519 +31520, O31520 +31521, O31521 +31522, O31522 +31523, O31523 +31524, O31524 +31525, O31525 +31526, O31526 +31527, O31527 +31528, O31528 +31529, O31529 +31530, O31530 +31531, O31531 +31532, O31532 +31533, O31533 +31534, O31534 +31535, O31535 +31536, O31536 +31537, O31537 +31538, O31538 +31539, O31539 +31540, O31540 +31541, O31541 +31542, O31542 +31543, O31543 +31544, O31544 +31545, O31545 +31546, O31546 +31547, O31547 +31548, O31548 +31549, O31549 +31550, O31550 +31551, O31551 +31552, O31552 +31553, O31553 +31554, O31554 +31555, O31555 +31556, O31556 +31557, O31557 +31558, O31558 +31559, O31559 +31560, O31560 +31561, O31561 +31562, O31562 +31563, O31563 +31564, O31564 +31565, O31565 +31566, O31566 +31567, O31567 +31568, O31568 +31569, O31569 +31570, O31570 +31571, O31571 +31572, O31572 +31573, O31573 +31574, O31574 +31575, O31575 +31576, O31576 +31577, O31577 +31578, O31578 +31579, O31579 +31580, O31580 +31581, O31581 +31582, O31582 +31583, O31583 +31584, O31584 +31585, O31585 +31586, O31586 +31587, O31587 +31588, O31588 +31589, O31589 +31590, O31590 +31591, O31591 +31592, O31592 +31593, O31593 +31594, O31594 +31595, O31595 +31596, O31596 +31597, O31597 +31598, O31598 +31599, O31599 +31600, O31600 +31601, O31601 +31602, O31602 +31603, O31603 +31604, O31604 +31605, O31605 +31606, O31606 +31607, O31607 +31608, O31608 +31609, O31609 +31610, O31610 +31611, O31611 +31612, O31612 +31613, O31613 +31614, O31614 +31615, O31615 +31616, O31616 +31617, O31617 +31618, O31618 +31619, O31619 +31620, O31620 +31621, O31621 +31622, O31622 +31623, O31623 +31624, O31624 +31625, O31625 +31626, O31626 +31627, O31627 +31628, O31628 +31629, O31629 +31630, O31630 +31631, O31631 +31632, O31632 +31633, O31633 +31634, O31634 +31635, O31635 +31636, O31636 +31637, O31637 +31638, O31638 +31639, O31639 +31640, O31640 +31641, O31641 +31642, O31642 +31643, O31643 +31644, O31644 +31645, O31645 +31646, O31646 +31647, O31647 +31648, O31648 +31649, O31649 +31650, O31650 +31651, O31651 +31652, O31652 +31653, O31653 +31654, O31654 +31655, O31655 +31656, O31656 +31657, O31657 +31658, O31658 +31659, O31659 +31660, O31660 +31661, O31661 +31662, O31662 +31663, O31663 +31664, O31664 +31665, O31665 +31666, O31666 +31667, O31667 +31668, O31668 +31669, O31669 +31670, O31670 +31671, O31671 +31672, O31672 +31673, O31673 +31674, O31674 +31675, O31675 +31676, O31676 +31677, O31677 +31678, O31678 +31679, O31679 +31680, O31680 +31681, O31681 +31682, O31682 +31683, O31683 +31684, O31684 +31685, O31685 +31686, O31686 +31687, O31687 +31688, O31688 +31689, O31689 +31690, O31690 +31691, O31691 +31692, O31692 +31693, O31693 +31694, O31694 +31695, O31695 +31696, O31696 +31697, O31697 +31698, O31698 +31699, O31699 +31700, O31700 +31701, O31701 +31702, O31702 +31703, O31703 +31704, O31704 +31705, O31705 +31706, O31706 +31707, O31707 +31708, O31708 +31709, O31709 +31710, O31710 +31711, O31711 +31712, O31712 +31713, O31713 +31714, O31714 +31715, O31715 +31716, O31716 +31717, O31717 +31718, O31718 +31719, O31719 +31720, O31720 +31721, O31721 +31722, O31722 +31723, O31723 +31724, O31724 +31725, O31725 +31726, O31726 +31727, O31727 +31728, O31728 +31729, O31729 +31730, O31730 +31731, O31731 +31732, O31732 +31733, O31733 +31734, O31734 +31735, O31735 +31736, O31736 +31737, O31737 +31738, O31738 +31739, O31739 +31740, O31740 +31741, O31741 +31742, O31742 +31743, O31743 +31744, O31744 +31745, O31745 +31746, O31746 +31747, O31747 +31748, O31748 +31749, O31749 +31750, O31750 +31751, O31751 +31752, O31752 +31753, O31753 +31754, O31754 +31755, O31755 +31756, O31756 +31757, O31757 +31758, O31758 +31759, O31759 +31760, O31760 +31761, O31761 +31762, O31762 +31763, O31763 +31764, O31764 +31765, O31765 +31766, O31766 +31767, O31767 +31768, O31768 +31769, O31769 +31770, O31770 +31771, O31771 +31772, O31772 +31773, O31773 +31774, O31774 +31775, O31775 +31776, O31776 +31777, O31777 +31778, O31778 +31779, O31779 +31780, O31780 +31781, O31781 +31782, O31782 +31783, O31783 +31784, O31784 +31785, O31785 +31786, O31786 +31787, O31787 +31788, O31788 +31789, O31789 +31790, O31790 +31791, O31791 +31792, O31792 +31793, O31793 +31794, O31794 +31795, O31795 +31796, O31796 +31797, O31797 +31798, O31798 +31799, O31799 +31800, O31800 +31801, O31801 +31802, O31802 +31803, O31803 +31804, O31804 +31805, O31805 +31806, O31806 +31807, O31807 +31808, O31808 +31809, O31809 +31810, O31810 +31811, O31811 +31812, O31812 +31813, O31813 +31814, O31814 +31815, O31815 +31816, O31816 +31817, O31817 +31818, O31818 +31819, O31819 +31820, O31820 +31821, O31821 +31822, O31822 +31823, O31823 +31824, O31824 +31825, O31825 +31826, O31826 +31827, O31827 +31828, O31828 +31829, O31829 +31830, O31830 +31831, O31831 +31832, O31832 +31833, O31833 +31834, O31834 +31835, O31835 +31836, O31836 +31837, O31837 +31838, O31838 +31839, O31839 +31840, O31840 +31841, O31841 +31842, O31842 +31843, O31843 +31844, O31844 +31845, O31845 +31846, O31846 +31847, O31847 +31848, O31848 +31849, O31849 +31850, O31850 +31851, O31851 +31852, O31852 +31853, O31853 +31854, O31854 +31855, O31855 +31856, O31856 +31857, O31857 +31858, O31858 +31859, O31859 +31860, O31860 +31861, O31861 +31862, O31862 +31863, O31863 +31864, O31864 +31865, O31865 +31866, O31866 +31867, O31867 +31868, O31868 +31869, O31869 +31870, O31870 +31871, O31871 +31872, O31872 +31873, O31873 +31874, O31874 +31875, O31875 +31876, O31876 +31877, O31877 +31878, O31878 +31879, O31879 +31880, O31880 +31881, O31881 +31882, O31882 +31883, O31883 +31884, O31884 +31885, O31885 +31886, O31886 +31887, O31887 +31888, O31888 +31889, O31889 +31890, O31890 +31891, O31891 +31892, O31892 +31893, O31893 +31894, O31894 +31895, O31895 +31896, O31896 +31897, O31897 +31898, O31898 +31899, O31899 +31900, O31900 +31901, O31901 +31902, O31902 +31903, O31903 +31904, O31904 +31905, O31905 +31906, O31906 +31907, O31907 +31908, O31908 +31909, O31909 +31910, O31910 +31911, O31911 +31912, O31912 +31913, O31913 +31914, O31914 +31915, O31915 +31916, O31916 +31917, O31917 +31918, O31918 +31919, O31919 +31920, O31920 +31921, O31921 +31922, O31922 +31923, O31923 +31924, O31924 +31925, O31925 +31926, O31926 +31927, O31927 +31928, O31928 +31929, O31929 +31930, O31930 +31931, O31931 +31932, O31932 +31933, O31933 +31934, O31934 +31935, O31935 +31936, O31936 +31937, O31937 +31938, O31938 +31939, O31939 +31940, O31940 +31941, O31941 +31942, O31942 +31943, O31943 +31944, O31944 +31945, O31945 +31946, O31946 +31947, O31947 +31948, O31948 +31949, O31949 +31950, O31950 +31951, O31951 +31952, O31952 +31953, O31953 +31954, O31954 +31955, O31955 +31956, O31956 +31957, O31957 +31958, O31958 +31959, O31959 +31960, O31960 +31961, O31961 +31962, O31962 +31963, O31963 +31964, O31964 +31965, O31965 +31966, O31966 +31967, O31967 +31968, O31968 +31969, O31969 +31970, O31970 +31971, O31971 +31972, O31972 +31973, O31973 +31974, O31974 +31975, O31975 +31976, O31976 +31977, O31977 +31978, O31978 +31979, O31979 +31980, O31980 +31981, O31981 +31982, O31982 +31983, O31983 +31984, O31984 +31985, O31985 +31986, O31986 +31987, O31987 +31988, O31988 +31989, O31989 +31990, O31990 +31991, O31991 +31992, O31992 +31993, O31993 +31994, O31994 +31995, O31995 +31996, O31996 +31997, O31997 +31998, O31998 +31999, O31999 +32000, O32000 +32001, O32001 +32002, O32002 +32003, O32003 +32004, O32004 +32005, O32005 +32006, O32006 +32007, O32007 +32008, O32008 +32009, O32009 +32010, O32010 +32011, O32011 +32012, O32012 +32013, O32013 +32014, O32014 +32015, O32015 +32016, O32016 +32017, O32017 +32018, O32018 +32019, O32019 +32020, O32020 +32021, O32021 +32022, O32022 +32023, O32023 +32024, O32024 +32025, O32025 +32026, O32026 +32027, O32027 +32028, O32028 +32029, O32029 +32030, O32030 +32031, O32031 +32032, O32032 +32033, O32033 +32034, O32034 +32035, O32035 +32036, O32036 +32037, O32037 +32038, O32038 +32039, O32039 +32040, O32040 +32041, O32041 +32042, O32042 +32043, O32043 +32044, O32044 +32045, O32045 +32046, O32046 +32047, O32047 +32048, O32048 +32049, O32049 +32050, O32050 +32051, O32051 +32052, O32052 +32053, O32053 +32054, O32054 +32055, O32055 +32056, O32056 +32057, O32057 +32058, O32058 +32059, O32059 +32060, O32060 +32061, O32061 +32062, O32062 +32063, O32063 +32064, O32064 +32065, O32065 +32066, O32066 +32067, O32067 +32068, O32068 +32069, O32069 +32070, O32070 +32071, O32071 +32072, O32072 +32073, O32073 +32074, O32074 +32075, O32075 +32076, O32076 +32077, O32077 +32078, O32078 +32079, O32079 +32080, O32080 +32081, O32081 +32082, O32082 +32083, O32083 +32084, O32084 +32085, O32085 +32086, O32086 +32087, O32087 +32088, O32088 +32089, O32089 +32090, O32090 +32091, O32091 +32092, O32092 +32093, O32093 +32094, O32094 +32095, O32095 +32096, O32096 +32097, O32097 +32098, O32098 +32099, O32099 +32100, O32100 +32101, O32101 +32102, O32102 +32103, O32103 +32104, O32104 +32105, O32105 +32106, O32106 +32107, O32107 +32108, O32108 +32109, O32109 +32110, O32110 +32111, O32111 +32112, O32112 +32113, O32113 +32114, O32114 +32115, O32115 +32116, O32116 +32117, O32117 +32118, O32118 +32119, O32119 +32120, O32120 +32121, O32121 +32122, O32122 +32123, O32123 +32124, O32124 +32125, O32125 +32126, O32126 +32127, O32127 +32128, O32128 +32129, O32129 +32130, O32130 +32131, O32131 +32132, O32132 +32133, O32133 +32134, O32134 +32135, O32135 +32136, O32136 +32137, O32137 +32138, O32138 +32139, O32139 +32140, O32140 +32141, O32141 +32142, O32142 +32143, O32143 +32144, O32144 +32145, O32145 +32146, O32146 +32147, O32147 +32148, O32148 +32149, O32149 +32150, O32150 +32151, O32151 +32152, O32152 +32153, O32153 +32154, O32154 +32155, O32155 +32156, O32156 +32157, O32157 +32158, O32158 +32159, O32159 +32160, O32160 +32161, O32161 +32162, O32162 +32163, O32163 +32164, O32164 +32165, O32165 +32166, O32166 +32167, O32167 +32168, O32168 +32169, O32169 +32170, O32170 +32171, O32171 +32172, O32172 +32173, O32173 +32174, O32174 +32175, O32175 +32176, O32176 +32177, O32177 +32178, O32178 +32179, O32179 +32180, O32180 +32181, O32181 +32182, O32182 +32183, O32183 +32184, O32184 +32185, O32185 +32186, O32186 +32187, O32187 +32188, O32188 +32189, O32189 +32190, O32190 +32191, O32191 +32192, O32192 +32193, O32193 +32194, O32194 +32195, O32195 +32196, O32196 +32197, O32197 +32198, O32198 +32199, O32199 +32200, O32200 +32201, O32201 +32202, O32202 +32203, O32203 +32204, O32204 +32205, O32205 +32206, O32206 +32207, O32207 +32208, O32208 +32209, O32209 +32210, O32210 +32211, O32211 +32212, O32212 +32213, O32213 +32214, O32214 +32215, O32215 +32216, O32216 +32217, O32217 +32218, O32218 +32219, O32219 +32220, O32220 +32221, O32221 +32222, O32222 +32223, O32223 +32224, O32224 +32225, O32225 +32226, O32226 +32227, O32227 +32228, O32228 +32229, O32229 +32230, O32230 +32231, O32231 +32232, O32232 +32233, O32233 +32234, O32234 +32235, O32235 +32236, O32236 +32237, O32237 +32238, O32238 +32239, O32239 +32240, O32240 +32241, O32241 +32242, O32242 +32243, O32243 +32244, O32244 +32245, O32245 +32246, O32246 +32247, O32247 +32248, O32248 +32249, O32249 +32250, O32250 +32251, O32251 +32252, O32252 +32253, O32253 +32254, O32254 +32255, O32255 +32256, O32256 +32257, O32257 +32258, O32258 +32259, O32259 +32260, O32260 +32261, O32261 +32262, O32262 +32263, O32263 +32264, O32264 +32265, O32265 +32266, O32266 +32267, O32267 +32268, O32268 +32269, O32269 +32270, O32270 +32271, O32271 +32272, O32272 +32273, O32273 +32274, O32274 +32275, O32275 +32276, O32276 +32277, O32277 +32278, O32278 +32279, O32279 +32280, O32280 +32281, O32281 +32282, O32282 +32283, O32283 +32284, O32284 +32285, O32285 +32286, O32286 +32287, O32287 +32288, O32288 +32289, O32289 +32290, O32290 +32291, O32291 +32292, O32292 +32293, O32293 +32294, O32294 +32295, O32295 +32296, O32296 +32297, O32297 +32298, O32298 +32299, O32299 +32300, O32300 +32301, O32301 +32302, O32302 +32303, O32303 +32304, O32304 +32305, O32305 +32306, O32306 +32307, O32307 +32308, O32308 +32309, O32309 +32310, O32310 +32311, O32311 +32312, O32312 +32313, O32313 +32314, O32314 +32315, O32315 +32316, O32316 +32317, O32317 +32318, O32318 +32319, O32319 +32320, O32320 +32321, O32321 +32322, O32322 +32323, O32323 +32324, O32324 +32325, O32325 +32326, O32326 +32327, O32327 +32328, O32328 +32329, O32329 +32330, O32330 +32331, O32331 +32332, O32332 +32333, O32333 +32334, O32334 +32335, O32335 +32336, O32336 +32337, O32337 +32338, O32338 +32339, O32339 +32340, O32340 +32341, O32341 +32342, O32342 +32343, O32343 +32344, O32344 +32345, O32345 +32346, O32346 +32347, O32347 +32348, O32348 +32349, O32349 +32350, O32350 +32351, O32351 +32352, O32352 +32353, O32353 +32354, O32354 +32355, O32355 +32356, O32356 +32357, O32357 +32358, O32358 +32359, O32359 +32360, O32360 +32361, O32361 +32362, O32362 +32363, O32363 +32364, O32364 +32365, O32365 +32366, O32366 +32367, O32367 +32368, O32368 +32369, O32369 +32370, O32370 +32371, O32371 +32372, O32372 +32373, O32373 +32374, O32374 +32375, O32375 +32376, O32376 +32377, O32377 +32378, O32378 +32379, O32379 +32380, O32380 +32381, O32381 +32382, O32382 +32383, O32383 +32384, O32384 +32385, O32385 +32386, O32386 +32387, O32387 +32388, O32388 +32389, O32389 +32390, O32390 +32391, O32391 +32392, O32392 +32393, O32393 +32394, O32394 +32395, O32395 +32396, O32396 +32397, O32397 +32398, O32398 +32399, O32399 +32400, O32400 +32401, O32401 +32402, O32402 +32403, O32403 +32404, O32404 +32405, O32405 +32406, O32406 +32407, O32407 +32408, O32408 +32409, O32409 +32410, O32410 +32411, O32411 +32412, O32412 +32413, O32413 +32414, O32414 +32415, O32415 +32416, O32416 +32417, O32417 +32418, O32418 +32419, O32419 +32420, O32420 +32421, O32421 +32422, O32422 +32423, O32423 +32424, O32424 +32425, O32425 +32426, O32426 +32427, O32427 +32428, O32428 +32429, O32429 +32430, O32430 +32431, O32431 +32432, O32432 +32433, O32433 +32434, O32434 +32435, O32435 +32436, O32436 +32437, O32437 +32438, O32438 +32439, O32439 +32440, O32440 +32441, O32441 +32442, O32442 +32443, O32443 +32444, O32444 +32445, O32445 +32446, O32446 +32447, O32447 +32448, O32448 +32449, O32449 +32450, O32450 +32451, O32451 +32452, O32452 +32453, O32453 +32454, O32454 +32455, O32455 +32456, O32456 +32457, O32457 +32458, O32458 +32459, O32459 +32460, O32460 +32461, O32461 +32462, O32462 +32463, O32463 +32464, O32464 +32465, O32465 +32466, O32466 +32467, O32467 +32468, O32468 +32469, O32469 +32470, O32470 +32471, O32471 +32472, O32472 +32473, O32473 +32474, O32474 +32475, O32475 +32476, O32476 +32477, O32477 +32478, O32478 +32479, O32479 +32480, O32480 +32481, O32481 +32482, O32482 +32483, O32483 +32484, O32484 +32485, O32485 +32486, O32486 +32487, O32487 +32488, O32488 +32489, O32489 +32490, O32490 +32491, O32491 +32492, O32492 +32493, O32493 +32494, O32494 +32495, O32495 +32496, O32496 +32497, O32497 +32498, O32498 +32499, O32499 +32500, O32500 +32501, O32501 +32502, O32502 +32503, O32503 +32504, O32504 +32505, O32505 +32506, O32506 +32507, O32507 +32508, O32508 +32509, O32509 +32510, O32510 +32511, O32511 +32512, O32512 +32513, O32513 +32514, O32514 +32515, O32515 +32516, O32516 +32517, O32517 +32518, O32518 +32519, O32519 +32520, O32520 +32521, O32521 +32522, O32522 +32523, O32523 +32524, O32524 +32525, O32525 +32526, O32526 +32527, O32527 +32528, O32528 +32529, O32529 +32530, O32530 +32531, O32531 +32532, O32532 +32533, O32533 +32534, O32534 +32535, O32535 +32536, O32536 +32537, O32537 +32538, O32538 +32539, O32539 +32540, O32540 +32541, O32541 +32542, O32542 +32543, O32543 +32544, O32544 +32545, O32545 +32546, O32546 +32547, O32547 +32548, O32548 +32549, O32549 +32550, O32550 +32551, O32551 +32552, O32552 +32553, O32553 +32554, O32554 +32555, O32555 +32556, O32556 +32557, O32557 +32558, O32558 +32559, O32559 +32560, O32560 +32561, O32561 +32562, O32562 +32563, O32563 +32564, O32564 +32565, O32565 +32566, O32566 +32567, O32567 +32568, O32568 +32569, O32569 +32570, O32570 +32571, O32571 +32572, O32572 +32573, O32573 +32574, O32574 +32575, O32575 +32576, O32576 +32577, O32577 +32578, O32578 +32579, O32579 +32580, O32580 +32581, O32581 +32582, O32582 +32583, O32583 +32584, O32584 +32585, O32585 +32586, O32586 +32587, O32587 +32588, O32588 +32589, O32589 +32590, O32590 +32591, O32591 +32592, O32592 +32593, O32593 +32594, O32594 +32595, O32595 +32596, O32596 +32597, O32597 +32598, O32598 +32599, O32599 +32600, O32600 +32601, O32601 +32602, O32602 +32603, O32603 +32604, O32604 +32605, O32605 +32606, O32606 +32607, O32607 +32608, O32608 +32609, O32609 +32610, O32610 +32611, O32611 +32612, O32612 +32613, O32613 +32614, O32614 +32615, O32615 +32616, O32616 +32617, O32617 +32618, O32618 +32619, O32619 +32620, O32620 +32621, O32621 +32622, O32622 +32623, O32623 +32624, O32624 +32625, O32625 +32626, O32626 +32627, O32627 +32628, O32628 +32629, O32629 +32630, O32630 +32631, O32631 +32632, O32632 +32633, O32633 +32634, O32634 +32635, O32635 +32636, O32636 +32637, O32637 +32638, O32638 +32639, O32639 +32640, O32640 +32641, O32641 +32642, O32642 +32643, O32643 +32644, O32644 +32645, O32645 +32646, O32646 +32647, O32647 +32648, O32648 +32649, O32649 +32650, O32650 +32651, O32651 +32652, O32652 +32653, O32653 +32654, O32654 +32655, O32655 +32656, O32656 +32657, O32657 +32658, O32658 +32659, O32659 +32660, O32660 +32661, O32661 +32662, O32662 +32663, O32663 +32664, O32664 +32665, O32665 +32666, O32666 +32667, O32667 +32668, O32668 +32669, O32669 +32670, O32670 +32671, O32671 +32672, O32672 +32673, O32673 +32674, O32674 +32675, O32675 +32676, O32676 +32677, O32677 +32678, O32678 +32679, O32679 +32680, O32680 +32681, O32681 +32682, O32682 +32683, O32683 +32684, O32684 +32685, O32685 +32686, O32686 +32687, O32687 +32688, O32688 +32689, O32689 +32690, O32690 +32691, O32691 +32692, O32692 +32693, O32693 +32694, O32694 +32695, O32695 +32696, O32696 +32697, O32697 +32698, O32698 +32699, O32699 +32700, O32700 +32701, O32701 +32702, O32702 +32703, O32703 +32704, O32704 +32705, O32705 +32706, O32706 +32707, O32707 +32708, O32708 +32709, O32709 +32710, O32710 +32711, O32711 +32712, O32712 +32713, O32713 +32714, O32714 +32715, O32715 +32716, O32716 +32717, O32717 +32718, O32718 +32719, O32719 +32720, O32720 +32721, O32721 +32722, O32722 +32723, O32723 +32724, O32724 +32725, O32725 +32726, O32726 +32727, O32727 +32728, O32728 +32729, O32729 +32730, O32730 +32731, O32731 +32732, O32732 +32733, O32733 +32734, O32734 +32735, O32735 +32736, O32736 +32737, O32737 +32738, O32738 +32739, O32739 +32740, O32740 +32741, O32741 +32742, O32742 +32743, O32743 +32744, O32744 +32745, O32745 +32746, O32746 +32747, O32747 +32748, O32748 +32749, O32749 +32750, O32750 +32751, O32751 +32752, O32752 +32753, O32753 +32754, O32754 +32755, O32755 +32756, O32756 +32757, O32757 +32758, O32758 +32759, O32759 +32760, O32760 +32761, O32761 +32762, O32762 +32763, O32763 +32764, O32764 +32765, O32765 +32766, O32766 +32767, O32767 +32768, O32768 +32769, O32769 +32770, O32770 +32771, O32771 +32772, O32772 +32773, O32773 +32774, O32774 +32775, O32775 +32776, O32776 +32777, O32777 +32778, O32778 +32779, O32779 +32780, O32780 +32781, O32781 +32782, O32782 +32783, O32783 +32784, O32784 +32785, O32785 +32786, O32786 +32787, O32787 +32788, O32788 +32789, O32789 +32790, O32790 +32791, O32791 +32792, O32792 +32793, O32793 +32794, O32794 +32795, O32795 +32796, O32796 +32797, O32797 +32798, O32798 +32799, O32799 +32800, O32800 +32801, O32801 +32802, O32802 +32803, O32803 +32804, O32804 +32805, O32805 +32806, O32806 +32807, O32807 +32808, O32808 +32809, O32809 +32810, O32810 +32811, O32811 +32812, O32812 +32813, O32813 +32814, O32814 +32815, O32815 +32816, O32816 +32817, O32817 +32818, O32818 +32819, O32819 +32820, O32820 +32821, O32821 +32822, O32822 +32823, O32823 +32824, O32824 +32825, O32825 +32826, O32826 +32827, O32827 +32828, O32828 +32829, O32829 +32830, O32830 +32831, O32831 +32832, O32832 +32833, O32833 +32834, O32834 +32835, O32835 +32836, O32836 +32837, O32837 +32838, O32838 +32839, O32839 +32840, O32840 +32841, O32841 +32842, O32842 +32843, O32843 +32844, O32844 +32845, O32845 +32846, O32846 +32847, O32847 +32848, O32848 +32849, O32849 +32850, O32850 +32851, O32851 +32852, O32852 +32853, O32853 +32854, O32854 +32855, O32855 +32856, O32856 +32857, O32857 +32858, O32858 +32859, O32859 +32860, O32860 +32861, O32861 +32862, O32862 +32863, O32863 +32864, O32864 +32865, O32865 +32866, O32866 +32867, O32867 +32868, O32868 +32869, O32869 +32870, O32870 +32871, O32871 +32872, O32872 +32873, O32873 +32874, O32874 +32875, O32875 +32876, O32876 +32877, O32877 +32878, O32878 +32879, O32879 +32880, O32880 +32881, O32881 +32882, O32882 +32883, O32883 +32884, O32884 +32885, O32885 +32886, O32886 +32887, O32887 +32888, O32888 +32889, O32889 +32890, O32890 +32891, O32891 +32892, O32892 +32893, O32893 +32894, O32894 +32895, O32895 +32896, O32896 +32897, O32897 +32898, O32898 +32899, O32899 +32900, O32900 +32901, O32901 +32902, O32902 +32903, O32903 +32904, O32904 +32905, O32905 +32906, O32906 +32907, O32907 +32908, O32908 +32909, O32909 +32910, O32910 +32911, O32911 +32912, O32912 +32913, O32913 +32914, O32914 +32915, O32915 +32916, O32916 +32917, O32917 +32918, O32918 +32919, O32919 +32920, O32920 +32921, O32921 +32922, O32922 +32923, O32923 +32924, O32924 +32925, O32925 +32926, O32926 +32927, O32927 +32928, O32928 +32929, O32929 +32930, O32930 +32931, O32931 +32932, O32932 +32933, O32933 +32934, O32934 +32935, O32935 +32936, O32936 +32937, O32937 +32938, O32938 +32939, O32939 +32940, O32940 +32941, O32941 +32942, O32942 +32943, O32943 +32944, O32944 +32945, O32945 +32946, O32946 +32947, O32947 +32948, O32948 +32949, O32949 +32950, O32950 +32951, O32951 +32952, O32952 +32953, O32953 +32954, O32954 +32955, O32955 +32956, O32956 +32957, O32957 +32958, O32958 +32959, O32959 +32960, O32960 +32961, O32961 +32962, O32962 +32963, O32963 +32964, O32964 +32965, O32965 +32966, O32966 +32967, O32967 +32968, O32968 +32969, O32969 +32970, O32970 +32971, O32971 +32972, O32972 +32973, O32973 +32974, O32974 +32975, O32975 +32976, O32976 +32977, O32977 +32978, O32978 +32979, O32979 +32980, O32980 +32981, O32981 +32982, O32982 +32983, O32983 +32984, O32984 +32985, O32985 +32986, O32986 +32987, O32987 +32988, O32988 +32989, O32989 +32990, O32990 +32991, O32991 +32992, O32992 +32993, O32993 +32994, O32994 +32995, O32995 +32996, O32996 +32997, O32997 +32998, O32998 +32999, O32999 +33000, O33000 +33001, O33001 +33002, O33002 +33003, O33003 +33004, O33004 +33005, O33005 +33006, O33006 +33007, O33007 +33008, O33008 +33009, O33009 +33010, O33010 +33011, O33011 +33012, O33012 +33013, O33013 +33014, O33014 +33015, O33015 +33016, O33016 +33017, O33017 +33018, O33018 +33019, O33019 +33020, O33020 +33021, O33021 +33022, O33022 +33023, O33023 +33024, O33024 +33025, O33025 +33026, O33026 +33027, O33027 +33028, O33028 +33029, O33029 +33030, O33030 +33031, O33031 +33032, O33032 +33033, O33033 +33034, O33034 +33035, O33035 +33036, O33036 +33037, O33037 +33038, O33038 +33039, O33039 +33040, O33040 +33041, O33041 +33042, O33042 +33043, O33043 +33044, O33044 +33045, O33045 +33046, O33046 +33047, O33047 +33048, O33048 +33049, O33049 +33050, O33050 +33051, O33051 +33052, O33052 +33053, O33053 +33054, O33054 +33055, O33055 +33056, O33056 +33057, O33057 +33058, O33058 +33059, O33059 +33060, O33060 +33061, O33061 +33062, O33062 +33063, O33063 +33064, O33064 +33065, O33065 +33066, O33066 +33067, O33067 +33068, O33068 +33069, O33069 +33070, O33070 +33071, O33071 +33072, O33072 +33073, O33073 +33074, O33074 +33075, O33075 +33076, O33076 +33077, O33077 +33078, O33078 +33079, O33079 +33080, O33080 +33081, O33081 +33082, O33082 +33083, O33083 +33084, O33084 +33085, O33085 +33086, O33086 +33087, O33087 +33088, O33088 +33089, O33089 +33090, O33090 +33091, O33091 +33092, O33092 +33093, O33093 +33094, O33094 +33095, O33095 +33096, O33096 +33097, O33097 +33098, O33098 +33099, O33099 +33100, O33100 +33101, O33101 +33102, O33102 +33103, O33103 +33104, O33104 +33105, O33105 +33106, O33106 +33107, O33107 +33108, O33108 +33109, O33109 +33110, O33110 +33111, O33111 +33112, O33112 +33113, O33113 +33114, O33114 +33115, O33115 +33116, O33116 +33117, O33117 +33118, O33118 +33119, O33119 +33120, O33120 +33121, O33121 +33122, O33122 +33123, O33123 +33124, O33124 +33125, O33125 +33126, O33126 +33127, O33127 +33128, O33128 +33129, O33129 +33130, O33130 +33131, O33131 +33132, O33132 +33133, O33133 +33134, O33134 +33135, O33135 +33136, O33136 +33137, O33137 +33138, O33138 +33139, O33139 +33140, O33140 +33141, O33141 +33142, O33142 +33143, O33143 +33144, O33144 +33145, O33145 +33146, O33146 +33147, O33147 +33148, O33148 +33149, O33149 +33150, O33150 +33151, O33151 +33152, O33152 +33153, O33153 +33154, O33154 +33155, O33155 +33156, O33156 +33157, O33157 +33158, O33158 +33159, O33159 +33160, O33160 +33161, O33161 +33162, O33162 +33163, O33163 +33164, O33164 +33165, O33165 +33166, O33166 +33167, O33167 +33168, O33168 +33169, O33169 +33170, O33170 +33171, O33171 +33172, O33172 +33173, O33173 +33174, O33174 +33175, O33175 +33176, O33176 +33177, O33177 +33178, O33178 +33179, O33179 +33180, O33180 +33181, O33181 +33182, O33182 +33183, O33183 +33184, O33184 +33185, O33185 +33186, O33186 +33187, O33187 +33188, O33188 +33189, O33189 +33190, O33190 +33191, O33191 +33192, O33192 +33193, O33193 +33194, O33194 +33195, O33195 +33196, O33196 +33197, O33197 +33198, O33198 +33199, O33199 +33200, O33200 +33201, O33201 +33202, O33202 +33203, O33203 +33204, O33204 +33205, O33205 +33206, O33206 +33207, O33207 +33208, O33208 +33209, O33209 +33210, O33210 +33211, O33211 +33212, O33212 +33213, O33213 +33214, O33214 +33215, O33215 +33216, O33216 +33217, O33217 +33218, O33218 +33219, O33219 +33220, O33220 +33221, O33221 +33222, O33222 +33223, O33223 +33224, O33224 +33225, O33225 +33226, O33226 +33227, O33227 +33228, O33228 +33229, O33229 +33230, O33230 +33231, O33231 +33232, O33232 +33233, O33233 +33234, O33234 +33235, O33235 +33236, O33236 +33237, O33237 +33238, O33238 +33239, O33239 +33240, O33240 +33241, O33241 +33242, O33242 +33243, O33243 +33244, O33244 +33245, O33245 +33246, O33246 +33247, O33247 +33248, O33248 +33249, O33249 +33250, O33250 +33251, O33251 +33252, O33252 +33253, O33253 +33254, O33254 +33255, O33255 +33256, O33256 +33257, O33257 +33258, O33258 +33259, O33259 +33260, O33260 +33261, O33261 +33262, O33262 +33263, O33263 +33264, O33264 +33265, O33265 +33266, O33266 +33267, O33267 +33268, O33268 +33269, O33269 +33270, O33270 +33271, O33271 +33272, O33272 +33273, O33273 +33274, O33274 +33275, O33275 +33276, O33276 +33277, O33277 +33278, O33278 +33279, O33279 +33280, O33280 +33281, O33281 +33282, O33282 +33283, O33283 +33284, O33284 +33285, O33285 +33286, O33286 +33287, O33287 +33288, O33288 +33289, O33289 +33290, O33290 +33291, O33291 +33292, O33292 +33293, O33293 +33294, O33294 +33295, O33295 +33296, O33296 +33297, O33297 +33298, O33298 +33299, O33299 +33300, O33300 +33301, O33301 +33302, O33302 +33303, O33303 +33304, O33304 +33305, O33305 +33306, O33306 +33307, O33307 +33308, O33308 +33309, O33309 +33310, O33310 +33311, O33311 +33312, O33312 +33313, O33313 +33314, O33314 +33315, O33315 +33316, O33316 +33317, O33317 +33318, O33318 +33319, O33319 +33320, O33320 +33321, O33321 +33322, O33322 +33323, O33323 +33324, O33324 +33325, O33325 +33326, O33326 +33327, O33327 +33328, O33328 +33329, O33329 +33330, O33330 +33331, O33331 +33332, O33332 +33333, O33333 +33334, O33334 +33335, O33335 +33336, O33336 +33337, O33337 +33338, O33338 +33339, O33339 +33340, O33340 +33341, O33341 +33342, O33342 +33343, O33343 +33344, O33344 +33345, O33345 +33346, O33346 +33347, O33347 +33348, O33348 +33349, O33349 +33350, O33350 +33351, O33351 +33352, O33352 +33353, O33353 +33354, O33354 +33355, O33355 +33356, O33356 +33357, O33357 +33358, O33358 +33359, O33359 +33360, O33360 +33361, O33361 +33362, O33362 +33363, O33363 +33364, O33364 +33365, O33365 +33366, O33366 +33367, O33367 +33368, O33368 +33369, O33369 +33370, O33370 +33371, O33371 +33372, O33372 +33373, O33373 +33374, O33374 +33375, O33375 +33376, O33376 +33377, O33377 +33378, O33378 +33379, O33379 +33380, O33380 +33381, O33381 +33382, O33382 +33383, O33383 +33384, O33384 +33385, O33385 +33386, O33386 +33387, O33387 +33388, O33388 +33389, O33389 +33390, O33390 +33391, O33391 +33392, O33392 +33393, O33393 +33394, O33394 +33395, O33395 +33396, O33396 +33397, O33397 +33398, O33398 +33399, O33399 +33400, O33400 +33401, O33401 +33402, O33402 +33403, O33403 +33404, O33404 +33405, O33405 +33406, O33406 +33407, O33407 +33408, O33408 +33409, O33409 +33410, O33410 +33411, O33411 +33412, O33412 +33413, O33413 +33414, O33414 +33415, O33415 +33416, O33416 +33417, O33417 +33418, O33418 +33419, O33419 +33420, O33420 +33421, O33421 +33422, O33422 +33423, O33423 +33424, O33424 +33425, O33425 +33426, O33426 +33427, O33427 +33428, O33428 +33429, O33429 +33430, O33430 +33431, O33431 +33432, O33432 +33433, O33433 +33434, O33434 +33435, O33435 +33436, O33436 +33437, O33437 +33438, O33438 +33439, O33439 +33440, O33440 +33441, O33441 +33442, O33442 +33443, O33443 +33444, O33444 +33445, O33445 +33446, O33446 +33447, O33447 +33448, O33448 +33449, O33449 +33450, O33450 +33451, O33451 +33452, O33452 +33453, O33453 +33454, O33454 +33455, O33455 +33456, O33456 +33457, O33457 +33458, O33458 +33459, O33459 +33460, O33460 +33461, O33461 +33462, O33462 +33463, O33463 +33464, O33464 +33465, O33465 +33466, O33466 +33467, O33467 +33468, O33468 +33469, O33469 +33470, O33470 +33471, O33471 +33472, O33472 +33473, O33473 +33474, O33474 +33475, O33475 +33476, O33476 +33477, O33477 +33478, O33478 +33479, O33479 +33480, O33480 +33481, O33481 +33482, O33482 +33483, O33483 +33484, O33484 +33485, O33485 +33486, O33486 +33487, O33487 +33488, O33488 +33489, O33489 +33490, O33490 +33491, O33491 +33492, O33492 +33493, O33493 +33494, O33494 +33495, O33495 +33496, O33496 +33497, O33497 +33498, O33498 +33499, O33499 +33500, O33500 +33501, O33501 +33502, O33502 +33503, O33503 +33504, O33504 +33505, O33505 +33506, O33506 +33507, O33507 +33508, O33508 +33509, O33509 +33510, O33510 +33511, O33511 +33512, O33512 +33513, O33513 +33514, O33514 +33515, O33515 +33516, O33516 +33517, O33517 +33518, O33518 +33519, O33519 +33520, O33520 +33521, O33521 +33522, O33522 +33523, O33523 +33524, O33524 +33525, O33525 +33526, O33526 +33527, O33527 +33528, O33528 +33529, O33529 +33530, O33530 +33531, O33531 +33532, O33532 +33533, O33533 +33534, O33534 +33535, O33535 +33536, O33536 +33537, O33537 +33538, O33538 +33539, O33539 +33540, O33540 +33541, O33541 +33542, O33542 +33543, O33543 +33544, O33544 +33545, O33545 +33546, O33546 +33547, O33547 +33548, O33548 +33549, O33549 +33550, O33550 +33551, O33551 +33552, O33552 +33553, O33553 +33554, O33554 +33555, O33555 +33556, O33556 +33557, O33557 +33558, O33558 +33559, O33559 +33560, O33560 +33561, O33561 +33562, O33562 +33563, O33563 +33564, O33564 +33565, O33565 +33566, O33566 +33567, O33567 +33568, O33568 +33569, O33569 +33570, O33570 +33571, O33571 +33572, O33572 +33573, O33573 +33574, O33574 +33575, O33575 +33576, O33576 +33577, O33577 +33578, O33578 +33579, O33579 +33580, O33580 +33581, O33581 +33582, O33582 +33583, O33583 +33584, O33584 +33585, O33585 +33586, O33586 +33587, O33587 +33588, O33588 +33589, O33589 +33590, O33590 +33591, O33591 +33592, O33592 +33593, O33593 +33594, O33594 +33595, O33595 +33596, O33596 +33597, O33597 +33598, O33598 +33599, O33599 +33600, O33600 +33601, O33601 +33602, O33602 +33603, O33603 +33604, O33604 +33605, O33605 +33606, O33606 +33607, O33607 +33608, O33608 +33609, O33609 +33610, O33610 +33611, O33611 +33612, O33612 +33613, O33613 +33614, O33614 +33615, O33615 +33616, O33616 +33617, O33617 +33618, O33618 +33619, O33619 +33620, O33620 +33621, O33621 +33622, O33622 +33623, O33623 +33624, O33624 +33625, O33625 +33626, O33626 +33627, O33627 +33628, O33628 +33629, O33629 +33630, O33630 +33631, O33631 +33632, O33632 +33633, O33633 +33634, O33634 +33635, O33635 +33636, O33636 +33637, O33637 +33638, O33638 +33639, O33639 +33640, O33640 +33641, O33641 +33642, O33642 +33643, O33643 +33644, O33644 +33645, O33645 +33646, O33646 +33647, O33647 +33648, O33648 +33649, O33649 +33650, O33650 +33651, O33651 +33652, O33652 +33653, O33653 +33654, O33654 +33655, O33655 +33656, O33656 +33657, O33657 +33658, O33658 +33659, O33659 +33660, O33660 +33661, O33661 +33662, O33662 +33663, O33663 +33664, O33664 +33665, O33665 +33666, O33666 +33667, O33667 +33668, O33668 +33669, O33669 +33670, O33670 +33671, O33671 +33672, O33672 +33673, O33673 +33674, O33674 +33675, O33675 +33676, O33676 +33677, O33677 +33678, O33678 +33679, O33679 +33680, O33680 +33681, O33681 +33682, O33682 +33683, O33683 +33684, O33684 +33685, O33685 +33686, O33686 +33687, O33687 +33688, O33688 +33689, O33689 +33690, O33690 +33691, O33691 +33692, O33692 +33693, O33693 +33694, O33694 +33695, O33695 +33696, O33696 +33697, O33697 +33698, O33698 +33699, O33699 +33700, O33700 +33701, O33701 +33702, O33702 +33703, O33703 +33704, O33704 +33705, O33705 +33706, O33706 +33707, O33707 +33708, O33708 +33709, O33709 +33710, O33710 +33711, O33711 +33712, O33712 +33713, O33713 +33714, O33714 +33715, O33715 +33716, O33716 +33717, O33717 +33718, O33718 +33719, O33719 +33720, O33720 +33721, O33721 +33722, O33722 +33723, O33723 +33724, O33724 +33725, O33725 +33726, O33726 +33727, O33727 +33728, O33728 +33729, O33729 +33730, O33730 +33731, O33731 +33732, O33732 +33733, O33733 +33734, O33734 +33735, O33735 +33736, O33736 +33737, O33737 +33738, O33738 +33739, O33739 +33740, O33740 +33741, O33741 +33742, O33742 +33743, O33743 +33744, O33744 +33745, O33745 +33746, O33746 +33747, O33747 +33748, O33748 +33749, O33749 +33750, O33750 +33751, O33751 +33752, O33752 +33753, O33753 +33754, O33754 +33755, O33755 +33756, O33756 +33757, O33757 +33758, O33758 +33759, O33759 +33760, O33760 +33761, O33761 +33762, O33762 +33763, O33763 +33764, O33764 +33765, O33765 +33766, O33766 +33767, O33767 +33768, O33768 +33769, O33769 +33770, O33770 +33771, O33771 +33772, O33772 +33773, O33773 +33774, O33774 +33775, O33775 +33776, O33776 +33777, O33777 +33778, O33778 +33779, O33779 +33780, O33780 +33781, O33781 +33782, O33782 +33783, O33783 +33784, O33784 +33785, O33785 +33786, O33786 +33787, O33787 +33788, O33788 +33789, O33789 +33790, O33790 +33791, O33791 +33792, O33792 +33793, O33793 +33794, O33794 +33795, O33795 +33796, O33796 +33797, O33797 +33798, O33798 +33799, O33799 +33800, O33800 +33801, O33801 +33802, O33802 +33803, O33803 +33804, O33804 +33805, O33805 +33806, O33806 +33807, O33807 +33808, O33808 +33809, O33809 +33810, O33810 +33811, O33811 +33812, O33812 +33813, O33813 +33814, O33814 +33815, O33815 +33816, O33816 +33817, O33817 +33818, O33818 +33819, O33819 +33820, O33820 +33821, O33821 +33822, O33822 +33823, O33823 +33824, O33824 +33825, O33825 +33826, O33826 +33827, O33827 +33828, O33828 +33829, O33829 +33830, O33830 +33831, O33831 +33832, O33832 +33833, O33833 +33834, O33834 +33835, O33835 +33836, O33836 +33837, O33837 +33838, O33838 +33839, O33839 +33840, O33840 +33841, O33841 +33842, O33842 +33843, O33843 +33844, O33844 +33845, O33845 +33846, O33846 +33847, O33847 +33848, O33848 +33849, O33849 +33850, O33850 +33851, O33851 +33852, O33852 +33853, O33853 +33854, O33854 +33855, O33855 +33856, O33856 +33857, O33857 +33858, O33858 +33859, O33859 +33860, O33860 +33861, O33861 +33862, O33862 +33863, O33863 +33864, O33864 +33865, O33865 +33866, O33866 +33867, O33867 +33868, O33868 +33869, O33869 +33870, O33870 +33871, O33871 +33872, O33872 +33873, O33873 +33874, O33874 +33875, O33875 +33876, O33876 +33877, O33877 +33878, O33878 +33879, O33879 +33880, O33880 +33881, O33881 +33882, O33882 +33883, O33883 +33884, O33884 +33885, O33885 +33886, O33886 +33887, O33887 +33888, O33888 +33889, O33889 +33890, O33890 +33891, O33891 +33892, O33892 +33893, O33893 +33894, O33894 +33895, O33895 +33896, O33896 +33897, O33897 +33898, O33898 +33899, O33899 +33900, O33900 +33901, O33901 +33902, O33902 +33903, O33903 +33904, O33904 +33905, O33905 +33906, O33906 +33907, O33907 +33908, O33908 +33909, O33909 +33910, O33910 +33911, O33911 +33912, O33912 +33913, O33913 +33914, O33914 +33915, O33915 +33916, O33916 +33917, O33917 +33918, O33918 +33919, O33919 +33920, O33920 +33921, O33921 +33922, O33922 +33923, O33923 +33924, O33924 +33925, O33925 +33926, O33926 +33927, O33927 +33928, O33928 +33929, O33929 +33930, O33930 +33931, O33931 +33932, O33932 +33933, O33933 +33934, O33934 +33935, O33935 +33936, O33936 +33937, O33937 +33938, O33938 +33939, O33939 +33940, O33940 +33941, O33941 +33942, O33942 +33943, O33943 +33944, O33944 +33945, O33945 +33946, O33946 +33947, O33947 +33948, O33948 +33949, O33949 +33950, O33950 +33951, O33951 +33952, O33952 +33953, O33953 +33954, O33954 +33955, O33955 +33956, O33956 +33957, O33957 +33958, O33958 +33959, O33959 +33960, O33960 +33961, O33961 +33962, O33962 +33963, O33963 +33964, O33964 +33965, O33965 +33966, O33966 +33967, O33967 +33968, O33968 +33969, O33969 +33970, O33970 +33971, O33971 +33972, O33972 +33973, O33973 +33974, O33974 +33975, O33975 +33976, O33976 +33977, O33977 +33978, O33978 +33979, O33979 +33980, O33980 +33981, O33981 +33982, O33982 +33983, O33983 +33984, O33984 +33985, O33985 +33986, O33986 +33987, O33987 +33988, O33988 +33989, O33989 +33990, O33990 +33991, O33991 +33992, O33992 +33993, O33993 +33994, O33994 +33995, O33995 +33996, O33996 +33997, O33997 +33998, O33998 +33999, O33999 +34000, O34000 +34001, O34001 +34002, O34002 +34003, O34003 +34004, O34004 +34005, O34005 +34006, O34006 +34007, O34007 +34008, O34008 +34009, O34009 +34010, O34010 +34011, O34011 +34012, O34012 +34013, O34013 +34014, O34014 +34015, O34015 +34016, O34016 +34017, O34017 +34018, O34018 +34019, O34019 +34020, O34020 +34021, O34021 +34022, O34022 +34023, O34023 +34024, O34024 +34025, O34025 +34026, O34026 +34027, O34027 +34028, O34028 +34029, O34029 +34030, O34030 +34031, O34031 +34032, O34032 +34033, O34033 +34034, O34034 +34035, O34035 +34036, O34036 +34037, O34037 +34038, O34038 +34039, O34039 +34040, O34040 +34041, O34041 +34042, O34042 +34043, O34043 +34044, O34044 +34045, O34045 +34046, O34046 +34047, O34047 +34048, O34048 +34049, O34049 +34050, O34050 +34051, O34051 +34052, O34052 +34053, O34053 +34054, O34054 +34055, O34055 +34056, O34056 +34057, O34057 +34058, O34058 +34059, O34059 +34060, O34060 +34061, O34061 +34062, O34062 +34063, O34063 +34064, O34064 +34065, O34065 +34066, O34066 +34067, O34067 +34068, O34068 +34069, O34069 +34070, O34070 +34071, O34071 +34072, O34072 +34073, O34073 +34074, O34074 +34075, O34075 +34076, O34076 +34077, O34077 +34078, O34078 +34079, O34079 +34080, O34080 +34081, O34081 +34082, O34082 +34083, O34083 +34084, O34084 +34085, O34085 +34086, O34086 +34087, O34087 +34088, O34088 +34089, O34089 +34090, O34090 +34091, O34091 +34092, O34092 +34093, O34093 +34094, O34094 +34095, O34095 +34096, O34096 +34097, O34097 +34098, O34098 +34099, O34099 +34100, O34100 +34101, O34101 +34102, O34102 +34103, O34103 +34104, O34104 +34105, O34105 +34106, O34106 +34107, O34107 +34108, O34108 +34109, O34109 +34110, O34110 +34111, O34111 +34112, O34112 +34113, O34113 +34114, O34114 +34115, O34115 +34116, O34116 +34117, O34117 +34118, O34118 +34119, O34119 +34120, O34120 +34121, O34121 +34122, O34122 +34123, O34123 +34124, O34124 +34125, O34125 +34126, O34126 +34127, O34127 +34128, O34128 +34129, O34129 +34130, O34130 +34131, O34131 +34132, O34132 +34133, O34133 +34134, O34134 +34135, O34135 +34136, O34136 +34137, O34137 +34138, O34138 +34139, O34139 +34140, O34140 +34141, O34141 +34142, O34142 +34143, O34143 +34144, O34144 +34145, O34145 +34146, O34146 +34147, O34147 +34148, O34148 +34149, O34149 +34150, O34150 +34151, O34151 +34152, O34152 +34153, O34153 +34154, O34154 +34155, O34155 +34156, O34156 +34157, O34157 +34158, O34158 +34159, O34159 +34160, O34160 +34161, O34161 +34162, O34162 +34163, O34163 +34164, O34164 +34165, O34165 +34166, O34166 +34167, O34167 +34168, O34168 +34169, O34169 +34170, O34170 +34171, O34171 +34172, O34172 +34173, O34173 +34174, O34174 +34175, O34175 +34176, O34176 +34177, O34177 +34178, O34178 +34179, O34179 +34180, O34180 +34181, O34181 +34182, O34182 +34183, O34183 +34184, O34184 +34185, O34185 +34186, O34186 +34187, O34187 +34188, O34188 +34189, O34189 +34190, O34190 +34191, O34191 +34192, O34192 +34193, O34193 +34194, O34194 +34195, O34195 +34196, O34196 +34197, O34197 +34198, O34198 +34199, O34199 +34200, O34200 +34201, O34201 +34202, O34202 +34203, O34203 +34204, O34204 +34205, O34205 +34206, O34206 +34207, O34207 +34208, O34208 +34209, O34209 +34210, O34210 +34211, O34211 +34212, O34212 +34213, O34213 +34214, O34214 +34215, O34215 +34216, O34216 +34217, O34217 +34218, O34218 +34219, O34219 +34220, O34220 +34221, O34221 +34222, O34222 +34223, O34223 +34224, O34224 +34225, O34225 +34226, O34226 +34227, O34227 +34228, O34228 +34229, O34229 +34230, O34230 +34231, O34231 +34232, O34232 +34233, O34233 +34234, O34234 +34235, O34235 +34236, O34236 +34237, O34237 +34238, O34238 +34239, O34239 +34240, O34240 +34241, O34241 +34242, O34242 +34243, O34243 +34244, O34244 +34245, O34245 +34246, O34246 +34247, O34247 +34248, O34248 +34249, O34249 +34250, O34250 +34251, O34251 +34252, O34252 +34253, O34253 +34254, O34254 +34255, O34255 +34256, O34256 +34257, O34257 +34258, O34258 +34259, O34259 +34260, O34260 +34261, O34261 +34262, O34262 +34263, O34263 +34264, O34264 +34265, O34265 +34266, O34266 +34267, O34267 +34268, O34268 +34269, O34269 +34270, O34270 +34271, O34271 +34272, O34272 +34273, O34273 +34274, O34274 +34275, O34275 +34276, O34276 +34277, O34277 +34278, O34278 +34279, O34279 +34280, O34280 +34281, O34281 +34282, O34282 +34283, O34283 +34284, O34284 +34285, O34285 +34286, O34286 +34287, O34287 +34288, O34288 +34289, O34289 +34290, O34290 +34291, O34291 +34292, O34292 +34293, O34293 +34294, O34294 +34295, O34295 +34296, O34296 +34297, O34297 +34298, O34298 +34299, O34299 +34300, O34300 +34301, O34301 +34302, O34302 +34303, O34303 +34304, O34304 +34305, O34305 +34306, O34306 +34307, O34307 +34308, O34308 +34309, O34309 +34310, O34310 +34311, O34311 +34312, O34312 +34313, O34313 +34314, O34314 +34315, O34315 +34316, O34316 +34317, O34317 +34318, O34318 +34319, O34319 +34320, O34320 +34321, O34321 +34322, O34322 +34323, O34323 +34324, O34324 +34325, O34325 +34326, O34326 +34327, O34327 +34328, O34328 +34329, O34329 +34330, O34330 +34331, O34331 +34332, O34332 +34333, O34333 +34334, O34334 +34335, O34335 +34336, O34336 +34337, O34337 +34338, O34338 +34339, O34339 +34340, O34340 +34341, O34341 +34342, O34342 +34343, O34343 +34344, O34344 +34345, O34345 +34346, O34346 +34347, O34347 +34348, O34348 +34349, O34349 +34350, O34350 +34351, O34351 +34352, O34352 +34353, O34353 +34354, O34354 +34355, O34355 +34356, O34356 +34357, O34357 +34358, O34358 +34359, O34359 +34360, O34360 +34361, O34361 +34362, O34362 +34363, O34363 +34364, O34364 +34365, O34365 +34366, O34366 +34367, O34367 +34368, O34368 +34369, O34369 +34370, O34370 +34371, O34371 +34372, O34372 +34373, O34373 +34374, O34374 +34375, O34375 +34376, O34376 +34377, O34377 +34378, O34378 +34379, O34379 +34380, O34380 +34381, O34381 +34382, O34382 +34383, O34383 +34384, O34384 +34385, O34385 +34386, O34386 +34387, O34387 +34388, O34388 +34389, O34389 +34390, O34390 +34391, O34391 +34392, O34392 +34393, O34393 +34394, O34394 +34395, O34395 +34396, O34396 +34397, O34397 +34398, O34398 +34399, O34399 +34400, O34400 +34401, O34401 +34402, O34402 +34403, O34403 +34404, O34404 +34405, O34405 +34406, O34406 +34407, O34407 +34408, O34408 +34409, O34409 +34410, O34410 +34411, O34411 +34412, O34412 +34413, O34413 +34414, O34414 +34415, O34415 +34416, O34416 +34417, O34417 +34418, O34418 +34419, O34419 +34420, O34420 +34421, O34421 +34422, O34422 +34423, O34423 +34424, O34424 +34425, O34425 +34426, O34426 +34427, O34427 +34428, O34428 +34429, O34429 +34430, O34430 +34431, O34431 +34432, O34432 +34433, O34433 +34434, O34434 +34435, O34435 +34436, O34436 +34437, O34437 +34438, O34438 +34439, O34439 +34440, O34440 +34441, O34441 +34442, O34442 +34443, O34443 +34444, O34444 +34445, O34445 +34446, O34446 +34447, O34447 +34448, O34448 +34449, O34449 +34450, O34450 +34451, O34451 +34452, O34452 +34453, O34453 +34454, O34454 +34455, O34455 +34456, O34456 +34457, O34457 +34458, O34458 +34459, O34459 +34460, O34460 +34461, O34461 +34462, O34462 +34463, O34463 +34464, O34464 +34465, O34465 +34466, O34466 +34467, O34467 +34468, O34468 +34469, O34469 +34470, O34470 +34471, O34471 +34472, O34472 +34473, O34473 +34474, O34474 +34475, O34475 +34476, O34476 +34477, O34477 +34478, O34478 +34479, O34479 +34480, O34480 +34481, O34481 +34482, O34482 +34483, O34483 +34484, O34484 +34485, O34485 +34486, O34486 +34487, O34487 +34488, O34488 +34489, O34489 +34490, O34490 +34491, O34491 +34492, O34492 +34493, O34493 +34494, O34494 +34495, O34495 +34496, O34496 +34497, O34497 +34498, O34498 +34499, O34499 +34500, O34500 +34501, O34501 +34502, O34502 +34503, O34503 +34504, O34504 +34505, O34505 +34506, O34506 +34507, O34507 +34508, O34508 +34509, O34509 +34510, O34510 +34511, O34511 +34512, O34512 +34513, O34513 +34514, O34514 +34515, O34515 +34516, O34516 +34517, O34517 +34518, O34518 +34519, O34519 +34520, O34520 +34521, O34521 +34522, O34522 +34523, O34523 +34524, O34524 +34525, O34525 +34526, O34526 +34527, O34527 +34528, O34528 +34529, O34529 +34530, O34530 +34531, O34531 +34532, O34532 +34533, O34533 +34534, O34534 +34535, O34535 +34536, O34536 +34537, O34537 +34538, O34538 +34539, O34539 +34540, O34540 +34541, O34541 +34542, O34542 +34543, O34543 +34544, O34544 +34545, O34545 +34546, O34546 +34547, O34547 +34548, O34548 +34549, O34549 +34550, O34550 +34551, O34551 +34552, O34552 +34553, O34553 +34554, O34554 +34555, O34555 +34556, O34556 +34557, O34557 +34558, O34558 +34559, O34559 +34560, O34560 +34561, O34561 +34562, O34562 +34563, O34563 +34564, O34564 +34565, O34565 +34566, O34566 +34567, O34567 +34568, O34568 +34569, O34569 +34570, O34570 +34571, O34571 +34572, O34572 +34573, O34573 +34574, O34574 +34575, O34575 +34576, O34576 +34577, O34577 +34578, O34578 +34579, O34579 +34580, O34580 +34581, O34581 +34582, O34582 +34583, O34583 +34584, O34584 +34585, O34585 +34586, O34586 +34587, O34587 +34588, O34588 +34589, O34589 +34590, O34590 +34591, O34591 +34592, O34592 +34593, O34593 +34594, O34594 +34595, O34595 +34596, O34596 +34597, O34597 +34598, O34598 +34599, O34599 +34600, O34600 +34601, O34601 +34602, O34602 +34603, O34603 +34604, O34604 +34605, O34605 +34606, O34606 +34607, O34607 +34608, O34608 +34609, O34609 +34610, O34610 +34611, O34611 +34612, O34612 +34613, O34613 +34614, O34614 +34615, O34615 +34616, O34616 +34617, O34617 +34618, O34618 +34619, O34619 +34620, O34620 +34621, O34621 +34622, O34622 +34623, O34623 +34624, O34624 +34625, O34625 +34626, O34626 +34627, O34627 +34628, O34628 +34629, O34629 +34630, O34630 +34631, O34631 +34632, O34632 +34633, O34633 +34634, O34634 +34635, O34635 +34636, O34636 +34637, O34637 +34638, O34638 +34639, O34639 +34640, O34640 +34641, O34641 +34642, O34642 +34643, O34643 +34644, O34644 +34645, O34645 +34646, O34646 +34647, O34647 +34648, O34648 +34649, O34649 +34650, O34650 +34651, O34651 +34652, O34652 +34653, O34653 +34654, O34654 +34655, O34655 +34656, O34656 +34657, O34657 +34658, O34658 +34659, O34659 +34660, O34660 +34661, O34661 +34662, O34662 +34663, O34663 +34664, O34664 +34665, O34665 +34666, O34666 +34667, O34667 +34668, O34668 +34669, O34669 +34670, O34670 +34671, O34671 +34672, O34672 +34673, O34673 +34674, O34674 +34675, O34675 +34676, O34676 +34677, O34677 +34678, O34678 +34679, O34679 +34680, O34680 +34681, O34681 +34682, O34682 +34683, O34683 +34684, O34684 +34685, O34685 +34686, O34686 +34687, O34687 +34688, O34688 +34689, O34689 +34690, O34690 +34691, O34691 +34692, O34692 +34693, O34693 +34694, O34694 +34695, O34695 +34696, O34696 +34697, O34697 +34698, O34698 +34699, O34699 +34700, O34700 +34701, O34701 +34702, O34702 +34703, O34703 +34704, O34704 +34705, O34705 +34706, O34706 +34707, O34707 +34708, O34708 +34709, O34709 +34710, O34710 +34711, O34711 +34712, O34712 +34713, O34713 +34714, O34714 +34715, O34715 +34716, O34716 +34717, O34717 +34718, O34718 +34719, O34719 +34720, O34720 +34721, O34721 +34722, O34722 +34723, O34723 +34724, O34724 +34725, O34725 +34726, O34726 +34727, O34727 +34728, O34728 +34729, O34729 +34730, O34730 +34731, O34731 +34732, O34732 +34733, O34733 +34734, O34734 +34735, O34735 +34736, O34736 +34737, O34737 +34738, O34738 +34739, O34739 +34740, O34740 +34741, O34741 +34742, O34742 +34743, O34743 +34744, O34744 +34745, O34745 +34746, O34746 +34747, O34747 +34748, O34748 +34749, O34749 +34750, O34750 +34751, O34751 +34752, O34752 +34753, O34753 +34754, O34754 +34755, O34755 +34756, O34756 +34757, O34757 +34758, O34758 +34759, O34759 +34760, O34760 +34761, O34761 +34762, O34762 +34763, O34763 +34764, O34764 +34765, O34765 +34766, O34766 +34767, O34767 +34768, O34768 +34769, O34769 +34770, O34770 +34771, O34771 +34772, O34772 +34773, O34773 +34774, O34774 +34775, O34775 +34776, O34776 +34777, O34777 +34778, O34778 +34779, O34779 +34780, O34780 +34781, O34781 +34782, O34782 +34783, O34783 +34784, O34784 +34785, O34785 +34786, O34786 +34787, O34787 +34788, O34788 +34789, O34789 +34790, O34790 +34791, O34791 +34792, O34792 +34793, O34793 +34794, O34794 +34795, O34795 +34796, O34796 +34797, O34797 +34798, O34798 +34799, O34799 +34800, O34800 +34801, O34801 +34802, O34802 +34803, O34803 +34804, O34804 +34805, O34805 +34806, O34806 +34807, O34807 +34808, O34808 +34809, O34809 +34810, O34810 +34811, O34811 +34812, O34812 +34813, O34813 +34814, O34814 +34815, O34815 +34816, O34816 +34817, O34817 +34818, O34818 +34819, O34819 +34820, O34820 +34821, O34821 +34822, O34822 +34823, O34823 +34824, O34824 +34825, O34825 +34826, O34826 +34827, O34827 +34828, O34828 +34829, O34829 +34830, O34830 +34831, O34831 +34832, O34832 +34833, O34833 +34834, O34834 +34835, O34835 +34836, O34836 +34837, O34837 +34838, O34838 +34839, O34839 +34840, O34840 +34841, O34841 +34842, O34842 +34843, O34843 +34844, O34844 +34845, O34845 +34846, O34846 +34847, O34847 +34848, O34848 +34849, O34849 +34850, O34850 +34851, O34851 +34852, O34852 +34853, O34853 +34854, O34854 +34855, O34855 +34856, O34856 +34857, O34857 +34858, O34858 +34859, O34859 +34860, O34860 +34861, O34861 +34862, O34862 +34863, O34863 +34864, O34864 +34865, O34865 +34866, O34866 +34867, O34867 +34868, O34868 +34869, O34869 +34870, O34870 +34871, O34871 +34872, O34872 +34873, O34873 +34874, O34874 +34875, O34875 +34876, O34876 +34877, O34877 +34878, O34878 +34879, O34879 +34880, O34880 +34881, O34881 +34882, O34882 +34883, O34883 +34884, O34884 +34885, O34885 +34886, O34886 +34887, O34887 +34888, O34888 +34889, O34889 +34890, O34890 +34891, O34891 +34892, O34892 +34893, O34893 +34894, O34894 +34895, O34895 +34896, O34896 +34897, O34897 +34898, O34898 +34899, O34899 +34900, O34900 +34901, O34901 +34902, O34902 +34903, O34903 +34904, O34904 +34905, O34905 +34906, O34906 +34907, O34907 +34908, O34908 +34909, O34909 +34910, O34910 +34911, O34911 +34912, O34912 +34913, O34913 +34914, O34914 +34915, O34915 +34916, O34916 +34917, O34917 +34918, O34918 +34919, O34919 +34920, O34920 +34921, O34921 +34922, O34922 +34923, O34923 +34924, O34924 +34925, O34925 +34926, O34926 +34927, O34927 +34928, O34928 +34929, O34929 +34930, O34930 +34931, O34931 +34932, O34932 +34933, O34933 +34934, O34934 +34935, O34935 +34936, O34936 +34937, O34937 +34938, O34938 +34939, O34939 +34940, O34940 +34941, O34941 +34942, O34942 +34943, O34943 +34944, O34944 +34945, O34945 +34946, O34946 +34947, O34947 +34948, O34948 +34949, O34949 +34950, O34950 +34951, O34951 +34952, O34952 +34953, O34953 +34954, O34954 +34955, O34955 +34956, O34956 +34957, O34957 +34958, O34958 +34959, O34959 +34960, O34960 +34961, O34961 +34962, O34962 +34963, O34963 +34964, O34964 +34965, O34965 +34966, O34966 +34967, O34967 +34968, O34968 +34969, O34969 +34970, O34970 +34971, O34971 +34972, O34972 +34973, O34973 +34974, O34974 +34975, O34975 +34976, O34976 +34977, O34977 +34978, O34978 +34979, O34979 +34980, O34980 +34981, O34981 +34982, O34982 +34983, O34983 +34984, O34984 +34985, O34985 +34986, O34986 +34987, O34987 +34988, O34988 +34989, O34989 +34990, O34990 +34991, O34991 +34992, O34992 +34993, O34993 +34994, O34994 +34995, O34995 +34996, O34996 +34997, O34997 +34998, O34998 +34999, O34999 +35000, O35000 +35001, O35001 +35002, O35002 +35003, O35003 +35004, O35004 +35005, O35005 +35006, O35006 +35007, O35007 +35008, O35008 +35009, O35009 +35010, O35010 +35011, O35011 +35012, O35012 +35013, O35013 +35014, O35014 +35015, O35015 +35016, O35016 +35017, O35017 +35018, O35018 +35019, O35019 +35020, O35020 +35021, O35021 +35022, O35022 +35023, O35023 +35024, O35024 +35025, O35025 +35026, O35026 +35027, O35027 +35028, O35028 +35029, O35029 +35030, O35030 +35031, O35031 +35032, O35032 +35033, O35033 +35034, O35034 +35035, O35035 +35036, O35036 +35037, O35037 +35038, O35038 +35039, O35039 +35040, O35040 +35041, O35041 +35042, O35042 +35043, O35043 +35044, O35044 +35045, O35045 +35046, O35046 +35047, O35047 +35048, O35048 +35049, O35049 +35050, O35050 +35051, O35051 +35052, O35052 +35053, O35053 +35054, O35054 +35055, O35055 +35056, O35056 +35057, O35057 +35058, O35058 +35059, O35059 +35060, O35060 +35061, O35061 +35062, O35062 +35063, O35063 +35064, O35064 +35065, O35065 +35066, O35066 +35067, O35067 +35068, O35068 +35069, O35069 +35070, O35070 +35071, O35071 +35072, O35072 +35073, O35073 +35074, O35074 +35075, O35075 +35076, O35076 +35077, O35077 +35078, O35078 +35079, O35079 +35080, O35080 +35081, O35081 +35082, O35082 +35083, O35083 +35084, O35084 +35085, O35085 +35086, O35086 +35087, O35087 +35088, O35088 +35089, O35089 +35090, O35090 +35091, O35091 +35092, O35092 +35093, O35093 +35094, O35094 +35095, O35095 +35096, O35096 +35097, O35097 +35098, O35098 +35099, O35099 +35100, O35100 +35101, O35101 +35102, O35102 +35103, O35103 +35104, O35104 +35105, O35105 +35106, O35106 +35107, O35107 +35108, O35108 +35109, O35109 +35110, O35110 +35111, O35111 +35112, O35112 +35113, O35113 +35114, O35114 +35115, O35115 +35116, O35116 +35117, O35117 +35118, O35118 +35119, O35119 +35120, O35120 +35121, O35121 +35122, O35122 +35123, O35123 +35124, O35124 +35125, O35125 +35126, O35126 +35127, O35127 +35128, O35128 +35129, O35129 +35130, O35130 +35131, O35131 +35132, O35132 +35133, O35133 +35134, O35134 +35135, O35135 +35136, O35136 +35137, O35137 +35138, O35138 +35139, O35139 +35140, O35140 +35141, O35141 +35142, O35142 +35143, O35143 +35144, O35144 +35145, O35145 +35146, O35146 +35147, O35147 +35148, O35148 +35149, O35149 +35150, O35150 +35151, O35151 +35152, O35152 +35153, O35153 +35154, O35154 +35155, O35155 +35156, O35156 +35157, O35157 +35158, O35158 +35159, O35159 +35160, O35160 +35161, O35161 +35162, O35162 +35163, O35163 +35164, O35164 +35165, O35165 +35166, O35166 +35167, O35167 +35168, O35168 +35169, O35169 +35170, O35170 +35171, O35171 +35172, O35172 +35173, O35173 +35174, O35174 +35175, O35175 +35176, O35176 +35177, O35177 +35178, O35178 +35179, O35179 +35180, O35180 +35181, O35181 +35182, O35182 +35183, O35183 +35184, O35184 +35185, O35185 +35186, O35186 +35187, O35187 +35188, O35188 +35189, O35189 +35190, O35190 +35191, O35191 +35192, O35192 +35193, O35193 +35194, O35194 +35195, O35195 +35196, O35196 +35197, O35197 +35198, O35198 +35199, O35199 +35200, O35200 +35201, O35201 +35202, O35202 +35203, O35203 +35204, O35204 +35205, O35205 +35206, O35206 +35207, O35207 +35208, O35208 +35209, O35209 +35210, O35210 +35211, O35211 +35212, O35212 +35213, O35213 +35214, O35214 +35215, O35215 +35216, O35216 +35217, O35217 +35218, O35218 +35219, O35219 +35220, O35220 +35221, O35221 +35222, O35222 +35223, O35223 +35224, O35224 +35225, O35225 +35226, O35226 +35227, O35227 +35228, O35228 +35229, O35229 +35230, O35230 +35231, O35231 +35232, O35232 +35233, O35233 +35234, O35234 +35235, O35235 +35236, O35236 +35237, O35237 +35238, O35238 +35239, O35239 +35240, O35240 +35241, O35241 +35242, O35242 +35243, O35243 +35244, O35244 +35245, O35245 +35246, O35246 +35247, O35247 +35248, O35248 +35249, O35249 +35250, O35250 +35251, O35251 +35252, O35252 +35253, O35253 +35254, O35254 +35255, O35255 +35256, O35256 +35257, O35257 +35258, O35258 +35259, O35259 +35260, O35260 +35261, O35261 +35262, O35262 +35263, O35263 +35264, O35264 +35265, O35265 +35266, O35266 +35267, O35267 +35268, O35268 +35269, O35269 +35270, O35270 +35271, O35271 +35272, O35272 +35273, O35273 +35274, O35274 +35275, O35275 +35276, O35276 +35277, O35277 +35278, O35278 +35279, O35279 +35280, O35280 +35281, O35281 +35282, O35282 +35283, O35283 +35284, O35284 +35285, O35285 +35286, O35286 +35287, O35287 +35288, O35288 +35289, O35289 +35290, O35290 +35291, O35291 +35292, O35292 +35293, O35293 +35294, O35294 +35295, O35295 +35296, O35296 +35297, O35297 +35298, O35298 +35299, O35299 +35300, O35300 +35301, O35301 +35302, O35302 +35303, O35303 +35304, O35304 +35305, O35305 +35306, O35306 +35307, O35307 +35308, O35308 +35309, O35309 +35310, O35310 +35311, O35311 +35312, O35312 +35313, O35313 +35314, O35314 +35315, O35315 +35316, O35316 +35317, O35317 +35318, O35318 +35319, O35319 +35320, O35320 +35321, O35321 +35322, O35322 +35323, O35323 +35324, O35324 +35325, O35325 +35326, O35326 +35327, O35327 +35328, O35328 +35329, O35329 +35330, O35330 +35331, O35331 +35332, O35332 +35333, O35333 +35334, O35334 +35335, O35335 +35336, O35336 +35337, O35337 +35338, O35338 +35339, O35339 +35340, O35340 +35341, O35341 +35342, O35342 +35343, O35343 +35344, O35344 +35345, O35345 +35346, O35346 +35347, O35347 +35348, O35348 +35349, O35349 +35350, O35350 +35351, O35351 +35352, O35352 +35353, O35353 +35354, O35354 +35355, O35355 +35356, O35356 +35357, O35357 +35358, O35358 +35359, O35359 +35360, O35360 +35361, O35361 +35362, O35362 +35363, O35363 +35364, O35364 +35365, O35365 +35366, O35366 +35367, O35367 +35368, O35368 +35369, O35369 +35370, O35370 +35371, O35371 +35372, O35372 +35373, O35373 +35374, O35374 +35375, O35375 +35376, O35376 +35377, O35377 +35378, O35378 +35379, O35379 +35380, O35380 +35381, O35381 +35382, O35382 +35383, O35383 +35384, O35384 +35385, O35385 +35386, O35386 +35387, O35387 +35388, O35388 +35389, O35389 +35390, O35390 +35391, O35391 +35392, O35392 +35393, O35393 +35394, O35394 +35395, O35395 +35396, O35396 +35397, O35397 +35398, O35398 +35399, O35399 +35400, O35400 +35401, O35401 +35402, O35402 +35403, O35403 +35404, O35404 +35405, O35405 +35406, O35406 +35407, O35407 +35408, O35408 +35409, O35409 +35410, O35410 +35411, O35411 +35412, O35412 +35413, O35413 +35414, O35414 +35415, O35415 +35416, O35416 +35417, O35417 +35418, O35418 +35419, O35419 +35420, O35420 +35421, O35421 +35422, O35422 +35423, O35423 +35424, O35424 +35425, O35425 +35426, O35426 +35427, O35427 +35428, O35428 +35429, O35429 +35430, O35430 +35431, O35431 +35432, O35432 +35433, O35433 +35434, O35434 +35435, O35435 +35436, O35436 +35437, O35437 +35438, O35438 +35439, O35439 +35440, O35440 +35441, O35441 +35442, O35442 +35443, O35443 +35444, O35444 +35445, O35445 +35446, O35446 +35447, O35447 +35448, O35448 +35449, O35449 +35450, O35450 +35451, O35451 +35452, O35452 +35453, O35453 +35454, O35454 +35455, O35455 +35456, O35456 +35457, O35457 +35458, O35458 +35459, O35459 +35460, O35460 +35461, O35461 +35462, O35462 +35463, O35463 +35464, O35464 +35465, O35465 +35466, O35466 +35467, O35467 +35468, O35468 +35469, O35469 +35470, O35470 +35471, O35471 +35472, O35472 +35473, O35473 +35474, O35474 +35475, O35475 +35476, O35476 +35477, O35477 +35478, O35478 +35479, O35479 +35480, O35480 +35481, O35481 +35482, O35482 +35483, O35483 +35484, O35484 +35485, O35485 +35486, O35486 +35487, O35487 +35488, O35488 +35489, O35489 +35490, O35490 +35491, O35491 +35492, O35492 +35493, O35493 +35494, O35494 +35495, O35495 +35496, O35496 +35497, O35497 +35498, O35498 +35499, O35499 +35500, O35500 +35501, O35501 +35502, O35502 +35503, O35503 +35504, O35504 +35505, O35505 +35506, O35506 +35507, O35507 +35508, O35508 +35509, O35509 +35510, O35510 +35511, O35511 +35512, O35512 +35513, O35513 +35514, O35514 +35515, O35515 +35516, O35516 +35517, O35517 +35518, O35518 +35519, O35519 +35520, O35520 +35521, O35521 +35522, O35522 +35523, O35523 +35524, O35524 +35525, O35525 +35526, O35526 +35527, O35527 +35528, O35528 +35529, O35529 +35530, O35530 +35531, O35531 +35532, O35532 +35533, O35533 +35534, O35534 +35535, O35535 +35536, O35536 +35537, O35537 +35538, O35538 +35539, O35539 +35540, O35540 +35541, O35541 +35542, O35542 +35543, O35543 +35544, O35544 +35545, O35545 +35546, O35546 +35547, O35547 +35548, O35548 +35549, O35549 +35550, O35550 +35551, O35551 +35552, O35552 +35553, O35553 +35554, O35554 +35555, O35555 +35556, O35556 +35557, O35557 +35558, O35558 +35559, O35559 +35560, O35560 +35561, O35561 +35562, O35562 +35563, O35563 +35564, O35564 +35565, O35565 +35566, O35566 +35567, O35567 +35568, O35568 +35569, O35569 +35570, O35570 +35571, O35571 +35572, O35572 +35573, O35573 +35574, O35574 +35575, O35575 +35576, O35576 +35577, O35577 +35578, O35578 +35579, O35579 +35580, O35580 +35581, O35581 +35582, O35582 +35583, O35583 +35584, O35584 +35585, O35585 +35586, O35586 +35587, O35587 +35588, O35588 +35589, O35589 +35590, O35590 +35591, O35591 +35592, O35592 +35593, O35593 +35594, O35594 +35595, O35595 +35596, O35596 +35597, O35597 +35598, O35598 +35599, O35599 +35600, O35600 +35601, O35601 +35602, O35602 +35603, O35603 +35604, O35604 +35605, O35605 +35606, O35606 +35607, O35607 +35608, O35608 +35609, O35609 +35610, O35610 +35611, O35611 +35612, O35612 +35613, O35613 +35614, O35614 +35615, O35615 +35616, O35616 +35617, O35617 +35618, O35618 +35619, O35619 +35620, O35620 +35621, O35621 +35622, O35622 +35623, O35623 +35624, O35624 +35625, O35625 +35626, O35626 +35627, O35627 +35628, O35628 +35629, O35629 +35630, O35630 +35631, O35631 +35632, O35632 +35633, O35633 +35634, O35634 +35635, O35635 +35636, O35636 +35637, O35637 +35638, O35638 +35639, O35639 +35640, O35640 +35641, O35641 +35642, O35642 +35643, O35643 +35644, O35644 +35645, O35645 +35646, O35646 +35647, O35647 +35648, O35648 +35649, O35649 +35650, O35650 +35651, O35651 +35652, O35652 +35653, O35653 +35654, O35654 +35655, O35655 +35656, O35656 +35657, O35657 +35658, O35658 +35659, O35659 +35660, O35660 +35661, O35661 +35662, O35662 +35663, O35663 +35664, O35664 +35665, O35665 +35666, O35666 +35667, O35667 +35668, O35668 +35669, O35669 +35670, O35670 +35671, O35671 +35672, O35672 +35673, O35673 +35674, O35674 +35675, O35675 +35676, O35676 +35677, O35677 +35678, O35678 +35679, O35679 +35680, O35680 +35681, O35681 +35682, O35682 +35683, O35683 +35684, O35684 +35685, O35685 +35686, O35686 +35687, O35687 +35688, O35688 +35689, O35689 +35690, O35690 +35691, O35691 +35692, O35692 +35693, O35693 +35694, O35694 +35695, O35695 +35696, O35696 +35697, O35697 +35698, O35698 +35699, O35699 +35700, O35700 +35701, O35701 +35702, O35702 +35703, O35703 +35704, O35704 +35705, O35705 +35706, O35706 +35707, O35707 +35708, O35708 +35709, O35709 +35710, O35710 +35711, O35711 +35712, O35712 +35713, O35713 +35714, O35714 +35715, O35715 +35716, O35716 +35717, O35717 +35718, O35718 +35719, O35719 +35720, O35720 +35721, O35721 +35722, O35722 +35723, O35723 +35724, O35724 +35725, O35725 +35726, O35726 +35727, O35727 +35728, O35728 +35729, O35729 +35730, O35730 +35731, O35731 +35732, O35732 +35733, O35733 +35734, O35734 +35735, O35735 +35736, O35736 +35737, O35737 +35738, O35738 +35739, O35739 +35740, O35740 +35741, O35741 +35742, O35742 +35743, O35743 +35744, O35744 +35745, O35745 +35746, O35746 +35747, O35747 +35748, O35748 +35749, O35749 +35750, O35750 +35751, O35751 +35752, O35752 +35753, O35753 +35754, O35754 +35755, O35755 +35756, O35756 +35757, O35757 +35758, O35758 +35759, O35759 +35760, O35760 +35761, O35761 +35762, O35762 +35763, O35763 +35764, O35764 +35765, O35765 +35766, O35766 +35767, O35767 +35768, O35768 +35769, O35769 +35770, O35770 +35771, O35771 +35772, O35772 +35773, O35773 +35774, O35774 +35775, O35775 +35776, O35776 +35777, O35777 +35778, O35778 +35779, O35779 +35780, O35780 +35781, O35781 +35782, O35782 +35783, O35783 +35784, O35784 +35785, O35785 +35786, O35786 +35787, O35787 +35788, O35788 +35789, O35789 +35790, O35790 +35791, O35791 +35792, O35792 +35793, O35793 +35794, O35794 +35795, O35795 +35796, O35796 +35797, O35797 +35798, O35798 +35799, O35799 +35800, O35800 +35801, O35801 +35802, O35802 +35803, O35803 +35804, O35804 +35805, O35805 +35806, O35806 +35807, O35807 +35808, O35808 +35809, O35809 +35810, O35810 +35811, O35811 +35812, O35812 +35813, O35813 +35814, O35814 +35815, O35815 +35816, O35816 +35817, O35817 +35818, O35818 +35819, O35819 +35820, O35820 +35821, O35821 +35822, O35822 +35823, O35823 +35824, O35824 +35825, O35825 +35826, O35826 +35827, O35827 +35828, O35828 +35829, O35829 +35830, O35830 +35831, O35831 +35832, O35832 +35833, O35833 +35834, O35834 +35835, O35835 +35836, O35836 +35837, O35837 +35838, O35838 +35839, O35839 +35840, O35840 +35841, O35841 +35842, O35842 +35843, O35843 +35844, O35844 +35845, O35845 +35846, O35846 +35847, O35847 +35848, O35848 +35849, O35849 +35850, O35850 +35851, O35851 +35852, O35852 +35853, O35853 +35854, O35854 +35855, O35855 +35856, O35856 +35857, O35857 +35858, O35858 +35859, O35859 +35860, O35860 +35861, O35861 +35862, O35862 +35863, O35863 +35864, O35864 +35865, O35865 +35866, O35866 +35867, O35867 +35868, O35868 +35869, O35869 +35870, O35870 +35871, O35871 +35872, O35872 +35873, O35873 +35874, O35874 +35875, O35875 +35876, O35876 +35877, O35877 +35878, O35878 +35879, O35879 +35880, O35880 +35881, O35881 +35882, O35882 +35883, O35883 +35884, O35884 +35885, O35885 +35886, O35886 +35887, O35887 +35888, O35888 +35889, O35889 +35890, O35890 +35891, O35891 +35892, O35892 +35893, O35893 +35894, O35894 +35895, O35895 +35896, O35896 +35897, O35897 +35898, O35898 +35899, O35899 +35900, O35900 +35901, O35901 +35902, O35902 +35903, O35903 +35904, O35904 +35905, O35905 +35906, O35906 +35907, O35907 +35908, O35908 +35909, O35909 +35910, O35910 +35911, O35911 +35912, O35912 +35913, O35913 +35914, O35914 +35915, O35915 +35916, O35916 +35917, O35917 +35918, O35918 +35919, O35919 +35920, O35920 +35921, O35921 +35922, O35922 +35923, O35923 +35924, O35924 +35925, O35925 +35926, O35926 +35927, O35927 +35928, O35928 +35929, O35929 +35930, O35930 +35931, O35931 +35932, O35932 +35933, O35933 +35934, O35934 +35935, O35935 +35936, O35936 +35937, O35937 +35938, O35938 +35939, O35939 +35940, O35940 +35941, O35941 +35942, O35942 +35943, O35943 +35944, O35944 +35945, O35945 +35946, O35946 +35947, O35947 +35948, O35948 +35949, O35949 +35950, O35950 +35951, O35951 +35952, O35952 +35953, O35953 +35954, O35954 +35955, O35955 +35956, O35956 +35957, O35957 +35958, O35958 +35959, O35959 +35960, O35960 +35961, O35961 +35962, O35962 +35963, O35963 +35964, O35964 +35965, O35965 +35966, O35966 +35967, O35967 +35968, O35968 +35969, O35969 +35970, O35970 +35971, O35971 +35972, O35972 +35973, O35973 +35974, O35974 +35975, O35975 +35976, O35976 +35977, O35977 +35978, O35978 +35979, O35979 +35980, O35980 +35981, O35981 +35982, O35982 +35983, O35983 +35984, O35984 +35985, O35985 +35986, O35986 +35987, O35987 +35988, O35988 +35989, O35989 +35990, O35990 +35991, O35991 +35992, O35992 +35993, O35993 +35994, O35994 +35995, O35995 +35996, O35996 +35997, O35997 +35998, O35998 +35999, O35999 +36000, O36000 +36001, O36001 +36002, O36002 +36003, O36003 +36004, O36004 +36005, O36005 +36006, O36006 +36007, O36007 +36008, O36008 +36009, O36009 +36010, O36010 +36011, O36011 +36012, O36012 +36013, O36013 +36014, O36014 +36015, O36015 +36016, O36016 +36017, O36017 +36018, O36018 +36019, O36019 +36020, O36020 +36021, O36021 +36022, O36022 +36023, O36023 +36024, O36024 +36025, O36025 +36026, O36026 +36027, O36027 +36028, O36028 +36029, O36029 +36030, O36030 +36031, O36031 +36032, O36032 +36033, O36033 +36034, O36034 +36035, O36035 +36036, O36036 +36037, O36037 +36038, O36038 +36039, O36039 +36040, O36040 +36041, O36041 +36042, O36042 +36043, O36043 +36044, O36044 +36045, O36045 +36046, O36046 +36047, O36047 +36048, O36048 +36049, O36049 +36050, O36050 +36051, O36051 +36052, O36052 +36053, O36053 +36054, O36054 +36055, O36055 +36056, O36056 +36057, O36057 +36058, O36058 +36059, O36059 +36060, O36060 +36061, O36061 +36062, O36062 +36063, O36063 +36064, O36064 +36065, O36065 +36066, O36066 +36067, O36067 +36068, O36068 +36069, O36069 +36070, O36070 +36071, O36071 +36072, O36072 +36073, O36073 +36074, O36074 +36075, O36075 +36076, O36076 +36077, O36077 +36078, O36078 +36079, O36079 +36080, O36080 +36081, O36081 +36082, O36082 +36083, O36083 +36084, O36084 +36085, O36085 +36086, O36086 +36087, O36087 +36088, O36088 +36089, O36089 +36090, O36090 +36091, O36091 +36092, O36092 +36093, O36093 +36094, O36094 +36095, O36095 +36096, O36096 +36097, O36097 +36098, O36098 +36099, O36099 +36100, O36100 +36101, O36101 +36102, O36102 +36103, O36103 +36104, O36104 +36105, O36105 +36106, O36106 +36107, O36107 +36108, O36108 +36109, O36109 +36110, O36110 +36111, O36111 +36112, O36112 +36113, O36113 +36114, O36114 +36115, O36115 +36116, O36116 +36117, O36117 +36118, O36118 +36119, O36119 +36120, O36120 +36121, O36121 +36122, O36122 +36123, O36123 +36124, O36124 +36125, O36125 +36126, O36126 +36127, O36127 +36128, O36128 +36129, O36129 +36130, O36130 +36131, O36131 +36132, O36132 +36133, O36133 +36134, O36134 +36135, O36135 +36136, O36136 +36137, O36137 +36138, O36138 +36139, O36139 +36140, O36140 +36141, O36141 +36142, O36142 +36143, O36143 +36144, O36144 +36145, O36145 +36146, O36146 +36147, O36147 +36148, O36148 +36149, O36149 +36150, O36150 +36151, O36151 +36152, O36152 +36153, O36153 +36154, O36154 +36155, O36155 +36156, O36156 +36157, O36157 +36158, O36158 +36159, O36159 +36160, O36160 +36161, O36161 +36162, O36162 +36163, O36163 +36164, O36164 +36165, O36165 +36166, O36166 +36167, O36167 +36168, O36168 +36169, O36169 +36170, O36170 +36171, O36171 +36172, O36172 +36173, O36173 +36174, O36174 +36175, O36175 +36176, O36176 +36177, O36177 +36178, O36178 +36179, O36179 +36180, O36180 +36181, O36181 +36182, O36182 +36183, O36183 +36184, O36184 +36185, O36185 +36186, O36186 +36187, O36187 +36188, O36188 +36189, O36189 +36190, O36190 +36191, O36191 +36192, O36192 +36193, O36193 +36194, O36194 +36195, O36195 +36196, O36196 +36197, O36197 +36198, O36198 +36199, O36199 +36200, O36200 +36201, O36201 +36202, O36202 +36203, O36203 +36204, O36204 +36205, O36205 +36206, O36206 +36207, O36207 +36208, O36208 +36209, O36209 +36210, O36210 +36211, O36211 +36212, O36212 +36213, O36213 +36214, O36214 +36215, O36215 +36216, O36216 +36217, O36217 +36218, O36218 +36219, O36219 +36220, O36220 +36221, O36221 +36222, O36222 +36223, O36223 +36224, O36224 +36225, O36225 +36226, O36226 +36227, O36227 +36228, O36228 +36229, O36229 +36230, O36230 +36231, O36231 +36232, O36232 +36233, O36233 +36234, O36234 +36235, O36235 +36236, O36236 +36237, O36237 +36238, O36238 +36239, O36239 +36240, O36240 +36241, O36241 +36242, O36242 +36243, O36243 +36244, O36244 +36245, O36245 +36246, O36246 +36247, O36247 +36248, O36248 +36249, O36249 +36250, O36250 +36251, O36251 +36252, O36252 +36253, O36253 +36254, O36254 +36255, O36255 +36256, O36256 +36257, O36257 +36258, O36258 +36259, O36259 +36260, O36260 +36261, O36261 +36262, O36262 +36263, O36263 +36264, O36264 +36265, O36265 +36266, O36266 +36267, O36267 +36268, O36268 +36269, O36269 +36270, O36270 +36271, O36271 +36272, O36272 +36273, O36273 +36274, O36274 +36275, O36275 +36276, O36276 +36277, O36277 +36278, O36278 +36279, O36279 +36280, O36280 +36281, O36281 +36282, O36282 +36283, O36283 +36284, O36284 +36285, O36285 +36286, O36286 +36287, O36287 +36288, O36288 +36289, O36289 +36290, O36290 +36291, O36291 +36292, O36292 +36293, O36293 +36294, O36294 +36295, O36295 +36296, O36296 +36297, O36297 +36298, O36298 +36299, O36299 +36300, O36300 +36301, O36301 +36302, O36302 +36303, O36303 +36304, O36304 +36305, O36305 +36306, O36306 +36307, O36307 +36308, O36308 +36309, O36309 +36310, O36310 +36311, O36311 +36312, O36312 +36313, O36313 +36314, O36314 +36315, O36315 +36316, O36316 +36317, O36317 +36318, O36318 +36319, O36319 +36320, O36320 +36321, O36321 +36322, O36322 +36323, O36323 +36324, O36324 +36325, O36325 +36326, O36326 +36327, O36327 +36328, O36328 +36329, O36329 +36330, O36330 +36331, O36331 +36332, O36332 +36333, O36333 +36334, O36334 +36335, O36335 +36336, O36336 +36337, O36337 +36338, O36338 +36339, O36339 +36340, O36340 +36341, O36341 +36342, O36342 +36343, O36343 +36344, O36344 +36345, O36345 +36346, O36346 +36347, O36347 +36348, O36348 +36349, O36349 +36350, O36350 +36351, O36351 +36352, O36352 +36353, O36353 +36354, O36354 +36355, O36355 +36356, O36356 +36357, O36357 +36358, O36358 +36359, O36359 +36360, O36360 +36361, O36361 +36362, O36362 +36363, O36363 +36364, O36364 +36365, O36365 +36366, O36366 +36367, O36367 +36368, O36368 +36369, O36369 +36370, O36370 +36371, O36371 +36372, O36372 +36373, O36373 +36374, O36374 +36375, O36375 +36376, O36376 +36377, O36377 +36378, O36378 +36379, O36379 +36380, O36380 +36381, O36381 +36382, O36382 +36383, O36383 +36384, O36384 +36385, O36385 +36386, O36386 +36387, O36387 +36388, O36388 +36389, O36389 +36390, O36390 +36391, O36391 +36392, O36392 +36393, O36393 +36394, O36394 +36395, O36395 +36396, O36396 +36397, O36397 +36398, O36398 +36399, O36399 +36400, O36400 +36401, O36401 +36402, O36402 +36403, O36403 +36404, O36404 +36405, O36405 +36406, O36406 +36407, O36407 +36408, O36408 +36409, O36409 +36410, O36410 +36411, O36411 +36412, O36412 +36413, O36413 +36414, O36414 +36415, O36415 +36416, O36416 +36417, O36417 +36418, O36418 +36419, O36419 +36420, O36420 +36421, O36421 +36422, O36422 +36423, O36423 +36424, O36424 +36425, O36425 +36426, O36426 +36427, O36427 +36428, O36428 +36429, O36429 +36430, O36430 +36431, O36431 +36432, O36432 +36433, O36433 +36434, O36434 +36435, O36435 +36436, O36436 +36437, O36437 +36438, O36438 +36439, O36439 +36440, O36440 +36441, O36441 +36442, O36442 +36443, O36443 +36444, O36444 +36445, O36445 +36446, O36446 +36447, O36447 +36448, O36448 +36449, O36449 +36450, O36450 +36451, O36451 +36452, O36452 +36453, O36453 +36454, O36454 +36455, O36455 +36456, O36456 +36457, O36457 +36458, O36458 +36459, O36459 +36460, O36460 +36461, O36461 +36462, O36462 +36463, O36463 +36464, O36464 +36465, O36465 +36466, O36466 +36467, O36467 +36468, O36468 +36469, O36469 +36470, O36470 +36471, O36471 +36472, O36472 +36473, O36473 +36474, O36474 +36475, O36475 +36476, O36476 +36477, O36477 +36478, O36478 +36479, O36479 +36480, O36480 +36481, O36481 +36482, O36482 +36483, O36483 +36484, O36484 +36485, O36485 +36486, O36486 +36487, O36487 +36488, O36488 +36489, O36489 +36490, O36490 +36491, O36491 +36492, O36492 +36493, O36493 +36494, O36494 +36495, O36495 +36496, O36496 +36497, O36497 +36498, O36498 +36499, O36499 +36500, O36500 +36501, O36501 +36502, O36502 +36503, O36503 +36504, O36504 +36505, O36505 +36506, O36506 +36507, O36507 +36508, O36508 +36509, O36509 +36510, O36510 +36511, O36511 +36512, O36512 +36513, O36513 +36514, O36514 +36515, O36515 +36516, O36516 +36517, O36517 +36518, O36518 +36519, O36519 +36520, O36520 +36521, O36521 +36522, O36522 +36523, O36523 +36524, O36524 +36525, O36525 +36526, O36526 +36527, O36527 +36528, O36528 +36529, O36529 +36530, O36530 +36531, O36531 +36532, O36532 +36533, O36533 +36534, O36534 +36535, O36535 +36536, O36536 +36537, O36537 +36538, O36538 +36539, O36539 +36540, O36540 +36541, O36541 +36542, O36542 +36543, O36543 +36544, O36544 +36545, O36545 +36546, O36546 +36547, O36547 +36548, O36548 +36549, O36549 +36550, O36550 +36551, O36551 +36552, O36552 +36553, O36553 +36554, O36554 +36555, O36555 +36556, O36556 +36557, O36557 +36558, O36558 +36559, O36559 +36560, O36560 +36561, O36561 +36562, O36562 +36563, O36563 +36564, O36564 +36565, O36565 +36566, O36566 +36567, O36567 +36568, O36568 +36569, O36569 +36570, O36570 +36571, O36571 +36572, O36572 +36573, O36573 +36574, O36574 +36575, O36575 +36576, O36576 +36577, O36577 +36578, O36578 +36579, O36579 +36580, O36580 +36581, O36581 +36582, O36582 +36583, O36583 +36584, O36584 +36585, O36585 +36586, O36586 +36587, O36587 +36588, O36588 +36589, O36589 +36590, O36590 +36591, O36591 +36592, O36592 +36593, O36593 +36594, O36594 +36595, O36595 +36596, O36596 +36597, O36597 +36598, O36598 +36599, O36599 +36600, O36600 +36601, O36601 +36602, O36602 +36603, O36603 +36604, O36604 +36605, O36605 +36606, O36606 +36607, O36607 +36608, O36608 +36609, O36609 +36610, O36610 +36611, O36611 +36612, O36612 +36613, O36613 +36614, O36614 +36615, O36615 +36616, O36616 +36617, O36617 +36618, O36618 +36619, O36619 +36620, O36620 +36621, O36621 +36622, O36622 +36623, O36623 +36624, O36624 +36625, O36625 +36626, O36626 +36627, O36627 +36628, O36628 +36629, O36629 +36630, O36630 +36631, O36631 +36632, O36632 +36633, O36633 +36634, O36634 +36635, O36635 +36636, O36636 +36637, O36637 +36638, O36638 +36639, O36639 +36640, O36640 +36641, O36641 +36642, O36642 +36643, O36643 +36644, O36644 +36645, O36645 +36646, O36646 +36647, O36647 +36648, O36648 +36649, O36649 +36650, O36650 +36651, O36651 +36652, O36652 +36653, O36653 +36654, O36654 +36655, O36655 +36656, O36656 +36657, O36657 +36658, O36658 +36659, O36659 +36660, O36660 +36661, O36661 +36662, O36662 +36663, O36663 +36664, O36664 +36665, O36665 +36666, O36666 +36667, O36667 +36668, O36668 +36669, O36669 +36670, O36670 +36671, O36671 +36672, O36672 +36673, O36673 +36674, O36674 +36675, O36675 +36676, O36676 +36677, O36677 +36678, O36678 +36679, O36679 +36680, O36680 +36681, O36681 +36682, O36682 +36683, O36683 +36684, O36684 +36685, O36685 +36686, O36686 +36687, O36687 +36688, O36688 +36689, O36689 +36690, O36690 +36691, O36691 +36692, O36692 +36693, O36693 +36694, O36694 +36695, O36695 +36696, O36696 +36697, O36697 +36698, O36698 +36699, O36699 +36700, O36700 +36701, O36701 +36702, O36702 +36703, O36703 +36704, O36704 +36705, O36705 +36706, O36706 +36707, O36707 +36708, O36708 +36709, O36709 +36710, O36710 +36711, O36711 +36712, O36712 +36713, O36713 +36714, O36714 +36715, O36715 +36716, O36716 +36717, O36717 +36718, O36718 +36719, O36719 +36720, O36720 +36721, O36721 +36722, O36722 +36723, O36723 +36724, O36724 +36725, O36725 +36726, O36726 +36727, O36727 +36728, O36728 +36729, O36729 +36730, O36730 +36731, O36731 +36732, O36732 +36733, O36733 +36734, O36734 +36735, O36735 +36736, O36736 +36737, O36737 +36738, O36738 +36739, O36739 +36740, O36740 +36741, O36741 +36742, O36742 +36743, O36743 +36744, O36744 +36745, O36745 +36746, O36746 +36747, O36747 +36748, O36748 +36749, O36749 +36750, O36750 +36751, O36751 +36752, O36752 +36753, O36753 +36754, O36754 +36755, O36755 +36756, O36756 +36757, O36757 +36758, O36758 +36759, O36759 +36760, O36760 +36761, O36761 +36762, O36762 +36763, O36763 +36764, O36764 +36765, O36765 +36766, O36766 +36767, O36767 +36768, O36768 +36769, O36769 +36770, O36770 +36771, O36771 +36772, O36772 +36773, O36773 +36774, O36774 +36775, O36775 +36776, O36776 +36777, O36777 +36778, O36778 +36779, O36779 +36780, O36780 +36781, O36781 +36782, O36782 +36783, O36783 +36784, O36784 +36785, O36785 +36786, O36786 +36787, O36787 +36788, O36788 +36789, O36789 +36790, O36790 +36791, O36791 +36792, O36792 +36793, O36793 +36794, O36794 +36795, O36795 +36796, O36796 +36797, O36797 +36798, O36798 +36799, O36799 +36800, O36800 +36801, O36801 +36802, O36802 +36803, O36803 +36804, O36804 +36805, O36805 +36806, O36806 +36807, O36807 +36808, O36808 +36809, O36809 +36810, O36810 +36811, O36811 +36812, O36812 +36813, O36813 +36814, O36814 +36815, O36815 +36816, O36816 +36817, O36817 +36818, O36818 +36819, O36819 +36820, O36820 +36821, O36821 +36822, O36822 +36823, O36823 +36824, O36824 +36825, O36825 +36826, O36826 +36827, O36827 +36828, O36828 +36829, O36829 +36830, O36830 +36831, O36831 +36832, O36832 +36833, O36833 +36834, O36834 +36835, O36835 +36836, O36836 +36837, O36837 +36838, O36838 +36839, O36839 +36840, O36840 +36841, O36841 +36842, O36842 +36843, O36843 +36844, O36844 +36845, O36845 +36846, O36846 +36847, O36847 +36848, O36848 +36849, O36849 +36850, O36850 +36851, O36851 +36852, O36852 +36853, O36853 +36854, O36854 +36855, O36855 +36856, O36856 +36857, O36857 +36858, O36858 +36859, O36859 +36860, O36860 +36861, O36861 +36862, O36862 +36863, O36863 +36864, O36864 +36865, O36865 +36866, O36866 +36867, O36867 +36868, O36868 +36869, O36869 +36870, O36870 +36871, O36871 +36872, O36872 +36873, O36873 +36874, O36874 +36875, O36875 +36876, O36876 +36877, O36877 +36878, O36878 +36879, O36879 +36880, O36880 +36881, O36881 +36882, O36882 +36883, O36883 +36884, O36884 +36885, O36885 +36886, O36886 +36887, O36887 +36888, O36888 +36889, O36889 +36890, O36890 +36891, O36891 +36892, O36892 +36893, O36893 +36894, O36894 +36895, O36895 +36896, O36896 +36897, O36897 +36898, O36898 +36899, O36899 +36900, O36900 +36901, O36901 +36902, O36902 +36903, O36903 +36904, O36904 +36905, O36905 +36906, O36906 +36907, O36907 +36908, O36908 +36909, O36909 +36910, O36910 +36911, O36911 +36912, O36912 +36913, O36913 +36914, O36914 +36915, O36915 +36916, O36916 +36917, O36917 +36918, O36918 +36919, O36919 +36920, O36920 +36921, O36921 +36922, O36922 +36923, O36923 +36924, O36924 +36925, O36925 +36926, O36926 +36927, O36927 +36928, O36928 +36929, O36929 +36930, O36930 +36931, O36931 +36932, O36932 +36933, O36933 +36934, O36934 +36935, O36935 +36936, O36936 +36937, O36937 +36938, O36938 +36939, O36939 +36940, O36940 +36941, O36941 +36942, O36942 +36943, O36943 +36944, O36944 +36945, O36945 +36946, O36946 +36947, O36947 +36948, O36948 +36949, O36949 +36950, O36950 +36951, O36951 +36952, O36952 +36953, O36953 +36954, O36954 +36955, O36955 +36956, O36956 +36957, O36957 +36958, O36958 +36959, O36959 +36960, O36960 +36961, O36961 +36962, O36962 +36963, O36963 +36964, O36964 +36965, O36965 +36966, O36966 +36967, O36967 +36968, O36968 +36969, O36969 +36970, O36970 +36971, O36971 +36972, O36972 +36973, O36973 +36974, O36974 +36975, O36975 +36976, O36976 +36977, O36977 +36978, O36978 +36979, O36979 +36980, O36980 +36981, O36981 +36982, O36982 +36983, O36983 +36984, O36984 +36985, O36985 +36986, O36986 +36987, O36987 +36988, O36988 +36989, O36989 +36990, O36990 +36991, O36991 +36992, O36992 +36993, O36993 +36994, O36994 +36995, O36995 +36996, O36996 +36997, O36997 +36998, O36998 +36999, O36999 +37000, O37000 +37001, O37001 +37002, O37002 +37003, O37003 +37004, O37004 +37005, O37005 +37006, O37006 +37007, O37007 +37008, O37008 +37009, O37009 +37010, O37010 +37011, O37011 +37012, O37012 +37013, O37013 +37014, O37014 +37015, O37015 +37016, O37016 +37017, O37017 +37018, O37018 +37019, O37019 +37020, O37020 +37021, O37021 +37022, O37022 +37023, O37023 +37024, O37024 +37025, O37025 +37026, O37026 +37027, O37027 +37028, O37028 +37029, O37029 +37030, O37030 +37031, O37031 +37032, O37032 +37033, O37033 +37034, O37034 +37035, O37035 +37036, O37036 +37037, O37037 +37038, O37038 +37039, O37039 +37040, O37040 +37041, O37041 +37042, O37042 +37043, O37043 +37044, O37044 +37045, O37045 +37046, O37046 +37047, O37047 +37048, O37048 +37049, O37049 +37050, O37050 +37051, O37051 +37052, O37052 +37053, O37053 +37054, O37054 +37055, O37055 +37056, O37056 +37057, O37057 +37058, O37058 +37059, O37059 +37060, O37060 +37061, O37061 +37062, O37062 +37063, O37063 +37064, O37064 +37065, O37065 +37066, O37066 +37067, O37067 +37068, O37068 +37069, O37069 +37070, O37070 +37071, O37071 +37072, O37072 +37073, O37073 +37074, O37074 +37075, O37075 +37076, O37076 +37077, O37077 +37078, O37078 +37079, O37079 +37080, O37080 +37081, O37081 +37082, O37082 +37083, O37083 +37084, O37084 +37085, O37085 +37086, O37086 +37087, O37087 +37088, O37088 +37089, O37089 +37090, O37090 +37091, O37091 +37092, O37092 +37093, O37093 +37094, O37094 +37095, O37095 +37096, O37096 +37097, O37097 +37098, O37098 +37099, O37099 +37100, O37100 +37101, O37101 +37102, O37102 +37103, O37103 +37104, O37104 +37105, O37105 +37106, O37106 +37107, O37107 +37108, O37108 +37109, O37109 +37110, O37110 +37111, O37111 +37112, O37112 +37113, O37113 +37114, O37114 +37115, O37115 +37116, O37116 +37117, O37117 +37118, O37118 +37119, O37119 +37120, O37120 +37121, O37121 +37122, O37122 +37123, O37123 +37124, O37124 +37125, O37125 +37126, O37126 +37127, O37127 +37128, O37128 +37129, O37129 +37130, O37130 +37131, O37131 +37132, O37132 +37133, O37133 +37134, O37134 +37135, O37135 +37136, O37136 +37137, O37137 +37138, O37138 +37139, O37139 +37140, O37140 +37141, O37141 +37142, O37142 +37143, O37143 +37144, O37144 +37145, O37145 +37146, O37146 +37147, O37147 +37148, O37148 +37149, O37149 +37150, O37150 +37151, O37151 +37152, O37152 +37153, O37153 +37154, O37154 +37155, O37155 +37156, O37156 +37157, O37157 +37158, O37158 +37159, O37159 +37160, O37160 +37161, O37161 +37162, O37162 +37163, O37163 +37164, O37164 +37165, O37165 +37166, O37166 +37167, O37167 +37168, O37168 +37169, O37169 +37170, O37170 +37171, O37171 +37172, O37172 +37173, O37173 +37174, O37174 +37175, O37175 +37176, O37176 +37177, O37177 +37178, O37178 +37179, O37179 +37180, O37180 +37181, O37181 +37182, O37182 +37183, O37183 +37184, O37184 +37185, O37185 +37186, O37186 +37187, O37187 +37188, O37188 +37189, O37189 +37190, O37190 +37191, O37191 +37192, O37192 +37193, O37193 +37194, O37194 +37195, O37195 +37196, O37196 +37197, O37197 +37198, O37198 +37199, O37199 +37200, O37200 +37201, O37201 +37202, O37202 +37203, O37203 +37204, O37204 +37205, O37205 +37206, O37206 +37207, O37207 +37208, O37208 +37209, O37209 +37210, O37210 +37211, O37211 +37212, O37212 +37213, O37213 +37214, O37214 +37215, O37215 +37216, O37216 +37217, O37217 +37218, O37218 +37219, O37219 +37220, O37220 +37221, O37221 +37222, O37222 +37223, O37223 +37224, O37224 +37225, O37225 +37226, O37226 +37227, O37227 +37228, O37228 +37229, O37229 +37230, O37230 +37231, O37231 +37232, O37232 +37233, O37233 +37234, O37234 +37235, O37235 +37236, O37236 +37237, O37237 +37238, O37238 +37239, O37239 +37240, O37240 +37241, O37241 +37242, O37242 +37243, O37243 +37244, O37244 +37245, O37245 +37246, O37246 +37247, O37247 +37248, O37248 +37249, O37249 +37250, O37250 +37251, O37251 +37252, O37252 +37253, O37253 +37254, O37254 +37255, O37255 +37256, O37256 +37257, O37257 +37258, O37258 +37259, O37259 +37260, O37260 +37261, O37261 +37262, O37262 +37263, O37263 +37264, O37264 +37265, O37265 +37266, O37266 +37267, O37267 +37268, O37268 +37269, O37269 +37270, O37270 +37271, O37271 +37272, O37272 +37273, O37273 +37274, O37274 +37275, O37275 +37276, O37276 +37277, O37277 +37278, O37278 +37279, O37279 +37280, O37280 +37281, O37281 +37282, O37282 +37283, O37283 +37284, O37284 +37285, O37285 +37286, O37286 +37287, O37287 +37288, O37288 +37289, O37289 +37290, O37290 +37291, O37291 +37292, O37292 +37293, O37293 +37294, O37294 +37295, O37295 +37296, O37296 +37297, O37297 +37298, O37298 +37299, O37299 +37300, O37300 +37301, O37301 +37302, O37302 +37303, O37303 +37304, O37304 +37305, O37305 +37306, O37306 +37307, O37307 +37308, O37308 +37309, O37309 +37310, O37310 +37311, O37311 +37312, O37312 +37313, O37313 +37314, O37314 +37315, O37315 +37316, O37316 +37317, O37317 +37318, O37318 +37319, O37319 +37320, O37320 +37321, O37321 +37322, O37322 +37323, O37323 +37324, O37324 +37325, O37325 +37326, O37326 +37327, O37327 +37328, O37328 +37329, O37329 +37330, O37330 +37331, O37331 +37332, O37332 +37333, O37333 +37334, O37334 +37335, O37335 +37336, O37336 +37337, O37337 +37338, O37338 +37339, O37339 +37340, O37340 +37341, O37341 +37342, O37342 +37343, O37343 +37344, O37344 +37345, O37345 +37346, O37346 +37347, O37347 +37348, O37348 +37349, O37349 +37350, O37350 +37351, O37351 +37352, O37352 +37353, O37353 +37354, O37354 +37355, O37355 +37356, O37356 +37357, O37357 +37358, O37358 +37359, O37359 +37360, O37360 +37361, O37361 +37362, O37362 +37363, O37363 +37364, O37364 +37365, O37365 +37366, O37366 +37367, O37367 +37368, O37368 +37369, O37369 +37370, O37370 +37371, O37371 +37372, O37372 +37373, O37373 +37374, O37374 +37375, O37375 +37376, O37376 +37377, O37377 +37378, O37378 +37379, O37379 +37380, O37380 +37381, O37381 +37382, O37382 +37383, O37383 +37384, O37384 +37385, O37385 +37386, O37386 +37387, O37387 +37388, O37388 +37389, O37389 +37390, O37390 +37391, O37391 +37392, O37392 +37393, O37393 +37394, O37394 +37395, O37395 +37396, O37396 +37397, O37397 +37398, O37398 +37399, O37399 +37400, O37400 +37401, O37401 +37402, O37402 +37403, O37403 +37404, O37404 +37405, O37405 +37406, O37406 +37407, O37407 +37408, O37408 +37409, O37409 +37410, O37410 +37411, O37411 +37412, O37412 +37413, O37413 +37414, O37414 +37415, O37415 +37416, O37416 +37417, O37417 +37418, O37418 +37419, O37419 +37420, O37420 +37421, O37421 +37422, O37422 +37423, O37423 +37424, O37424 +37425, O37425 +37426, O37426 +37427, O37427 +37428, O37428 +37429, O37429 +37430, O37430 +37431, O37431 +37432, O37432 +37433, O37433 +37434, O37434 +37435, O37435 +37436, O37436 +37437, O37437 +37438, O37438 +37439, O37439 +37440, O37440 +37441, O37441 +37442, O37442 +37443, O37443 +37444, O37444 +37445, O37445 +37446, O37446 +37447, O37447 +37448, O37448 +37449, O37449 +37450, O37450 +37451, O37451 +37452, O37452 +37453, O37453 +37454, O37454 +37455, O37455 +37456, O37456 +37457, O37457 +37458, O37458 +37459, O37459 +37460, O37460 +37461, O37461 +37462, O37462 +37463, O37463 +37464, O37464 +37465, O37465 +37466, O37466 +37467, O37467 +37468, O37468 +37469, O37469 +37470, O37470 +37471, O37471 +37472, O37472 +37473, O37473 +37474, O37474 +37475, O37475 +37476, O37476 +37477, O37477 +37478, O37478 +37479, O37479 +37480, O37480 +37481, O37481 +37482, O37482 +37483, O37483 +37484, O37484 +37485, O37485 +37486, O37486 +37487, O37487 +37488, O37488 +37489, O37489 +37490, O37490 +37491, O37491 +37492, O37492 +37493, O37493 +37494, O37494 +37495, O37495 +37496, O37496 +37497, O37497 +37498, O37498 +37499, O37499 +37500, O37500 +37501, O37501 +37502, O37502 +37503, O37503 +37504, O37504 +37505, O37505 +37506, O37506 +37507, O37507 +37508, O37508 +37509, O37509 +37510, O37510 +37511, O37511 +37512, O37512 +37513, O37513 +37514, O37514 +37515, O37515 +37516, O37516 +37517, O37517 +37518, O37518 +37519, O37519 +37520, O37520 +37521, O37521 +37522, O37522 +37523, O37523 +37524, O37524 +37525, O37525 +37526, O37526 +37527, O37527 +37528, O37528 +37529, O37529 +37530, O37530 +37531, O37531 +37532, O37532 +37533, O37533 +37534, O37534 +37535, O37535 +37536, O37536 +37537, O37537 +37538, O37538 +37539, O37539 +37540, O37540 +37541, O37541 +37542, O37542 +37543, O37543 +37544, O37544 +37545, O37545 +37546, O37546 +37547, O37547 +37548, O37548 +37549, O37549 +37550, O37550 +37551, O37551 +37552, O37552 +37553, O37553 +37554, O37554 +37555, O37555 +37556, O37556 +37557, O37557 +37558, O37558 +37559, O37559 +37560, O37560 +37561, O37561 +37562, O37562 +37563, O37563 +37564, O37564 +37565, O37565 +37566, O37566 +37567, O37567 +37568, O37568 +37569, O37569 +37570, O37570 +37571, O37571 +37572, O37572 +37573, O37573 +37574, O37574 +37575, O37575 +37576, O37576 +37577, O37577 +37578, O37578 +37579, O37579 +37580, O37580 +37581, O37581 +37582, O37582 +37583, O37583 +37584, O37584 +37585, O37585 +37586, O37586 +37587, O37587 +37588, O37588 +37589, O37589 +37590, O37590 +37591, O37591 +37592, O37592 +37593, O37593 +37594, O37594 +37595, O37595 +37596, O37596 +37597, O37597 +37598, O37598 +37599, O37599 +37600, O37600 +37601, O37601 +37602, O37602 +37603, O37603 +37604, O37604 +37605, O37605 +37606, O37606 +37607, O37607 +37608, O37608 +37609, O37609 +37610, O37610 +37611, O37611 +37612, O37612 +37613, O37613 +37614, O37614 +37615, O37615 +37616, O37616 +37617, O37617 +37618, O37618 +37619, O37619 +37620, O37620 +37621, O37621 +37622, O37622 +37623, O37623 +37624, O37624 +37625, O37625 +37626, O37626 +37627, O37627 +37628, O37628 +37629, O37629 +37630, O37630 +37631, O37631 +37632, O37632 +37633, O37633 +37634, O37634 +37635, O37635 +37636, O37636 +37637, O37637 +37638, O37638 +37639, O37639 +37640, O37640 +37641, O37641 +37642, O37642 +37643, O37643 +37644, O37644 +37645, O37645 +37646, O37646 +37647, O37647 +37648, O37648 +37649, O37649 +37650, O37650 +37651, O37651 +37652, O37652 +37653, O37653 +37654, O37654 +37655, O37655 +37656, O37656 +37657, O37657 +37658, O37658 +37659, O37659 +37660, O37660 +37661, O37661 +37662, O37662 +37663, O37663 +37664, O37664 +37665, O37665 +37666, O37666 +37667, O37667 +37668, O37668 +37669, O37669 +37670, O37670 +37671, O37671 +37672, O37672 +37673, O37673 +37674, O37674 +37675, O37675 +37676, O37676 +37677, O37677 +37678, O37678 +37679, O37679 +37680, O37680 +37681, O37681 +37682, O37682 +37683, O37683 +37684, O37684 +37685, O37685 +37686, O37686 +37687, O37687 +37688, O37688 +37689, O37689 +37690, O37690 +37691, O37691 +37692, O37692 +37693, O37693 +37694, O37694 +37695, O37695 +37696, O37696 +37697, O37697 +37698, O37698 +37699, O37699 +37700, O37700 +37701, O37701 +37702, O37702 +37703, O37703 +37704, O37704 +37705, O37705 +37706, O37706 +37707, O37707 +37708, O37708 +37709, O37709 +37710, O37710 +37711, O37711 +37712, O37712 +37713, O37713 +37714, O37714 +37715, O37715 +37716, O37716 +37717, O37717 +37718, O37718 +37719, O37719 +37720, O37720 +37721, O37721 +37722, O37722 +37723, O37723 +37724, O37724 +37725, O37725 +37726, O37726 +37727, O37727 +37728, O37728 +37729, O37729 +37730, O37730 +37731, O37731 +37732, O37732 +37733, O37733 +37734, O37734 +37735, O37735 +37736, O37736 +37737, O37737 +37738, O37738 +37739, O37739 +37740, O37740 +37741, O37741 +37742, O37742 +37743, O37743 +37744, O37744 +37745, O37745 +37746, O37746 +37747, O37747 +37748, O37748 +37749, O37749 +37750, O37750 +37751, O37751 +37752, O37752 +37753, O37753 +37754, O37754 +37755, O37755 +37756, O37756 +37757, O37757 +37758, O37758 +37759, O37759 +37760, O37760 +37761, O37761 +37762, O37762 +37763, O37763 +37764, O37764 +37765, O37765 +37766, O37766 +37767, O37767 +37768, O37768 +37769, O37769 +37770, O37770 +37771, O37771 +37772, O37772 +37773, O37773 +37774, O37774 +37775, O37775 +37776, O37776 +37777, O37777 +37778, O37778 +37779, O37779 +37780, O37780 +37781, O37781 +37782, O37782 +37783, O37783 +37784, O37784 +37785, O37785 +37786, O37786 +37787, O37787 +37788, O37788 +37789, O37789 +37790, O37790 +37791, O37791 +37792, O37792 +37793, O37793 +37794, O37794 +37795, O37795 +37796, O37796 +37797, O37797 +37798, O37798 +37799, O37799 +37800, O37800 +37801, O37801 +37802, O37802 +37803, O37803 +37804, O37804 +37805, O37805 +37806, O37806 +37807, O37807 +37808, O37808 +37809, O37809 +37810, O37810 +37811, O37811 +37812, O37812 +37813, O37813 +37814, O37814 +37815, O37815 +37816, O37816 +37817, O37817 +37818, O37818 +37819, O37819 +37820, O37820 +37821, O37821 +37822, O37822 +37823, O37823 +37824, O37824 +37825, O37825 +37826, O37826 +37827, O37827 +37828, O37828 +37829, O37829 +37830, O37830 +37831, O37831 +37832, O37832 +37833, O37833 +37834, O37834 +37835, O37835 +37836, O37836 +37837, O37837 +37838, O37838 +37839, O37839 +37840, O37840 +37841, O37841 +37842, O37842 +37843, O37843 +37844, O37844 +37845, O37845 +37846, O37846 +37847, O37847 +37848, O37848 +37849, O37849 +37850, O37850 +37851, O37851 +37852, O37852 +37853, O37853 +37854, O37854 +37855, O37855 +37856, O37856 +37857, O37857 +37858, O37858 +37859, O37859 +37860, O37860 +37861, O37861 +37862, O37862 +37863, O37863 +37864, O37864 +37865, O37865 +37866, O37866 +37867, O37867 +37868, O37868 +37869, O37869 +37870, O37870 +37871, O37871 +37872, O37872 +37873, O37873 +37874, O37874 +37875, O37875 +37876, O37876 +37877, O37877 +37878, O37878 +37879, O37879 +37880, O37880 +37881, O37881 +37882, O37882 +37883, O37883 +37884, O37884 +37885, O37885 +37886, O37886 +37887, O37887 +37888, O37888 +37889, O37889 +37890, O37890 +37891, O37891 +37892, O37892 +37893, O37893 +37894, O37894 +37895, O37895 +37896, O37896 +37897, O37897 +37898, O37898 +37899, O37899 +37900, O37900 +37901, O37901 +37902, O37902 +37903, O37903 +37904, O37904 +37905, O37905 +37906, O37906 +37907, O37907 +37908, O37908 +37909, O37909 +37910, O37910 +37911, O37911 +37912, O37912 +37913, O37913 +37914, O37914 +37915, O37915 +37916, O37916 +37917, O37917 +37918, O37918 +37919, O37919 +37920, O37920 +37921, O37921 +37922, O37922 +37923, O37923 +37924, O37924 +37925, O37925 +37926, O37926 +37927, O37927 +37928, O37928 +37929, O37929 +37930, O37930 +37931, O37931 +37932, O37932 +37933, O37933 +37934, O37934 +37935, O37935 +37936, O37936 +37937, O37937 +37938, O37938 +37939, O37939 +37940, O37940 +37941, O37941 +37942, O37942 +37943, O37943 +37944, O37944 +37945, O37945 +37946, O37946 +37947, O37947 +37948, O37948 +37949, O37949 +37950, O37950 +37951, O37951 +37952, O37952 +37953, O37953 +37954, O37954 +37955, O37955 +37956, O37956 +37957, O37957 +37958, O37958 +37959, O37959 +37960, O37960 +37961, O37961 +37962, O37962 +37963, O37963 +37964, O37964 +37965, O37965 +37966, O37966 +37967, O37967 +37968, O37968 +37969, O37969 +37970, O37970 +37971, O37971 +37972, O37972 +37973, O37973 +37974, O37974 +37975, O37975 +37976, O37976 +37977, O37977 +37978, O37978 +37979, O37979 +37980, O37980 +37981, O37981 +37982, O37982 +37983, O37983 +37984, O37984 +37985, O37985 +37986, O37986 +37987, O37987 +37988, O37988 +37989, O37989 +37990, O37990 +37991, O37991 +37992, O37992 +37993, O37993 +37994, O37994 +37995, O37995 +37996, O37996 +37997, O37997 +37998, O37998 +37999, O37999 +38000, O38000 +38001, O38001 +38002, O38002 +38003, O38003 +38004, O38004 +38005, O38005 +38006, O38006 +38007, O38007 +38008, O38008 +38009, O38009 +38010, O38010 +38011, O38011 +38012, O38012 +38013, O38013 +38014, O38014 +38015, O38015 +38016, O38016 +38017, O38017 +38018, O38018 +38019, O38019 +38020, O38020 +38021, O38021 +38022, O38022 +38023, O38023 +38024, O38024 +38025, O38025 +38026, O38026 +38027, O38027 +38028, O38028 +38029, O38029 +38030, O38030 +38031, O38031 +38032, O38032 +38033, O38033 +38034, O38034 +38035, O38035 +38036, O38036 +38037, O38037 +38038, O38038 +38039, O38039 +38040, O38040 +38041, O38041 +38042, O38042 +38043, O38043 +38044, O38044 +38045, O38045 +38046, O38046 +38047, O38047 +38048, O38048 +38049, O38049 +38050, O38050 +38051, O38051 +38052, O38052 +38053, O38053 +38054, O38054 +38055, O38055 +38056, O38056 +38057, O38057 +38058, O38058 +38059, O38059 +38060, O38060 +38061, O38061 +38062, O38062 +38063, O38063 +38064, O38064 +38065, O38065 +38066, O38066 +38067, O38067 +38068, O38068 +38069, O38069 +38070, O38070 +38071, O38071 +38072, O38072 +38073, O38073 +38074, O38074 +38075, O38075 +38076, O38076 +38077, O38077 +38078, O38078 +38079, O38079 +38080, O38080 +38081, O38081 +38082, O38082 +38083, O38083 +38084, O38084 +38085, O38085 +38086, O38086 +38087, O38087 +38088, O38088 +38089, O38089 +38090, O38090 +38091, O38091 +38092, O38092 +38093, O38093 +38094, O38094 +38095, O38095 +38096, O38096 +38097, O38097 +38098, O38098 +38099, O38099 +38100, O38100 +38101, O38101 +38102, O38102 +38103, O38103 +38104, O38104 +38105, O38105 +38106, O38106 +38107, O38107 +38108, O38108 +38109, O38109 +38110, O38110 +38111, O38111 +38112, O38112 +38113, O38113 +38114, O38114 +38115, O38115 +38116, O38116 +38117, O38117 +38118, O38118 +38119, O38119 +38120, O38120 +38121, O38121 +38122, O38122 +38123, O38123 +38124, O38124 +38125, O38125 +38126, O38126 +38127, O38127 +38128, O38128 +38129, O38129 +38130, O38130 +38131, O38131 +38132, O38132 +38133, O38133 +38134, O38134 +38135, O38135 +38136, O38136 +38137, O38137 +38138, O38138 +38139, O38139 +38140, O38140 +38141, O38141 +38142, O38142 +38143, O38143 +38144, O38144 +38145, O38145 +38146, O38146 +38147, O38147 +38148, O38148 +38149, O38149 +38150, O38150 +38151, O38151 +38152, O38152 +38153, O38153 +38154, O38154 +38155, O38155 +38156, O38156 +38157, O38157 +38158, O38158 +38159, O38159 +38160, O38160 +38161, O38161 +38162, O38162 +38163, O38163 +38164, O38164 +38165, O38165 +38166, O38166 +38167, O38167 +38168, O38168 +38169, O38169 +38170, O38170 +38171, O38171 +38172, O38172 +38173, O38173 +38174, O38174 +38175, O38175 +38176, O38176 +38177, O38177 +38178, O38178 +38179, O38179 +38180, O38180 +38181, O38181 +38182, O38182 +38183, O38183 +38184, O38184 +38185, O38185 +38186, O38186 +38187, O38187 +38188, O38188 +38189, O38189 +38190, O38190 +38191, O38191 +38192, O38192 +38193, O38193 +38194, O38194 +38195, O38195 +38196, O38196 +38197, O38197 +38198, O38198 +38199, O38199 +38200, O38200 +38201, O38201 +38202, O38202 +38203, O38203 +38204, O38204 +38205, O38205 +38206, O38206 +38207, O38207 +38208, O38208 +38209, O38209 +38210, O38210 +38211, O38211 +38212, O38212 +38213, O38213 +38214, O38214 +38215, O38215 +38216, O38216 +38217, O38217 +38218, O38218 +38219, O38219 +38220, O38220 +38221, O38221 +38222, O38222 +38223, O38223 +38224, O38224 +38225, O38225 +38226, O38226 +38227, O38227 +38228, O38228 +38229, O38229 +38230, O38230 +38231, O38231 +38232, O38232 +38233, O38233 +38234, O38234 +38235, O38235 +38236, O38236 +38237, O38237 +38238, O38238 +38239, O38239 +38240, O38240 +38241, O38241 +38242, O38242 +38243, O38243 +38244, O38244 +38245, O38245 +38246, O38246 +38247, O38247 +38248, O38248 +38249, O38249 +38250, O38250 +38251, O38251 +38252, O38252 +38253, O38253 +38254, O38254 +38255, O38255 +38256, O38256 +38257, O38257 +38258, O38258 +38259, O38259 +38260, O38260 +38261, O38261 +38262, O38262 +38263, O38263 +38264, O38264 +38265, O38265 +38266, O38266 +38267, O38267 +38268, O38268 +38269, O38269 +38270, O38270 +38271, O38271 +38272, O38272 +38273, O38273 +38274, O38274 +38275, O38275 +38276, O38276 +38277, O38277 +38278, O38278 +38279, O38279 +38280, O38280 +38281, O38281 +38282, O38282 +38283, O38283 +38284, O38284 +38285, O38285 +38286, O38286 +38287, O38287 +38288, O38288 +38289, O38289 +38290, O38290 +38291, O38291 +38292, O38292 +38293, O38293 +38294, O38294 +38295, O38295 +38296, O38296 +38297, O38297 +38298, O38298 +38299, O38299 +38300, O38300 +38301, O38301 +38302, O38302 +38303, O38303 +38304, O38304 +38305, O38305 +38306, O38306 +38307, O38307 +38308, O38308 +38309, O38309 +38310, O38310 +38311, O38311 +38312, O38312 +38313, O38313 +38314, O38314 +38315, O38315 +38316, O38316 +38317, O38317 +38318, O38318 +38319, O38319 +38320, O38320 +38321, O38321 +38322, O38322 +38323, O38323 +38324, O38324 +38325, O38325 +38326, O38326 +38327, O38327 +38328, O38328 +38329, O38329 +38330, O38330 +38331, O38331 +38332, O38332 +38333, O38333 +38334, O38334 +38335, O38335 +38336, O38336 +38337, O38337 +38338, O38338 +38339, O38339 +38340, O38340 +38341, O38341 +38342, O38342 +38343, O38343 +38344, O38344 +38345, O38345 +38346, O38346 +38347, O38347 +38348, O38348 +38349, O38349 +38350, O38350 +38351, O38351 +38352, O38352 +38353, O38353 +38354, O38354 +38355, O38355 +38356, O38356 +38357, O38357 +38358, O38358 +38359, O38359 +38360, O38360 +38361, O38361 +38362, O38362 +38363, O38363 +38364, O38364 +38365, O38365 +38366, O38366 +38367, O38367 +38368, O38368 +38369, O38369 +38370, O38370 +38371, O38371 +38372, O38372 +38373, O38373 +38374, O38374 +38375, O38375 +38376, O38376 +38377, O38377 +38378, O38378 +38379, O38379 +38380, O38380 +38381, O38381 +38382, O38382 +38383, O38383 +38384, O38384 +38385, O38385 +38386, O38386 +38387, O38387 +38388, O38388 +38389, O38389 +38390, O38390 +38391, O38391 +38392, O38392 +38393, O38393 +38394, O38394 +38395, O38395 +38396, O38396 +38397, O38397 +38398, O38398 +38399, O38399 +38400, O38400 +38401, O38401 +38402, O38402 +38403, O38403 +38404, O38404 +38405, O38405 +38406, O38406 +38407, O38407 +38408, O38408 +38409, O38409 +38410, O38410 +38411, O38411 +38412, O38412 +38413, O38413 +38414, O38414 +38415, O38415 +38416, O38416 +38417, O38417 +38418, O38418 +38419, O38419 +38420, O38420 +38421, O38421 +38422, O38422 +38423, O38423 +38424, O38424 +38425, O38425 +38426, O38426 +38427, O38427 +38428, O38428 +38429, O38429 +38430, O38430 +38431, O38431 +38432, O38432 +38433, O38433 +38434, O38434 +38435, O38435 +38436, O38436 +38437, O38437 +38438, O38438 +38439, O38439 +38440, O38440 +38441, O38441 +38442, O38442 +38443, O38443 +38444, O38444 +38445, O38445 +38446, O38446 +38447, O38447 +38448, O38448 +38449, O38449 +38450, O38450 +38451, O38451 +38452, O38452 +38453, O38453 +38454, O38454 +38455, O38455 +38456, O38456 +38457, O38457 +38458, O38458 +38459, O38459 +38460, O38460 +38461, O38461 +38462, O38462 +38463, O38463 +38464, O38464 +38465, O38465 +38466, O38466 +38467, O38467 +38468, O38468 +38469, O38469 +38470, O38470 +38471, O38471 +38472, O38472 +38473, O38473 +38474, O38474 +38475, O38475 +38476, O38476 +38477, O38477 +38478, O38478 +38479, O38479 +38480, O38480 +38481, O38481 +38482, O38482 +38483, O38483 +38484, O38484 +38485, O38485 +38486, O38486 +38487, O38487 +38488, O38488 +38489, O38489 +38490, O38490 +38491, O38491 +38492, O38492 +38493, O38493 +38494, O38494 +38495, O38495 +38496, O38496 +38497, O38497 +38498, O38498 +38499, O38499 +38500, O38500 +38501, O38501 +38502, O38502 +38503, O38503 +38504, O38504 +38505, O38505 +38506, O38506 +38507, O38507 +38508, O38508 +38509, O38509 +38510, O38510 +38511, O38511 +38512, O38512 +38513, O38513 +38514, O38514 +38515, O38515 +38516, O38516 +38517, O38517 +38518, O38518 +38519, O38519 +38520, O38520 +38521, O38521 +38522, O38522 +38523, O38523 +38524, O38524 +38525, O38525 +38526, O38526 +38527, O38527 +38528, O38528 +38529, O38529 +38530, O38530 +38531, O38531 +38532, O38532 +38533, O38533 +38534, O38534 +38535, O38535 +38536, O38536 +38537, O38537 +38538, O38538 +38539, O38539 +38540, O38540 +38541, O38541 +38542, O38542 +38543, O38543 +38544, O38544 +38545, O38545 +38546, O38546 +38547, O38547 +38548, O38548 +38549, O38549 +38550, O38550 +38551, O38551 +38552, O38552 +38553, O38553 +38554, O38554 +38555, O38555 +38556, O38556 +38557, O38557 +38558, O38558 +38559, O38559 +38560, O38560 +38561, O38561 +38562, O38562 +38563, O38563 +38564, O38564 +38565, O38565 +38566, O38566 +38567, O38567 +38568, O38568 +38569, O38569 +38570, O38570 +38571, O38571 +38572, O38572 +38573, O38573 +38574, O38574 +38575, O38575 +38576, O38576 +38577, O38577 +38578, O38578 +38579, O38579 +38580, O38580 +38581, O38581 +38582, O38582 +38583, O38583 +38584, O38584 +38585, O38585 +38586, O38586 +38587, O38587 +38588, O38588 +38589, O38589 +38590, O38590 +38591, O38591 +38592, O38592 +38593, O38593 +38594, O38594 +38595, O38595 +38596, O38596 +38597, O38597 +38598, O38598 +38599, O38599 +38600, O38600 +38601, O38601 +38602, O38602 +38603, O38603 +38604, O38604 +38605, O38605 +38606, O38606 +38607, O38607 +38608, O38608 +38609, O38609 +38610, O38610 +38611, O38611 +38612, O38612 +38613, O38613 +38614, O38614 +38615, O38615 +38616, O38616 +38617, O38617 +38618, O38618 +38619, O38619 +38620, O38620 +38621, O38621 +38622, O38622 +38623, O38623 +38624, O38624 +38625, O38625 +38626, O38626 +38627, O38627 +38628, O38628 +38629, O38629 +38630, O38630 +38631, O38631 +38632, O38632 +38633, O38633 +38634, O38634 +38635, O38635 +38636, O38636 +38637, O38637 +38638, O38638 +38639, O38639 +38640, O38640 +38641, O38641 +38642, O38642 +38643, O38643 +38644, O38644 +38645, O38645 +38646, O38646 +38647, O38647 +38648, O38648 +38649, O38649 +38650, O38650 +38651, O38651 +38652, O38652 +38653, O38653 +38654, O38654 +38655, O38655 +38656, O38656 +38657, O38657 +38658, O38658 +38659, O38659 +38660, O38660 +38661, O38661 +38662, O38662 +38663, O38663 +38664, O38664 +38665, O38665 +38666, O38666 +38667, O38667 +38668, O38668 +38669, O38669 +38670, O38670 +38671, O38671 +38672, O38672 +38673, O38673 +38674, O38674 +38675, O38675 +38676, O38676 +38677, O38677 +38678, O38678 +38679, O38679 +38680, O38680 +38681, O38681 +38682, O38682 +38683, O38683 +38684, O38684 +38685, O38685 +38686, O38686 +38687, O38687 +38688, O38688 +38689, O38689 +38690, O38690 +38691, O38691 +38692, O38692 +38693, O38693 +38694, O38694 +38695, O38695 +38696, O38696 +38697, O38697 +38698, O38698 +38699, O38699 +38700, O38700 +38701, O38701 +38702, O38702 +38703, O38703 +38704, O38704 +38705, O38705 +38706, O38706 +38707, O38707 +38708, O38708 +38709, O38709 +38710, O38710 +38711, O38711 +38712, O38712 +38713, O38713 +38714, O38714 +38715, O38715 +38716, O38716 +38717, O38717 +38718, O38718 +38719, O38719 +38720, O38720 +38721, O38721 +38722, O38722 +38723, O38723 +38724, O38724 +38725, O38725 +38726, O38726 +38727, O38727 +38728, O38728 +38729, O38729 +38730, O38730 +38731, O38731 +38732, O38732 +38733, O38733 +38734, O38734 +38735, O38735 +38736, O38736 +38737, O38737 +38738, O38738 +38739, O38739 +38740, O38740 +38741, O38741 +38742, O38742 +38743, O38743 +38744, O38744 +38745, O38745 +38746, O38746 +38747, O38747 +38748, O38748 +38749, O38749 +38750, O38750 +38751, O38751 +38752, O38752 +38753, O38753 +38754, O38754 +38755, O38755 +38756, O38756 +38757, O38757 +38758, O38758 +38759, O38759 +38760, O38760 +38761, O38761 +38762, O38762 +38763, O38763 +38764, O38764 +38765, O38765 +38766, O38766 +38767, O38767 +38768, O38768 +38769, O38769 +38770, O38770 +38771, O38771 +38772, O38772 +38773, O38773 +38774, O38774 +38775, O38775 +38776, O38776 +38777, O38777 +38778, O38778 +38779, O38779 +38780, O38780 +38781, O38781 +38782, O38782 +38783, O38783 +38784, O38784 +38785, O38785 +38786, O38786 +38787, O38787 +38788, O38788 +38789, O38789 +38790, O38790 +38791, O38791 +38792, O38792 +38793, O38793 +38794, O38794 +38795, O38795 +38796, O38796 +38797, O38797 +38798, O38798 +38799, O38799 +38800, O38800 +38801, O38801 +38802, O38802 +38803, O38803 +38804, O38804 +38805, O38805 +38806, O38806 +38807, O38807 +38808, O38808 +38809, O38809 +38810, O38810 +38811, O38811 +38812, O38812 +38813, O38813 +38814, O38814 +38815, O38815 +38816, O38816 +38817, O38817 +38818, O38818 +38819, O38819 +38820, O38820 +38821, O38821 +38822, O38822 +38823, O38823 +38824, O38824 +38825, O38825 +38826, O38826 +38827, O38827 +38828, O38828 +38829, O38829 +38830, O38830 +38831, O38831 +38832, O38832 +38833, O38833 +38834, O38834 +38835, O38835 +38836, O38836 +38837, O38837 +38838, O38838 +38839, O38839 +38840, O38840 +38841, O38841 +38842, O38842 +38843, O38843 +38844, O38844 +38845, O38845 +38846, O38846 +38847, O38847 +38848, O38848 +38849, O38849 +38850, O38850 +38851, O38851 +38852, O38852 +38853, O38853 +38854, O38854 +38855, O38855 +38856, O38856 +38857, O38857 +38858, O38858 +38859, O38859 +38860, O38860 +38861, O38861 +38862, O38862 +38863, O38863 +38864, O38864 +38865, O38865 +38866, O38866 +38867, O38867 +38868, O38868 +38869, O38869 +38870, O38870 +38871, O38871 +38872, O38872 +38873, O38873 +38874, O38874 +38875, O38875 +38876, O38876 +38877, O38877 +38878, O38878 +38879, O38879 +38880, O38880 +38881, O38881 +38882, O38882 +38883, O38883 +38884, O38884 +38885, O38885 +38886, O38886 +38887, O38887 +38888, O38888 +38889, O38889 +38890, O38890 +38891, O38891 +38892, O38892 +38893, O38893 +38894, O38894 +38895, O38895 +38896, O38896 +38897, O38897 +38898, O38898 +38899, O38899 +38900, O38900 +38901, O38901 +38902, O38902 +38903, O38903 +38904, O38904 +38905, O38905 +38906, O38906 +38907, O38907 +38908, O38908 +38909, O38909 +38910, O38910 +38911, O38911 +38912, O38912 +38913, O38913 +38914, O38914 +38915, O38915 +38916, O38916 +38917, O38917 +38918, O38918 +38919, O38919 +38920, O38920 +38921, O38921 +38922, O38922 +38923, O38923 +38924, O38924 +38925, O38925 +38926, O38926 +38927, O38927 +38928, O38928 +38929, O38929 +38930, O38930 +38931, O38931 +38932, O38932 +38933, O38933 +38934, O38934 +38935, O38935 +38936, O38936 +38937, O38937 +38938, O38938 +38939, O38939 +38940, O38940 +38941, O38941 +38942, O38942 +38943, O38943 +38944, O38944 +38945, O38945 +38946, O38946 +38947, O38947 +38948, O38948 +38949, O38949 +38950, O38950 +38951, O38951 +38952, O38952 +38953, O38953 +38954, O38954 +38955, O38955 +38956, O38956 +38957, O38957 +38958, O38958 +38959, O38959 +38960, O38960 +38961, O38961 +38962, O38962 +38963, O38963 +38964, O38964 +38965, O38965 +38966, O38966 +38967, O38967 +38968, O38968 +38969, O38969 +38970, O38970 +38971, O38971 +38972, O38972 +38973, O38973 +38974, O38974 +38975, O38975 +38976, O38976 +38977, O38977 +38978, O38978 +38979, O38979 +38980, O38980 +38981, O38981 +38982, O38982 +38983, O38983 +38984, O38984 +38985, O38985 +38986, O38986 +38987, O38987 +38988, O38988 +38989, O38989 +38990, O38990 +38991, O38991 +38992, O38992 +38993, O38993 +38994, O38994 +38995, O38995 +38996, O38996 +38997, O38997 +38998, O38998 +38999, O38999 +39000, O39000 +39001, O39001 +39002, O39002 +39003, O39003 +39004, O39004 +39005, O39005 +39006, O39006 +39007, O39007 +39008, O39008 +39009, O39009 +39010, O39010 +39011, O39011 +39012, O39012 +39013, O39013 +39014, O39014 +39015, O39015 +39016, O39016 +39017, O39017 +39018, O39018 +39019, O39019 +39020, O39020 +39021, O39021 +39022, O39022 +39023, O39023 +39024, O39024 +39025, O39025 +39026, O39026 +39027, O39027 +39028, O39028 +39029, O39029 +39030, O39030 +39031, O39031 +39032, O39032 +39033, O39033 +39034, O39034 +39035, O39035 +39036, O39036 +39037, O39037 +39038, O39038 +39039, O39039 +39040, O39040 +39041, O39041 +39042, O39042 +39043, O39043 +39044, O39044 +39045, O39045 +39046, O39046 +39047, O39047 +39048, O39048 +39049, O39049 +39050, O39050 +39051, O39051 +39052, O39052 +39053, O39053 +39054, O39054 +39055, O39055 +39056, O39056 +39057, O39057 +39058, O39058 +39059, O39059 +39060, O39060 +39061, O39061 +39062, O39062 +39063, O39063 +39064, O39064 +39065, O39065 +39066, O39066 +39067, O39067 +39068, O39068 +39069, O39069 +39070, O39070 +39071, O39071 +39072, O39072 +39073, O39073 +39074, O39074 +39075, O39075 +39076, O39076 +39077, O39077 +39078, O39078 +39079, O39079 +39080, O39080 +39081, O39081 +39082, O39082 +39083, O39083 +39084, O39084 +39085, O39085 +39086, O39086 +39087, O39087 +39088, O39088 +39089, O39089 +39090, O39090 +39091, O39091 +39092, O39092 +39093, O39093 +39094, O39094 +39095, O39095 +39096, O39096 +39097, O39097 +39098, O39098 +39099, O39099 +39100, O39100 +39101, O39101 +39102, O39102 +39103, O39103 +39104, O39104 +39105, O39105 +39106, O39106 +39107, O39107 +39108, O39108 +39109, O39109 +39110, O39110 +39111, O39111 +39112, O39112 +39113, O39113 +39114, O39114 +39115, O39115 +39116, O39116 +39117, O39117 +39118, O39118 +39119, O39119 +39120, O39120 +39121, O39121 +39122, O39122 +39123, O39123 +39124, O39124 +39125, O39125 +39126, O39126 +39127, O39127 +39128, O39128 +39129, O39129 +39130, O39130 +39131, O39131 +39132, O39132 +39133, O39133 +39134, O39134 +39135, O39135 +39136, O39136 +39137, O39137 +39138, O39138 +39139, O39139 +39140, O39140 +39141, O39141 +39142, O39142 +39143, O39143 +39144, O39144 +39145, O39145 +39146, O39146 +39147, O39147 +39148, O39148 +39149, O39149 +39150, O39150 +39151, O39151 +39152, O39152 +39153, O39153 +39154, O39154 +39155, O39155 +39156, O39156 +39157, O39157 +39158, O39158 +39159, O39159 +39160, O39160 +39161, O39161 +39162, O39162 +39163, O39163 +39164, O39164 +39165, O39165 +39166, O39166 +39167, O39167 +39168, O39168 +39169, O39169 +39170, O39170 +39171, O39171 +39172, O39172 +39173, O39173 +39174, O39174 +39175, O39175 +39176, O39176 +39177, O39177 +39178, O39178 +39179, O39179 +39180, O39180 +39181, O39181 +39182, O39182 +39183, O39183 +39184, O39184 +39185, O39185 +39186, O39186 +39187, O39187 +39188, O39188 +39189, O39189 +39190, O39190 +39191, O39191 +39192, O39192 +39193, O39193 +39194, O39194 +39195, O39195 +39196, O39196 +39197, O39197 +39198, O39198 +39199, O39199 +39200, O39200 +39201, O39201 +39202, O39202 +39203, O39203 +39204, O39204 +39205, O39205 +39206, O39206 +39207, O39207 +39208, O39208 +39209, O39209 +39210, O39210 +39211, O39211 +39212, O39212 +39213, O39213 +39214, O39214 +39215, O39215 +39216, O39216 +39217, O39217 +39218, O39218 +39219, O39219 +39220, O39220 +39221, O39221 +39222, O39222 +39223, O39223 +39224, O39224 +39225, O39225 +39226, O39226 +39227, O39227 +39228, O39228 +39229, O39229 +39230, O39230 +39231, O39231 +39232, O39232 +39233, O39233 +39234, O39234 +39235, O39235 +39236, O39236 +39237, O39237 +39238, O39238 +39239, O39239 +39240, O39240 +39241, O39241 +39242, O39242 +39243, O39243 +39244, O39244 +39245, O39245 +39246, O39246 +39247, O39247 +39248, O39248 +39249, O39249 +39250, O39250 +39251, O39251 +39252, O39252 +39253, O39253 +39254, O39254 +39255, O39255 +39256, O39256 +39257, O39257 +39258, O39258 +39259, O39259 +39260, O39260 +39261, O39261 +39262, O39262 +39263, O39263 +39264, O39264 +39265, O39265 +39266, O39266 +39267, O39267 +39268, O39268 +39269, O39269 +39270, O39270 +39271, O39271 +39272, O39272 +39273, O39273 +39274, O39274 +39275, O39275 +39276, O39276 +39277, O39277 +39278, O39278 +39279, O39279 +39280, O39280 +39281, O39281 +39282, O39282 +39283, O39283 +39284, O39284 +39285, O39285 +39286, O39286 +39287, O39287 +39288, O39288 +39289, O39289 +39290, O39290 +39291, O39291 +39292, O39292 +39293, O39293 +39294, O39294 +39295, O39295 +39296, O39296 +39297, O39297 +39298, O39298 +39299, O39299 +39300, O39300 +39301, O39301 +39302, O39302 +39303, O39303 +39304, O39304 +39305, O39305 +39306, O39306 +39307, O39307 +39308, O39308 +39309, O39309 +39310, O39310 +39311, O39311 +39312, O39312 +39313, O39313 +39314, O39314 +39315, O39315 +39316, O39316 +39317, O39317 +39318, O39318 +39319, O39319 +39320, O39320 +39321, O39321 +39322, O39322 +39323, O39323 +39324, O39324 +39325, O39325 +39326, O39326 +39327, O39327 +39328, O39328 +39329, O39329 +39330, O39330 +39331, O39331 +39332, O39332 +39333, O39333 +39334, O39334 +39335, O39335 +39336, O39336 +39337, O39337 +39338, O39338 +39339, O39339 +39340, O39340 +39341, O39341 +39342, O39342 +39343, O39343 +39344, O39344 +39345, O39345 +39346, O39346 +39347, O39347 +39348, O39348 +39349, O39349 +39350, O39350 +39351, O39351 +39352, O39352 +39353, O39353 +39354, O39354 +39355, O39355 +39356, O39356 +39357, O39357 +39358, O39358 +39359, O39359 +39360, O39360 +39361, O39361 +39362, O39362 +39363, O39363 +39364, O39364 +39365, O39365 +39366, O39366 +39367, O39367 +39368, O39368 +39369, O39369 +39370, O39370 +39371, O39371 +39372, O39372 +39373, O39373 +39374, O39374 +39375, O39375 +39376, O39376 +39377, O39377 +39378, O39378 +39379, O39379 +39380, O39380 +39381, O39381 +39382, O39382 +39383, O39383 +39384, O39384 +39385, O39385 +39386, O39386 +39387, O39387 +39388, O39388 +39389, O39389 +39390, O39390 +39391, O39391 +39392, O39392 +39393, O39393 +39394, O39394 +39395, O39395 +39396, O39396 +39397, O39397 +39398, O39398 +39399, O39399 +39400, O39400 +39401, O39401 +39402, O39402 +39403, O39403 +39404, O39404 +39405, O39405 +39406, O39406 +39407, O39407 +39408, O39408 +39409, O39409 +39410, O39410 +39411, O39411 +39412, O39412 +39413, O39413 +39414, O39414 +39415, O39415 +39416, O39416 +39417, O39417 +39418, O39418 +39419, O39419 +39420, O39420 +39421, O39421 +39422, O39422 +39423, O39423 +39424, O39424 +39425, O39425 +39426, O39426 +39427, O39427 +39428, O39428 +39429, O39429 +39430, O39430 +39431, O39431 +39432, O39432 +39433, O39433 +39434, O39434 +39435, O39435 +39436, O39436 +39437, O39437 +39438, O39438 +39439, O39439 +39440, O39440 +39441, O39441 +39442, O39442 +39443, O39443 +39444, O39444 +39445, O39445 +39446, O39446 +39447, O39447 +39448, O39448 +39449, O39449 +39450, O39450 +39451, O39451 +39452, O39452 +39453, O39453 +39454, O39454 +39455, O39455 +39456, O39456 +39457, O39457 +39458, O39458 +39459, O39459 +39460, O39460 +39461, O39461 +39462, O39462 +39463, O39463 +39464, O39464 +39465, O39465 +39466, O39466 +39467, O39467 +39468, O39468 +39469, O39469 +39470, O39470 +39471, O39471 +39472, O39472 +39473, O39473 +39474, O39474 +39475, O39475 +39476, O39476 +39477, O39477 +39478, O39478 +39479, O39479 +39480, O39480 +39481, O39481 +39482, O39482 +39483, O39483 +39484, O39484 +39485, O39485 +39486, O39486 +39487, O39487 +39488, O39488 +39489, O39489 +39490, O39490 +39491, O39491 +39492, O39492 +39493, O39493 +39494, O39494 +39495, O39495 +39496, O39496 +39497, O39497 +39498, O39498 +39499, O39499 +39500, O39500 +39501, O39501 +39502, O39502 +39503, O39503 +39504, O39504 +39505, O39505 +39506, O39506 +39507, O39507 +39508, O39508 +39509, O39509 +39510, O39510 +39511, O39511 +39512, O39512 +39513, O39513 +39514, O39514 +39515, O39515 +39516, O39516 +39517, O39517 +39518, O39518 +39519, O39519 +39520, O39520 +39521, O39521 +39522, O39522 +39523, O39523 +39524, O39524 +39525, O39525 +39526, O39526 +39527, O39527 +39528, O39528 +39529, O39529 +39530, O39530 +39531, O39531 +39532, O39532 +39533, O39533 +39534, O39534 +39535, O39535 +39536, O39536 +39537, O39537 +39538, O39538 +39539, O39539 +39540, O39540 +39541, O39541 +39542, O39542 +39543, O39543 +39544, O39544 +39545, O39545 +39546, O39546 +39547, O39547 +39548, O39548 +39549, O39549 +39550, O39550 +39551, O39551 +39552, O39552 +39553, O39553 +39554, O39554 +39555, O39555 +39556, O39556 +39557, O39557 +39558, O39558 +39559, O39559 +39560, O39560 +39561, O39561 +39562, O39562 +39563, O39563 +39564, O39564 +39565, O39565 +39566, O39566 +39567, O39567 +39568, O39568 +39569, O39569 +39570, O39570 +39571, O39571 +39572, O39572 +39573, O39573 +39574, O39574 +39575, O39575 +39576, O39576 +39577, O39577 +39578, O39578 +39579, O39579 +39580, O39580 +39581, O39581 +39582, O39582 +39583, O39583 +39584, O39584 +39585, O39585 +39586, O39586 +39587, O39587 +39588, O39588 +39589, O39589 +39590, O39590 +39591, O39591 +39592, O39592 +39593, O39593 +39594, O39594 +39595, O39595 +39596, O39596 +39597, O39597 +39598, O39598 +39599, O39599 +39600, O39600 +39601, O39601 +39602, O39602 +39603, O39603 +39604, O39604 +39605, O39605 +39606, O39606 +39607, O39607 +39608, O39608 +39609, O39609 +39610, O39610 +39611, O39611 +39612, O39612 +39613, O39613 +39614, O39614 +39615, O39615 +39616, O39616 +39617, O39617 +39618, O39618 +39619, O39619 +39620, O39620 +39621, O39621 +39622, O39622 +39623, O39623 +39624, O39624 +39625, O39625 +39626, O39626 +39627, O39627 +39628, O39628 +39629, O39629 +39630, O39630 +39631, O39631 +39632, O39632 +39633, O39633 +39634, O39634 +39635, O39635 +39636, O39636 +39637, O39637 +39638, O39638 +39639, O39639 +39640, O39640 +39641, O39641 +39642, O39642 +39643, O39643 +39644, O39644 +39645, O39645 +39646, O39646 +39647, O39647 +39648, O39648 +39649, O39649 +39650, O39650 +39651, O39651 +39652, O39652 +39653, O39653 +39654, O39654 +39655, O39655 +39656, O39656 +39657, O39657 +39658, O39658 +39659, O39659 +39660, O39660 +39661, O39661 +39662, O39662 +39663, O39663 +39664, O39664 +39665, O39665 +39666, O39666 +39667, O39667 +39668, O39668 +39669, O39669 +39670, O39670 +39671, O39671 +39672, O39672 +39673, O39673 +39674, O39674 +39675, O39675 +39676, O39676 +39677, O39677 +39678, O39678 +39679, O39679 +39680, O39680 +39681, O39681 +39682, O39682 +39683, O39683 +39684, O39684 +39685, O39685 +39686, O39686 +39687, O39687 +39688, O39688 +39689, O39689 +39690, O39690 +39691, O39691 +39692, O39692 +39693, O39693 +39694, O39694 +39695, O39695 +39696, O39696 +39697, O39697 +39698, O39698 +39699, O39699 +39700, O39700 +39701, O39701 +39702, O39702 +39703, O39703 +39704, O39704 +39705, O39705 +39706, O39706 +39707, O39707 +39708, O39708 +39709, O39709 +39710, O39710 +39711, O39711 +39712, O39712 +39713, O39713 +39714, O39714 +39715, O39715 +39716, O39716 +39717, O39717 +39718, O39718 +39719, O39719 +39720, O39720 +39721, O39721 +39722, O39722 +39723, O39723 +39724, O39724 +39725, O39725 +39726, O39726 +39727, O39727 +39728, O39728 +39729, O39729 +39730, O39730 +39731, O39731 +39732, O39732 +39733, O39733 +39734, O39734 +39735, O39735 +39736, O39736 +39737, O39737 +39738, O39738 +39739, O39739 +39740, O39740 +39741, O39741 +39742, O39742 +39743, O39743 +39744, O39744 +39745, O39745 +39746, O39746 +39747, O39747 +39748, O39748 +39749, O39749 +39750, O39750 +39751, O39751 +39752, O39752 +39753, O39753 +39754, O39754 +39755, O39755 +39756, O39756 +39757, O39757 +39758, O39758 +39759, O39759 +39760, O39760 +39761, O39761 +39762, O39762 +39763, O39763 +39764, O39764 +39765, O39765 +39766, O39766 +39767, O39767 +39768, O39768 +39769, O39769 +39770, O39770 +39771, O39771 +39772, O39772 +39773, O39773 +39774, O39774 +39775, O39775 +39776, O39776 +39777, O39777 +39778, O39778 +39779, O39779 +39780, O39780 +39781, O39781 +39782, O39782 +39783, O39783 +39784, O39784 +39785, O39785 +39786, O39786 +39787, O39787 +39788, O39788 +39789, O39789 +39790, O39790 +39791, O39791 +39792, O39792 +39793, O39793 +39794, O39794 +39795, O39795 +39796, O39796 +39797, O39797 +39798, O39798 +39799, O39799 +39800, O39800 +39801, O39801 +39802, O39802 +39803, O39803 +39804, O39804 +39805, O39805 +39806, O39806 +39807, O39807 +39808, O39808 +39809, O39809 +39810, O39810 +39811, O39811 +39812, O39812 +39813, O39813 +39814, O39814 +39815, O39815 +39816, O39816 +39817, O39817 +39818, O39818 +39819, O39819 +39820, O39820 +39821, O39821 +39822, O39822 +39823, O39823 +39824, O39824 +39825, O39825 +39826, O39826 +39827, O39827 +39828, O39828 +39829, O39829 +39830, O39830 +39831, O39831 +39832, O39832 +39833, O39833 +39834, O39834 +39835, O39835 +39836, O39836 +39837, O39837 +39838, O39838 +39839, O39839 +39840, O39840 +39841, O39841 +39842, O39842 +39843, O39843 +39844, O39844 +39845, O39845 +39846, O39846 +39847, O39847 +39848, O39848 +39849, O39849 +39850, O39850 +39851, O39851 +39852, O39852 +39853, O39853 +39854, O39854 +39855, O39855 +39856, O39856 +39857, O39857 +39858, O39858 +39859, O39859 +39860, O39860 +39861, O39861 +39862, O39862 +39863, O39863 +39864, O39864 +39865, O39865 +39866, O39866 +39867, O39867 +39868, O39868 +39869, O39869 +39870, O39870 +39871, O39871 +39872, O39872 +39873, O39873 +39874, O39874 +39875, O39875 +39876, O39876 +39877, O39877 +39878, O39878 +39879, O39879 +39880, O39880 +39881, O39881 +39882, O39882 +39883, O39883 +39884, O39884 +39885, O39885 +39886, O39886 +39887, O39887 +39888, O39888 +39889, O39889 +39890, O39890 +39891, O39891 +39892, O39892 +39893, O39893 +39894, O39894 +39895, O39895 +39896, O39896 +39897, O39897 +39898, O39898 +39899, O39899 +39900, O39900 +39901, O39901 +39902, O39902 +39903, O39903 +39904, O39904 +39905, O39905 +39906, O39906 +39907, O39907 +39908, O39908 +39909, O39909 +39910, O39910 +39911, O39911 +39912, O39912 +39913, O39913 +39914, O39914 +39915, O39915 +39916, O39916 +39917, O39917 +39918, O39918 +39919, O39919 +39920, O39920 +39921, O39921 +39922, O39922 +39923, O39923 +39924, O39924 +39925, O39925 +39926, O39926 +39927, O39927 +39928, O39928 +39929, O39929 +39930, O39930 +39931, O39931 +39932, O39932 +39933, O39933 +39934, O39934 +39935, O39935 +39936, O39936 +39937, O39937 +39938, O39938 +39939, O39939 +39940, O39940 +39941, O39941 +39942, O39942 +39943, O39943 +39944, O39944 +39945, O39945 +39946, O39946 +39947, O39947 +39948, O39948 +39949, O39949 +39950, O39950 +39951, O39951 +39952, O39952 +39953, O39953 +39954, O39954 +39955, O39955 +39956, O39956 +39957, O39957 +39958, O39958 +39959, O39959 +39960, O39960 +39961, O39961 +39962, O39962 +39963, O39963 +39964, O39964 +39965, O39965 +39966, O39966 +39967, O39967 +39968, O39968 +39969, O39969 +39970, O39970 +39971, O39971 +39972, O39972 +39973, O39973 +39974, O39974 +39975, O39975 +39976, O39976 +39977, O39977 +39978, O39978 +39979, O39979 +39980, O39980 +39981, O39981 +39982, O39982 +39983, O39983 +39984, O39984 +39985, O39985 +39986, O39986 +39987, O39987 +39988, O39988 +39989, O39989 +39990, O39990 +39991, O39991 +39992, O39992 +39993, O39993 +39994, O39994 +39995, O39995 +39996, O39996 +39997, O39997 +39998, O39998 +39999, O39999 +40000, O40000 +40001, O40001 +40002, O40002 +40003, O40003 +40004, O40004 +40005, O40005 +40006, O40006 +40007, O40007 +40008, O40008 +40009, O40009 +40010, O40010 +40011, O40011 +40012, O40012 +40013, O40013 +40014, O40014 +40015, O40015 +40016, O40016 +40017, O40017 +40018, O40018 +40019, O40019 +40020, O40020 +40021, O40021 +40022, O40022 +40023, O40023 +40024, O40024 +40025, O40025 +40026, O40026 +40027, O40027 +40028, O40028 +40029, O40029 +40030, O40030 +40031, O40031 +40032, O40032 +40033, O40033 +40034, O40034 +40035, O40035 +40036, O40036 +40037, O40037 +40038, O40038 +40039, O40039 +40040, O40040 +40041, O40041 +40042, O40042 +40043, O40043 +40044, O40044 +40045, O40045 +40046, O40046 +40047, O40047 +40048, O40048 +40049, O40049 +40050, O40050 +40051, O40051 +40052, O40052 +40053, O40053 +40054, O40054 +40055, O40055 +40056, O40056 +40057, O40057 +40058, O40058 +40059, O40059 +40060, O40060 +40061, O40061 +40062, O40062 +40063, O40063 +40064, O40064 +40065, O40065 +40066, O40066 +40067, O40067 +40068, O40068 +40069, O40069 +40070, O40070 +40071, O40071 +40072, O40072 +40073, O40073 +40074, O40074 +40075, O40075 +40076, O40076 +40077, O40077 +40078, O40078 +40079, O40079 +40080, O40080 +40081, O40081 +40082, O40082 +40083, O40083 +40084, O40084 +40085, O40085 +40086, O40086 +40087, O40087 +40088, O40088 +40089, O40089 +40090, O40090 +40091, O40091 +40092, O40092 +40093, O40093 +40094, O40094 +40095, O40095 +40096, O40096 +40097, O40097 +40098, O40098 +40099, O40099 +40100, O40100 +40101, O40101 +40102, O40102 +40103, O40103 +40104, O40104 +40105, O40105 +40106, O40106 +40107, O40107 +40108, O40108 +40109, O40109 +40110, O40110 +40111, O40111 +40112, O40112 +40113, O40113 +40114, O40114 +40115, O40115 +40116, O40116 +40117, O40117 +40118, O40118 +40119, O40119 +40120, O40120 +40121, O40121 +40122, O40122 +40123, O40123 +40124, O40124 +40125, O40125 +40126, O40126 +40127, O40127 +40128, O40128 +40129, O40129 +40130, O40130 +40131, O40131 +40132, O40132 +40133, O40133 +40134, O40134 +40135, O40135 +40136, O40136 +40137, O40137 +40138, O40138 +40139, O40139 +40140, O40140 +40141, O40141 +40142, O40142 +40143, O40143 +40144, O40144 +40145, O40145 +40146, O40146 +40147, O40147 +40148, O40148 +40149, O40149 +40150, O40150 +40151, O40151 +40152, O40152 +40153, O40153 +40154, O40154 +40155, O40155 +40156, O40156 +40157, O40157 +40158, O40158 +40159, O40159 +40160, O40160 +40161, O40161 +40162, O40162 +40163, O40163 +40164, O40164 +40165, O40165 +40166, O40166 +40167, O40167 +40168, O40168 +40169, O40169 +40170, O40170 +40171, O40171 +40172, O40172 +40173, O40173 +40174, O40174 +40175, O40175 +40176, O40176 +40177, O40177 +40178, O40178 +40179, O40179 +40180, O40180 +40181, O40181 +40182, O40182 +40183, O40183 +40184, O40184 +40185, O40185 +40186, O40186 +40187, O40187 +40188, O40188 +40189, O40189 +40190, O40190 +40191, O40191 +40192, O40192 +40193, O40193 +40194, O40194 +40195, O40195 +40196, O40196 +40197, O40197 +40198, O40198 +40199, O40199 +40200, O40200 +40201, O40201 +40202, O40202 +40203, O40203 +40204, O40204 +40205, O40205 +40206, O40206 +40207, O40207 +40208, O40208 +40209, O40209 +40210, O40210 +40211, O40211 +40212, O40212 +40213, O40213 +40214, O40214 +40215, O40215 +40216, O40216 +40217, O40217 +40218, O40218 +40219, O40219 +40220, O40220 +40221, O40221 +40222, O40222 +40223, O40223 +40224, O40224 +40225, O40225 +40226, O40226 +40227, O40227 +40228, O40228 +40229, O40229 +40230, O40230 +40231, O40231 +40232, O40232 +40233, O40233 +40234, O40234 +40235, O40235 +40236, O40236 +40237, O40237 +40238, O40238 +40239, O40239 +40240, O40240 +40241, O40241 +40242, O40242 +40243, O40243 +40244, O40244 +40245, O40245 +40246, O40246 +40247, O40247 +40248, O40248 +40249, O40249 +40250, O40250 +40251, O40251 +40252, O40252 +40253, O40253 +40254, O40254 +40255, O40255 +40256, O40256 +40257, O40257 +40258, O40258 +40259, O40259 +40260, O40260 +40261, O40261 +40262, O40262 +40263, O40263 +40264, O40264 +40265, O40265 +40266, O40266 +40267, O40267 +40268, O40268 +40269, O40269 +40270, O40270 +40271, O40271 +40272, O40272 +40273, O40273 +40274, O40274 +40275, O40275 +40276, O40276 +40277, O40277 +40278, O40278 +40279, O40279 +40280, O40280 +40281, O40281 +40282, O40282 +40283, O40283 +40284, O40284 +40285, O40285 +40286, O40286 +40287, O40287 +40288, O40288 +40289, O40289 +40290, O40290 +40291, O40291 +40292, O40292 +40293, O40293 +40294, O40294 +40295, O40295 +40296, O40296 +40297, O40297 +40298, O40298 +40299, O40299 +40300, O40300 +40301, O40301 +40302, O40302 +40303, O40303 +40304, O40304 +40305, O40305 +40306, O40306 +40307, O40307 +40308, O40308 +40309, O40309 +40310, O40310 +40311, O40311 +40312, O40312 +40313, O40313 +40314, O40314 +40315, O40315 +40316, O40316 +40317, O40317 +40318, O40318 +40319, O40319 +40320, O40320 +40321, O40321 +40322, O40322 +40323, O40323 +40324, O40324 +40325, O40325 +40326, O40326 +40327, O40327 +40328, O40328 +40329, O40329 +40330, O40330 +40331, O40331 +40332, O40332 +40333, O40333 +40334, O40334 +40335, O40335 +40336, O40336 +40337, O40337 +40338, O40338 +40339, O40339 +40340, O40340 +40341, O40341 +40342, O40342 +40343, O40343 +40344, O40344 +40345, O40345 +40346, O40346 +40347, O40347 +40348, O40348 +40349, O40349 +40350, O40350 +40351, O40351 +40352, O40352 +40353, O40353 +40354, O40354 +40355, O40355 +40356, O40356 +40357, O40357 +40358, O40358 +40359, O40359 +40360, O40360 +40361, O40361 +40362, O40362 +40363, O40363 +40364, O40364 +40365, O40365 +40366, O40366 +40367, O40367 +40368, O40368 +40369, O40369 +40370, O40370 +40371, O40371 +40372, O40372 +40373, O40373 +40374, O40374 +40375, O40375 +40376, O40376 +40377, O40377 +40378, O40378 +40379, O40379 +40380, O40380 +40381, O40381 +40382, O40382 +40383, O40383 +40384, O40384 +40385, O40385 +40386, O40386 +40387, O40387 +40388, O40388 +40389, O40389 +40390, O40390 +40391, O40391 +40392, O40392 +40393, O40393 +40394, O40394 +40395, O40395 +40396, O40396 +40397, O40397 +40398, O40398 +40399, O40399 +40400, O40400 +40401, O40401 +40402, O40402 +40403, O40403 +40404, O40404 +40405, O40405 +40406, O40406 +40407, O40407 +40408, O40408 +40409, O40409 +40410, O40410 +40411, O40411 +40412, O40412 +40413, O40413 +40414, O40414 +40415, O40415 +40416, O40416 +40417, O40417 +40418, O40418 +40419, O40419 +40420, O40420 +40421, O40421 +40422, O40422 +40423, O40423 +40424, O40424 +40425, O40425 +40426, O40426 +40427, O40427 +40428, O40428 +40429, O40429 +40430, O40430 +40431, O40431 +40432, O40432 +40433, O40433 +40434, O40434 +40435, O40435 +40436, O40436 +40437, O40437 +40438, O40438 +40439, O40439 +40440, O40440 +40441, O40441 +40442, O40442 +40443, O40443 +40444, O40444 +40445, O40445 +40446, O40446 +40447, O40447 +40448, O40448 +40449, O40449 +40450, O40450 +40451, O40451 +40452, O40452 +40453, O40453 +40454, O40454 +40455, O40455 +40456, O40456 +40457, O40457 +40458, O40458 +40459, O40459 +40460, O40460 +40461, O40461 +40462, O40462 +40463, O40463 +40464, O40464 +40465, O40465 +40466, O40466 +40467, O40467 +40468, O40468 +40469, O40469 +40470, O40470 +40471, O40471 +40472, O40472 +40473, O40473 +40474, O40474 +40475, O40475 +40476, O40476 +40477, O40477 +40478, O40478 +40479, O40479 +40480, O40480 +40481, O40481 +40482, O40482 +40483, O40483 +40484, O40484 +40485, O40485 +40486, O40486 +40487, O40487 +40488, O40488 +40489, O40489 +40490, O40490 +40491, O40491 +40492, O40492 +40493, O40493 +40494, O40494 +40495, O40495 +40496, O40496 +40497, O40497 +40498, O40498 +40499, O40499 +40500, O40500 +40501, O40501 +40502, O40502 +40503, O40503 +40504, O40504 +40505, O40505 +40506, O40506 +40507, O40507 +40508, O40508 +40509, O40509 +40510, O40510 +40511, O40511 +40512, O40512 +40513, O40513 +40514, O40514 +40515, O40515 +40516, O40516 +40517, O40517 +40518, O40518 +40519, O40519 +40520, O40520 +40521, O40521 +40522, O40522 +40523, O40523 +40524, O40524 +40525, O40525 +40526, O40526 +40527, O40527 +40528, O40528 +40529, O40529 +40530, O40530 +40531, O40531 +40532, O40532 +40533, O40533 +40534, O40534 +40535, O40535 +40536, O40536 +40537, O40537 +40538, O40538 +40539, O40539 +40540, O40540 +40541, O40541 +40542, O40542 +40543, O40543 +40544, O40544 +40545, O40545 +40546, O40546 +40547, O40547 +40548, O40548 +40549, O40549 +40550, O40550 +40551, O40551 +40552, O40552 +40553, O40553 +40554, O40554 +40555, O40555 +40556, O40556 +40557, O40557 +40558, O40558 +40559, O40559 +40560, O40560 +40561, O40561 +40562, O40562 +40563, O40563 +40564, O40564 +40565, O40565 +40566, O40566 +40567, O40567 +40568, O40568 +40569, O40569 +40570, O40570 +40571, O40571 +40572, O40572 +40573, O40573 +40574, O40574 +40575, O40575 +40576, O40576 +40577, O40577 +40578, O40578 +40579, O40579 +40580, O40580 +40581, O40581 +40582, O40582 +40583, O40583 +40584, O40584 +40585, O40585 +40586, O40586 +40587, O40587 +40588, O40588 +40589, O40589 +40590, O40590 +40591, O40591 +40592, O40592 +40593, O40593 +40594, O40594 +40595, O40595 +40596, O40596 +40597, O40597 +40598, O40598 +40599, O40599 +40600, O40600 +40601, O40601 +40602, O40602 +40603, O40603 +40604, O40604 +40605, O40605 +40606, O40606 +40607, O40607 +40608, O40608 +40609, O40609 +40610, O40610 +40611, O40611 +40612, O40612 +40613, O40613 +40614, O40614 +40615, O40615 +40616, O40616 +40617, O40617 +40618, O40618 +40619, O40619 +40620, O40620 +40621, O40621 +40622, O40622 +40623, O40623 +40624, O40624 +40625, O40625 +40626, O40626 +40627, O40627 +40628, O40628 +40629, O40629 +40630, O40630 +40631, O40631 +40632, O40632 +40633, O40633 +40634, O40634 +40635, O40635 +40636, O40636 +40637, O40637 +40638, O40638 +40639, O40639 +40640, O40640 +40641, O40641 +40642, O40642 +40643, O40643 +40644, O40644 +40645, O40645 +40646, O40646 +40647, O40647 +40648, O40648 +40649, O40649 +40650, O40650 +40651, O40651 +40652, O40652 +40653, O40653 +40654, O40654 +40655, O40655 +40656, O40656 +40657, O40657 +40658, O40658 +40659, O40659 +40660, O40660 +40661, O40661 +40662, O40662 +40663, O40663 +40664, O40664 +40665, O40665 +40666, O40666 +40667, O40667 +40668, O40668 +40669, O40669 +40670, O40670 +40671, O40671 +40672, O40672 +40673, O40673 +40674, O40674 +40675, O40675 +40676, O40676 +40677, O40677 +40678, O40678 +40679, O40679 +40680, O40680 +40681, O40681 +40682, O40682 +40683, O40683 +40684, O40684 +40685, O40685 +40686, O40686 +40687, O40687 +40688, O40688 +40689, O40689 +40690, O40690 +40691, O40691 +40692, O40692 +40693, O40693 +40694, O40694 +40695, O40695 +40696, O40696 +40697, O40697 +40698, O40698 +40699, O40699 +40700, O40700 +40701, O40701 +40702, O40702 +40703, O40703 +40704, O40704 +40705, O40705 +40706, O40706 +40707, O40707 +40708, O40708 +40709, O40709 +40710, O40710 +40711, O40711 +40712, O40712 +40713, O40713 +40714, O40714 +40715, O40715 +40716, O40716 +40717, O40717 +40718, O40718 +40719, O40719 +40720, O40720 +40721, O40721 +40722, O40722 +40723, O40723 +40724, O40724 +40725, O40725 +40726, O40726 +40727, O40727 +40728, O40728 +40729, O40729 +40730, O40730 +40731, O40731 +40732, O40732 +40733, O40733 +40734, O40734 +40735, O40735 +40736, O40736 +40737, O40737 +40738, O40738 +40739, O40739 +40740, O40740 +40741, O40741 +40742, O40742 +40743, O40743 +40744, O40744 +40745, O40745 +40746, O40746 +40747, O40747 +40748, O40748 +40749, O40749 +40750, O40750 +40751, O40751 +40752, O40752 +40753, O40753 +40754, O40754 +40755, O40755 +40756, O40756 +40757, O40757 +40758, O40758 +40759, O40759 +40760, O40760 +40761, O40761 +40762, O40762 +40763, O40763 +40764, O40764 +40765, O40765 +40766, O40766 +40767, O40767 +40768, O40768 +40769, O40769 +40770, O40770 +40771, O40771 +40772, O40772 +40773, O40773 +40774, O40774 +40775, O40775 +40776, O40776 +40777, O40777 +40778, O40778 +40779, O40779 +40780, O40780 +40781, O40781 +40782, O40782 +40783, O40783 +40784, O40784 +40785, O40785 +40786, O40786 +40787, O40787 +40788, O40788 +40789, O40789 +40790, O40790 +40791, O40791 +40792, O40792 +40793, O40793 +40794, O40794 +40795, O40795 +40796, O40796 +40797, O40797 +40798, O40798 +40799, O40799 +40800, O40800 +40801, O40801 +40802, O40802 +40803, O40803 +40804, O40804 +40805, O40805 +40806, O40806 +40807, O40807 +40808, O40808 +40809, O40809 +40810, O40810 +40811, O40811 +40812, O40812 +40813, O40813 +40814, O40814 +40815, O40815 +40816, O40816 +40817, O40817 +40818, O40818 +40819, O40819 +40820, O40820 +40821, O40821 +40822, O40822 +40823, O40823 +40824, O40824 +40825, O40825 +40826, O40826 +40827, O40827 +40828, O40828 +40829, O40829 +40830, O40830 +40831, O40831 +40832, O40832 +40833, O40833 +40834, O40834 +40835, O40835 +40836, O40836 +40837, O40837 +40838, O40838 +40839, O40839 +40840, O40840 +40841, O40841 +40842, O40842 +40843, O40843 +40844, O40844 +40845, O40845 +40846, O40846 +40847, O40847 +40848, O40848 +40849, O40849 +40850, O40850 +40851, O40851 +40852, O40852 +40853, O40853 +40854, O40854 +40855, O40855 +40856, O40856 +40857, O40857 +40858, O40858 +40859, O40859 +40860, O40860 +40861, O40861 +40862, O40862 +40863, O40863 +40864, O40864 +40865, O40865 +40866, O40866 +40867, O40867 +40868, O40868 +40869, O40869 +40870, O40870 +40871, O40871 +40872, O40872 +40873, O40873 +40874, O40874 +40875, O40875 +40876, O40876 +40877, O40877 +40878, O40878 +40879, O40879 +40880, O40880 +40881, O40881 +40882, O40882 +40883, O40883 +40884, O40884 +40885, O40885 +40886, O40886 +40887, O40887 +40888, O40888 +40889, O40889 +40890, O40890 +40891, O40891 +40892, O40892 +40893, O40893 +40894, O40894 +40895, O40895 +40896, O40896 +40897, O40897 +40898, O40898 +40899, O40899 +40900, O40900 +40901, O40901 +40902, O40902 +40903, O40903 +40904, O40904 +40905, O40905 +40906, O40906 +40907, O40907 +40908, O40908 +40909, O40909 +40910, O40910 +40911, O40911 +40912, O40912 +40913, O40913 +40914, O40914 +40915, O40915 +40916, O40916 +40917, O40917 +40918, O40918 +40919, O40919 +40920, O40920 +40921, O40921 +40922, O40922 +40923, O40923 +40924, O40924 +40925, O40925 +40926, O40926 +40927, O40927 +40928, O40928 +40929, O40929 +40930, O40930 +40931, O40931 +40932, O40932 +40933, O40933 +40934, O40934 +40935, O40935 +40936, O40936 +40937, O40937 +40938, O40938 +40939, O40939 +40940, O40940 +40941, O40941 +40942, O40942 +40943, O40943 +40944, O40944 +40945, O40945 +40946, O40946 +40947, O40947 +40948, O40948 +40949, O40949 +40950, O40950 +40951, O40951 +40952, O40952 +40953, O40953 +40954, O40954 +40955, O40955 +40956, O40956 +40957, O40957 +40958, O40958 +40959, O40959 +40960, O40960 +40961, O40961 +40962, O40962 +40963, O40963 +40964, O40964 +40965, O40965 +40966, O40966 +40967, O40967 +40968, O40968 +40969, O40969 +40970, O40970 +40971, O40971 +40972, O40972 +40973, O40973 +40974, O40974 +40975, O40975 +40976, O40976 +40977, O40977 +40978, O40978 +40979, O40979 +40980, O40980 +40981, O40981 +40982, O40982 +40983, O40983 +40984, O40984 +40985, O40985 +40986, O40986 +40987, O40987 +40988, O40988 +40989, O40989 +40990, O40990 +40991, O40991 +40992, O40992 +40993, O40993 +40994, O40994 +40995, O40995 +40996, O40996 +40997, O40997 +40998, O40998 +40999, O40999 +41000, O41000 +41001, O41001 +41002, O41002 +41003, O41003 +41004, O41004 +41005, O41005 +41006, O41006 +41007, O41007 +41008, O41008 +41009, O41009 +41010, O41010 +41011, O41011 +41012, O41012 +41013, O41013 +41014, O41014 +41015, O41015 +41016, O41016 +41017, O41017 +41018, O41018 +41019, O41019 +41020, O41020 +41021, O41021 +41022, O41022 +41023, O41023 +41024, O41024 +41025, O41025 +41026, O41026 +41027, O41027 +41028, O41028 +41029, O41029 +41030, O41030 +41031, O41031 +41032, O41032 +41033, O41033 +41034, O41034 +41035, O41035 +41036, O41036 +41037, O41037 +41038, O41038 +41039, O41039 +41040, O41040 +41041, O41041 +41042, O41042 +41043, O41043 +41044, O41044 +41045, O41045 +41046, O41046 +41047, O41047 +41048, O41048 +41049, O41049 +41050, O41050 +41051, O41051 +41052, O41052 +41053, O41053 +41054, O41054 +41055, O41055 +41056, O41056 +41057, O41057 +41058, O41058 +41059, O41059 +41060, O41060 +41061, O41061 +41062, O41062 +41063, O41063 +41064, O41064 +41065, O41065 +41066, O41066 +41067, O41067 +41068, O41068 +41069, O41069 +41070, O41070 +41071, O41071 +41072, O41072 +41073, O41073 +41074, O41074 +41075, O41075 +41076, O41076 +41077, O41077 +41078, O41078 +41079, O41079 +41080, O41080 +41081, O41081 +41082, O41082 +41083, O41083 +41084, O41084 +41085, O41085 +41086, O41086 +41087, O41087 +41088, O41088 +41089, O41089 +41090, O41090 +41091, O41091 +41092, O41092 +41093, O41093 +41094, O41094 +41095, O41095 +41096, O41096 +41097, O41097 +41098, O41098 +41099, O41099 +41100, O41100 +41101, O41101 +41102, O41102 +41103, O41103 +41104, O41104 +41105, O41105 +41106, O41106 +41107, O41107 +41108, O41108 +41109, O41109 +41110, O41110 +41111, O41111 +41112, O41112 +41113, O41113 +41114, O41114 +41115, O41115 +41116, O41116 +41117, O41117 +41118, O41118 +41119, O41119 +41120, O41120 +41121, O41121 +41122, O41122 +41123, O41123 +41124, O41124 +41125, O41125 +41126, O41126 +41127, O41127 +41128, O41128 +41129, O41129 +41130, O41130 +41131, O41131 +41132, O41132 +41133, O41133 +41134, O41134 +41135, O41135 +41136, O41136 +41137, O41137 +41138, O41138 +41139, O41139 +41140, O41140 +41141, O41141 +41142, O41142 +41143, O41143 +41144, O41144 +41145, O41145 +41146, O41146 +41147, O41147 +41148, O41148 +41149, O41149 +41150, O41150 +41151, O41151 +41152, O41152 +41153, O41153 +41154, O41154 +41155, O41155 +41156, O41156 +41157, O41157 +41158, O41158 +41159, O41159 +41160, O41160 +41161, O41161 +41162, O41162 +41163, O41163 +41164, O41164 +41165, O41165 +41166, O41166 +41167, O41167 +41168, O41168 +41169, O41169 +41170, O41170 +41171, O41171 +41172, O41172 +41173, O41173 +41174, O41174 +41175, O41175 +41176, O41176 +41177, O41177 +41178, O41178 +41179, O41179 +41180, O41180 +41181, O41181 +41182, O41182 +41183, O41183 +41184, O41184 +41185, O41185 +41186, O41186 +41187, O41187 +41188, O41188 +41189, O41189 +41190, O41190 +41191, O41191 +41192, O41192 +41193, O41193 +41194, O41194 +41195, O41195 +41196, O41196 +41197, O41197 +41198, O41198 +41199, O41199 +41200, O41200 +41201, O41201 +41202, O41202 +41203, O41203 +41204, O41204 +41205, O41205 +41206, O41206 +41207, O41207 +41208, O41208 +41209, O41209 +41210, O41210 +41211, O41211 +41212, O41212 +41213, O41213 +41214, O41214 +41215, O41215 +41216, O41216 +41217, O41217 +41218, O41218 +41219, O41219 +41220, O41220 +41221, O41221 +41222, O41222 +41223, O41223 +41224, O41224 +41225, O41225 +41226, O41226 +41227, O41227 +41228, O41228 +41229, O41229 +41230, O41230 +41231, O41231 +41232, O41232 +41233, O41233 +41234, O41234 +41235, O41235 +41236, O41236 +41237, O41237 +41238, O41238 +41239, O41239 +41240, O41240 +41241, O41241 +41242, O41242 +41243, O41243 +41244, O41244 +41245, O41245 +41246, O41246 +41247, O41247 +41248, O41248 +41249, O41249 +41250, O41250 +41251, O41251 +41252, O41252 +41253, O41253 +41254, O41254 +41255, O41255 +41256, O41256 +41257, O41257 +41258, O41258 +41259, O41259 +41260, O41260 +41261, O41261 +41262, O41262 +41263, O41263 +41264, O41264 +41265, O41265 +41266, O41266 +41267, O41267 +41268, O41268 +41269, O41269 +41270, O41270 +41271, O41271 +41272, O41272 +41273, O41273 +41274, O41274 +41275, O41275 +41276, O41276 +41277, O41277 +41278, O41278 +41279, O41279 +41280, O41280 +41281, O41281 +41282, O41282 +41283, O41283 +41284, O41284 +41285, O41285 +41286, O41286 +41287, O41287 +41288, O41288 +41289, O41289 +41290, O41290 +41291, O41291 +41292, O41292 +41293, O41293 +41294, O41294 +41295, O41295 +41296, O41296 +41297, O41297 +41298, O41298 +41299, O41299 +41300, O41300 +41301, O41301 +41302, O41302 +41303, O41303 +41304, O41304 +41305, O41305 +41306, O41306 +41307, O41307 +41308, O41308 +41309, O41309 +41310, O41310 +41311, O41311 +41312, O41312 +41313, O41313 +41314, O41314 +41315, O41315 +41316, O41316 +41317, O41317 +41318, O41318 +41319, O41319 +41320, O41320 +41321, O41321 +41322, O41322 +41323, O41323 +41324, O41324 +41325, O41325 +41326, O41326 +41327, O41327 +41328, O41328 +41329, O41329 +41330, O41330 +41331, O41331 +41332, O41332 +41333, O41333 +41334, O41334 +41335, O41335 +41336, O41336 +41337, O41337 +41338, O41338 +41339, O41339 +41340, O41340 +41341, O41341 +41342, O41342 +41343, O41343 +41344, O41344 +41345, O41345 +41346, O41346 +41347, O41347 +41348, O41348 +41349, O41349 +41350, O41350 +41351, O41351 +41352, O41352 +41353, O41353 +41354, O41354 +41355, O41355 +41356, O41356 +41357, O41357 +41358, O41358 +41359, O41359 +41360, O41360 +41361, O41361 +41362, O41362 +41363, O41363 +41364, O41364 +41365, O41365 +41366, O41366 +41367, O41367 +41368, O41368 +41369, O41369 +41370, O41370 +41371, O41371 +41372, O41372 +41373, O41373 +41374, O41374 +41375, O41375 +41376, O41376 +41377, O41377 +41378, O41378 +41379, O41379 +41380, O41380 +41381, O41381 +41382, O41382 +41383, O41383 +41384, O41384 +41385, O41385 +41386, O41386 +41387, O41387 +41388, O41388 +41389, O41389 +41390, O41390 +41391, O41391 +41392, O41392 +41393, O41393 +41394, O41394 +41395, O41395 +41396, O41396 +41397, O41397 +41398, O41398 +41399, O41399 +41400, O41400 +41401, O41401 +41402, O41402 +41403, O41403 +41404, O41404 +41405, O41405 +41406, O41406 +41407, O41407 +41408, O41408 +41409, O41409 +41410, O41410 +41411, O41411 +41412, O41412 +41413, O41413 +41414, O41414 +41415, O41415 +41416, O41416 +41417, O41417 +41418, O41418 +41419, O41419 +41420, O41420 +41421, O41421 +41422, O41422 +41423, O41423 +41424, O41424 +41425, O41425 +41426, O41426 +41427, O41427 +41428, O41428 +41429, O41429 +41430, O41430 +41431, O41431 +41432, O41432 +41433, O41433 +41434, O41434 +41435, O41435 +41436, O41436 +41437, O41437 +41438, O41438 +41439, O41439 +41440, O41440 +41441, O41441 +41442, O41442 +41443, O41443 +41444, O41444 +41445, O41445 +41446, O41446 +41447, O41447 +41448, O41448 +41449, O41449 +41450, O41450 +41451, O41451 +41452, O41452 +41453, O41453 +41454, O41454 +41455, O41455 +41456, O41456 +41457, O41457 +41458, O41458 +41459, O41459 +41460, O41460 +41461, O41461 +41462, O41462 +41463, O41463 +41464, O41464 +41465, O41465 +41466, O41466 +41467, O41467 +41468, O41468 +41469, O41469 +41470, O41470 +41471, O41471 +41472, O41472 +41473, O41473 +41474, O41474 +41475, O41475 +41476, O41476 +41477, O41477 +41478, O41478 +41479, O41479 +41480, O41480 +41481, O41481 +41482, O41482 +41483, O41483 +41484, O41484 +41485, O41485 +41486, O41486 +41487, O41487 +41488, O41488 +41489, O41489 +41490, O41490 +41491, O41491 +41492, O41492 +41493, O41493 +41494, O41494 +41495, O41495 +41496, O41496 +41497, O41497 +41498, O41498 +41499, O41499 +41500, O41500 +41501, O41501 +41502, O41502 +41503, O41503 +41504, O41504 +41505, O41505 +41506, O41506 +41507, O41507 +41508, O41508 +41509, O41509 +41510, O41510 +41511, O41511 +41512, O41512 +41513, O41513 +41514, O41514 +41515, O41515 +41516, O41516 +41517, O41517 +41518, O41518 +41519, O41519 +41520, O41520 +41521, O41521 +41522, O41522 +41523, O41523 +41524, O41524 +41525, O41525 +41526, O41526 +41527, O41527 +41528, O41528 +41529, O41529 +41530, O41530 +41531, O41531 +41532, O41532 +41533, O41533 +41534, O41534 +41535, O41535 +41536, O41536 +41537, O41537 +41538, O41538 +41539, O41539 +41540, O41540 +41541, O41541 +41542, O41542 +41543, O41543 +41544, O41544 +41545, O41545 +41546, O41546 +41547, O41547 +41548, O41548 +41549, O41549 +41550, O41550 +41551, O41551 +41552, O41552 +41553, O41553 +41554, O41554 +41555, O41555 +41556, O41556 +41557, O41557 +41558, O41558 +41559, O41559 +41560, O41560 +41561, O41561 +41562, O41562 +41563, O41563 +41564, O41564 +41565, O41565 +41566, O41566 +41567, O41567 +41568, O41568 +41569, O41569 +41570, O41570 +41571, O41571 +41572, O41572 +41573, O41573 +41574, O41574 +41575, O41575 +41576, O41576 +41577, O41577 +41578, O41578 +41579, O41579 +41580, O41580 +41581, O41581 +41582, O41582 +41583, O41583 +41584, O41584 +41585, O41585 +41586, O41586 +41587, O41587 +41588, O41588 +41589, O41589 +41590, O41590 +41591, O41591 +41592, O41592 +41593, O41593 +41594, O41594 +41595, O41595 +41596, O41596 +41597, O41597 +41598, O41598 +41599, O41599 +41600, O41600 +41601, O41601 +41602, O41602 +41603, O41603 +41604, O41604 +41605, O41605 +41606, O41606 +41607, O41607 +41608, O41608 +41609, O41609 +41610, O41610 +41611, O41611 +41612, O41612 +41613, O41613 +41614, O41614 +41615, O41615 +41616, O41616 +41617, O41617 +41618, O41618 +41619, O41619 +41620, O41620 +41621, O41621 +41622, O41622 +41623, O41623 +41624, O41624 +41625, O41625 +41626, O41626 +41627, O41627 +41628, O41628 +41629, O41629 +41630, O41630 +41631, O41631 +41632, O41632 +41633, O41633 +41634, O41634 +41635, O41635 +41636, O41636 +41637, O41637 +41638, O41638 +41639, O41639 +41640, O41640 +41641, O41641 +41642, O41642 +41643, O41643 +41644, O41644 +41645, O41645 +41646, O41646 +41647, O41647 +41648, O41648 +41649, O41649 +41650, O41650 +41651, O41651 +41652, O41652 +41653, O41653 +41654, O41654 +41655, O41655 +41656, O41656 +41657, O41657 +41658, O41658 +41659, O41659 +41660, O41660 +41661, O41661 +41662, O41662 +41663, O41663 +41664, O41664 +41665, O41665 +41666, O41666 +41667, O41667 +41668, O41668 +41669, O41669 +41670, O41670 +41671, O41671 +41672, O41672 +41673, O41673 +41674, O41674 +41675, O41675 +41676, O41676 +41677, O41677 +41678, O41678 +41679, O41679 +41680, O41680 +41681, O41681 +41682, O41682 +41683, O41683 +41684, O41684 +41685, O41685 +41686, O41686 +41687, O41687 +41688, O41688 +41689, O41689 +41690, O41690 +41691, O41691 +41692, O41692 +41693, O41693 +41694, O41694 +41695, O41695 +41696, O41696 +41697, O41697 +41698, O41698 +41699, O41699 +41700, O41700 +41701, O41701 +41702, O41702 +41703, O41703 +41704, O41704 +41705, O41705 +41706, O41706 +41707, O41707 +41708, O41708 +41709, O41709 +41710, O41710 +41711, O41711 +41712, O41712 +41713, O41713 +41714, O41714 +41715, O41715 +41716, O41716 +41717, O41717 +41718, O41718 +41719, O41719 +41720, O41720 +41721, O41721 +41722, O41722 +41723, O41723 +41724, O41724 +41725, O41725 +41726, O41726 +41727, O41727 +41728, O41728 +41729, O41729 +41730, O41730 +41731, O41731 +41732, O41732 +41733, O41733 +41734, O41734 +41735, O41735 +41736, O41736 +41737, O41737 +41738, O41738 +41739, O41739 +41740, O41740 +41741, O41741 +41742, O41742 +41743, O41743 +41744, O41744 +41745, O41745 +41746, O41746 +41747, O41747 +41748, O41748 +41749, O41749 +41750, O41750 +41751, O41751 +41752, O41752 +41753, O41753 +41754, O41754 +41755, O41755 +41756, O41756 +41757, O41757 +41758, O41758 +41759, O41759 +41760, O41760 +41761, O41761 +41762, O41762 +41763, O41763 +41764, O41764 +41765, O41765 +41766, O41766 +41767, O41767 +41768, O41768 +41769, O41769 +41770, O41770 +41771, O41771 +41772, O41772 +41773, O41773 +41774, O41774 +41775, O41775 +41776, O41776 +41777, O41777 +41778, O41778 +41779, O41779 +41780, O41780 +41781, O41781 +41782, O41782 +41783, O41783 +41784, O41784 +41785, O41785 +41786, O41786 +41787, O41787 +41788, O41788 +41789, O41789 +41790, O41790 +41791, O41791 +41792, O41792 +41793, O41793 +41794, O41794 +41795, O41795 +41796, O41796 +41797, O41797 +41798, O41798 +41799, O41799 +41800, O41800 +41801, O41801 +41802, O41802 +41803, O41803 +41804, O41804 +41805, O41805 +41806, O41806 +41807, O41807 +41808, O41808 +41809, O41809 +41810, O41810 +41811, O41811 +41812, O41812 +41813, O41813 +41814, O41814 +41815, O41815 +41816, O41816 +41817, O41817 +41818, O41818 +41819, O41819 +41820, O41820 +41821, O41821 +41822, O41822 +41823, O41823 +41824, O41824 +41825, O41825 +41826, O41826 +41827, O41827 +41828, O41828 +41829, O41829 +41830, O41830 +41831, O41831 +41832, O41832 +41833, O41833 +41834, O41834 +41835, O41835 +41836, O41836 +41837, O41837 +41838, O41838 +41839, O41839 +41840, O41840 +41841, O41841 +41842, O41842 +41843, O41843 +41844, O41844 +41845, O41845 +41846, O41846 +41847, O41847 +41848, O41848 +41849, O41849 +41850, O41850 +41851, O41851 +41852, O41852 +41853, O41853 +41854, O41854 +41855, O41855 +41856, O41856 +41857, O41857 +41858, O41858 +41859, O41859 +41860, O41860 +41861, O41861 +41862, O41862 +41863, O41863 +41864, O41864 +41865, O41865 +41866, O41866 +41867, O41867 +41868, O41868 +41869, O41869 +41870, O41870 +41871, O41871 +41872, O41872 +41873, O41873 +41874, O41874 +41875, O41875 +41876, O41876 +41877, O41877 +41878, O41878 +41879, O41879 +41880, O41880 +41881, O41881 +41882, O41882 +41883, O41883 +41884, O41884 +41885, O41885 +41886, O41886 +41887, O41887 +41888, O41888 +41889, O41889 +41890, O41890 +41891, O41891 +41892, O41892 +41893, O41893 +41894, O41894 +41895, O41895 +41896, O41896 +41897, O41897 +41898, O41898 +41899, O41899 +41900, O41900 +41901, O41901 +41902, O41902 +41903, O41903 +41904, O41904 +41905, O41905 +41906, O41906 +41907, O41907 +41908, O41908 +41909, O41909 +41910, O41910 +41911, O41911 +41912, O41912 +41913, O41913 +41914, O41914 +41915, O41915 +41916, O41916 +41917, O41917 +41918, O41918 +41919, O41919 +41920, O41920 +41921, O41921 +41922, O41922 +41923, O41923 +41924, O41924 +41925, O41925 +41926, O41926 +41927, O41927 +41928, O41928 +41929, O41929 +41930, O41930 +41931, O41931 +41932, O41932 +41933, O41933 +41934, O41934 +41935, O41935 +41936, O41936 +41937, O41937 +41938, O41938 +41939, O41939 +41940, O41940 +41941, O41941 +41942, O41942 +41943, O41943 +41944, O41944 +41945, O41945 +41946, O41946 +41947, O41947 +41948, O41948 +41949, O41949 +41950, O41950 +41951, O41951 +41952, O41952 +41953, O41953 +41954, O41954 +41955, O41955 +41956, O41956 +41957, O41957 +41958, O41958 +41959, O41959 +41960, O41960 +41961, O41961 +41962, O41962 +41963, O41963 +41964, O41964 +41965, O41965 +41966, O41966 +41967, O41967 +41968, O41968 +41969, O41969 +41970, O41970 +41971, O41971 +41972, O41972 +41973, O41973 +41974, O41974 +41975, O41975 +41976, O41976 +41977, O41977 +41978, O41978 +41979, O41979 +41980, O41980 +41981, O41981 +41982, O41982 +41983, O41983 +41984, O41984 +41985, O41985 +41986, O41986 +41987, O41987 +41988, O41988 +41989, O41989 +41990, O41990 +41991, O41991 +41992, O41992 +41993, O41993 +41994, O41994 +41995, O41995 +41996, O41996 +41997, O41997 +41998, O41998 +41999, O41999 +42000, O42000 +42001, O42001 +42002, O42002 +42003, O42003 +42004, O42004 +42005, O42005 +42006, O42006 +42007, O42007 +42008, O42008 +42009, O42009 +42010, O42010 +42011, O42011 +42012, O42012 +42013, O42013 +42014, O42014 +42015, O42015 +42016, O42016 +42017, O42017 +42018, O42018 +42019, O42019 +42020, O42020 +42021, O42021 +42022, O42022 +42023, O42023 +42024, O42024 +42025, O42025 +42026, O42026 +42027, O42027 +42028, O42028 +42029, O42029 +42030, O42030 +42031, O42031 +42032, O42032 +42033, O42033 +42034, O42034 +42035, O42035 +42036, O42036 +42037, O42037 +42038, O42038 +42039, O42039 +42040, O42040 +42041, O42041 +42042, O42042 +42043, O42043 +42044, O42044 +42045, O42045 +42046, O42046 +42047, O42047 +42048, O42048 +42049, O42049 +42050, O42050 +42051, O42051 +42052, O42052 +42053, O42053 +42054, O42054 +42055, O42055 +42056, O42056 +42057, O42057 +42058, O42058 +42059, O42059 +42060, O42060 +42061, O42061 +42062, O42062 +42063, O42063 +42064, O42064 +42065, O42065 +42066, O42066 +42067, O42067 +42068, O42068 +42069, O42069 +42070, O42070 +42071, O42071 +42072, O42072 +42073, O42073 +42074, O42074 +42075, O42075 +42076, O42076 +42077, O42077 +42078, O42078 +42079, O42079 +42080, O42080 +42081, O42081 +42082, O42082 +42083, O42083 +42084, O42084 +42085, O42085 +42086, O42086 +42087, O42087 +42088, O42088 +42089, O42089 +42090, O42090 +42091, O42091 +42092, O42092 +42093, O42093 +42094, O42094 +42095, O42095 +42096, O42096 +42097, O42097 +42098, O42098 +42099, O42099 +42100, O42100 +42101, O42101 +42102, O42102 +42103, O42103 +42104, O42104 +42105, O42105 +42106, O42106 +42107, O42107 +42108, O42108 +42109, O42109 +42110, O42110 +42111, O42111 +42112, O42112 +42113, O42113 +42114, O42114 +42115, O42115 +42116, O42116 +42117, O42117 +42118, O42118 +42119, O42119 +42120, O42120 +42121, O42121 +42122, O42122 +42123, O42123 +42124, O42124 +42125, O42125 +42126, O42126 +42127, O42127 +42128, O42128 +42129, O42129 +42130, O42130 +42131, O42131 +42132, O42132 +42133, O42133 +42134, O42134 +42135, O42135 +42136, O42136 +42137, O42137 +42138, O42138 +42139, O42139 +42140, O42140 +42141, O42141 +42142, O42142 +42143, O42143 +42144, O42144 +42145, O42145 +42146, O42146 +42147, O42147 +42148, O42148 +42149, O42149 +42150, O42150 +42151, O42151 +42152, O42152 +42153, O42153 +42154, O42154 +42155, O42155 +42156, O42156 +42157, O42157 +42158, O42158 +42159, O42159 +42160, O42160 +42161, O42161 +42162, O42162 +42163, O42163 +42164, O42164 +42165, O42165 +42166, O42166 +42167, O42167 +42168, O42168 +42169, O42169 +42170, O42170 +42171, O42171 +42172, O42172 +42173, O42173 +42174, O42174 +42175, O42175 +42176, O42176 +42177, O42177 +42178, O42178 +42179, O42179 +42180, O42180 +42181, O42181 +42182, O42182 +42183, O42183 +42184, O42184 +42185, O42185 +42186, O42186 +42187, O42187 +42188, O42188 +42189, O42189 +42190, O42190 +42191, O42191 +42192, O42192 +42193, O42193 +42194, O42194 +42195, O42195 +42196, O42196 +42197, O42197 +42198, O42198 +42199, O42199 +42200, O42200 +42201, O42201 +42202, O42202 +42203, O42203 +42204, O42204 +42205, O42205 +42206, O42206 +42207, O42207 +42208, O42208 +42209, O42209 +42210, O42210 +42211, O42211 +42212, O42212 +42213, O42213 +42214, O42214 +42215, O42215 +42216, O42216 +42217, O42217 +42218, O42218 +42219, O42219 +42220, O42220 +42221, O42221 +42222, O42222 +42223, O42223 +42224, O42224 +42225, O42225 +42226, O42226 +42227, O42227 +42228, O42228 +42229, O42229 +42230, O42230 +42231, O42231 +42232, O42232 +42233, O42233 +42234, O42234 +42235, O42235 +42236, O42236 +42237, O42237 +42238, O42238 +42239, O42239 +42240, O42240 +42241, O42241 +42242, O42242 +42243, O42243 +42244, O42244 +42245, O42245 +42246, O42246 +42247, O42247 +42248, O42248 +42249, O42249 +42250, O42250 +42251, O42251 +42252, O42252 +42253, O42253 +42254, O42254 +42255, O42255 +42256, O42256 +42257, O42257 +42258, O42258 +42259, O42259 +42260, O42260 +42261, O42261 +42262, O42262 +42263, O42263 +42264, O42264 +42265, O42265 +42266, O42266 +42267, O42267 +42268, O42268 +42269, O42269 +42270, O42270 +42271, O42271 +42272, O42272 +42273, O42273 +42274, O42274 +42275, O42275 +42276, O42276 +42277, O42277 +42278, O42278 +42279, O42279 +42280, O42280 +42281, O42281 +42282, O42282 +42283, O42283 +42284, O42284 +42285, O42285 +42286, O42286 +42287, O42287 +42288, O42288 +42289, O42289 +42290, O42290 +42291, O42291 +42292, O42292 +42293, O42293 +42294, O42294 +42295, O42295 +42296, O42296 +42297, O42297 +42298, O42298 +42299, O42299 +42300, O42300 +42301, O42301 +42302, O42302 +42303, O42303 +42304, O42304 +42305, O42305 +42306, O42306 +42307, O42307 +42308, O42308 +42309, O42309 +42310, O42310 +42311, O42311 +42312, O42312 +42313, O42313 +42314, O42314 +42315, O42315 +42316, O42316 +42317, O42317 +42318, O42318 +42319, O42319 +42320, O42320 +42321, O42321 +42322, O42322 +42323, O42323 +42324, O42324 +42325, O42325 +42326, O42326 +42327, O42327 +42328, O42328 +42329, O42329 +42330, O42330 +42331, O42331 +42332, O42332 +42333, O42333 +42334, O42334 +42335, O42335 +42336, O42336 +42337, O42337 +42338, O42338 +42339, O42339 +42340, O42340 +42341, O42341 +42342, O42342 +42343, O42343 +42344, O42344 +42345, O42345 +42346, O42346 +42347, O42347 +42348, O42348 +42349, O42349 +42350, O42350 +42351, O42351 +42352, O42352 +42353, O42353 +42354, O42354 +42355, O42355 +42356, O42356 +42357, O42357 +42358, O42358 +42359, O42359 +42360, O42360 +42361, O42361 +42362, O42362 +42363, O42363 +42364, O42364 +42365, O42365 +42366, O42366 +42367, O42367 +42368, O42368 +42369, O42369 +42370, O42370 +42371, O42371 +42372, O42372 +42373, O42373 +42374, O42374 +42375, O42375 +42376, O42376 +42377, O42377 +42378, O42378 +42379, O42379 +42380, O42380 +42381, O42381 +42382, O42382 +42383, O42383 +42384, O42384 +42385, O42385 +42386, O42386 +42387, O42387 +42388, O42388 +42389, O42389 +42390, O42390 +42391, O42391 +42392, O42392 +42393, O42393 +42394, O42394 +42395, O42395 +42396, O42396 +42397, O42397 +42398, O42398 +42399, O42399 +42400, O42400 +42401, O42401 +42402, O42402 +42403, O42403 +42404, O42404 +42405, O42405 +42406, O42406 +42407, O42407 +42408, O42408 +42409, O42409 +42410, O42410 +42411, O42411 +42412, O42412 +42413, O42413 +42414, O42414 +42415, O42415 +42416, O42416 +42417, O42417 +42418, O42418 +42419, O42419 +42420, O42420 +42421, O42421 +42422, O42422 +42423, O42423 +42424, O42424 +42425, O42425 +42426, O42426 +42427, O42427 +42428, O42428 +42429, O42429 +42430, O42430 +42431, O42431 +42432, O42432 +42433, O42433 +42434, O42434 +42435, O42435 +42436, O42436 +42437, O42437 +42438, O42438 +42439, O42439 +42440, O42440 +42441, O42441 +42442, O42442 +42443, O42443 +42444, O42444 +42445, O42445 +42446, O42446 +42447, O42447 +42448, O42448 +42449, O42449 +42450, O42450 +42451, O42451 +42452, O42452 +42453, O42453 +42454, O42454 +42455, O42455 +42456, O42456 +42457, O42457 +42458, O42458 +42459, O42459 +42460, O42460 +42461, O42461 +42462, O42462 +42463, O42463 +42464, O42464 +42465, O42465 +42466, O42466 +42467, O42467 +42468, O42468 +42469, O42469 +42470, O42470 +42471, O42471 +42472, O42472 +42473, O42473 +42474, O42474 +42475, O42475 +42476, O42476 +42477, O42477 +42478, O42478 +42479, O42479 +42480, O42480 +42481, O42481 +42482, O42482 +42483, O42483 +42484, O42484 +42485, O42485 +42486, O42486 +42487, O42487 +42488, O42488 +42489, O42489 +42490, O42490 +42491, O42491 +42492, O42492 +42493, O42493 +42494, O42494 +42495, O42495 +42496, O42496 +42497, O42497 +42498, O42498 +42499, O42499 +42500, O42500 +42501, O42501 +42502, O42502 +42503, O42503 +42504, O42504 +42505, O42505 +42506, O42506 +42507, O42507 +42508, O42508 +42509, O42509 +42510, O42510 +42511, O42511 +42512, O42512 +42513, O42513 +42514, O42514 +42515, O42515 +42516, O42516 +42517, O42517 +42518, O42518 +42519, O42519 +42520, O42520 +42521, O42521 +42522, O42522 +42523, O42523 +42524, O42524 +42525, O42525 +42526, O42526 +42527, O42527 +42528, O42528 +42529, O42529 +42530, O42530 +42531, O42531 +42532, O42532 +42533, O42533 +42534, O42534 +42535, O42535 +42536, O42536 +42537, O42537 +42538, O42538 +42539, O42539 +42540, O42540 +42541, O42541 +42542, O42542 +42543, O42543 +42544, O42544 +42545, O42545 +42546, O42546 +42547, O42547 +42548, O42548 +42549, O42549 +42550, O42550 +42551, O42551 +42552, O42552 +42553, O42553 +42554, O42554 +42555, O42555 +42556, O42556 +42557, O42557 +42558, O42558 +42559, O42559 +42560, O42560 +42561, O42561 +42562, O42562 +42563, O42563 +42564, O42564 +42565, O42565 +42566, O42566 +42567, O42567 +42568, O42568 +42569, O42569 +42570, O42570 +42571, O42571 +42572, O42572 +42573, O42573 +42574, O42574 +42575, O42575 +42576, O42576 +42577, O42577 +42578, O42578 +42579, O42579 +42580, O42580 +42581, O42581 +42582, O42582 +42583, O42583 +42584, O42584 +42585, O42585 +42586, O42586 +42587, O42587 +42588, O42588 +42589, O42589 +42590, O42590 +42591, O42591 +42592, O42592 +42593, O42593 +42594, O42594 +42595, O42595 +42596, O42596 +42597, O42597 +42598, O42598 +42599, O42599 +42600, O42600 +42601, O42601 +42602, O42602 +42603, O42603 +42604, O42604 +42605, O42605 +42606, O42606 +42607, O42607 +42608, O42608 +42609, O42609 +42610, O42610 +42611, O42611 +42612, O42612 +42613, O42613 +42614, O42614 +42615, O42615 +42616, O42616 +42617, O42617 +42618, O42618 +42619, O42619 +42620, O42620 +42621, O42621 +42622, O42622 +42623, O42623 +42624, O42624 +42625, O42625 +42626, O42626 +42627, O42627 +42628, O42628 +42629, O42629 +42630, O42630 +42631, O42631 +42632, O42632 +42633, O42633 +42634, O42634 +42635, O42635 +42636, O42636 +42637, O42637 +42638, O42638 +42639, O42639 +42640, O42640 +42641, O42641 +42642, O42642 +42643, O42643 +42644, O42644 +42645, O42645 +42646, O42646 +42647, O42647 +42648, O42648 +42649, O42649 +42650, O42650 +42651, O42651 +42652, O42652 +42653, O42653 +42654, O42654 +42655, O42655 +42656, O42656 +42657, O42657 +42658, O42658 +42659, O42659 +42660, O42660 +42661, O42661 +42662, O42662 +42663, O42663 +42664, O42664 +42665, O42665 +42666, O42666 +42667, O42667 +42668, O42668 +42669, O42669 +42670, O42670 +42671, O42671 +42672, O42672 +42673, O42673 +42674, O42674 +42675, O42675 +42676, O42676 +42677, O42677 +42678, O42678 +42679, O42679 +42680, O42680 +42681, O42681 +42682, O42682 +42683, O42683 +42684, O42684 +42685, O42685 +42686, O42686 +42687, O42687 +42688, O42688 +42689, O42689 +42690, O42690 +42691, O42691 +42692, O42692 +42693, O42693 +42694, O42694 +42695, O42695 +42696, O42696 +42697, O42697 +42698, O42698 +42699, O42699 +42700, O42700 +42701, O42701 +42702, O42702 +42703, O42703 +42704, O42704 +42705, O42705 +42706, O42706 +42707, O42707 +42708, O42708 +42709, O42709 +42710, O42710 +42711, O42711 +42712, O42712 +42713, O42713 +42714, O42714 +42715, O42715 +42716, O42716 +42717, O42717 +42718, O42718 +42719, O42719 +42720, O42720 +42721, O42721 +42722, O42722 +42723, O42723 +42724, O42724 +42725, O42725 +42726, O42726 +42727, O42727 +42728, O42728 +42729, O42729 +42730, O42730 +42731, O42731 +42732, O42732 +42733, O42733 +42734, O42734 +42735, O42735 +42736, O42736 +42737, O42737 +42738, O42738 +42739, O42739 +42740, O42740 +42741, O42741 +42742, O42742 +42743, O42743 +42744, O42744 +42745, O42745 +42746, O42746 +42747, O42747 +42748, O42748 +42749, O42749 +42750, O42750 +42751, O42751 +42752, O42752 +42753, O42753 +42754, O42754 +42755, O42755 +42756, O42756 +42757, O42757 +42758, O42758 +42759, O42759 +42760, O42760 +42761, O42761 +42762, O42762 +42763, O42763 +42764, O42764 +42765, O42765 +42766, O42766 +42767, O42767 +42768, O42768 +42769, O42769 +42770, O42770 +42771, O42771 +42772, O42772 +42773, O42773 +42774, O42774 +42775, O42775 +42776, O42776 +42777, O42777 +42778, O42778 +42779, O42779 +42780, O42780 +42781, O42781 +42782, O42782 +42783, O42783 +42784, O42784 +42785, O42785 +42786, O42786 +42787, O42787 +42788, O42788 +42789, O42789 +42790, O42790 +42791, O42791 +42792, O42792 +42793, O42793 +42794, O42794 +42795, O42795 +42796, O42796 +42797, O42797 +42798, O42798 +42799, O42799 +42800, O42800 +42801, O42801 +42802, O42802 +42803, O42803 +42804, O42804 +42805, O42805 +42806, O42806 +42807, O42807 +42808, O42808 +42809, O42809 +42810, O42810 +42811, O42811 +42812, O42812 +42813, O42813 +42814, O42814 +42815, O42815 +42816, O42816 +42817, O42817 +42818, O42818 +42819, O42819 +42820, O42820 +42821, O42821 +42822, O42822 +42823, O42823 +42824, O42824 +42825, O42825 +42826, O42826 +42827, O42827 +42828, O42828 +42829, O42829 +42830, O42830 +42831, O42831 +42832, O42832 +42833, O42833 +42834, O42834 +42835, O42835 +42836, O42836 +42837, O42837 +42838, O42838 +42839, O42839 +42840, O42840 +42841, O42841 +42842, O42842 +42843, O42843 +42844, O42844 +42845, O42845 +42846, O42846 +42847, O42847 +42848, O42848 +42849, O42849 +42850, O42850 +42851, O42851 +42852, O42852 +42853, O42853 +42854, O42854 +42855, O42855 +42856, O42856 +42857, O42857 +42858, O42858 +42859, O42859 +42860, O42860 +42861, O42861 +42862, O42862 +42863, O42863 +42864, O42864 +42865, O42865 +42866, O42866 +42867, O42867 +42868, O42868 +42869, O42869 +42870, O42870 +42871, O42871 +42872, O42872 +42873, O42873 +42874, O42874 +42875, O42875 +42876, O42876 +42877, O42877 +42878, O42878 +42879, O42879 +42880, O42880 +42881, O42881 +42882, O42882 +42883, O42883 +42884, O42884 +42885, O42885 +42886, O42886 +42887, O42887 +42888, O42888 +42889, O42889 +42890, O42890 +42891, O42891 +42892, O42892 +42893, O42893 +42894, O42894 +42895, O42895 +42896, O42896 +42897, O42897 +42898, O42898 +42899, O42899 +42900, O42900 +42901, O42901 +42902, O42902 +42903, O42903 +42904, O42904 +42905, O42905 +42906, O42906 +42907, O42907 +42908, O42908 +42909, O42909 +42910, O42910 +42911, O42911 +42912, O42912 +42913, O42913 +42914, O42914 +42915, O42915 +42916, O42916 +42917, O42917 +42918, O42918 +42919, O42919 +42920, O42920 +42921, O42921 +42922, O42922 +42923, O42923 +42924, O42924 +42925, O42925 +42926, O42926 +42927, O42927 +42928, O42928 +42929, O42929 +42930, O42930 +42931, O42931 +42932, O42932 +42933, O42933 +42934, O42934 +42935, O42935 +42936, O42936 +42937, O42937 +42938, O42938 +42939, O42939 +42940, O42940 +42941, O42941 +42942, O42942 +42943, O42943 +42944, O42944 +42945, O42945 +42946, O42946 +42947, O42947 +42948, O42948 +42949, O42949 +42950, O42950 +42951, O42951 +42952, O42952 +42953, O42953 +42954, O42954 +42955, O42955 +42956, O42956 +42957, O42957 +42958, O42958 +42959, O42959 +42960, O42960 +42961, O42961 +42962, O42962 +42963, O42963 +42964, O42964 +42965, O42965 +42966, O42966 +42967, O42967 +42968, O42968 +42969, O42969 +42970, O42970 +42971, O42971 +42972, O42972 +42973, O42973 +42974, O42974 +42975, O42975 +42976, O42976 +42977, O42977 +42978, O42978 +42979, O42979 +42980, O42980 +42981, O42981 +42982, O42982 +42983, O42983 +42984, O42984 +42985, O42985 +42986, O42986 +42987, O42987 +42988, O42988 +42989, O42989 +42990, O42990 +42991, O42991 +42992, O42992 +42993, O42993 +42994, O42994 +42995, O42995 +42996, O42996 +42997, O42997 +42998, O42998 +42999, O42999 +43000, O43000 +43001, O43001 +43002, O43002 +43003, O43003 +43004, O43004 +43005, O43005 +43006, O43006 +43007, O43007 +43008, O43008 +43009, O43009 +43010, O43010 +43011, O43011 +43012, O43012 +43013, O43013 +43014, O43014 +43015, O43015 +43016, O43016 +43017, O43017 +43018, O43018 +43019, O43019 +43020, O43020 +43021, O43021 +43022, O43022 +43023, O43023 +43024, O43024 +43025, O43025 +43026, O43026 +43027, O43027 +43028, O43028 +43029, O43029 +43030, O43030 +43031, O43031 +43032, O43032 +43033, O43033 +43034, O43034 +43035, O43035 +43036, O43036 +43037, O43037 +43038, O43038 +43039, O43039 +43040, O43040 +43041, O43041 +43042, O43042 +43043, O43043 +43044, O43044 +43045, O43045 +43046, O43046 +43047, O43047 +43048, O43048 +43049, O43049 +43050, O43050 +43051, O43051 +43052, O43052 +43053, O43053 +43054, O43054 +43055, O43055 +43056, O43056 +43057, O43057 +43058, O43058 +43059, O43059 +43060, O43060 +43061, O43061 +43062, O43062 +43063, O43063 +43064, O43064 +43065, O43065 +43066, O43066 +43067, O43067 +43068, O43068 +43069, O43069 +43070, O43070 +43071, O43071 +43072, O43072 +43073, O43073 +43074, O43074 +43075, O43075 +43076, O43076 +43077, O43077 +43078, O43078 +43079, O43079 +43080, O43080 +43081, O43081 +43082, O43082 +43083, O43083 +43084, O43084 +43085, O43085 +43086, O43086 +43087, O43087 +43088, O43088 +43089, O43089 +43090, O43090 +43091, O43091 +43092, O43092 +43093, O43093 +43094, O43094 +43095, O43095 +43096, O43096 +43097, O43097 +43098, O43098 +43099, O43099 +43100, O43100 +43101, O43101 +43102, O43102 +43103, O43103 +43104, O43104 +43105, O43105 +43106, O43106 +43107, O43107 +43108, O43108 +43109, O43109 +43110, O43110 +43111, O43111 +43112, O43112 +43113, O43113 +43114, O43114 +43115, O43115 +43116, O43116 +43117, O43117 +43118, O43118 +43119, O43119 +43120, O43120 +43121, O43121 +43122, O43122 +43123, O43123 +43124, O43124 +43125, O43125 +43126, O43126 +43127, O43127 +43128, O43128 +43129, O43129 +43130, O43130 +43131, O43131 +43132, O43132 +43133, O43133 +43134, O43134 +43135, O43135 +43136, O43136 +43137, O43137 +43138, O43138 +43139, O43139 +43140, O43140 +43141, O43141 +43142, O43142 +43143, O43143 +43144, O43144 +43145, O43145 +43146, O43146 +43147, O43147 +43148, O43148 +43149, O43149 +43150, O43150 +43151, O43151 +43152, O43152 +43153, O43153 +43154, O43154 +43155, O43155 +43156, O43156 +43157, O43157 +43158, O43158 +43159, O43159 +43160, O43160 +43161, O43161 +43162, O43162 +43163, O43163 +43164, O43164 +43165, O43165 +43166, O43166 +43167, O43167 +43168, O43168 +43169, O43169 +43170, O43170 +43171, O43171 +43172, O43172 +43173, O43173 +43174, O43174 +43175, O43175 +43176, O43176 +43177, O43177 +43178, O43178 +43179, O43179 +43180, O43180 +43181, O43181 +43182, O43182 +43183, O43183 +43184, O43184 +43185, O43185 +43186, O43186 +43187, O43187 +43188, O43188 +43189, O43189 +43190, O43190 +43191, O43191 +43192, O43192 +43193, O43193 +43194, O43194 +43195, O43195 +43196, O43196 +43197, O43197 +43198, O43198 +43199, O43199 +43200, O43200 +43201, O43201 +43202, O43202 +43203, O43203 +43204, O43204 +43205, O43205 +43206, O43206 +43207, O43207 +43208, O43208 +43209, O43209 +43210, O43210 +43211, O43211 +43212, O43212 +43213, O43213 +43214, O43214 +43215, O43215 +43216, O43216 +43217, O43217 +43218, O43218 +43219, O43219 +43220, O43220 +43221, O43221 +43222, O43222 +43223, O43223 +43224, O43224 +43225, O43225 +43226, O43226 +43227, O43227 +43228, O43228 +43229, O43229 +43230, O43230 +43231, O43231 +43232, O43232 +43233, O43233 +43234, O43234 +43235, O43235 +43236, O43236 +43237, O43237 +43238, O43238 +43239, O43239 +43240, O43240 +43241, O43241 +43242, O43242 +43243, O43243 +43244, O43244 +43245, O43245 +43246, O43246 +43247, O43247 +43248, O43248 +43249, O43249 +43250, O43250 +43251, O43251 +43252, O43252 +43253, O43253 +43254, O43254 +43255, O43255 +43256, O43256 +43257, O43257 +43258, O43258 +43259, O43259 +43260, O43260 +43261, O43261 +43262, O43262 +43263, O43263 +43264, O43264 +43265, O43265 +43266, O43266 +43267, O43267 +43268, O43268 +43269, O43269 +43270, O43270 +43271, O43271 +43272, O43272 +43273, O43273 +43274, O43274 +43275, O43275 +43276, O43276 +43277, O43277 +43278, O43278 +43279, O43279 +43280, O43280 +43281, O43281 +43282, O43282 +43283, O43283 +43284, O43284 +43285, O43285 +43286, O43286 +43287, O43287 +43288, O43288 +43289, O43289 +43290, O43290 +43291, O43291 +43292, O43292 +43293, O43293 +43294, O43294 +43295, O43295 +43296, O43296 +43297, O43297 +43298, O43298 +43299, O43299 +43300, O43300 +43301, O43301 +43302, O43302 +43303, O43303 +43304, O43304 +43305, O43305 +43306, O43306 +43307, O43307 +43308, O43308 +43309, O43309 +43310, O43310 +43311, O43311 +43312, O43312 +43313, O43313 +43314, O43314 +43315, O43315 +43316, O43316 +43317, O43317 +43318, O43318 +43319, O43319 +43320, O43320 +43321, O43321 +43322, O43322 +43323, O43323 +43324, O43324 +43325, O43325 +43326, O43326 +43327, O43327 +43328, O43328 +43329, O43329 +43330, O43330 +43331, O43331 +43332, O43332 +43333, O43333 +43334, O43334 +43335, O43335 +43336, O43336 +43337, O43337 +43338, O43338 +43339, O43339 +43340, O43340 +43341, O43341 +43342, O43342 +43343, O43343 +43344, O43344 +43345, O43345 +43346, O43346 +43347, O43347 +43348, O43348 +43349, O43349 +43350, O43350 +43351, O43351 +43352, O43352 +43353, O43353 +43354, O43354 +43355, O43355 +43356, O43356 +43357, O43357 +43358, O43358 +43359, O43359 +43360, O43360 +43361, O43361 +43362, O43362 +43363, O43363 +43364, O43364 +43365, O43365 +43366, O43366 +43367, O43367 +43368, O43368 +43369, O43369 +43370, O43370 +43371, O43371 +43372, O43372 +43373, O43373 +43374, O43374 +43375, O43375 +43376, O43376 +43377, O43377 +43378, O43378 +43379, O43379 +43380, O43380 +43381, O43381 +43382, O43382 +43383, O43383 +43384, O43384 +43385, O43385 +43386, O43386 +43387, O43387 +43388, O43388 +43389, O43389 +43390, O43390 +43391, O43391 +43392, O43392 +43393, O43393 +43394, O43394 +43395, O43395 +43396, O43396 +43397, O43397 +43398, O43398 +43399, O43399 +43400, O43400 +43401, O43401 +43402, O43402 +43403, O43403 +43404, O43404 +43405, O43405 +43406, O43406 +43407, O43407 +43408, O43408 +43409, O43409 +43410, O43410 +43411, O43411 +43412, O43412 +43413, O43413 +43414, O43414 +43415, O43415 +43416, O43416 +43417, O43417 +43418, O43418 +43419, O43419 +43420, O43420 +43421, O43421 +43422, O43422 +43423, O43423 +43424, O43424 +43425, O43425 +43426, O43426 +43427, O43427 +43428, O43428 +43429, O43429 +43430, O43430 +43431, O43431 +43432, O43432 +43433, O43433 +43434, O43434 +43435, O43435 +43436, O43436 +43437, O43437 +43438, O43438 +43439, O43439 +43440, O43440 +43441, O43441 +43442, O43442 +43443, O43443 +43444, O43444 +43445, O43445 +43446, O43446 +43447, O43447 +43448, O43448 +43449, O43449 +43450, O43450 +43451, O43451 +43452, O43452 +43453, O43453 +43454, O43454 +43455, O43455 +43456, O43456 +43457, O43457 +43458, O43458 +43459, O43459 +43460, O43460 +43461, O43461 +43462, O43462 +43463, O43463 +43464, O43464 +43465, O43465 +43466, O43466 +43467, O43467 +43468, O43468 +43469, O43469 +43470, O43470 +43471, O43471 +43472, O43472 +43473, O43473 +43474, O43474 +43475, O43475 +43476, O43476 +43477, O43477 +43478, O43478 +43479, O43479 +43480, O43480 +43481, O43481 +43482, O43482 +43483, O43483 +43484, O43484 +43485, O43485 +43486, O43486 +43487, O43487 +43488, O43488 +43489, O43489 +43490, O43490 +43491, O43491 +43492, O43492 +43493, O43493 +43494, O43494 +43495, O43495 +43496, O43496 +43497, O43497 +43498, O43498 +43499, O43499 +43500, O43500 +43501, O43501 +43502, O43502 +43503, O43503 +43504, O43504 +43505, O43505 +43506, O43506 +43507, O43507 +43508, O43508 +43509, O43509 +43510, O43510 +43511, O43511 +43512, O43512 +43513, O43513 +43514, O43514 +43515, O43515 +43516, O43516 +43517, O43517 +43518, O43518 +43519, O43519 +43520, O43520 +43521, O43521 +43522, O43522 +43523, O43523 +43524, O43524 +43525, O43525 +43526, O43526 +43527, O43527 +43528, O43528 +43529, O43529 +43530, O43530 +43531, O43531 +43532, O43532 +43533, O43533 +43534, O43534 +43535, O43535 +43536, O43536 +43537, O43537 +43538, O43538 +43539, O43539 +43540, O43540 +43541, O43541 +43542, O43542 +43543, O43543 +43544, O43544 +43545, O43545 +43546, O43546 +43547, O43547 +43548, O43548 +43549, O43549 +43550, O43550 +43551, O43551 +43552, O43552 +43553, O43553 +43554, O43554 +43555, O43555 +43556, O43556 +43557, O43557 +43558, O43558 +43559, O43559 +43560, O43560 +43561, O43561 +43562, O43562 +43563, O43563 +43564, O43564 +43565, O43565 +43566, O43566 +43567, O43567 +43568, O43568 +43569, O43569 +43570, O43570 +43571, O43571 +43572, O43572 +43573, O43573 +43574, O43574 +43575, O43575 +43576, O43576 +43577, O43577 +43578, O43578 +43579, O43579 +43580, O43580 +43581, O43581 +43582, O43582 +43583, O43583 +43584, O43584 +43585, O43585 +43586, O43586 +43587, O43587 +43588, O43588 +43589, O43589 +43590, O43590 +43591, O43591 +43592, O43592 +43593, O43593 +43594, O43594 +43595, O43595 +43596, O43596 +43597, O43597 +43598, O43598 +43599, O43599 +43600, O43600 +43601, O43601 +43602, O43602 +43603, O43603 +43604, O43604 +43605, O43605 +43606, O43606 +43607, O43607 +43608, O43608 +43609, O43609 +43610, O43610 +43611, O43611 +43612, O43612 +43613, O43613 +43614, O43614 +43615, O43615 +43616, O43616 +43617, O43617 +43618, O43618 +43619, O43619 +43620, O43620 +43621, O43621 +43622, O43622 +43623, O43623 +43624, O43624 +43625, O43625 +43626, O43626 +43627, O43627 +43628, O43628 +43629, O43629 +43630, O43630 +43631, O43631 +43632, O43632 +43633, O43633 +43634, O43634 +43635, O43635 +43636, O43636 +43637, O43637 +43638, O43638 +43639, O43639 +43640, O43640 +43641, O43641 +43642, O43642 +43643, O43643 +43644, O43644 +43645, O43645 +43646, O43646 +43647, O43647 +43648, O43648 +43649, O43649 +43650, O43650 +43651, O43651 +43652, O43652 +43653, O43653 +43654, O43654 +43655, O43655 +43656, O43656 +43657, O43657 +43658, O43658 +43659, O43659 +43660, O43660 +43661, O43661 +43662, O43662 +43663, O43663 +43664, O43664 +43665, O43665 +43666, O43666 +43667, O43667 +43668, O43668 +43669, O43669 +43670, O43670 +43671, O43671 +43672, O43672 +43673, O43673 +43674, O43674 +43675, O43675 +43676, O43676 +43677, O43677 +43678, O43678 +43679, O43679 +43680, O43680 +43681, O43681 +43682, O43682 +43683, O43683 +43684, O43684 +43685, O43685 +43686, O43686 +43687, O43687 +43688, O43688 +43689, O43689 +43690, O43690 +43691, O43691 +43692, O43692 +43693, O43693 +43694, O43694 +43695, O43695 +43696, O43696 +43697, O43697 +43698, O43698 +43699, O43699 +43700, O43700 +43701, O43701 +43702, O43702 +43703, O43703 +43704, O43704 +43705, O43705 +43706, O43706 +43707, O43707 +43708, O43708 +43709, O43709 +43710, O43710 +43711, O43711 +43712, O43712 +43713, O43713 +43714, O43714 +43715, O43715 +43716, O43716 +43717, O43717 +43718, O43718 +43719, O43719 +43720, O43720 +43721, O43721 +43722, O43722 +43723, O43723 +43724, O43724 +43725, O43725 +43726, O43726 +43727, O43727 +43728, O43728 +43729, O43729 +43730, O43730 +43731, O43731 +43732, O43732 +43733, O43733 +43734, O43734 +43735, O43735 +43736, O43736 +43737, O43737 +43738, O43738 +43739, O43739 +43740, O43740 +43741, O43741 +43742, O43742 +43743, O43743 +43744, O43744 +43745, O43745 +43746, O43746 +43747, O43747 +43748, O43748 +43749, O43749 +43750, O43750 +43751, O43751 +43752, O43752 +43753, O43753 +43754, O43754 +43755, O43755 +43756, O43756 +43757, O43757 +43758, O43758 +43759, O43759 +43760, O43760 +43761, O43761 +43762, O43762 +43763, O43763 +43764, O43764 +43765, O43765 +43766, O43766 +43767, O43767 +43768, O43768 +43769, O43769 +43770, O43770 +43771, O43771 +43772, O43772 +43773, O43773 +43774, O43774 +43775, O43775 +43776, O43776 +43777, O43777 +43778, O43778 +43779, O43779 +43780, O43780 +43781, O43781 +43782, O43782 +43783, O43783 +43784, O43784 +43785, O43785 +43786, O43786 +43787, O43787 +43788, O43788 +43789, O43789 +43790, O43790 +43791, O43791 +43792, O43792 +43793, O43793 +43794, O43794 +43795, O43795 +43796, O43796 +43797, O43797 +43798, O43798 +43799, O43799 +43800, O43800 +43801, O43801 +43802, O43802 +43803, O43803 +43804, O43804 +43805, O43805 +43806, O43806 +43807, O43807 +43808, O43808 +43809, O43809 +43810, O43810 +43811, O43811 +43812, O43812 +43813, O43813 +43814, O43814 +43815, O43815 +43816, O43816 +43817, O43817 +43818, O43818 +43819, O43819 +43820, O43820 +43821, O43821 +43822, O43822 +43823, O43823 +43824, O43824 +43825, O43825 +43826, O43826 +43827, O43827 +43828, O43828 +43829, O43829 +43830, O43830 +43831, O43831 +43832, O43832 +43833, O43833 +43834, O43834 +43835, O43835 +43836, O43836 +43837, O43837 +43838, O43838 +43839, O43839 +43840, O43840 +43841, O43841 +43842, O43842 +43843, O43843 +43844, O43844 +43845, O43845 +43846, O43846 +43847, O43847 +43848, O43848 +43849, O43849 +43850, O43850 +43851, O43851 +43852, O43852 +43853, O43853 +43854, O43854 +43855, O43855 +43856, O43856 +43857, O43857 +43858, O43858 +43859, O43859 +43860, O43860 +43861, O43861 +43862, O43862 +43863, O43863 +43864, O43864 +43865, O43865 +43866, O43866 +43867, O43867 +43868, O43868 +43869, O43869 +43870, O43870 +43871, O43871 +43872, O43872 +43873, O43873 +43874, O43874 +43875, O43875 +43876, O43876 +43877, O43877 +43878, O43878 +43879, O43879 +43880, O43880 +43881, O43881 +43882, O43882 +43883, O43883 +43884, O43884 +43885, O43885 +43886, O43886 +43887, O43887 +43888, O43888 +43889, O43889 +43890, O43890 +43891, O43891 +43892, O43892 +43893, O43893 +43894, O43894 +43895, O43895 +43896, O43896 +43897, O43897 +43898, O43898 +43899, O43899 +43900, O43900 +43901, O43901 +43902, O43902 +43903, O43903 +43904, O43904 +43905, O43905 +43906, O43906 +43907, O43907 +43908, O43908 +43909, O43909 +43910, O43910 +43911, O43911 +43912, O43912 +43913, O43913 +43914, O43914 +43915, O43915 +43916, O43916 +43917, O43917 +43918, O43918 +43919, O43919 +43920, O43920 +43921, O43921 +43922, O43922 +43923, O43923 +43924, O43924 +43925, O43925 +43926, O43926 +43927, O43927 +43928, O43928 +43929, O43929 +43930, O43930 +43931, O43931 +43932, O43932 +43933, O43933 +43934, O43934 +43935, O43935 +43936, O43936 +43937, O43937 +43938, O43938 +43939, O43939 +43940, O43940 +43941, O43941 +43942, O43942 +43943, O43943 +43944, O43944 +43945, O43945 +43946, O43946 +43947, O43947 +43948, O43948 +43949, O43949 +43950, O43950 +43951, O43951 +43952, O43952 +43953, O43953 +43954, O43954 +43955, O43955 +43956, O43956 +43957, O43957 +43958, O43958 +43959, O43959 +43960, O43960 +43961, O43961 +43962, O43962 +43963, O43963 +43964, O43964 +43965, O43965 +43966, O43966 +43967, O43967 +43968, O43968 +43969, O43969 +43970, O43970 +43971, O43971 +43972, O43972 +43973, O43973 +43974, O43974 +43975, O43975 +43976, O43976 +43977, O43977 +43978, O43978 +43979, O43979 +43980, O43980 +43981, O43981 +43982, O43982 +43983, O43983 +43984, O43984 +43985, O43985 +43986, O43986 +43987, O43987 +43988, O43988 +43989, O43989 +43990, O43990 +43991, O43991 +43992, O43992 +43993, O43993 +43994, O43994 +43995, O43995 +43996, O43996 +43997, O43997 +43998, O43998 +43999, O43999 +44000, O44000 +44001, O44001 +44002, O44002 +44003, O44003 +44004, O44004 +44005, O44005 +44006, O44006 +44007, O44007 +44008, O44008 +44009, O44009 +44010, O44010 +44011, O44011 +44012, O44012 +44013, O44013 +44014, O44014 +44015, O44015 +44016, O44016 +44017, O44017 +44018, O44018 +44019, O44019 +44020, O44020 +44021, O44021 +44022, O44022 +44023, O44023 +44024, O44024 +44025, O44025 +44026, O44026 +44027, O44027 +44028, O44028 +44029, O44029 +44030, O44030 +44031, O44031 +44032, O44032 +44033, O44033 +44034, O44034 +44035, O44035 +44036, O44036 +44037, O44037 +44038, O44038 +44039, O44039 +44040, O44040 +44041, O44041 +44042, O44042 +44043, O44043 +44044, O44044 +44045, O44045 +44046, O44046 +44047, O44047 +44048, O44048 +44049, O44049 +44050, O44050 +44051, O44051 +44052, O44052 +44053, O44053 +44054, O44054 +44055, O44055 +44056, O44056 +44057, O44057 +44058, O44058 +44059, O44059 +44060, O44060 +44061, O44061 +44062, O44062 +44063, O44063 +44064, O44064 +44065, O44065 +44066, O44066 +44067, O44067 +44068, O44068 +44069, O44069 +44070, O44070 +44071, O44071 +44072, O44072 +44073, O44073 +44074, O44074 +44075, O44075 +44076, O44076 +44077, O44077 +44078, O44078 +44079, O44079 +44080, O44080 +44081, O44081 +44082, O44082 +44083, O44083 +44084, O44084 +44085, O44085 +44086, O44086 +44087, O44087 +44088, O44088 +44089, O44089 +44090, O44090 +44091, O44091 +44092, O44092 +44093, O44093 +44094, O44094 +44095, O44095 +44096, O44096 +44097, O44097 +44098, O44098 +44099, O44099 +44100, O44100 +44101, O44101 +44102, O44102 +44103, O44103 +44104, O44104 +44105, O44105 +44106, O44106 +44107, O44107 +44108, O44108 +44109, O44109 +44110, O44110 +44111, O44111 +44112, O44112 +44113, O44113 +44114, O44114 +44115, O44115 +44116, O44116 +44117, O44117 +44118, O44118 +44119, O44119 +44120, O44120 +44121, O44121 +44122, O44122 +44123, O44123 +44124, O44124 +44125, O44125 +44126, O44126 +44127, O44127 +44128, O44128 +44129, O44129 +44130, O44130 +44131, O44131 +44132, O44132 +44133, O44133 +44134, O44134 +44135, O44135 +44136, O44136 +44137, O44137 +44138, O44138 +44139, O44139 +44140, O44140 +44141, O44141 +44142, O44142 +44143, O44143 +44144, O44144 +44145, O44145 +44146, O44146 +44147, O44147 +44148, O44148 +44149, O44149 +44150, O44150 +44151, O44151 +44152, O44152 +44153, O44153 +44154, O44154 +44155, O44155 +44156, O44156 +44157, O44157 +44158, O44158 +44159, O44159 +44160, O44160 +44161, O44161 +44162, O44162 +44163, O44163 +44164, O44164 +44165, O44165 +44166, O44166 +44167, O44167 +44168, O44168 +44169, O44169 +44170, O44170 +44171, O44171 +44172, O44172 +44173, O44173 +44174, O44174 +44175, O44175 +44176, O44176 +44177, O44177 +44178, O44178 +44179, O44179 +44180, O44180 +44181, O44181 +44182, O44182 +44183, O44183 +44184, O44184 +44185, O44185 +44186, O44186 +44187, O44187 +44188, O44188 +44189, O44189 +44190, O44190 +44191, O44191 +44192, O44192 +44193, O44193 +44194, O44194 +44195, O44195 +44196, O44196 +44197, O44197 +44198, O44198 +44199, O44199 +44200, O44200 +44201, O44201 +44202, O44202 +44203, O44203 +44204, O44204 +44205, O44205 +44206, O44206 +44207, O44207 +44208, O44208 +44209, O44209 +44210, O44210 +44211, O44211 +44212, O44212 +44213, O44213 +44214, O44214 +44215, O44215 +44216, O44216 +44217, O44217 +44218, O44218 +44219, O44219 +44220, O44220 +44221, O44221 +44222, O44222 +44223, O44223 +44224, O44224 +44225, O44225 +44226, O44226 +44227, O44227 +44228, O44228 +44229, O44229 +44230, O44230 +44231, O44231 +44232, O44232 +44233, O44233 +44234, O44234 +44235, O44235 +44236, O44236 +44237, O44237 +44238, O44238 +44239, O44239 +44240, O44240 +44241, O44241 +44242, O44242 +44243, O44243 +44244, O44244 +44245, O44245 +44246, O44246 +44247, O44247 +44248, O44248 +44249, O44249 +44250, O44250 +44251, O44251 +44252, O44252 +44253, O44253 +44254, O44254 +44255, O44255 +44256, O44256 +44257, O44257 +44258, O44258 +44259, O44259 +44260, O44260 +44261, O44261 +44262, O44262 +44263, O44263 +44264, O44264 +44265, O44265 +44266, O44266 +44267, O44267 +44268, O44268 +44269, O44269 +44270, O44270 +44271, O44271 +44272, O44272 +44273, O44273 +44274, O44274 +44275, O44275 +44276, O44276 +44277, O44277 +44278, O44278 +44279, O44279 +44280, O44280 +44281, O44281 +44282, O44282 +44283, O44283 +44284, O44284 +44285, O44285 +44286, O44286 +44287, O44287 +44288, O44288 +44289, O44289 +44290, O44290 +44291, O44291 +44292, O44292 +44293, O44293 +44294, O44294 +44295, O44295 +44296, O44296 +44297, O44297 +44298, O44298 +44299, O44299 +44300, O44300 +44301, O44301 +44302, O44302 +44303, O44303 +44304, O44304 +44305, O44305 +44306, O44306 +44307, O44307 +44308, O44308 +44309, O44309 +44310, O44310 +44311, O44311 +44312, O44312 +44313, O44313 +44314, O44314 +44315, O44315 +44316, O44316 +44317, O44317 +44318, O44318 +44319, O44319 +44320, O44320 +44321, O44321 +44322, O44322 +44323, O44323 +44324, O44324 +44325, O44325 +44326, O44326 +44327, O44327 +44328, O44328 +44329, O44329 +44330, O44330 +44331, O44331 +44332, O44332 +44333, O44333 +44334, O44334 +44335, O44335 +44336, O44336 +44337, O44337 +44338, O44338 +44339, O44339 +44340, O44340 +44341, O44341 +44342, O44342 +44343, O44343 +44344, O44344 +44345, O44345 +44346, O44346 +44347, O44347 +44348, O44348 +44349, O44349 +44350, O44350 +44351, O44351 +44352, O44352 +44353, O44353 +44354, O44354 +44355, O44355 +44356, O44356 +44357, O44357 +44358, O44358 +44359, O44359 +44360, O44360 +44361, O44361 +44362, O44362 +44363, O44363 +44364, O44364 +44365, O44365 +44366, O44366 +44367, O44367 +44368, O44368 +44369, O44369 +44370, O44370 +44371, O44371 +44372, O44372 +44373, O44373 +44374, O44374 +44375, O44375 +44376, O44376 +44377, O44377 +44378, O44378 +44379, O44379 +44380, O44380 +44381, O44381 +44382, O44382 +44383, O44383 +44384, O44384 +44385, O44385 +44386, O44386 +44387, O44387 +44388, O44388 +44389, O44389 +44390, O44390 +44391, O44391 +44392, O44392 +44393, O44393 +44394, O44394 +44395, O44395 +44396, O44396 +44397, O44397 +44398, O44398 +44399, O44399 +44400, O44400 +44401, O44401 +44402, O44402 +44403, O44403 +44404, O44404 +44405, O44405 +44406, O44406 +44407, O44407 +44408, O44408 +44409, O44409 +44410, O44410 +44411, O44411 +44412, O44412 +44413, O44413 +44414, O44414 +44415, O44415 +44416, O44416 +44417, O44417 +44418, O44418 +44419, O44419 +44420, O44420 +44421, O44421 +44422, O44422 +44423, O44423 +44424, O44424 +44425, O44425 +44426, O44426 +44427, O44427 +44428, O44428 +44429, O44429 +44430, O44430 +44431, O44431 +44432, O44432 +44433, O44433 +44434, O44434 +44435, O44435 +44436, O44436 +44437, O44437 +44438, O44438 +44439, O44439 +44440, O44440 +44441, O44441 +44442, O44442 +44443, O44443 +44444, O44444 +44445, O44445 +44446, O44446 +44447, O44447 +44448, O44448 +44449, O44449 +44450, O44450 +44451, O44451 +44452, O44452 +44453, O44453 +44454, O44454 +44455, O44455 +44456, O44456 +44457, O44457 +44458, O44458 +44459, O44459 +44460, O44460 +44461, O44461 +44462, O44462 +44463, O44463 +44464, O44464 +44465, O44465 +44466, O44466 +44467, O44467 +44468, O44468 +44469, O44469 +44470, O44470 +44471, O44471 +44472, O44472 +44473, O44473 +44474, O44474 +44475, O44475 +44476, O44476 +44477, O44477 +44478, O44478 +44479, O44479 +44480, O44480 +44481, O44481 +44482, O44482 +44483, O44483 +44484, O44484 +44485, O44485 +44486, O44486 +44487, O44487 +44488, O44488 +44489, O44489 +44490, O44490 +44491, O44491 +44492, O44492 +44493, O44493 +44494, O44494 +44495, O44495 +44496, O44496 +44497, O44497 +44498, O44498 +44499, O44499 +44500, O44500 +44501, O44501 +44502, O44502 +44503, O44503 +44504, O44504 +44505, O44505 +44506, O44506 +44507, O44507 +44508, O44508 +44509, O44509 +44510, O44510 +44511, O44511 +44512, O44512 +44513, O44513 +44514, O44514 +44515, O44515 +44516, O44516 +44517, O44517 +44518, O44518 +44519, O44519 +44520, O44520 +44521, O44521 +44522, O44522 +44523, O44523 +44524, O44524 +44525, O44525 +44526, O44526 +44527, O44527 +44528, O44528 +44529, O44529 +44530, O44530 +44531, O44531 +44532, O44532 +44533, O44533 +44534, O44534 +44535, O44535 +44536, O44536 +44537, O44537 +44538, O44538 +44539, O44539 +44540, O44540 +44541, O44541 +44542, O44542 +44543, O44543 +44544, O44544 +44545, O44545 +44546, O44546 +44547, O44547 +44548, O44548 +44549, O44549 +44550, O44550 +44551, O44551 +44552, O44552 +44553, O44553 +44554, O44554 +44555, O44555 +44556, O44556 +44557, O44557 +44558, O44558 +44559, O44559 +44560, O44560 +44561, O44561 +44562, O44562 +44563, O44563 +44564, O44564 +44565, O44565 +44566, O44566 +44567, O44567 +44568, O44568 +44569, O44569 +44570, O44570 +44571, O44571 +44572, O44572 +44573, O44573 +44574, O44574 +44575, O44575 +44576, O44576 +44577, O44577 +44578, O44578 +44579, O44579 +44580, O44580 +44581, O44581 +44582, O44582 +44583, O44583 +44584, O44584 +44585, O44585 +44586, O44586 +44587, O44587 +44588, O44588 +44589, O44589 +44590, O44590 +44591, O44591 +44592, O44592 +44593, O44593 +44594, O44594 +44595, O44595 +44596, O44596 +44597, O44597 +44598, O44598 +44599, O44599 +44600, O44600 +44601, O44601 +44602, O44602 +44603, O44603 +44604, O44604 +44605, O44605 +44606, O44606 +44607, O44607 +44608, O44608 +44609, O44609 +44610, O44610 +44611, O44611 +44612, O44612 +44613, O44613 +44614, O44614 +44615, O44615 +44616, O44616 +44617, O44617 +44618, O44618 +44619, O44619 +44620, O44620 +44621, O44621 +44622, O44622 +44623, O44623 +44624, O44624 +44625, O44625 +44626, O44626 +44627, O44627 +44628, O44628 +44629, O44629 +44630, O44630 +44631, O44631 +44632, O44632 +44633, O44633 +44634, O44634 +44635, O44635 +44636, O44636 +44637, O44637 +44638, O44638 +44639, O44639 +44640, O44640 +44641, O44641 +44642, O44642 +44643, O44643 +44644, O44644 +44645, O44645 +44646, O44646 +44647, O44647 +44648, O44648 +44649, O44649 +44650, O44650 +44651, O44651 +44652, O44652 +44653, O44653 +44654, O44654 +44655, O44655 +44656, O44656 +44657, O44657 +44658, O44658 +44659, O44659 +44660, O44660 +44661, O44661 +44662, O44662 +44663, O44663 +44664, O44664 +44665, O44665 +44666, O44666 +44667, O44667 +44668, O44668 +44669, O44669 +44670, O44670 +44671, O44671 +44672, O44672 +44673, O44673 +44674, O44674 +44675, O44675 +44676, O44676 +44677, O44677 +44678, O44678 +44679, O44679 +44680, O44680 +44681, O44681 +44682, O44682 +44683, O44683 +44684, O44684 +44685, O44685 +44686, O44686 +44687, O44687 +44688, O44688 +44689, O44689 +44690, O44690 +44691, O44691 +44692, O44692 +44693, O44693 +44694, O44694 +44695, O44695 +44696, O44696 +44697, O44697 +44698, O44698 +44699, O44699 +44700, O44700 +44701, O44701 +44702, O44702 +44703, O44703 +44704, O44704 +44705, O44705 +44706, O44706 +44707, O44707 +44708, O44708 +44709, O44709 +44710, O44710 +44711, O44711 +44712, O44712 +44713, O44713 +44714, O44714 +44715, O44715 +44716, O44716 +44717, O44717 +44718, O44718 +44719, O44719 +44720, O44720 +44721, O44721 +44722, O44722 +44723, O44723 +44724, O44724 +44725, O44725 +44726, O44726 +44727, O44727 +44728, O44728 +44729, O44729 +44730, O44730 +44731, O44731 +44732, O44732 +44733, O44733 +44734, O44734 +44735, O44735 +44736, O44736 +44737, O44737 +44738, O44738 +44739, O44739 +44740, O44740 +44741, O44741 +44742, O44742 +44743, O44743 +44744, O44744 +44745, O44745 +44746, O44746 +44747, O44747 +44748, O44748 +44749, O44749 +44750, O44750 +44751, O44751 +44752, O44752 +44753, O44753 +44754, O44754 +44755, O44755 +44756, O44756 +44757, O44757 +44758, O44758 +44759, O44759 +44760, O44760 +44761, O44761 +44762, O44762 +44763, O44763 +44764, O44764 +44765, O44765 +44766, O44766 +44767, O44767 +44768, O44768 +44769, O44769 +44770, O44770 +44771, O44771 +44772, O44772 +44773, O44773 +44774, O44774 +44775, O44775 +44776, O44776 +44777, O44777 +44778, O44778 +44779, O44779 +44780, O44780 +44781, O44781 +44782, O44782 +44783, O44783 +44784, O44784 +44785, O44785 +44786, O44786 +44787, O44787 +44788, O44788 +44789, O44789 +44790, O44790 +44791, O44791 +44792, O44792 +44793, O44793 +44794, O44794 +44795, O44795 +44796, O44796 +44797, O44797 +44798, O44798 +44799, O44799 +44800, O44800 +44801, O44801 +44802, O44802 +44803, O44803 +44804, O44804 +44805, O44805 +44806, O44806 +44807, O44807 +44808, O44808 +44809, O44809 +44810, O44810 +44811, O44811 +44812, O44812 +44813, O44813 +44814, O44814 +44815, O44815 +44816, O44816 +44817, O44817 +44818, O44818 +44819, O44819 +44820, O44820 +44821, O44821 +44822, O44822 +44823, O44823 +44824, O44824 +44825, O44825 +44826, O44826 +44827, O44827 +44828, O44828 +44829, O44829 +44830, O44830 +44831, O44831 +44832, O44832 +44833, O44833 +44834, O44834 +44835, O44835 +44836, O44836 +44837, O44837 +44838, O44838 +44839, O44839 +44840, O44840 +44841, O44841 +44842, O44842 +44843, O44843 +44844, O44844 +44845, O44845 +44846, O44846 +44847, O44847 +44848, O44848 +44849, O44849 +44850, O44850 +44851, O44851 +44852, O44852 +44853, O44853 +44854, O44854 +44855, O44855 +44856, O44856 +44857, O44857 +44858, O44858 +44859, O44859 +44860, O44860 +44861, O44861 +44862, O44862 +44863, O44863 +44864, O44864 +44865, O44865 +44866, O44866 +44867, O44867 +44868, O44868 +44869, O44869 +44870, O44870 +44871, O44871 +44872, O44872 +44873, O44873 +44874, O44874 +44875, O44875 +44876, O44876 +44877, O44877 +44878, O44878 +44879, O44879 +44880, O44880 +44881, O44881 +44882, O44882 +44883, O44883 +44884, O44884 +44885, O44885 +44886, O44886 +44887, O44887 +44888, O44888 +44889, O44889 +44890, O44890 +44891, O44891 +44892, O44892 +44893, O44893 +44894, O44894 +44895, O44895 +44896, O44896 +44897, O44897 +44898, O44898 +44899, O44899 +44900, O44900 +44901, O44901 +44902, O44902 +44903, O44903 +44904, O44904 +44905, O44905 +44906, O44906 +44907, O44907 +44908, O44908 +44909, O44909 +44910, O44910 +44911, O44911 +44912, O44912 +44913, O44913 +44914, O44914 +44915, O44915 +44916, O44916 +44917, O44917 +44918, O44918 +44919, O44919 +44920, O44920 +44921, O44921 +44922, O44922 +44923, O44923 +44924, O44924 +44925, O44925 +44926, O44926 +44927, O44927 +44928, O44928 +44929, O44929 +44930, O44930 +44931, O44931 +44932, O44932 +44933, O44933 +44934, O44934 +44935, O44935 +44936, O44936 +44937, O44937 +44938, O44938 +44939, O44939 +44940, O44940 +44941, O44941 +44942, O44942 +44943, O44943 +44944, O44944 +44945, O44945 +44946, O44946 +44947, O44947 +44948, O44948 +44949, O44949 +44950, O44950 +44951, O44951 +44952, O44952 +44953, O44953 +44954, O44954 +44955, O44955 +44956, O44956 +44957, O44957 +44958, O44958 +44959, O44959 +44960, O44960 +44961, O44961 +44962, O44962 +44963, O44963 +44964, O44964 +44965, O44965 +44966, O44966 +44967, O44967 +44968, O44968 +44969, O44969 +44970, O44970 +44971, O44971 +44972, O44972 +44973, O44973 +44974, O44974 +44975, O44975 +44976, O44976 +44977, O44977 +44978, O44978 +44979, O44979 +44980, O44980 +44981, O44981 +44982, O44982 +44983, O44983 +44984, O44984 +44985, O44985 +44986, O44986 +44987, O44987 +44988, O44988 +44989, O44989 +44990, O44990 +44991, O44991 +44992, O44992 +44993, O44993 +44994, O44994 +44995, O44995 +44996, O44996 +44997, O44997 +44998, O44998 +44999, O44999 +45000, O45000 +45001, O45001 +45002, O45002 +45003, O45003 +45004, O45004 +45005, O45005 +45006, O45006 +45007, O45007 +45008, O45008 +45009, O45009 +45010, O45010 +45011, O45011 +45012, O45012 +45013, O45013 +45014, O45014 +45015, O45015 +45016, O45016 +45017, O45017 +45018, O45018 +45019, O45019 +45020, O45020 +45021, O45021 +45022, O45022 +45023, O45023 +45024, O45024 +45025, O45025 +45026, O45026 +45027, O45027 +45028, O45028 +45029, O45029 +45030, O45030 +45031, O45031 +45032, O45032 +45033, O45033 +45034, O45034 +45035, O45035 +45036, O45036 +45037, O45037 +45038, O45038 +45039, O45039 +45040, O45040 +45041, O45041 +45042, O45042 +45043, O45043 +45044, O45044 +45045, O45045 +45046, O45046 +45047, O45047 +45048, O45048 +45049, O45049 +45050, O45050 +45051, O45051 +45052, O45052 +45053, O45053 +45054, O45054 +45055, O45055 +45056, O45056 +45057, O45057 +45058, O45058 +45059, O45059 +45060, O45060 +45061, O45061 +45062, O45062 +45063, O45063 +45064, O45064 +45065, O45065 +45066, O45066 +45067, O45067 +45068, O45068 +45069, O45069 +45070, O45070 +45071, O45071 +45072, O45072 +45073, O45073 +45074, O45074 +45075, O45075 +45076, O45076 +45077, O45077 +45078, O45078 +45079, O45079 +45080, O45080 +45081, O45081 +45082, O45082 +45083, O45083 +45084, O45084 +45085, O45085 +45086, O45086 +45087, O45087 +45088, O45088 +45089, O45089 +45090, O45090 +45091, O45091 +45092, O45092 +45093, O45093 +45094, O45094 +45095, O45095 +45096, O45096 +45097, O45097 +45098, O45098 +45099, O45099 +45100, O45100 +45101, O45101 +45102, O45102 +45103, O45103 +45104, O45104 +45105, O45105 +45106, O45106 +45107, O45107 +45108, O45108 +45109, O45109 +45110, O45110 +45111, O45111 +45112, O45112 +45113, O45113 +45114, O45114 +45115, O45115 +45116, O45116 +45117, O45117 +45118, O45118 +45119, O45119 +45120, O45120 +45121, O45121 +45122, O45122 +45123, O45123 +45124, O45124 +45125, O45125 +45126, O45126 +45127, O45127 +45128, O45128 +45129, O45129 +45130, O45130 +45131, O45131 +45132, O45132 +45133, O45133 +45134, O45134 +45135, O45135 +45136, O45136 +45137, O45137 +45138, O45138 +45139, O45139 +45140, O45140 +45141, O45141 +45142, O45142 +45143, O45143 +45144, O45144 +45145, O45145 +45146, O45146 +45147, O45147 +45148, O45148 +45149, O45149 +45150, O45150 +45151, O45151 +45152, O45152 +45153, O45153 +45154, O45154 +45155, O45155 +45156, O45156 +45157, O45157 +45158, O45158 +45159, O45159 +45160, O45160 +45161, O45161 +45162, O45162 +45163, O45163 +45164, O45164 +45165, O45165 +45166, O45166 +45167, O45167 +45168, O45168 +45169, O45169 +45170, O45170 +45171, O45171 +45172, O45172 +45173, O45173 +45174, O45174 +45175, O45175 +45176, O45176 +45177, O45177 +45178, O45178 +45179, O45179 +45180, O45180 +45181, O45181 +45182, O45182 +45183, O45183 +45184, O45184 +45185, O45185 +45186, O45186 +45187, O45187 +45188, O45188 +45189, O45189 +45190, O45190 +45191, O45191 +45192, O45192 +45193, O45193 +45194, O45194 +45195, O45195 +45196, O45196 +45197, O45197 +45198, O45198 +45199, O45199 +45200, O45200 +45201, O45201 +45202, O45202 +45203, O45203 +45204, O45204 +45205, O45205 +45206, O45206 +45207, O45207 +45208, O45208 +45209, O45209 +45210, O45210 +45211, O45211 +45212, O45212 +45213, O45213 +45214, O45214 +45215, O45215 +45216, O45216 +45217, O45217 +45218, O45218 +45219, O45219 +45220, O45220 +45221, O45221 +45222, O45222 +45223, O45223 +45224, O45224 +45225, O45225 +45226, O45226 +45227, O45227 +45228, O45228 +45229, O45229 +45230, O45230 +45231, O45231 +45232, O45232 +45233, O45233 +45234, O45234 +45235, O45235 +45236, O45236 +45237, O45237 +45238, O45238 +45239, O45239 +45240, O45240 +45241, O45241 +45242, O45242 +45243, O45243 +45244, O45244 +45245, O45245 +45246, O45246 +45247, O45247 +45248, O45248 +45249, O45249 +45250, O45250 +45251, O45251 +45252, O45252 +45253, O45253 +45254, O45254 +45255, O45255 +45256, O45256 +45257, O45257 +45258, O45258 +45259, O45259 +45260, O45260 +45261, O45261 +45262, O45262 +45263, O45263 +45264, O45264 +45265, O45265 +45266, O45266 +45267, O45267 +45268, O45268 +45269, O45269 +45270, O45270 +45271, O45271 +45272, O45272 +45273, O45273 +45274, O45274 +45275, O45275 +45276, O45276 +45277, O45277 +45278, O45278 +45279, O45279 +45280, O45280 +45281, O45281 +45282, O45282 +45283, O45283 +45284, O45284 +45285, O45285 +45286, O45286 +45287, O45287 +45288, O45288 +45289, O45289 +45290, O45290 +45291, O45291 +45292, O45292 +45293, O45293 +45294, O45294 +45295, O45295 +45296, O45296 +45297, O45297 +45298, O45298 +45299, O45299 +45300, O45300 +45301, O45301 +45302, O45302 +45303, O45303 +45304, O45304 +45305, O45305 +45306, O45306 +45307, O45307 +45308, O45308 +45309, O45309 +45310, O45310 +45311, O45311 +45312, O45312 +45313, O45313 +45314, O45314 +45315, O45315 +45316, O45316 +45317, O45317 +45318, O45318 +45319, O45319 +45320, O45320 +45321, O45321 +45322, O45322 +45323, O45323 +45324, O45324 +45325, O45325 +45326, O45326 +45327, O45327 +45328, O45328 +45329, O45329 +45330, O45330 +45331, O45331 +45332, O45332 +45333, O45333 +45334, O45334 +45335, O45335 +45336, O45336 +45337, O45337 +45338, O45338 +45339, O45339 +45340, O45340 +45341, O45341 +45342, O45342 +45343, O45343 +45344, O45344 +45345, O45345 +45346, O45346 +45347, O45347 +45348, O45348 +45349, O45349 +45350, O45350 +45351, O45351 +45352, O45352 +45353, O45353 +45354, O45354 +45355, O45355 +45356, O45356 +45357, O45357 +45358, O45358 +45359, O45359 +45360, O45360 +45361, O45361 +45362, O45362 +45363, O45363 +45364, O45364 +45365, O45365 +45366, O45366 +45367, O45367 +45368, O45368 +45369, O45369 +45370, O45370 +45371, O45371 +45372, O45372 +45373, O45373 +45374, O45374 +45375, O45375 +45376, O45376 +45377, O45377 +45378, O45378 +45379, O45379 +45380, O45380 +45381, O45381 +45382, O45382 +45383, O45383 +45384, O45384 +45385, O45385 +45386, O45386 +45387, O45387 +45388, O45388 +45389, O45389 +45390, O45390 +45391, O45391 +45392, O45392 +45393, O45393 +45394, O45394 +45395, O45395 +45396, O45396 +45397, O45397 +45398, O45398 +45399, O45399 +45400, O45400 +45401, O45401 +45402, O45402 +45403, O45403 +45404, O45404 +45405, O45405 +45406, O45406 +45407, O45407 +45408, O45408 +45409, O45409 +45410, O45410 +45411, O45411 +45412, O45412 +45413, O45413 +45414, O45414 +45415, O45415 +45416, O45416 +45417, O45417 +45418, O45418 +45419, O45419 +45420, O45420 +45421, O45421 +45422, O45422 +45423, O45423 +45424, O45424 +45425, O45425 +45426, O45426 +45427, O45427 +45428, O45428 +45429, O45429 +45430, O45430 +45431, O45431 +45432, O45432 +45433, O45433 +45434, O45434 +45435, O45435 +45436, O45436 +45437, O45437 +45438, O45438 +45439, O45439 +45440, O45440 +45441, O45441 +45442, O45442 +45443, O45443 +45444, O45444 +45445, O45445 +45446, O45446 +45447, O45447 +45448, O45448 +45449, O45449 +45450, O45450 +45451, O45451 +45452, O45452 +45453, O45453 +45454, O45454 +45455, O45455 +45456, O45456 +45457, O45457 +45458, O45458 +45459, O45459 +45460, O45460 +45461, O45461 +45462, O45462 +45463, O45463 +45464, O45464 +45465, O45465 +45466, O45466 +45467, O45467 +45468, O45468 +45469, O45469 +45470, O45470 +45471, O45471 +45472, O45472 +45473, O45473 +45474, O45474 +45475, O45475 +45476, O45476 +45477, O45477 +45478, O45478 +45479, O45479 +45480, O45480 +45481, O45481 +45482, O45482 +45483, O45483 +45484, O45484 +45485, O45485 +45486, O45486 +45487, O45487 +45488, O45488 +45489, O45489 +45490, O45490 +45491, O45491 +45492, O45492 +45493, O45493 +45494, O45494 +45495, O45495 +45496, O45496 +45497, O45497 +45498, O45498 +45499, O45499 +45500, O45500 +45501, O45501 +45502, O45502 +45503, O45503 +45504, O45504 +45505, O45505 +45506, O45506 +45507, O45507 +45508, O45508 +45509, O45509 +45510, O45510 +45511, O45511 +45512, O45512 +45513, O45513 +45514, O45514 +45515, O45515 +45516, O45516 +45517, O45517 +45518, O45518 +45519, O45519 +45520, O45520 +45521, O45521 +45522, O45522 +45523, O45523 +45524, O45524 +45525, O45525 +45526, O45526 +45527, O45527 +45528, O45528 +45529, O45529 +45530, O45530 +45531, O45531 +45532, O45532 +45533, O45533 +45534, O45534 +45535, O45535 +45536, O45536 +45537, O45537 +45538, O45538 +45539, O45539 +45540, O45540 +45541, O45541 +45542, O45542 +45543, O45543 +45544, O45544 +45545, O45545 +45546, O45546 +45547, O45547 +45548, O45548 +45549, O45549 +45550, O45550 +45551, O45551 +45552, O45552 +45553, O45553 +45554, O45554 +45555, O45555 +45556, O45556 +45557, O45557 +45558, O45558 +45559, O45559 +45560, O45560 +45561, O45561 +45562, O45562 +45563, O45563 +45564, O45564 +45565, O45565 +45566, O45566 +45567, O45567 +45568, O45568 +45569, O45569 +45570, O45570 +45571, O45571 +45572, O45572 +45573, O45573 +45574, O45574 +45575, O45575 +45576, O45576 +45577, O45577 +45578, O45578 +45579, O45579 +45580, O45580 +45581, O45581 +45582, O45582 +45583, O45583 +45584, O45584 +45585, O45585 +45586, O45586 +45587, O45587 +45588, O45588 +45589, O45589 +45590, O45590 +45591, O45591 +45592, O45592 +45593, O45593 +45594, O45594 +45595, O45595 +45596, O45596 +45597, O45597 +45598, O45598 +45599, O45599 +45600, O45600 +45601, O45601 +45602, O45602 +45603, O45603 +45604, O45604 +45605, O45605 +45606, O45606 +45607, O45607 +45608, O45608 +45609, O45609 +45610, O45610 +45611, O45611 +45612, O45612 +45613, O45613 +45614, O45614 +45615, O45615 +45616, O45616 +45617, O45617 +45618, O45618 +45619, O45619 +45620, O45620 +45621, O45621 +45622, O45622 +45623, O45623 +45624, O45624 +45625, O45625 +45626, O45626 +45627, O45627 +45628, O45628 +45629, O45629 +45630, O45630 +45631, O45631 +45632, O45632 +45633, O45633 +45634, O45634 +45635, O45635 +45636, O45636 +45637, O45637 +45638, O45638 +45639, O45639 +45640, O45640 +45641, O45641 +45642, O45642 +45643, O45643 +45644, O45644 +45645, O45645 +45646, O45646 +45647, O45647 +45648, O45648 +45649, O45649 +45650, O45650 +45651, O45651 +45652, O45652 +45653, O45653 +45654, O45654 +45655, O45655 +45656, O45656 +45657, O45657 +45658, O45658 +45659, O45659 +45660, O45660 +45661, O45661 +45662, O45662 +45663, O45663 +45664, O45664 +45665, O45665 +45666, O45666 +45667, O45667 +45668, O45668 +45669, O45669 +45670, O45670 +45671, O45671 +45672, O45672 +45673, O45673 +45674, O45674 +45675, O45675 +45676, O45676 +45677, O45677 +45678, O45678 +45679, O45679 +45680, O45680 +45681, O45681 +45682, O45682 +45683, O45683 +45684, O45684 +45685, O45685 +45686, O45686 +45687, O45687 +45688, O45688 +45689, O45689 +45690, O45690 +45691, O45691 +45692, O45692 +45693, O45693 +45694, O45694 +45695, O45695 +45696, O45696 +45697, O45697 +45698, O45698 +45699, O45699 +45700, O45700 +45701, O45701 +45702, O45702 +45703, O45703 +45704, O45704 +45705, O45705 +45706, O45706 +45707, O45707 +45708, O45708 +45709, O45709 +45710, O45710 +45711, O45711 +45712, O45712 +45713, O45713 +45714, O45714 +45715, O45715 +45716, O45716 +45717, O45717 +45718, O45718 +45719, O45719 +45720, O45720 +45721, O45721 +45722, O45722 +45723, O45723 +45724, O45724 +45725, O45725 +45726, O45726 +45727, O45727 +45728, O45728 +45729, O45729 +45730, O45730 +45731, O45731 +45732, O45732 +45733, O45733 +45734, O45734 +45735, O45735 +45736, O45736 +45737, O45737 +45738, O45738 +45739, O45739 +45740, O45740 +45741, O45741 +45742, O45742 +45743, O45743 +45744, O45744 +45745, O45745 +45746, O45746 +45747, O45747 +45748, O45748 +45749, O45749 +45750, O45750 +45751, O45751 +45752, O45752 +45753, O45753 +45754, O45754 +45755, O45755 +45756, O45756 +45757, O45757 +45758, O45758 +45759, O45759 +45760, O45760 +45761, O45761 +45762, O45762 +45763, O45763 +45764, O45764 +45765, O45765 +45766, O45766 +45767, O45767 +45768, O45768 +45769, O45769 +45770, O45770 +45771, O45771 +45772, O45772 +45773, O45773 +45774, O45774 +45775, O45775 +45776, O45776 +45777, O45777 +45778, O45778 +45779, O45779 +45780, O45780 +45781, O45781 +45782, O45782 +45783, O45783 +45784, O45784 +45785, O45785 +45786, O45786 +45787, O45787 +45788, O45788 +45789, O45789 +45790, O45790 +45791, O45791 +45792, O45792 +45793, O45793 +45794, O45794 +45795, O45795 +45796, O45796 +45797, O45797 +45798, O45798 +45799, O45799 +45800, O45800 +45801, O45801 +45802, O45802 +45803, O45803 +45804, O45804 +45805, O45805 +45806, O45806 +45807, O45807 +45808, O45808 +45809, O45809 +45810, O45810 +45811, O45811 +45812, O45812 +45813, O45813 +45814, O45814 +45815, O45815 +45816, O45816 +45817, O45817 +45818, O45818 +45819, O45819 +45820, O45820 +45821, O45821 +45822, O45822 +45823, O45823 +45824, O45824 +45825, O45825 +45826, O45826 +45827, O45827 +45828, O45828 +45829, O45829 +45830, O45830 +45831, O45831 +45832, O45832 +45833, O45833 +45834, O45834 +45835, O45835 +45836, O45836 +45837, O45837 +45838, O45838 +45839, O45839 +45840, O45840 +45841, O45841 +45842, O45842 +45843, O45843 +45844, O45844 +45845, O45845 +45846, O45846 +45847, O45847 +45848, O45848 +45849, O45849 +45850, O45850 +45851, O45851 +45852, O45852 +45853, O45853 +45854, O45854 +45855, O45855 +45856, O45856 +45857, O45857 +45858, O45858 +45859, O45859 +45860, O45860 +45861, O45861 +45862, O45862 +45863, O45863 +45864, O45864 +45865, O45865 +45866, O45866 +45867, O45867 +45868, O45868 +45869, O45869 +45870, O45870 +45871, O45871 +45872, O45872 +45873, O45873 +45874, O45874 +45875, O45875 +45876, O45876 +45877, O45877 +45878, O45878 +45879, O45879 +45880, O45880 +45881, O45881 +45882, O45882 +45883, O45883 +45884, O45884 +45885, O45885 +45886, O45886 +45887, O45887 +45888, O45888 +45889, O45889 +45890, O45890 +45891, O45891 +45892, O45892 +45893, O45893 +45894, O45894 +45895, O45895 +45896, O45896 +45897, O45897 +45898, O45898 +45899, O45899 +45900, O45900 +45901, O45901 +45902, O45902 +45903, O45903 +45904, O45904 +45905, O45905 +45906, O45906 +45907, O45907 +45908, O45908 +45909, O45909 +45910, O45910 +45911, O45911 +45912, O45912 +45913, O45913 +45914, O45914 +45915, O45915 +45916, O45916 +45917, O45917 +45918, O45918 +45919, O45919 +45920, O45920 +45921, O45921 +45922, O45922 +45923, O45923 +45924, O45924 +45925, O45925 +45926, O45926 +45927, O45927 +45928, O45928 +45929, O45929 +45930, O45930 +45931, O45931 +45932, O45932 +45933, O45933 +45934, O45934 +45935, O45935 +45936, O45936 +45937, O45937 +45938, O45938 +45939, O45939 +45940, O45940 +45941, O45941 +45942, O45942 +45943, O45943 +45944, O45944 +45945, O45945 +45946, O45946 +45947, O45947 +45948, O45948 +45949, O45949 +45950, O45950 +45951, O45951 +45952, O45952 +45953, O45953 +45954, O45954 +45955, O45955 +45956, O45956 +45957, O45957 +45958, O45958 +45959, O45959 +45960, O45960 +45961, O45961 +45962, O45962 +45963, O45963 +45964, O45964 +45965, O45965 +45966, O45966 +45967, O45967 +45968, O45968 +45969, O45969 +45970, O45970 +45971, O45971 +45972, O45972 +45973, O45973 +45974, O45974 +45975, O45975 +45976, O45976 +45977, O45977 +45978, O45978 +45979, O45979 +45980, O45980 +45981, O45981 +45982, O45982 +45983, O45983 +45984, O45984 +45985, O45985 +45986, O45986 +45987, O45987 +45988, O45988 +45989, O45989 +45990, O45990 +45991, O45991 +45992, O45992 +45993, O45993 +45994, O45994 +45995, O45995 +45996, O45996 +45997, O45997 +45998, O45998 +45999, O45999 +46000, O46000 +46001, O46001 +46002, O46002 +46003, O46003 +46004, O46004 +46005, O46005 +46006, O46006 +46007, O46007 +46008, O46008 +46009, O46009 +46010, O46010 +46011, O46011 +46012, O46012 +46013, O46013 +46014, O46014 +46015, O46015 +46016, O46016 +46017, O46017 +46018, O46018 +46019, O46019 +46020, O46020 +46021, O46021 +46022, O46022 +46023, O46023 +46024, O46024 +46025, O46025 +46026, O46026 +46027, O46027 +46028, O46028 +46029, O46029 +46030, O46030 +46031, O46031 +46032, O46032 +46033, O46033 +46034, O46034 +46035, O46035 +46036, O46036 +46037, O46037 +46038, O46038 +46039, O46039 +46040, O46040 +46041, O46041 +46042, O46042 +46043, O46043 +46044, O46044 +46045, O46045 +46046, O46046 +46047, O46047 +46048, O46048 +46049, O46049 +46050, O46050 +46051, O46051 +46052, O46052 +46053, O46053 +46054, O46054 +46055, O46055 +46056, O46056 +46057, O46057 +46058, O46058 +46059, O46059 +46060, O46060 +46061, O46061 +46062, O46062 +46063, O46063 +46064, O46064 +46065, O46065 +46066, O46066 +46067, O46067 +46068, O46068 +46069, O46069 +46070, O46070 +46071, O46071 +46072, O46072 +46073, O46073 +46074, O46074 +46075, O46075 +46076, O46076 +46077, O46077 +46078, O46078 +46079, O46079 +46080, O46080 +46081, O46081 +46082, O46082 +46083, O46083 +46084, O46084 +46085, O46085 +46086, O46086 +46087, O46087 +46088, O46088 +46089, O46089 +46090, O46090 +46091, O46091 +46092, O46092 +46093, O46093 +46094, O46094 +46095, O46095 +46096, O46096 +46097, O46097 +46098, O46098 +46099, O46099 +46100, O46100 +46101, O46101 +46102, O46102 +46103, O46103 +46104, O46104 +46105, O46105 +46106, O46106 +46107, O46107 +46108, O46108 +46109, O46109 +46110, O46110 +46111, O46111 +46112, O46112 +46113, O46113 +46114, O46114 +46115, O46115 +46116, O46116 +46117, O46117 +46118, O46118 +46119, O46119 +46120, O46120 +46121, O46121 +46122, O46122 +46123, O46123 +46124, O46124 +46125, O46125 +46126, O46126 +46127, O46127 +46128, O46128 +46129, O46129 +46130, O46130 +46131, O46131 +46132, O46132 +46133, O46133 +46134, O46134 +46135, O46135 +46136, O46136 +46137, O46137 +46138, O46138 +46139, O46139 +46140, O46140 +46141, O46141 +46142, O46142 +46143, O46143 +46144, O46144 +46145, O46145 +46146, O46146 +46147, O46147 +46148, O46148 +46149, O46149 +46150, O46150 +46151, O46151 +46152, O46152 +46153, O46153 +46154, O46154 +46155, O46155 +46156, O46156 +46157, O46157 +46158, O46158 +46159, O46159 +46160, O46160 +46161, O46161 +46162, O46162 +46163, O46163 +46164, O46164 +46165, O46165 +46166, O46166 +46167, O46167 +46168, O46168 +46169, O46169 +46170, O46170 +46171, O46171 +46172, O46172 +46173, O46173 +46174, O46174 +46175, O46175 +46176, O46176 +46177, O46177 +46178, O46178 +46179, O46179 +46180, O46180 +46181, O46181 +46182, O46182 +46183, O46183 +46184, O46184 +46185, O46185 +46186, O46186 +46187, O46187 +46188, O46188 +46189, O46189 +46190, O46190 +46191, O46191 +46192, O46192 +46193, O46193 +46194, O46194 +46195, O46195 +46196, O46196 +46197, O46197 +46198, O46198 +46199, O46199 +46200, O46200 +46201, O46201 +46202, O46202 +46203, O46203 +46204, O46204 +46205, O46205 +46206, O46206 +46207, O46207 +46208, O46208 +46209, O46209 +46210, O46210 +46211, O46211 +46212, O46212 +46213, O46213 +46214, O46214 +46215, O46215 +46216, O46216 +46217, O46217 +46218, O46218 +46219, O46219 +46220, O46220 +46221, O46221 +46222, O46222 +46223, O46223 +46224, O46224 +46225, O46225 +46226, O46226 +46227, O46227 +46228, O46228 +46229, O46229 +46230, O46230 +46231, O46231 +46232, O46232 +46233, O46233 +46234, O46234 +46235, O46235 +46236, O46236 +46237, O46237 +46238, O46238 +46239, O46239 +46240, O46240 +46241, O46241 +46242, O46242 +46243, O46243 +46244, O46244 +46245, O46245 +46246, O46246 +46247, O46247 +46248, O46248 +46249, O46249 +46250, O46250 +46251, O46251 +46252, O46252 +46253, O46253 +46254, O46254 +46255, O46255 +46256, O46256 +46257, O46257 +46258, O46258 +46259, O46259 +46260, O46260 +46261, O46261 +46262, O46262 +46263, O46263 +46264, O46264 +46265, O46265 +46266, O46266 +46267, O46267 +46268, O46268 +46269, O46269 +46270, O46270 +46271, O46271 +46272, O46272 +46273, O46273 +46274, O46274 +46275, O46275 +46276, O46276 +46277, O46277 +46278, O46278 +46279, O46279 +46280, O46280 +46281, O46281 +46282, O46282 +46283, O46283 +46284, O46284 +46285, O46285 +46286, O46286 +46287, O46287 +46288, O46288 +46289, O46289 +46290, O46290 +46291, O46291 +46292, O46292 +46293, O46293 +46294, O46294 +46295, O46295 +46296, O46296 +46297, O46297 +46298, O46298 +46299, O46299 +46300, O46300 +46301, O46301 +46302, O46302 +46303, O46303 +46304, O46304 +46305, O46305 +46306, O46306 +46307, O46307 +46308, O46308 +46309, O46309 +46310, O46310 +46311, O46311 +46312, O46312 +46313, O46313 +46314, O46314 +46315, O46315 +46316, O46316 +46317, O46317 +46318, O46318 +46319, O46319 +46320, O46320 +46321, O46321 +46322, O46322 +46323, O46323 +46324, O46324 +46325, O46325 +46326, O46326 +46327, O46327 +46328, O46328 +46329, O46329 +46330, O46330 +46331, O46331 +46332, O46332 +46333, O46333 +46334, O46334 +46335, O46335 +46336, O46336 +46337, O46337 +46338, O46338 +46339, O46339 +46340, O46340 +46341, O46341 +46342, O46342 +46343, O46343 +46344, O46344 +46345, O46345 +46346, O46346 +46347, O46347 +46348, O46348 +46349, O46349 +46350, O46350 +46351, O46351 +46352, O46352 +46353, O46353 +46354, O46354 +46355, O46355 +46356, O46356 +46357, O46357 +46358, O46358 +46359, O46359 +46360, O46360 +46361, O46361 +46362, O46362 +46363, O46363 +46364, O46364 +46365, O46365 +46366, O46366 +46367, O46367 +46368, O46368 +46369, O46369 +46370, O46370 +46371, O46371 +46372, O46372 +46373, O46373 +46374, O46374 +46375, O46375 +46376, O46376 +46377, O46377 +46378, O46378 +46379, O46379 +46380, O46380 +46381, O46381 +46382, O46382 +46383, O46383 +46384, O46384 +46385, O46385 +46386, O46386 +46387, O46387 +46388, O46388 +46389, O46389 +46390, O46390 +46391, O46391 +46392, O46392 +46393, O46393 +46394, O46394 +46395, O46395 +46396, O46396 +46397, O46397 +46398, O46398 +46399, O46399 +46400, O46400 +46401, O46401 +46402, O46402 +46403, O46403 +46404, O46404 +46405, O46405 +46406, O46406 +46407, O46407 +46408, O46408 +46409, O46409 +46410, O46410 +46411, O46411 +46412, O46412 +46413, O46413 +46414, O46414 +46415, O46415 +46416, O46416 +46417, O46417 +46418, O46418 +46419, O46419 +46420, O46420 +46421, O46421 +46422, O46422 +46423, O46423 +46424, O46424 +46425, O46425 +46426, O46426 +46427, O46427 +46428, O46428 +46429, O46429 +46430, O46430 +46431, O46431 +46432, O46432 +46433, O46433 +46434, O46434 +46435, O46435 +46436, O46436 +46437, O46437 +46438, O46438 +46439, O46439 +46440, O46440 +46441, O46441 +46442, O46442 +46443, O46443 +46444, O46444 +46445, O46445 +46446, O46446 +46447, O46447 +46448, O46448 +46449, O46449 +46450, O46450 +46451, O46451 +46452, O46452 +46453, O46453 +46454, O46454 +46455, O46455 +46456, O46456 +46457, O46457 +46458, O46458 +46459, O46459 +46460, O46460 +46461, O46461 +46462, O46462 +46463, O46463 +46464, O46464 +46465, O46465 +46466, O46466 +46467, O46467 +46468, O46468 +46469, O46469 +46470, O46470 +46471, O46471 +46472, O46472 +46473, O46473 +46474, O46474 +46475, O46475 +46476, O46476 +46477, O46477 +46478, O46478 +46479, O46479 +46480, O46480 +46481, O46481 +46482, O46482 +46483, O46483 +46484, O46484 +46485, O46485 +46486, O46486 +46487, O46487 +46488, O46488 +46489, O46489 +46490, O46490 +46491, O46491 +46492, O46492 +46493, O46493 +46494, O46494 +46495, O46495 +46496, O46496 +46497, O46497 +46498, O46498 +46499, O46499 +46500, O46500 +46501, O46501 +46502, O46502 +46503, O46503 +46504, O46504 +46505, O46505 +46506, O46506 +46507, O46507 +46508, O46508 +46509, O46509 +46510, O46510 +46511, O46511 +46512, O46512 +46513, O46513 +46514, O46514 +46515, O46515 +46516, O46516 +46517, O46517 +46518, O46518 +46519, O46519 +46520, O46520 +46521, O46521 +46522, O46522 +46523, O46523 +46524, O46524 +46525, O46525 +46526, O46526 +46527, O46527 +46528, O46528 +46529, O46529 +46530, O46530 +46531, O46531 +46532, O46532 +46533, O46533 +46534, O46534 +46535, O46535 +46536, O46536 +46537, O46537 +46538, O46538 +46539, O46539 +46540, O46540 +46541, O46541 +46542, O46542 +46543, O46543 +46544, O46544 +46545, O46545 +46546, O46546 +46547, O46547 +46548, O46548 +46549, O46549 +46550, O46550 +46551, O46551 +46552, O46552 +46553, O46553 +46554, O46554 +46555, O46555 +46556, O46556 +46557, O46557 +46558, O46558 +46559, O46559 +46560, O46560 +46561, O46561 +46562, O46562 +46563, O46563 +46564, O46564 +46565, O46565 +46566, O46566 +46567, O46567 +46568, O46568 +46569, O46569 +46570, O46570 +46571, O46571 +46572, O46572 +46573, O46573 +46574, O46574 +46575, O46575 +46576, O46576 +46577, O46577 +46578, O46578 +46579, O46579 +46580, O46580 +46581, O46581 +46582, O46582 +46583, O46583 +46584, O46584 +46585, O46585 +46586, O46586 +46587, O46587 +46588, O46588 +46589, O46589 +46590, O46590 +46591, O46591 +46592, O46592 +46593, O46593 +46594, O46594 +46595, O46595 +46596, O46596 +46597, O46597 +46598, O46598 +46599, O46599 +46600, O46600 +46601, O46601 +46602, O46602 +46603, O46603 +46604, O46604 +46605, O46605 +46606, O46606 +46607, O46607 +46608, O46608 +46609, O46609 +46610, O46610 +46611, O46611 +46612, O46612 +46613, O46613 +46614, O46614 +46615, O46615 +46616, O46616 +46617, O46617 +46618, O46618 +46619, O46619 +46620, O46620 +46621, O46621 +46622, O46622 +46623, O46623 +46624, O46624 +46625, O46625 +46626, O46626 +46627, O46627 +46628, O46628 +46629, O46629 +46630, O46630 +46631, O46631 +46632, O46632 +46633, O46633 +46634, O46634 +46635, O46635 +46636, O46636 +46637, O46637 +46638, O46638 +46639, O46639 +46640, O46640 +46641, O46641 +46642, O46642 +46643, O46643 +46644, O46644 +46645, O46645 +46646, O46646 +46647, O46647 +46648, O46648 +46649, O46649 +46650, O46650 +46651, O46651 +46652, O46652 +46653, O46653 +46654, O46654 +46655, O46655 +46656, O46656 +46657, O46657 +46658, O46658 +46659, O46659 +46660, O46660 +46661, O46661 +46662, O46662 +46663, O46663 +46664, O46664 +46665, O46665 +46666, O46666 +46667, O46667 +46668, O46668 +46669, O46669 +46670, O46670 +46671, O46671 +46672, O46672 +46673, O46673 +46674, O46674 +46675, O46675 +46676, O46676 +46677, O46677 +46678, O46678 +46679, O46679 +46680, O46680 +46681, O46681 +46682, O46682 +46683, O46683 +46684, O46684 +46685, O46685 +46686, O46686 +46687, O46687 +46688, O46688 +46689, O46689 +46690, O46690 +46691, O46691 +46692, O46692 +46693, O46693 +46694, O46694 +46695, O46695 +46696, O46696 +46697, O46697 +46698, O46698 +46699, O46699 +46700, O46700 +46701, O46701 +46702, O46702 +46703, O46703 +46704, O46704 +46705, O46705 +46706, O46706 +46707, O46707 +46708, O46708 +46709, O46709 +46710, O46710 +46711, O46711 +46712, O46712 +46713, O46713 +46714, O46714 +46715, O46715 +46716, O46716 +46717, O46717 +46718, O46718 +46719, O46719 +46720, O46720 +46721, O46721 +46722, O46722 +46723, O46723 +46724, O46724 +46725, O46725 +46726, O46726 +46727, O46727 +46728, O46728 +46729, O46729 +46730, O46730 +46731, O46731 +46732, O46732 +46733, O46733 +46734, O46734 +46735, O46735 +46736, O46736 +46737, O46737 +46738, O46738 +46739, O46739 +46740, O46740 +46741, O46741 +46742, O46742 +46743, O46743 +46744, O46744 +46745, O46745 +46746, O46746 +46747, O46747 +46748, O46748 +46749, O46749 +46750, O46750 +46751, O46751 +46752, O46752 +46753, O46753 +46754, O46754 +46755, O46755 +46756, O46756 +46757, O46757 +46758, O46758 +46759, O46759 +46760, O46760 +46761, O46761 +46762, O46762 +46763, O46763 +46764, O46764 +46765, O46765 +46766, O46766 +46767, O46767 +46768, O46768 +46769, O46769 +46770, O46770 +46771, O46771 +46772, O46772 +46773, O46773 +46774, O46774 +46775, O46775 +46776, O46776 +46777, O46777 +46778, O46778 +46779, O46779 +46780, O46780 +46781, O46781 +46782, O46782 +46783, O46783 +46784, O46784 +46785, O46785 +46786, O46786 +46787, O46787 +46788, O46788 +46789, O46789 +46790, O46790 +46791, O46791 +46792, O46792 +46793, O46793 +46794, O46794 +46795, O46795 +46796, O46796 +46797, O46797 +46798, O46798 +46799, O46799 +46800, O46800 +46801, O46801 +46802, O46802 +46803, O46803 +46804, O46804 +46805, O46805 +46806, O46806 +46807, O46807 +46808, O46808 +46809, O46809 +46810, O46810 +46811, O46811 +46812, O46812 +46813, O46813 +46814, O46814 +46815, O46815 +46816, O46816 +46817, O46817 +46818, O46818 +46819, O46819 +46820, O46820 +46821, O46821 +46822, O46822 +46823, O46823 +46824, O46824 +46825, O46825 +46826, O46826 +46827, O46827 +46828, O46828 +46829, O46829 +46830, O46830 +46831, O46831 +46832, O46832 +46833, O46833 +46834, O46834 +46835, O46835 +46836, O46836 +46837, O46837 +46838, O46838 +46839, O46839 +46840, O46840 +46841, O46841 +46842, O46842 +46843, O46843 +46844, O46844 +46845, O46845 +46846, O46846 +46847, O46847 +46848, O46848 +46849, O46849 +46850, O46850 +46851, O46851 +46852, O46852 +46853, O46853 +46854, O46854 +46855, O46855 +46856, O46856 +46857, O46857 +46858, O46858 +46859, O46859 +46860, O46860 +46861, O46861 +46862, O46862 +46863, O46863 +46864, O46864 +46865, O46865 +46866, O46866 +46867, O46867 +46868, O46868 +46869, O46869 +46870, O46870 +46871, O46871 +46872, O46872 +46873, O46873 +46874, O46874 +46875, O46875 +46876, O46876 +46877, O46877 +46878, O46878 +46879, O46879 +46880, O46880 +46881, O46881 +46882, O46882 +46883, O46883 +46884, O46884 +46885, O46885 +46886, O46886 +46887, O46887 +46888, O46888 +46889, O46889 +46890, O46890 +46891, O46891 +46892, O46892 +46893, O46893 +46894, O46894 +46895, O46895 +46896, O46896 +46897, O46897 +46898, O46898 +46899, O46899 +46900, O46900 +46901, O46901 +46902, O46902 +46903, O46903 +46904, O46904 +46905, O46905 +46906, O46906 +46907, O46907 +46908, O46908 +46909, O46909 +46910, O46910 +46911, O46911 +46912, O46912 +46913, O46913 +46914, O46914 +46915, O46915 +46916, O46916 +46917, O46917 +46918, O46918 +46919, O46919 +46920, O46920 +46921, O46921 +46922, O46922 +46923, O46923 +46924, O46924 +46925, O46925 +46926, O46926 +46927, O46927 +46928, O46928 +46929, O46929 +46930, O46930 +46931, O46931 +46932, O46932 +46933, O46933 +46934, O46934 +46935, O46935 +46936, O46936 +46937, O46937 +46938, O46938 +46939, O46939 +46940, O46940 +46941, O46941 +46942, O46942 +46943, O46943 +46944, O46944 +46945, O46945 +46946, O46946 +46947, O46947 +46948, O46948 +46949, O46949 +46950, O46950 +46951, O46951 +46952, O46952 +46953, O46953 +46954, O46954 +46955, O46955 +46956, O46956 +46957, O46957 +46958, O46958 +46959, O46959 +46960, O46960 +46961, O46961 +46962, O46962 +46963, O46963 +46964, O46964 +46965, O46965 +46966, O46966 +46967, O46967 +46968, O46968 +46969, O46969 +46970, O46970 +46971, O46971 +46972, O46972 +46973, O46973 +46974, O46974 +46975, O46975 +46976, O46976 +46977, O46977 +46978, O46978 +46979, O46979 +46980, O46980 +46981, O46981 +46982, O46982 +46983, O46983 +46984, O46984 +46985, O46985 +46986, O46986 +46987, O46987 +46988, O46988 +46989, O46989 +46990, O46990 +46991, O46991 +46992, O46992 +46993, O46993 +46994, O46994 +46995, O46995 +46996, O46996 +46997, O46997 +46998, O46998 +46999, O46999 +47000, O47000 +47001, O47001 +47002, O47002 +47003, O47003 +47004, O47004 +47005, O47005 +47006, O47006 +47007, O47007 +47008, O47008 +47009, O47009 +47010, O47010 +47011, O47011 +47012, O47012 +47013, O47013 +47014, O47014 +47015, O47015 +47016, O47016 +47017, O47017 +47018, O47018 +47019, O47019 +47020, O47020 +47021, O47021 +47022, O47022 +47023, O47023 +47024, O47024 +47025, O47025 +47026, O47026 +47027, O47027 +47028, O47028 +47029, O47029 +47030, O47030 +47031, O47031 +47032, O47032 +47033, O47033 +47034, O47034 +47035, O47035 +47036, O47036 +47037, O47037 +47038, O47038 +47039, O47039 +47040, O47040 +47041, O47041 +47042, O47042 +47043, O47043 +47044, O47044 +47045, O47045 +47046, O47046 +47047, O47047 +47048, O47048 +47049, O47049 +47050, O47050 +47051, O47051 +47052, O47052 +47053, O47053 +47054, O47054 +47055, O47055 +47056, O47056 +47057, O47057 +47058, O47058 +47059, O47059 +47060, O47060 +47061, O47061 +47062, O47062 +47063, O47063 +47064, O47064 +47065, O47065 +47066, O47066 +47067, O47067 +47068, O47068 +47069, O47069 +47070, O47070 +47071, O47071 +47072, O47072 +47073, O47073 +47074, O47074 +47075, O47075 +47076, O47076 +47077, O47077 +47078, O47078 +47079, O47079 +47080, O47080 +47081, O47081 +47082, O47082 +47083, O47083 +47084, O47084 +47085, O47085 +47086, O47086 +47087, O47087 +47088, O47088 +47089, O47089 +47090, O47090 +47091, O47091 +47092, O47092 +47093, O47093 +47094, O47094 +47095, O47095 +47096, O47096 +47097, O47097 +47098, O47098 +47099, O47099 +47100, O47100 +47101, O47101 +47102, O47102 +47103, O47103 +47104, O47104 +47105, O47105 +47106, O47106 +47107, O47107 +47108, O47108 +47109, O47109 +47110, O47110 +47111, O47111 +47112, O47112 +47113, O47113 +47114, O47114 +47115, O47115 +47116, O47116 +47117, O47117 +47118, O47118 +47119, O47119 +47120, O47120 +47121, O47121 +47122, O47122 +47123, O47123 +47124, O47124 +47125, O47125 +47126, O47126 +47127, O47127 +47128, O47128 +47129, O47129 +47130, O47130 +47131, O47131 +47132, O47132 +47133, O47133 +47134, O47134 +47135, O47135 +47136, O47136 +47137, O47137 +47138, O47138 +47139, O47139 +47140, O47140 +47141, O47141 +47142, O47142 +47143, O47143 +47144, O47144 +47145, O47145 +47146, O47146 +47147, O47147 +47148, O47148 +47149, O47149 +47150, O47150 +47151, O47151 +47152, O47152 +47153, O47153 +47154, O47154 +47155, O47155 +47156, O47156 +47157, O47157 +47158, O47158 +47159, O47159 +47160, O47160 +47161, O47161 +47162, O47162 +47163, O47163 +47164, O47164 +47165, O47165 +47166, O47166 +47167, O47167 +47168, O47168 +47169, O47169 +47170, O47170 +47171, O47171 +47172, O47172 +47173, O47173 +47174, O47174 +47175, O47175 +47176, O47176 +47177, O47177 +47178, O47178 +47179, O47179 +47180, O47180 +47181, O47181 +47182, O47182 +47183, O47183 +47184, O47184 +47185, O47185 +47186, O47186 +47187, O47187 +47188, O47188 +47189, O47189 +47190, O47190 +47191, O47191 +47192, O47192 +47193, O47193 +47194, O47194 +47195, O47195 +47196, O47196 +47197, O47197 +47198, O47198 +47199, O47199 +47200, O47200 +47201, O47201 +47202, O47202 +47203, O47203 +47204, O47204 +47205, O47205 +47206, O47206 +47207, O47207 +47208, O47208 +47209, O47209 +47210, O47210 +47211, O47211 +47212, O47212 +47213, O47213 +47214, O47214 +47215, O47215 +47216, O47216 +47217, O47217 +47218, O47218 +47219, O47219 +47220, O47220 +47221, O47221 +47222, O47222 +47223, O47223 +47224, O47224 +47225, O47225 +47226, O47226 +47227, O47227 +47228, O47228 +47229, O47229 +47230, O47230 +47231, O47231 +47232, O47232 +47233, O47233 +47234, O47234 +47235, O47235 +47236, O47236 +47237, O47237 +47238, O47238 +47239, O47239 +47240, O47240 +47241, O47241 +47242, O47242 +47243, O47243 +47244, O47244 +47245, O47245 +47246, O47246 +47247, O47247 +47248, O47248 +47249, O47249 +47250, O47250 +47251, O47251 +47252, O47252 +47253, O47253 +47254, O47254 +47255, O47255 +47256, O47256 +47257, O47257 +47258, O47258 +47259, O47259 +47260, O47260 +47261, O47261 +47262, O47262 +47263, O47263 +47264, O47264 +47265, O47265 +47266, O47266 +47267, O47267 +47268, O47268 +47269, O47269 +47270, O47270 +47271, O47271 +47272, O47272 +47273, O47273 +47274, O47274 +47275, O47275 +47276, O47276 +47277, O47277 +47278, O47278 +47279, O47279 +47280, O47280 +47281, O47281 +47282, O47282 +47283, O47283 +47284, O47284 +47285, O47285 +47286, O47286 +47287, O47287 +47288, O47288 +47289, O47289 +47290, O47290 +47291, O47291 +47292, O47292 +47293, O47293 +47294, O47294 +47295, O47295 +47296, O47296 +47297, O47297 +47298, O47298 +47299, O47299 +47300, O47300 +47301, O47301 +47302, O47302 +47303, O47303 +47304, O47304 +47305, O47305 +47306, O47306 +47307, O47307 +47308, O47308 +47309, O47309 +47310, O47310 +47311, O47311 +47312, O47312 +47313, O47313 +47314, O47314 +47315, O47315 +47316, O47316 +47317, O47317 +47318, O47318 +47319, O47319 +47320, O47320 +47321, O47321 +47322, O47322 +47323, O47323 +47324, O47324 +47325, O47325 +47326, O47326 +47327, O47327 +47328, O47328 +47329, O47329 +47330, O47330 +47331, O47331 +47332, O47332 +47333, O47333 +47334, O47334 +47335, O47335 +47336, O47336 +47337, O47337 +47338, O47338 +47339, O47339 +47340, O47340 +47341, O47341 +47342, O47342 +47343, O47343 +47344, O47344 +47345, O47345 +47346, O47346 +47347, O47347 +47348, O47348 +47349, O47349 +47350, O47350 +47351, O47351 +47352, O47352 +47353, O47353 +47354, O47354 +47355, O47355 +47356, O47356 +47357, O47357 +47358, O47358 +47359, O47359 +47360, O47360 +47361, O47361 +47362, O47362 +47363, O47363 +47364, O47364 +47365, O47365 +47366, O47366 +47367, O47367 +47368, O47368 +47369, O47369 +47370, O47370 +47371, O47371 +47372, O47372 +47373, O47373 +47374, O47374 +47375, O47375 +47376, O47376 +47377, O47377 +47378, O47378 +47379, O47379 +47380, O47380 +47381, O47381 +47382, O47382 +47383, O47383 +47384, O47384 +47385, O47385 +47386, O47386 +47387, O47387 +47388, O47388 +47389, O47389 +47390, O47390 +47391, O47391 +47392, O47392 +47393, O47393 +47394, O47394 +47395, O47395 +47396, O47396 +47397, O47397 +47398, O47398 +47399, O47399 +47400, O47400 +47401, O47401 +47402, O47402 +47403, O47403 +47404, O47404 +47405, O47405 +47406, O47406 +47407, O47407 +47408, O47408 +47409, O47409 +47410, O47410 +47411, O47411 +47412, O47412 +47413, O47413 +47414, O47414 +47415, O47415 +47416, O47416 +47417, O47417 +47418, O47418 +47419, O47419 +47420, O47420 +47421, O47421 +47422, O47422 +47423, O47423 +47424, O47424 +47425, O47425 +47426, O47426 +47427, O47427 +47428, O47428 +47429, O47429 +47430, O47430 +47431, O47431 +47432, O47432 +47433, O47433 +47434, O47434 +47435, O47435 +47436, O47436 +47437, O47437 +47438, O47438 +47439, O47439 +47440, O47440 +47441, O47441 +47442, O47442 +47443, O47443 +47444, O47444 +47445, O47445 +47446, O47446 +47447, O47447 +47448, O47448 +47449, O47449 +47450, O47450 +47451, O47451 +47452, O47452 +47453, O47453 +47454, O47454 +47455, O47455 +47456, O47456 +47457, O47457 +47458, O47458 +47459, O47459 +47460, O47460 +47461, O47461 +47462, O47462 +47463, O47463 +47464, O47464 +47465, O47465 +47466, O47466 +47467, O47467 +47468, O47468 +47469, O47469 +47470, O47470 +47471, O47471 +47472, O47472 +47473, O47473 +47474, O47474 +47475, O47475 +47476, O47476 +47477, O47477 +47478, O47478 +47479, O47479 +47480, O47480 +47481, O47481 +47482, O47482 +47483, O47483 +47484, O47484 +47485, O47485 +47486, O47486 +47487, O47487 +47488, O47488 +47489, O47489 +47490, O47490 +47491, O47491 +47492, O47492 +47493, O47493 +47494, O47494 +47495, O47495 +47496, O47496 +47497, O47497 +47498, O47498 +47499, O47499 +47500, O47500 +47501, O47501 +47502, O47502 +47503, O47503 +47504, O47504 +47505, O47505 +47506, O47506 +47507, O47507 +47508, O47508 +47509, O47509 +47510, O47510 +47511, O47511 +47512, O47512 +47513, O47513 +47514, O47514 +47515, O47515 +47516, O47516 +47517, O47517 +47518, O47518 +47519, O47519 +47520, O47520 +47521, O47521 +47522, O47522 +47523, O47523 +47524, O47524 +47525, O47525 +47526, O47526 +47527, O47527 +47528, O47528 +47529, O47529 +47530, O47530 +47531, O47531 +47532, O47532 +47533, O47533 +47534, O47534 +47535, O47535 +47536, O47536 +47537, O47537 +47538, O47538 +47539, O47539 +47540, O47540 +47541, O47541 +47542, O47542 +47543, O47543 +47544, O47544 +47545, O47545 +47546, O47546 +47547, O47547 +47548, O47548 +47549, O47549 +47550, O47550 +47551, O47551 +47552, O47552 +47553, O47553 +47554, O47554 +47555, O47555 +47556, O47556 +47557, O47557 +47558, O47558 +47559, O47559 +47560, O47560 +47561, O47561 +47562, O47562 +47563, O47563 +47564, O47564 +47565, O47565 +47566, O47566 +47567, O47567 +47568, O47568 +47569, O47569 +47570, O47570 +47571, O47571 +47572, O47572 +47573, O47573 +47574, O47574 +47575, O47575 +47576, O47576 +47577, O47577 +47578, O47578 +47579, O47579 +47580, O47580 +47581, O47581 +47582, O47582 +47583, O47583 +47584, O47584 +47585, O47585 +47586, O47586 +47587, O47587 +47588, O47588 +47589, O47589 +47590, O47590 +47591, O47591 +47592, O47592 +47593, O47593 +47594, O47594 +47595, O47595 +47596, O47596 +47597, O47597 +47598, O47598 +47599, O47599 +47600, O47600 +47601, O47601 +47602, O47602 +47603, O47603 +47604, O47604 +47605, O47605 +47606, O47606 +47607, O47607 +47608, O47608 +47609, O47609 +47610, O47610 +47611, O47611 +47612, O47612 +47613, O47613 +47614, O47614 +47615, O47615 +47616, O47616 +47617, O47617 +47618, O47618 +47619, O47619 +47620, O47620 +47621, O47621 +47622, O47622 +47623, O47623 +47624, O47624 +47625, O47625 +47626, O47626 +47627, O47627 +47628, O47628 +47629, O47629 +47630, O47630 +47631, O47631 +47632, O47632 +47633, O47633 +47634, O47634 +47635, O47635 +47636, O47636 +47637, O47637 +47638, O47638 +47639, O47639 +47640, O47640 +47641, O47641 +47642, O47642 +47643, O47643 +47644, O47644 +47645, O47645 +47646, O47646 +47647, O47647 +47648, O47648 +47649, O47649 +47650, O47650 +47651, O47651 +47652, O47652 +47653, O47653 +47654, O47654 +47655, O47655 +47656, O47656 +47657, O47657 +47658, O47658 +47659, O47659 +47660, O47660 +47661, O47661 +47662, O47662 +47663, O47663 +47664, O47664 +47665, O47665 +47666, O47666 +47667, O47667 +47668, O47668 +47669, O47669 +47670, O47670 +47671, O47671 +47672, O47672 +47673, O47673 +47674, O47674 +47675, O47675 +47676, O47676 +47677, O47677 +47678, O47678 +47679, O47679 +47680, O47680 +47681, O47681 +47682, O47682 +47683, O47683 +47684, O47684 +47685, O47685 +47686, O47686 +47687, O47687 +47688, O47688 +47689, O47689 +47690, O47690 +47691, O47691 +47692, O47692 +47693, O47693 +47694, O47694 +47695, O47695 +47696, O47696 +47697, O47697 +47698, O47698 +47699, O47699 +47700, O47700 +47701, O47701 +47702, O47702 +47703, O47703 +47704, O47704 +47705, O47705 +47706, O47706 +47707, O47707 +47708, O47708 +47709, O47709 +47710, O47710 +47711, O47711 +47712, O47712 +47713, O47713 +47714, O47714 +47715, O47715 +47716, O47716 +47717, O47717 +47718, O47718 +47719, O47719 +47720, O47720 +47721, O47721 +47722, O47722 +47723, O47723 +47724, O47724 +47725, O47725 +47726, O47726 +47727, O47727 +47728, O47728 +47729, O47729 +47730, O47730 +47731, O47731 +47732, O47732 +47733, O47733 +47734, O47734 +47735, O47735 +47736, O47736 +47737, O47737 +47738, O47738 +47739, O47739 +47740, O47740 +47741, O47741 +47742, O47742 +47743, O47743 +47744, O47744 +47745, O47745 +47746, O47746 +47747, O47747 +47748, O47748 +47749, O47749 +47750, O47750 +47751, O47751 +47752, O47752 +47753, O47753 +47754, O47754 +47755, O47755 +47756, O47756 +47757, O47757 +47758, O47758 +47759, O47759 +47760, O47760 +47761, O47761 +47762, O47762 +47763, O47763 +47764, O47764 +47765, O47765 +47766, O47766 +47767, O47767 +47768, O47768 +47769, O47769 +47770, O47770 +47771, O47771 +47772, O47772 +47773, O47773 +47774, O47774 +47775, O47775 +47776, O47776 +47777, O47777 +47778, O47778 +47779, O47779 +47780, O47780 +47781, O47781 +47782, O47782 +47783, O47783 +47784, O47784 +47785, O47785 +47786, O47786 +47787, O47787 +47788, O47788 +47789, O47789 +47790, O47790 +47791, O47791 +47792, O47792 +47793, O47793 +47794, O47794 +47795, O47795 +47796, O47796 +47797, O47797 +47798, O47798 +47799, O47799 +47800, O47800 +47801, O47801 +47802, O47802 +47803, O47803 +47804, O47804 +47805, O47805 +47806, O47806 +47807, O47807 +47808, O47808 +47809, O47809 +47810, O47810 +47811, O47811 +47812, O47812 +47813, O47813 +47814, O47814 +47815, O47815 +47816, O47816 +47817, O47817 +47818, O47818 +47819, O47819 +47820, O47820 +47821, O47821 +47822, O47822 +47823, O47823 +47824, O47824 +47825, O47825 +47826, O47826 +47827, O47827 +47828, O47828 +47829, O47829 +47830, O47830 +47831, O47831 +47832, O47832 +47833, O47833 +47834, O47834 +47835, O47835 +47836, O47836 +47837, O47837 +47838, O47838 +47839, O47839 +47840, O47840 +47841, O47841 +47842, O47842 +47843, O47843 +47844, O47844 +47845, O47845 +47846, O47846 +47847, O47847 +47848, O47848 +47849, O47849 +47850, O47850 +47851, O47851 +47852, O47852 +47853, O47853 +47854, O47854 +47855, O47855 +47856, O47856 +47857, O47857 +47858, O47858 +47859, O47859 +47860, O47860 +47861, O47861 +47862, O47862 +47863, O47863 +47864, O47864 +47865, O47865 +47866, O47866 +47867, O47867 +47868, O47868 +47869, O47869 +47870, O47870 +47871, O47871 +47872, O47872 +47873, O47873 +47874, O47874 +47875, O47875 +47876, O47876 +47877, O47877 +47878, O47878 +47879, O47879 +47880, O47880 +47881, O47881 +47882, O47882 +47883, O47883 +47884, O47884 +47885, O47885 +47886, O47886 +47887, O47887 +47888, O47888 +47889, O47889 +47890, O47890 +47891, O47891 +47892, O47892 +47893, O47893 +47894, O47894 +47895, O47895 +47896, O47896 +47897, O47897 +47898, O47898 +47899, O47899 +47900, O47900 +47901, O47901 +47902, O47902 +47903, O47903 +47904, O47904 +47905, O47905 +47906, O47906 +47907, O47907 +47908, O47908 +47909, O47909 +47910, O47910 +47911, O47911 +47912, O47912 +47913, O47913 +47914, O47914 +47915, O47915 +47916, O47916 +47917, O47917 +47918, O47918 +47919, O47919 +47920, O47920 +47921, O47921 +47922, O47922 +47923, O47923 +47924, O47924 +47925, O47925 +47926, O47926 +47927, O47927 +47928, O47928 +47929, O47929 +47930, O47930 +47931, O47931 +47932, O47932 +47933, O47933 +47934, O47934 +47935, O47935 +47936, O47936 +47937, O47937 +47938, O47938 +47939, O47939 +47940, O47940 +47941, O47941 +47942, O47942 +47943, O47943 +47944, O47944 +47945, O47945 +47946, O47946 +47947, O47947 +47948, O47948 +47949, O47949 +47950, O47950 +47951, O47951 +47952, O47952 +47953, O47953 +47954, O47954 +47955, O47955 +47956, O47956 +47957, O47957 +47958, O47958 +47959, O47959 +47960, O47960 +47961, O47961 +47962, O47962 +47963, O47963 +47964, O47964 +47965, O47965 +47966, O47966 +47967, O47967 +47968, O47968 +47969, O47969 +47970, O47970 +47971, O47971 +47972, O47972 +47973, O47973 +47974, O47974 +47975, O47975 +47976, O47976 +47977, O47977 +47978, O47978 +47979, O47979 +47980, O47980 +47981, O47981 +47982, O47982 +47983, O47983 +47984, O47984 +47985, O47985 +47986, O47986 +47987, O47987 +47988, O47988 +47989, O47989 +47990, O47990 +47991, O47991 +47992, O47992 +47993, O47993 +47994, O47994 +47995, O47995 +47996, O47996 +47997, O47997 +47998, O47998 +47999, O47999 +48000, O48000 +48001, O48001 +48002, O48002 +48003, O48003 +48004, O48004 +48005, O48005 +48006, O48006 +48007, O48007 +48008, O48008 +48009, O48009 +48010, O48010 +48011, O48011 +48012, O48012 +48013, O48013 +48014, O48014 +48015, O48015 +48016, O48016 +48017, O48017 +48018, O48018 +48019, O48019 +48020, O48020 +48021, O48021 +48022, O48022 +48023, O48023 +48024, O48024 +48025, O48025 +48026, O48026 +48027, O48027 +48028, O48028 +48029, O48029 +48030, O48030 +48031, O48031 +48032, O48032 +48033, O48033 +48034, O48034 +48035, O48035 +48036, O48036 +48037, O48037 +48038, O48038 +48039, O48039 +48040, O48040 +48041, O48041 +48042, O48042 +48043, O48043 +48044, O48044 +48045, O48045 +48046, O48046 +48047, O48047 +48048, O48048 +48049, O48049 +48050, O48050 +48051, O48051 +48052, O48052 +48053, O48053 +48054, O48054 +48055, O48055 +48056, O48056 +48057, O48057 +48058, O48058 +48059, O48059 +48060, O48060 +48061, O48061 +48062, O48062 +48063, O48063 +48064, O48064 +48065, O48065 +48066, O48066 +48067, O48067 +48068, O48068 +48069, O48069 +48070, O48070 +48071, O48071 +48072, O48072 +48073, O48073 +48074, O48074 +48075, O48075 +48076, O48076 +48077, O48077 +48078, O48078 +48079, O48079 +48080, O48080 +48081, O48081 +48082, O48082 +48083, O48083 +48084, O48084 +48085, O48085 +48086, O48086 +48087, O48087 +48088, O48088 +48089, O48089 +48090, O48090 +48091, O48091 +48092, O48092 +48093, O48093 +48094, O48094 +48095, O48095 +48096, O48096 +48097, O48097 +48098, O48098 +48099, O48099 +48100, O48100 +48101, O48101 +48102, O48102 +48103, O48103 +48104, O48104 +48105, O48105 +48106, O48106 +48107, O48107 +48108, O48108 +48109, O48109 +48110, O48110 +48111, O48111 +48112, O48112 +48113, O48113 +48114, O48114 +48115, O48115 +48116, O48116 +48117, O48117 +48118, O48118 +48119, O48119 +48120, O48120 +48121, O48121 +48122, O48122 +48123, O48123 +48124, O48124 +48125, O48125 +48126, O48126 +48127, O48127 +48128, O48128 +48129, O48129 +48130, O48130 +48131, O48131 +48132, O48132 +48133, O48133 +48134, O48134 +48135, O48135 +48136, O48136 +48137, O48137 +48138, O48138 +48139, O48139 +48140, O48140 +48141, O48141 +48142, O48142 +48143, O48143 +48144, O48144 +48145, O48145 +48146, O48146 +48147, O48147 +48148, O48148 +48149, O48149 +48150, O48150 +48151, O48151 +48152, O48152 +48153, O48153 +48154, O48154 +48155, O48155 +48156, O48156 +48157, O48157 +48158, O48158 +48159, O48159 +48160, O48160 +48161, O48161 +48162, O48162 +48163, O48163 +48164, O48164 +48165, O48165 +48166, O48166 +48167, O48167 +48168, O48168 +48169, O48169 +48170, O48170 +48171, O48171 +48172, O48172 +48173, O48173 +48174, O48174 +48175, O48175 +48176, O48176 +48177, O48177 +48178, O48178 +48179, O48179 +48180, O48180 +48181, O48181 +48182, O48182 +48183, O48183 +48184, O48184 +48185, O48185 +48186, O48186 +48187, O48187 +48188, O48188 +48189, O48189 +48190, O48190 +48191, O48191 +48192, O48192 +48193, O48193 +48194, O48194 +48195, O48195 +48196, O48196 +48197, O48197 +48198, O48198 +48199, O48199 +48200, O48200 +48201, O48201 +48202, O48202 +48203, O48203 +48204, O48204 +48205, O48205 +48206, O48206 +48207, O48207 +48208, O48208 +48209, O48209 +48210, O48210 +48211, O48211 +48212, O48212 +48213, O48213 +48214, O48214 +48215, O48215 +48216, O48216 +48217, O48217 +48218, O48218 +48219, O48219 +48220, O48220 +48221, O48221 +48222, O48222 +48223, O48223 +48224, O48224 +48225, O48225 +48226, O48226 +48227, O48227 +48228, O48228 +48229, O48229 +48230, O48230 +48231, O48231 +48232, O48232 +48233, O48233 +48234, O48234 +48235, O48235 +48236, O48236 +48237, O48237 +48238, O48238 +48239, O48239 +48240, O48240 +48241, O48241 +48242, O48242 +48243, O48243 +48244, O48244 +48245, O48245 +48246, O48246 +48247, O48247 +48248, O48248 +48249, O48249 +48250, O48250 +48251, O48251 +48252, O48252 +48253, O48253 +48254, O48254 +48255, O48255 +48256, O48256 +48257, O48257 +48258, O48258 +48259, O48259 +48260, O48260 +48261, O48261 +48262, O48262 +48263, O48263 +48264, O48264 +48265, O48265 +48266, O48266 +48267, O48267 +48268, O48268 +48269, O48269 +48270, O48270 +48271, O48271 +48272, O48272 +48273, O48273 +48274, O48274 +48275, O48275 +48276, O48276 +48277, O48277 +48278, O48278 +48279, O48279 +48280, O48280 +48281, O48281 +48282, O48282 +48283, O48283 +48284, O48284 +48285, O48285 +48286, O48286 +48287, O48287 +48288, O48288 +48289, O48289 +48290, O48290 +48291, O48291 +48292, O48292 +48293, O48293 +48294, O48294 +48295, O48295 +48296, O48296 +48297, O48297 +48298, O48298 +48299, O48299 +48300, O48300 +48301, O48301 +48302, O48302 +48303, O48303 +48304, O48304 +48305, O48305 +48306, O48306 +48307, O48307 +48308, O48308 +48309, O48309 +48310, O48310 +48311, O48311 +48312, O48312 +48313, O48313 +48314, O48314 +48315, O48315 +48316, O48316 +48317, O48317 +48318, O48318 +48319, O48319 +48320, O48320 +48321, O48321 +48322, O48322 +48323, O48323 +48324, O48324 +48325, O48325 +48326, O48326 +48327, O48327 +48328, O48328 +48329, O48329 +48330, O48330 +48331, O48331 +48332, O48332 +48333, O48333 +48334, O48334 +48335, O48335 +48336, O48336 +48337, O48337 +48338, O48338 +48339, O48339 +48340, O48340 +48341, O48341 +48342, O48342 +48343, O48343 +48344, O48344 +48345, O48345 +48346, O48346 +48347, O48347 +48348, O48348 +48349, O48349 +48350, O48350 +48351, O48351 +48352, O48352 +48353, O48353 +48354, O48354 +48355, O48355 +48356, O48356 +48357, O48357 +48358, O48358 +48359, O48359 +48360, O48360 +48361, O48361 +48362, O48362 +48363, O48363 +48364, O48364 +48365, O48365 +48366, O48366 +48367, O48367 +48368, O48368 +48369, O48369 +48370, O48370 +48371, O48371 +48372, O48372 +48373, O48373 +48374, O48374 +48375, O48375 +48376, O48376 +48377, O48377 +48378, O48378 +48379, O48379 +48380, O48380 +48381, O48381 +48382, O48382 +48383, O48383 +48384, O48384 +48385, O48385 +48386, O48386 +48387, O48387 +48388, O48388 +48389, O48389 +48390, O48390 +48391, O48391 +48392, O48392 +48393, O48393 +48394, O48394 +48395, O48395 +48396, O48396 +48397, O48397 +48398, O48398 +48399, O48399 +48400, O48400 +48401, O48401 +48402, O48402 +48403, O48403 +48404, O48404 +48405, O48405 +48406, O48406 +48407, O48407 +48408, O48408 +48409, O48409 +48410, O48410 +48411, O48411 +48412, O48412 +48413, O48413 +48414, O48414 +48415, O48415 +48416, O48416 +48417, O48417 +48418, O48418 +48419, O48419 +48420, O48420 +48421, O48421 +48422, O48422 +48423, O48423 +48424, O48424 +48425, O48425 +48426, O48426 +48427, O48427 +48428, O48428 +48429, O48429 +48430, O48430 +48431, O48431 +48432, O48432 +48433, O48433 +48434, O48434 +48435, O48435 +48436, O48436 +48437, O48437 +48438, O48438 +48439, O48439 +48440, O48440 +48441, O48441 +48442, O48442 +48443, O48443 +48444, O48444 +48445, O48445 +48446, O48446 +48447, O48447 +48448, O48448 +48449, O48449 +48450, O48450 +48451, O48451 +48452, O48452 +48453, O48453 +48454, O48454 +48455, O48455 +48456, O48456 +48457, O48457 +48458, O48458 +48459, O48459 +48460, O48460 +48461, O48461 +48462, O48462 +48463, O48463 +48464, O48464 +48465, O48465 +48466, O48466 +48467, O48467 +48468, O48468 +48469, O48469 +48470, O48470 +48471, O48471 +48472, O48472 +48473, O48473 +48474, O48474 +48475, O48475 +48476, O48476 +48477, O48477 +48478, O48478 +48479, O48479 +48480, O48480 +48481, O48481 +48482, O48482 +48483, O48483 +48484, O48484 +48485, O48485 +48486, O48486 +48487, O48487 +48488, O48488 +48489, O48489 +48490, O48490 +48491, O48491 +48492, O48492 +48493, O48493 +48494, O48494 +48495, O48495 +48496, O48496 +48497, O48497 +48498, O48498 +48499, O48499 +48500, O48500 +48501, O48501 +48502, O48502 +48503, O48503 +48504, O48504 +48505, O48505 +48506, O48506 +48507, O48507 +48508, O48508 +48509, O48509 +48510, O48510 +48511, O48511 +48512, O48512 +48513, O48513 +48514, O48514 +48515, O48515 +48516, O48516 +48517, O48517 +48518, O48518 +48519, O48519 +48520, O48520 +48521, O48521 +48522, O48522 +48523, O48523 +48524, O48524 +48525, O48525 +48526, O48526 +48527, O48527 +48528, O48528 +48529, O48529 +48530, O48530 +48531, O48531 +48532, O48532 +48533, O48533 +48534, O48534 +48535, O48535 +48536, O48536 +48537, O48537 +48538, O48538 +48539, O48539 +48540, O48540 +48541, O48541 +48542, O48542 +48543, O48543 +48544, O48544 +48545, O48545 +48546, O48546 +48547, O48547 +48548, O48548 +48549, O48549 +48550, O48550 +48551, O48551 +48552, O48552 +48553, O48553 +48554, O48554 +48555, O48555 +48556, O48556 +48557, O48557 +48558, O48558 +48559, O48559 +48560, O48560 +48561, O48561 +48562, O48562 +48563, O48563 +48564, O48564 +48565, O48565 +48566, O48566 +48567, O48567 +48568, O48568 +48569, O48569 +48570, O48570 +48571, O48571 +48572, O48572 +48573, O48573 +48574, O48574 +48575, O48575 +48576, O48576 +48577, O48577 +48578, O48578 +48579, O48579 +48580, O48580 +48581, O48581 +48582, O48582 +48583, O48583 +48584, O48584 +48585, O48585 +48586, O48586 +48587, O48587 +48588, O48588 +48589, O48589 +48590, O48590 +48591, O48591 +48592, O48592 +48593, O48593 +48594, O48594 +48595, O48595 +48596, O48596 +48597, O48597 +48598, O48598 +48599, O48599 +48600, O48600 +48601, O48601 +48602, O48602 +48603, O48603 +48604, O48604 +48605, O48605 +48606, O48606 +48607, O48607 +48608, O48608 +48609, O48609 +48610, O48610 +48611, O48611 +48612, O48612 +48613, O48613 +48614, O48614 +48615, O48615 +48616, O48616 +48617, O48617 +48618, O48618 +48619, O48619 +48620, O48620 +48621, O48621 +48622, O48622 +48623, O48623 +48624, O48624 +48625, O48625 +48626, O48626 +48627, O48627 +48628, O48628 +48629, O48629 +48630, O48630 +48631, O48631 +48632, O48632 +48633, O48633 +48634, O48634 +48635, O48635 +48636, O48636 +48637, O48637 +48638, O48638 +48639, O48639 +48640, O48640 +48641, O48641 +48642, O48642 +48643, O48643 +48644, O48644 +48645, O48645 +48646, O48646 +48647, O48647 +48648, O48648 +48649, O48649 +48650, O48650 +48651, O48651 +48652, O48652 +48653, O48653 +48654, O48654 +48655, O48655 +48656, O48656 +48657, O48657 +48658, O48658 +48659, O48659 +48660, O48660 +48661, O48661 +48662, O48662 +48663, O48663 +48664, O48664 +48665, O48665 +48666, O48666 +48667, O48667 +48668, O48668 +48669, O48669 +48670, O48670 +48671, O48671 +48672, O48672 +48673, O48673 +48674, O48674 +48675, O48675 +48676, O48676 +48677, O48677 +48678, O48678 +48679, O48679 +48680, O48680 +48681, O48681 +48682, O48682 +48683, O48683 +48684, O48684 +48685, O48685 +48686, O48686 +48687, O48687 +48688, O48688 +48689, O48689 +48690, O48690 +48691, O48691 +48692, O48692 +48693, O48693 +48694, O48694 +48695, O48695 +48696, O48696 +48697, O48697 +48698, O48698 +48699, O48699 +48700, O48700 +48701, O48701 +48702, O48702 +48703, O48703 +48704, O48704 +48705, O48705 +48706, O48706 +48707, O48707 +48708, O48708 +48709, O48709 +48710, O48710 +48711, O48711 +48712, O48712 +48713, O48713 +48714, O48714 +48715, O48715 +48716, O48716 +48717, O48717 +48718, O48718 +48719, O48719 +48720, O48720 +48721, O48721 +48722, O48722 +48723, O48723 +48724, O48724 +48725, O48725 +48726, O48726 +48727, O48727 +48728, O48728 +48729, O48729 +48730, O48730 +48731, O48731 +48732, O48732 +48733, O48733 +48734, O48734 +48735, O48735 +48736, O48736 +48737, O48737 +48738, O48738 +48739, O48739 +48740, O48740 +48741, O48741 +48742, O48742 +48743, O48743 +48744, O48744 +48745, O48745 +48746, O48746 +48747, O48747 +48748, O48748 +48749, O48749 +48750, O48750 +48751, O48751 +48752, O48752 +48753, O48753 +48754, O48754 +48755, O48755 +48756, O48756 +48757, O48757 +48758, O48758 +48759, O48759 +48760, O48760 +48761, O48761 +48762, O48762 +48763, O48763 +48764, O48764 +48765, O48765 +48766, O48766 +48767, O48767 +48768, O48768 +48769, O48769 +48770, O48770 +48771, O48771 +48772, O48772 +48773, O48773 +48774, O48774 +48775, O48775 +48776, O48776 +48777, O48777 +48778, O48778 +48779, O48779 +48780, O48780 +48781, O48781 +48782, O48782 +48783, O48783 +48784, O48784 +48785, O48785 +48786, O48786 +48787, O48787 +48788, O48788 +48789, O48789 +48790, O48790 +48791, O48791 +48792, O48792 +48793, O48793 +48794, O48794 +48795, O48795 +48796, O48796 +48797, O48797 +48798, O48798 +48799, O48799 +48800, O48800 +48801, O48801 +48802, O48802 +48803, O48803 +48804, O48804 +48805, O48805 +48806, O48806 +48807, O48807 +48808, O48808 +48809, O48809 +48810, O48810 +48811, O48811 +48812, O48812 +48813, O48813 +48814, O48814 +48815, O48815 +48816, O48816 +48817, O48817 +48818, O48818 +48819, O48819 +48820, O48820 +48821, O48821 +48822, O48822 +48823, O48823 +48824, O48824 +48825, O48825 +48826, O48826 +48827, O48827 +48828, O48828 +48829, O48829 +48830, O48830 +48831, O48831 +48832, O48832 +48833, O48833 +48834, O48834 +48835, O48835 +48836, O48836 +48837, O48837 +48838, O48838 +48839, O48839 +48840, O48840 +48841, O48841 +48842, O48842 +48843, O48843 +48844, O48844 +48845, O48845 +48846, O48846 +48847, O48847 +48848, O48848 +48849, O48849 +48850, O48850 +48851, O48851 +48852, O48852 +48853, O48853 +48854, O48854 +48855, O48855 +48856, O48856 +48857, O48857 +48858, O48858 +48859, O48859 +48860, O48860 +48861, O48861 +48862, O48862 +48863, O48863 +48864, O48864 +48865, O48865 +48866, O48866 +48867, O48867 +48868, O48868 +48869, O48869 +48870, O48870 +48871, O48871 +48872, O48872 +48873, O48873 +48874, O48874 +48875, O48875 +48876, O48876 +48877, O48877 +48878, O48878 +48879, O48879 +48880, O48880 +48881, O48881 +48882, O48882 +48883, O48883 +48884, O48884 +48885, O48885 +48886, O48886 +48887, O48887 +48888, O48888 +48889, O48889 +48890, O48890 +48891, O48891 +48892, O48892 +48893, O48893 +48894, O48894 +48895, O48895 +48896, O48896 +48897, O48897 +48898, O48898 +48899, O48899 +48900, O48900 +48901, O48901 +48902, O48902 +48903, O48903 +48904, O48904 +48905, O48905 +48906, O48906 +48907, O48907 +48908, O48908 +48909, O48909 +48910, O48910 +48911, O48911 +48912, O48912 +48913, O48913 +48914, O48914 +48915, O48915 +48916, O48916 +48917, O48917 +48918, O48918 +48919, O48919 +48920, O48920 +48921, O48921 +48922, O48922 +48923, O48923 +48924, O48924 +48925, O48925 +48926, O48926 +48927, O48927 +48928, O48928 +48929, O48929 +48930, O48930 +48931, O48931 +48932, O48932 +48933, O48933 +48934, O48934 +48935, O48935 +48936, O48936 +48937, O48937 +48938, O48938 +48939, O48939 +48940, O48940 +48941, O48941 +48942, O48942 +48943, O48943 +48944, O48944 +48945, O48945 +48946, O48946 +48947, O48947 +48948, O48948 +48949, O48949 +48950, O48950 +48951, O48951 +48952, O48952 +48953, O48953 +48954, O48954 +48955, O48955 +48956, O48956 +48957, O48957 +48958, O48958 +48959, O48959 +48960, O48960 +48961, O48961 +48962, O48962 +48963, O48963 +48964, O48964 +48965, O48965 +48966, O48966 +48967, O48967 +48968, O48968 +48969, O48969 +48970, O48970 +48971, O48971 +48972, O48972 +48973, O48973 +48974, O48974 +48975, O48975 +48976, O48976 +48977, O48977 +48978, O48978 +48979, O48979 +48980, O48980 +48981, O48981 +48982, O48982 +48983, O48983 +48984, O48984 +48985, O48985 +48986, O48986 +48987, O48987 +48988, O48988 +48989, O48989 +48990, O48990 +48991, O48991 +48992, O48992 +48993, O48993 +48994, O48994 +48995, O48995 +48996, O48996 +48997, O48997 +48998, O48998 +48999, O48999 +49000, O49000 +49001, O49001 +49002, O49002 +49003, O49003 +49004, O49004 +49005, O49005 +49006, O49006 +49007, O49007 +49008, O49008 +49009, O49009 +49010, O49010 +49011, O49011 +49012, O49012 +49013, O49013 +49014, O49014 +49015, O49015 +49016, O49016 +49017, O49017 +49018, O49018 +49019, O49019 +49020, O49020 +49021, O49021 +49022, O49022 +49023, O49023 +49024, O49024 +49025, O49025 +49026, O49026 +49027, O49027 +49028, O49028 +49029, O49029 +49030, O49030 +49031, O49031 +49032, O49032 +49033, O49033 +49034, O49034 +49035, O49035 +49036, O49036 +49037, O49037 +49038, O49038 +49039, O49039 +49040, O49040 +49041, O49041 +49042, O49042 +49043, O49043 +49044, O49044 +49045, O49045 +49046, O49046 +49047, O49047 +49048, O49048 +49049, O49049 +49050, O49050 +49051, O49051 +49052, O49052 +49053, O49053 +49054, O49054 +49055, O49055 +49056, O49056 +49057, O49057 +49058, O49058 +49059, O49059 +49060, O49060 +49061, O49061 +49062, O49062 +49063, O49063 +49064, O49064 +49065, O49065 +49066, O49066 +49067, O49067 +49068, O49068 +49069, O49069 +49070, O49070 +49071, O49071 +49072, O49072 +49073, O49073 +49074, O49074 +49075, O49075 +49076, O49076 +49077, O49077 +49078, O49078 +49079, O49079 +49080, O49080 +49081, O49081 +49082, O49082 +49083, O49083 +49084, O49084 +49085, O49085 +49086, O49086 +49087, O49087 +49088, O49088 +49089, O49089 +49090, O49090 +49091, O49091 +49092, O49092 +49093, O49093 +49094, O49094 +49095, O49095 +49096, O49096 +49097, O49097 +49098, O49098 +49099, O49099 +49100, O49100 +49101, O49101 +49102, O49102 +49103, O49103 +49104, O49104 +49105, O49105 +49106, O49106 +49107, O49107 +49108, O49108 +49109, O49109 +49110, O49110 +49111, O49111 +49112, O49112 +49113, O49113 +49114, O49114 +49115, O49115 +49116, O49116 +49117, O49117 +49118, O49118 +49119, O49119 +49120, O49120 +49121, O49121 +49122, O49122 +49123, O49123 +49124, O49124 +49125, O49125 +49126, O49126 +49127, O49127 +49128, O49128 +49129, O49129 +49130, O49130 +49131, O49131 +49132, O49132 +49133, O49133 +49134, O49134 +49135, O49135 +49136, O49136 +49137, O49137 +49138, O49138 +49139, O49139 +49140, O49140 +49141, O49141 +49142, O49142 +49143, O49143 +49144, O49144 +49145, O49145 +49146, O49146 +49147, O49147 +49148, O49148 +49149, O49149 +49150, O49150 +49151, O49151 +49152, O49152 +49153, O49153 +49154, O49154 +49155, O49155 +49156, O49156 +49157, O49157 +49158, O49158 +49159, O49159 +49160, O49160 +49161, O49161 +49162, O49162 +49163, O49163 +49164, O49164 +49165, O49165 +49166, O49166 +49167, O49167 +49168, O49168 +49169, O49169 +49170, O49170 +49171, O49171 +49172, O49172 +49173, O49173 +49174, O49174 +49175, O49175 +49176, O49176 +49177, O49177 +49178, O49178 +49179, O49179 +49180, O49180 +49181, O49181 +49182, O49182 +49183, O49183 +49184, O49184 +49185, O49185 +49186, O49186 +49187, O49187 +49188, O49188 +49189, O49189 +49190, O49190 +49191, O49191 +49192, O49192 +49193, O49193 +49194, O49194 +49195, O49195 +49196, O49196 +49197, O49197 +49198, O49198 +49199, O49199 +49200, O49200 +49201, O49201 +49202, O49202 +49203, O49203 +49204, O49204 +49205, O49205 +49206, O49206 +49207, O49207 +49208, O49208 +49209, O49209 +49210, O49210 +49211, O49211 +49212, O49212 +49213, O49213 +49214, O49214 +49215, O49215 +49216, O49216 +49217, O49217 +49218, O49218 +49219, O49219 +49220, O49220 +49221, O49221 +49222, O49222 +49223, O49223 +49224, O49224 +49225, O49225 +49226, O49226 +49227, O49227 +49228, O49228 +49229, O49229 +49230, O49230 +49231, O49231 +49232, O49232 +49233, O49233 +49234, O49234 +49235, O49235 +49236, O49236 +49237, O49237 +49238, O49238 +49239, O49239 +49240, O49240 +49241, O49241 +49242, O49242 +49243, O49243 +49244, O49244 +49245, O49245 +49246, O49246 +49247, O49247 +49248, O49248 +49249, O49249 +49250, O49250 +49251, O49251 +49252, O49252 +49253, O49253 +49254, O49254 +49255, O49255 +49256, O49256 +49257, O49257 +49258, O49258 +49259, O49259 +49260, O49260 +49261, O49261 +49262, O49262 +49263, O49263 +49264, O49264 +49265, O49265 +49266, O49266 +49267, O49267 +49268, O49268 +49269, O49269 +49270, O49270 +49271, O49271 +49272, O49272 +49273, O49273 +49274, O49274 +49275, O49275 +49276, O49276 +49277, O49277 +49278, O49278 +49279, O49279 +49280, O49280 +49281, O49281 +49282, O49282 +49283, O49283 +49284, O49284 +49285, O49285 +49286, O49286 +49287, O49287 +49288, O49288 +49289, O49289 +49290, O49290 +49291, O49291 +49292, O49292 +49293, O49293 +49294, O49294 +49295, O49295 +49296, O49296 +49297, O49297 +49298, O49298 +49299, O49299 +49300, O49300 +49301, O49301 +49302, O49302 +49303, O49303 +49304, O49304 +49305, O49305 +49306, O49306 +49307, O49307 +49308, O49308 +49309, O49309 +49310, O49310 +49311, O49311 +49312, O49312 +49313, O49313 +49314, O49314 +49315, O49315 +49316, O49316 +49317, O49317 +49318, O49318 +49319, O49319 +49320, O49320 +49321, O49321 +49322, O49322 +49323, O49323 +49324, O49324 +49325, O49325 +49326, O49326 +49327, O49327 +49328, O49328 +49329, O49329 +49330, O49330 +49331, O49331 +49332, O49332 +49333, O49333 +49334, O49334 +49335, O49335 +49336, O49336 +49337, O49337 +49338, O49338 +49339, O49339 +49340, O49340 +49341, O49341 +49342, O49342 +49343, O49343 +49344, O49344 +49345, O49345 +49346, O49346 +49347, O49347 +49348, O49348 +49349, O49349 +49350, O49350 +49351, O49351 +49352, O49352 +49353, O49353 +49354, O49354 +49355, O49355 +49356, O49356 +49357, O49357 +49358, O49358 +49359, O49359 +49360, O49360 +49361, O49361 +49362, O49362 +49363, O49363 +49364, O49364 +49365, O49365 +49366, O49366 +49367, O49367 +49368, O49368 +49369, O49369 +49370, O49370 +49371, O49371 +49372, O49372 +49373, O49373 +49374, O49374 +49375, O49375 +49376, O49376 +49377, O49377 +49378, O49378 +49379, O49379 +49380, O49380 +49381, O49381 +49382, O49382 +49383, O49383 +49384, O49384 +49385, O49385 +49386, O49386 +49387, O49387 +49388, O49388 +49389, O49389 +49390, O49390 +49391, O49391 +49392, O49392 +49393, O49393 +49394, O49394 +49395, O49395 +49396, O49396 +49397, O49397 +49398, O49398 +49399, O49399 +49400, O49400 +49401, O49401 +49402, O49402 +49403, O49403 +49404, O49404 +49405, O49405 +49406, O49406 +49407, O49407 +49408, O49408 +49409, O49409 +49410, O49410 +49411, O49411 +49412, O49412 +49413, O49413 +49414, O49414 +49415, O49415 +49416, O49416 +49417, O49417 +49418, O49418 +49419, O49419 +49420, O49420 +49421, O49421 +49422, O49422 +49423, O49423 +49424, O49424 +49425, O49425 +49426, O49426 +49427, O49427 +49428, O49428 +49429, O49429 +49430, O49430 +49431, O49431 +49432, O49432 +49433, O49433 +49434, O49434 +49435, O49435 +49436, O49436 +49437, O49437 +49438, O49438 +49439, O49439 +49440, O49440 +49441, O49441 +49442, O49442 +49443, O49443 +49444, O49444 +49445, O49445 +49446, O49446 +49447, O49447 +49448, O49448 +49449, O49449 +49450, O49450 +49451, O49451 +49452, O49452 +49453, O49453 +49454, O49454 +49455, O49455 +49456, O49456 +49457, O49457 +49458, O49458 +49459, O49459 +49460, O49460 +49461, O49461 +49462, O49462 +49463, O49463 +49464, O49464 +49465, O49465 +49466, O49466 +49467, O49467 +49468, O49468 +49469, O49469 +49470, O49470 +49471, O49471 +49472, O49472 +49473, O49473 +49474, O49474 +49475, O49475 +49476, O49476 +49477, O49477 +49478, O49478 +49479, O49479 +49480, O49480 +49481, O49481 +49482, O49482 +49483, O49483 +49484, O49484 +49485, O49485 +49486, O49486 +49487, O49487 +49488, O49488 +49489, O49489 +49490, O49490 +49491, O49491 +49492, O49492 +49493, O49493 +49494, O49494 +49495, O49495 +49496, O49496 +49497, O49497 +49498, O49498 +49499, O49499 +49500, O49500 +49501, O49501 +49502, O49502 +49503, O49503 +49504, O49504 +49505, O49505 +49506, O49506 +49507, O49507 +49508, O49508 +49509, O49509 +49510, O49510 +49511, O49511 +49512, O49512 +49513, O49513 +49514, O49514 +49515, O49515 +49516, O49516 +49517, O49517 +49518, O49518 +49519, O49519 +49520, O49520 +49521, O49521 +49522, O49522 +49523, O49523 +49524, O49524 +49525, O49525 +49526, O49526 +49527, O49527 +49528, O49528 +49529, O49529 +49530, O49530 +49531, O49531 +49532, O49532 +49533, O49533 +49534, O49534 +49535, O49535 +49536, O49536 +49537, O49537 +49538, O49538 +49539, O49539 +49540, O49540 +49541, O49541 +49542, O49542 +49543, O49543 +49544, O49544 +49545, O49545 +49546, O49546 +49547, O49547 +49548, O49548 +49549, O49549 +49550, O49550 +49551, O49551 +49552, O49552 +49553, O49553 +49554, O49554 +49555, O49555 +49556, O49556 +49557, O49557 +49558, O49558 +49559, O49559 +49560, O49560 +49561, O49561 +49562, O49562 +49563, O49563 +49564, O49564 +49565, O49565 +49566, O49566 +49567, O49567 +49568, O49568 +49569, O49569 +49570, O49570 +49571, O49571 +49572, O49572 +49573, O49573 +49574, O49574 +49575, O49575 +49576, O49576 +49577, O49577 +49578, O49578 +49579, O49579 +49580, O49580 +49581, O49581 +49582, O49582 +49583, O49583 +49584, O49584 +49585, O49585 +49586, O49586 +49587, O49587 +49588, O49588 +49589, O49589 +49590, O49590 +49591, O49591 +49592, O49592 +49593, O49593 +49594, O49594 +49595, O49595 +49596, O49596 +49597, O49597 +49598, O49598 +49599, O49599 +49600, O49600 +49601, O49601 +49602, O49602 +49603, O49603 +49604, O49604 +49605, O49605 +49606, O49606 +49607, O49607 +49608, O49608 +49609, O49609 +49610, O49610 +49611, O49611 +49612, O49612 +49613, O49613 +49614, O49614 +49615, O49615 +49616, O49616 +49617, O49617 +49618, O49618 +49619, O49619 +49620, O49620 +49621, O49621 +49622, O49622 +49623, O49623 +49624, O49624 +49625, O49625 +49626, O49626 +49627, O49627 +49628, O49628 +49629, O49629 +49630, O49630 +49631, O49631 +49632, O49632 +49633, O49633 +49634, O49634 +49635, O49635 +49636, O49636 +49637, O49637 +49638, O49638 +49639, O49639 +49640, O49640 +49641, O49641 +49642, O49642 +49643, O49643 +49644, O49644 +49645, O49645 +49646, O49646 +49647, O49647 +49648, O49648 +49649, O49649 +49650, O49650 +49651, O49651 +49652, O49652 +49653, O49653 +49654, O49654 +49655, O49655 +49656, O49656 +49657, O49657 +49658, O49658 +49659, O49659 +49660, O49660 +49661, O49661 +49662, O49662 +49663, O49663 +49664, O49664 +49665, O49665 +49666, O49666 +49667, O49667 +49668, O49668 +49669, O49669 +49670, O49670 +49671, O49671 +49672, O49672 +49673, O49673 +49674, O49674 +49675, O49675 +49676, O49676 +49677, O49677 +49678, O49678 +49679, O49679 +49680, O49680 +49681, O49681 +49682, O49682 +49683, O49683 +49684, O49684 +49685, O49685 +49686, O49686 +49687, O49687 +49688, O49688 +49689, O49689 +49690, O49690 +49691, O49691 +49692, O49692 +49693, O49693 +49694, O49694 +49695, O49695 +49696, O49696 +49697, O49697 +49698, O49698 +49699, O49699 +49700, O49700 +49701, O49701 +49702, O49702 +49703, O49703 +49704, O49704 +49705, O49705 +49706, O49706 +49707, O49707 +49708, O49708 +49709, O49709 +49710, O49710 +49711, O49711 +49712, O49712 +49713, O49713 +49714, O49714 +49715, O49715 +49716, O49716 +49717, O49717 +49718, O49718 +49719, O49719 +49720, O49720 +49721, O49721 +49722, O49722 +49723, O49723 +49724, O49724 +49725, O49725 +49726, O49726 +49727, O49727 +49728, O49728 +49729, O49729 +49730, O49730 +49731, O49731 +49732, O49732 +49733, O49733 +49734, O49734 +49735, O49735 +49736, O49736 +49737, O49737 +49738, O49738 +49739, O49739 +49740, O49740 +49741, O49741 +49742, O49742 +49743, O49743 +49744, O49744 +49745, O49745 +49746, O49746 +49747, O49747 +49748, O49748 +49749, O49749 +49750, O49750 +49751, O49751 +49752, O49752 +49753, O49753 +49754, O49754 +49755, O49755 +49756, O49756 +49757, O49757 +49758, O49758 +49759, O49759 +49760, O49760 +49761, O49761 +49762, O49762 +49763, O49763 +49764, O49764 +49765, O49765 +49766, O49766 +49767, O49767 +49768, O49768 +49769, O49769 +49770, O49770 +49771, O49771 +49772, O49772 +49773, O49773 +49774, O49774 +49775, O49775 +49776, O49776 +49777, O49777 +49778, O49778 +49779, O49779 +49780, O49780 +49781, O49781 +49782, O49782 +49783, O49783 +49784, O49784 +49785, O49785 +49786, O49786 +49787, O49787 +49788, O49788 +49789, O49789 +49790, O49790 +49791, O49791 +49792, O49792 +49793, O49793 +49794, O49794 +49795, O49795 +49796, O49796 +49797, O49797 +49798, O49798 +49799, O49799 +49800, O49800 +49801, O49801 +49802, O49802 +49803, O49803 +49804, O49804 +49805, O49805 +49806, O49806 +49807, O49807 +49808, O49808 +49809, O49809 +49810, O49810 +49811, O49811 +49812, O49812 +49813, O49813 +49814, O49814 +49815, O49815 +49816, O49816 +49817, O49817 +49818, O49818 +49819, O49819 +49820, O49820 +49821, O49821 +49822, O49822 +49823, O49823 +49824, O49824 +49825, O49825 +49826, O49826 +49827, O49827 +49828, O49828 +49829, O49829 +49830, O49830 +49831, O49831 +49832, O49832 +49833, O49833 +49834, O49834 +49835, O49835 +49836, O49836 +49837, O49837 +49838, O49838 +49839, O49839 +49840, O49840 +49841, O49841 +49842, O49842 +49843, O49843 +49844, O49844 +49845, O49845 +49846, O49846 +49847, O49847 +49848, O49848 +49849, O49849 +49850, O49850 +49851, O49851 +49852, O49852 +49853, O49853 +49854, O49854 +49855, O49855 +49856, O49856 +49857, O49857 +49858, O49858 +49859, O49859 +49860, O49860 +49861, O49861 +49862, O49862 +49863, O49863 +49864, O49864 +49865, O49865 +49866, O49866 +49867, O49867 +49868, O49868 +49869, O49869 +49870, O49870 +49871, O49871 +49872, O49872 +49873, O49873 +49874, O49874 +49875, O49875 +49876, O49876 +49877, O49877 +49878, O49878 +49879, O49879 +49880, O49880 +49881, O49881 +49882, O49882 +49883, O49883 +49884, O49884 +49885, O49885 +49886, O49886 +49887, O49887 +49888, O49888 +49889, O49889 +49890, O49890 +49891, O49891 +49892, O49892 +49893, O49893 +49894, O49894 +49895, O49895 +49896, O49896 +49897, O49897 +49898, O49898 +49899, O49899 +49900, O49900 +49901, O49901 +49902, O49902 +49903, O49903 +49904, O49904 +49905, O49905 +49906, O49906 +49907, O49907 +49908, O49908 +49909, O49909 +49910, O49910 +49911, O49911 +49912, O49912 +49913, O49913 +49914, O49914 +49915, O49915 +49916, O49916 +49917, O49917 +49918, O49918 +49919, O49919 +49920, O49920 +49921, O49921 +49922, O49922 +49923, O49923 +49924, O49924 +49925, O49925 +49926, O49926 +49927, O49927 +49928, O49928 +49929, O49929 +49930, O49930 +49931, O49931 +49932, O49932 +49933, O49933 +49934, O49934 +49935, O49935 +49936, O49936 +49937, O49937 +49938, O49938 +49939, O49939 +49940, O49940 +49941, O49941 +49942, O49942 +49943, O49943 +49944, O49944 +49945, O49945 +49946, O49946 +49947, O49947 +49948, O49948 +49949, O49949 +49950, O49950 +49951, O49951 +49952, O49952 +49953, O49953 +49954, O49954 +49955, O49955 +49956, O49956 +49957, O49957 +49958, O49958 +49959, O49959 +49960, O49960 +49961, O49961 +49962, O49962 +49963, O49963 +49964, O49964 +49965, O49965 +49966, O49966 +49967, O49967 +49968, O49968 +49969, O49969 +49970, O49970 +49971, O49971 +49972, O49972 +49973, O49973 +49974, O49974 +49975, O49975 +49976, O49976 +49977, O49977 +49978, O49978 +49979, O49979 +49980, O49980 +49981, O49981 +49982, O49982 +49983, O49983 +49984, O49984 +49985, O49985 +49986, O49986 +49987, O49987 +49988, O49988 +49989, O49989 +49990, O49990 +49991, O49991 +49992, O49992 +49993, O49993 +49994, O49994 +49995, O49995 +49996, O49996 +49997, O49997 +49998, O49998 +49999, O49999 +50000, O50000 diff --git a/testdb/csv/OA.csv b/testdb/csv/OA.csv new file mode 100644 index 000000000..eeb92198d --- /dev/null +++ b/testdb/csv/OA.csv @@ -0,0 +1,30000 @@ +1, OA1 +2, OA2 +3, OA3 +4, OA4 +5, OA5 +6, OA6 +7, OA7 +8, OA8 +9, OA9 +10, OA10 +11, OA11 +12, OA12 +13, OA13 +14, OA14 +15, OA15 +16, OA16 +17, OA17 +18, OA18 +19, OA19 +20, OA20 +21, OA21 +22, OA22 +23, OA23 +24, OA24 +25, OA25 +26, OA26 +27, OA27 +28, OA28 +29, OA29 +30, OA30 +31, OA31 +32, OA32 +33, OA33 +34, OA34 +35, OA35 +36, OA36 +37, OA37 +38, OA38 +39, OA39 +40, OA40 +41, OA41 +42, OA42 +43, OA43 +44, OA44 +45, OA45 +46, OA46 +47, OA47 +48, OA48 +49, OA49 +50, OA50 +51, OA51 +52, OA52 +53, OA53 +54, OA54 +55, OA55 +56, OA56 +57, OA57 +58, OA58 +59, OA59 +60, OA60 +61, OA61 +62, OA62 +63, OA63 +64, OA64 +65, OA65 +66, OA66 +67, OA67 +68, OA68 +69, OA69 +70, OA70 +71, OA71 +72, OA72 +73, OA73 +74, OA74 +75, OA75 +76, OA76 +77, OA77 +78, OA78 +79, OA79 +80, OA80 +81, OA81 +82, OA82 +83, OA83 +84, OA84 +85, OA85 +86, OA86 +87, OA87 +88, OA88 +89, OA89 +90, OA90 +91, OA91 +92, OA92 +93, OA93 +94, OA94 +95, OA95 +96, OA96 +97, OA97 +98, OA98 +99, OA99 +100, OA100 +101, OA101 +102, OA102 +103, OA103 +104, OA104 +105, OA105 +106, OA106 +107, OA107 +108, OA108 +109, OA109 +110, OA110 +111, OA111 +112, OA112 +113, OA113 +114, OA114 +115, OA115 +116, OA116 +117, OA117 +118, OA118 +119, OA119 +120, OA120 +121, OA121 +122, OA122 +123, OA123 +124, OA124 +125, OA125 +126, OA126 +127, OA127 +128, OA128 +129, OA129 +130, OA130 +131, OA131 +132, OA132 +133, OA133 +134, OA134 +135, OA135 +136, OA136 +137, OA137 +138, OA138 +139, OA139 +140, OA140 +141, OA141 +142, OA142 +143, OA143 +144, OA144 +145, OA145 +146, OA146 +147, OA147 +148, OA148 +149, OA149 +150, OA150 +151, OA151 +152, OA152 +153, OA153 +154, OA154 +155, OA155 +156, OA156 +157, OA157 +158, OA158 +159, OA159 +160, OA160 +161, OA161 +162, OA162 +163, OA163 +164, OA164 +165, OA165 +166, OA166 +167, OA167 +168, OA168 +169, OA169 +170, OA170 +171, OA171 +172, OA172 +173, OA173 +174, OA174 +175, OA175 +176, OA176 +177, OA177 +178, OA178 +179, OA179 +180, OA180 +181, OA181 +182, OA182 +183, OA183 +184, OA184 +185, OA185 +186, OA186 +187, OA187 +188, OA188 +189, OA189 +190, OA190 +191, OA191 +192, OA192 +193, OA193 +194, OA194 +195, OA195 +196, OA196 +197, OA197 +198, OA198 +199, OA199 +200, OA200 +201, OA201 +202, OA202 +203, OA203 +204, OA204 +205, OA205 +206, OA206 +207, OA207 +208, OA208 +209, OA209 +210, OA210 +211, OA211 +212, OA212 +213, OA213 +214, OA214 +215, OA215 +216, OA216 +217, OA217 +218, OA218 +219, OA219 +220, OA220 +221, OA221 +222, OA222 +223, OA223 +224, OA224 +225, OA225 +226, OA226 +227, OA227 +228, OA228 +229, OA229 +230, OA230 +231, OA231 +232, OA232 +233, OA233 +234, OA234 +235, OA235 +236, OA236 +237, OA237 +238, OA238 +239, OA239 +240, OA240 +241, OA241 +242, OA242 +243, OA243 +244, OA244 +245, OA245 +246, OA246 +247, OA247 +248, OA248 +249, OA249 +250, OA250 +251, OA251 +252, OA252 +253, OA253 +254, OA254 +255, OA255 +256, OA256 +257, OA257 +258, OA258 +259, OA259 +260, OA260 +261, OA261 +262, OA262 +263, OA263 +264, OA264 +265, OA265 +266, OA266 +267, OA267 +268, OA268 +269, OA269 +270, OA270 +271, OA271 +272, OA272 +273, OA273 +274, OA274 +275, OA275 +276, OA276 +277, OA277 +278, OA278 +279, OA279 +280, OA280 +281, OA281 +282, OA282 +283, OA283 +284, OA284 +285, OA285 +286, OA286 +287, OA287 +288, OA288 +289, OA289 +290, OA290 +291, OA291 +292, OA292 +293, OA293 +294, OA294 +295, OA295 +296, OA296 +297, OA297 +298, OA298 +299, OA299 +300, OA300 +301, OA301 +302, OA302 +303, OA303 +304, OA304 +305, OA305 +306, OA306 +307, OA307 +308, OA308 +309, OA309 +310, OA310 +311, OA311 +312, OA312 +313, OA313 +314, OA314 +315, OA315 +316, OA316 +317, OA317 +318, OA318 +319, OA319 +320, OA320 +321, OA321 +322, OA322 +323, OA323 +324, OA324 +325, OA325 +326, OA326 +327, OA327 +328, OA328 +329, OA329 +330, OA330 +331, OA331 +332, OA332 +333, OA333 +334, OA334 +335, OA335 +336, OA336 +337, OA337 +338, OA338 +339, OA339 +340, OA340 +341, OA341 +342, OA342 +343, OA343 +344, OA344 +345, OA345 +346, OA346 +347, OA347 +348, OA348 +349, OA349 +350, OA350 +351, OA351 +352, OA352 +353, OA353 +354, OA354 +355, OA355 +356, OA356 +357, OA357 +358, OA358 +359, OA359 +360, OA360 +361, OA361 +362, OA362 +363, OA363 +364, OA364 +365, OA365 +366, OA366 +367, OA367 +368, OA368 +369, OA369 +370, OA370 +371, OA371 +372, OA372 +373, OA373 +374, OA374 +375, OA375 +376, OA376 +377, OA377 +378, OA378 +379, OA379 +380, OA380 +381, OA381 +382, OA382 +383, OA383 +384, OA384 +385, OA385 +386, OA386 +387, OA387 +388, OA388 +389, OA389 +390, OA390 +391, OA391 +392, OA392 +393, OA393 +394, OA394 +395, OA395 +396, OA396 +397, OA397 +398, OA398 +399, OA399 +400, OA400 +401, OA401 +402, OA402 +403, OA403 +404, OA404 +405, OA405 +406, OA406 +407, OA407 +408, OA408 +409, OA409 +410, OA410 +411, OA411 +412, OA412 +413, OA413 +414, OA414 +415, OA415 +416, OA416 +417, OA417 +418, OA418 +419, OA419 +420, OA420 +421, OA421 +422, OA422 +423, OA423 +424, OA424 +425, OA425 +426, OA426 +427, OA427 +428, OA428 +429, OA429 +430, OA430 +431, OA431 +432, OA432 +433, OA433 +434, OA434 +435, OA435 +436, OA436 +437, OA437 +438, OA438 +439, OA439 +440, OA440 +441, OA441 +442, OA442 +443, OA443 +444, OA444 +445, OA445 +446, OA446 +447, OA447 +448, OA448 +449, OA449 +450, OA450 +451, OA451 +452, OA452 +453, OA453 +454, OA454 +455, OA455 +456, OA456 +457, OA457 +458, OA458 +459, OA459 +460, OA460 +461, OA461 +462, OA462 +463, OA463 +464, OA464 +465, OA465 +466, OA466 +467, OA467 +468, OA468 +469, OA469 +470, OA470 +471, OA471 +472, OA472 +473, OA473 +474, OA474 +475, OA475 +476, OA476 +477, OA477 +478, OA478 +479, OA479 +480, OA480 +481, OA481 +482, OA482 +483, OA483 +484, OA484 +485, OA485 +486, OA486 +487, OA487 +488, OA488 +489, OA489 +490, OA490 +491, OA491 +492, OA492 +493, OA493 +494, OA494 +495, OA495 +496, OA496 +497, OA497 +498, OA498 +499, OA499 +500, OA500 +501, OA501 +502, OA502 +503, OA503 +504, OA504 +505, OA505 +506, OA506 +507, OA507 +508, OA508 +509, OA509 +510, OA510 +511, OA511 +512, OA512 +513, OA513 +514, OA514 +515, OA515 +516, OA516 +517, OA517 +518, OA518 +519, OA519 +520, OA520 +521, OA521 +522, OA522 +523, OA523 +524, OA524 +525, OA525 +526, OA526 +527, OA527 +528, OA528 +529, OA529 +530, OA530 +531, OA531 +532, OA532 +533, OA533 +534, OA534 +535, OA535 +536, OA536 +537, OA537 +538, OA538 +539, OA539 +540, OA540 +541, OA541 +542, OA542 +543, OA543 +544, OA544 +545, OA545 +546, OA546 +547, OA547 +548, OA548 +549, OA549 +550, OA550 +551, OA551 +552, OA552 +553, OA553 +554, OA554 +555, OA555 +556, OA556 +557, OA557 +558, OA558 +559, OA559 +560, OA560 +561, OA561 +562, OA562 +563, OA563 +564, OA564 +565, OA565 +566, OA566 +567, OA567 +568, OA568 +569, OA569 +570, OA570 +571, OA571 +572, OA572 +573, OA573 +574, OA574 +575, OA575 +576, OA576 +577, OA577 +578, OA578 +579, OA579 +580, OA580 +581, OA581 +582, OA582 +583, OA583 +584, OA584 +585, OA585 +586, OA586 +587, OA587 +588, OA588 +589, OA589 +590, OA590 +591, OA591 +592, OA592 +593, OA593 +594, OA594 +595, OA595 +596, OA596 +597, OA597 +598, OA598 +599, OA599 +600, OA600 +601, OA601 +602, OA602 +603, OA603 +604, OA604 +605, OA605 +606, OA606 +607, OA607 +608, OA608 +609, OA609 +610, OA610 +611, OA611 +612, OA612 +613, OA613 +614, OA614 +615, OA615 +616, OA616 +617, OA617 +618, OA618 +619, OA619 +620, OA620 +621, OA621 +622, OA622 +623, OA623 +624, OA624 +625, OA625 +626, OA626 +627, OA627 +628, OA628 +629, OA629 +630, OA630 +631, OA631 +632, OA632 +633, OA633 +634, OA634 +635, OA635 +636, OA636 +637, OA637 +638, OA638 +639, OA639 +640, OA640 +641, OA641 +642, OA642 +643, OA643 +644, OA644 +645, OA645 +646, OA646 +647, OA647 +648, OA648 +649, OA649 +650, OA650 +651, OA651 +652, OA652 +653, OA653 +654, OA654 +655, OA655 +656, OA656 +657, OA657 +658, OA658 +659, OA659 +660, OA660 +661, OA661 +662, OA662 +663, OA663 +664, OA664 +665, OA665 +666, OA666 +667, OA667 +668, OA668 +669, OA669 +670, OA670 +671, OA671 +672, OA672 +673, OA673 +674, OA674 +675, OA675 +676, OA676 +677, OA677 +678, OA678 +679, OA679 +680, OA680 +681, OA681 +682, OA682 +683, OA683 +684, OA684 +685, OA685 +686, OA686 +687, OA687 +688, OA688 +689, OA689 +690, OA690 +691, OA691 +692, OA692 +693, OA693 +694, OA694 +695, OA695 +696, OA696 +697, OA697 +698, OA698 +699, OA699 +700, OA700 +701, OA701 +702, OA702 +703, OA703 +704, OA704 +705, OA705 +706, OA706 +707, OA707 +708, OA708 +709, OA709 +710, OA710 +711, OA711 +712, OA712 +713, OA713 +714, OA714 +715, OA715 +716, OA716 +717, OA717 +718, OA718 +719, OA719 +720, OA720 +721, OA721 +722, OA722 +723, OA723 +724, OA724 +725, OA725 +726, OA726 +727, OA727 +728, OA728 +729, OA729 +730, OA730 +731, OA731 +732, OA732 +733, OA733 +734, OA734 +735, OA735 +736, OA736 +737, OA737 +738, OA738 +739, OA739 +740, OA740 +741, OA741 +742, OA742 +743, OA743 +744, OA744 +745, OA745 +746, OA746 +747, OA747 +748, OA748 +749, OA749 +750, OA750 +751, OA751 +752, OA752 +753, OA753 +754, OA754 +755, OA755 +756, OA756 +757, OA757 +758, OA758 +759, OA759 +760, OA760 +761, OA761 +762, OA762 +763, OA763 +764, OA764 +765, OA765 +766, OA766 +767, OA767 +768, OA768 +769, OA769 +770, OA770 +771, OA771 +772, OA772 +773, OA773 +774, OA774 +775, OA775 +776, OA776 +777, OA777 +778, OA778 +779, OA779 +780, OA780 +781, OA781 +782, OA782 +783, OA783 +784, OA784 +785, OA785 +786, OA786 +787, OA787 +788, OA788 +789, OA789 +790, OA790 +791, OA791 +792, OA792 +793, OA793 +794, OA794 +795, OA795 +796, OA796 +797, OA797 +798, OA798 +799, OA799 +800, OA800 +801, OA801 +802, OA802 +803, OA803 +804, OA804 +805, OA805 +806, OA806 +807, OA807 +808, OA808 +809, OA809 +810, OA810 +811, OA811 +812, OA812 +813, OA813 +814, OA814 +815, OA815 +816, OA816 +817, OA817 +818, OA818 +819, OA819 +820, OA820 +821, OA821 +822, OA822 +823, OA823 +824, OA824 +825, OA825 +826, OA826 +827, OA827 +828, OA828 +829, OA829 +830, OA830 +831, OA831 +832, OA832 +833, OA833 +834, OA834 +835, OA835 +836, OA836 +837, OA837 +838, OA838 +839, OA839 +840, OA840 +841, OA841 +842, OA842 +843, OA843 +844, OA844 +845, OA845 +846, OA846 +847, OA847 +848, OA848 +849, OA849 +850, OA850 +851, OA851 +852, OA852 +853, OA853 +854, OA854 +855, OA855 +856, OA856 +857, OA857 +858, OA858 +859, OA859 +860, OA860 +861, OA861 +862, OA862 +863, OA863 +864, OA864 +865, OA865 +866, OA866 +867, OA867 +868, OA868 +869, OA869 +870, OA870 +871, OA871 +872, OA872 +873, OA873 +874, OA874 +875, OA875 +876, OA876 +877, OA877 +878, OA878 +879, OA879 +880, OA880 +881, OA881 +882, OA882 +883, OA883 +884, OA884 +885, OA885 +886, OA886 +887, OA887 +888, OA888 +889, OA889 +890, OA890 +891, OA891 +892, OA892 +893, OA893 +894, OA894 +895, OA895 +896, OA896 +897, OA897 +898, OA898 +899, OA899 +900, OA900 +901, OA901 +902, OA902 +903, OA903 +904, OA904 +905, OA905 +906, OA906 +907, OA907 +908, OA908 +909, OA909 +910, OA910 +911, OA911 +912, OA912 +913, OA913 +914, OA914 +915, OA915 +916, OA916 +917, OA917 +918, OA918 +919, OA919 +920, OA920 +921, OA921 +922, OA922 +923, OA923 +924, OA924 +925, OA925 +926, OA926 +927, OA927 +928, OA928 +929, OA929 +930, OA930 +931, OA931 +932, OA932 +933, OA933 +934, OA934 +935, OA935 +936, OA936 +937, OA937 +938, OA938 +939, OA939 +940, OA940 +941, OA941 +942, OA942 +943, OA943 +944, OA944 +945, OA945 +946, OA946 +947, OA947 +948, OA948 +949, OA949 +950, OA950 +951, OA951 +952, OA952 +953, OA953 +954, OA954 +955, OA955 +956, OA956 +957, OA957 +958, OA958 +959, OA959 +960, OA960 +961, OA961 +962, OA962 +963, OA963 +964, OA964 +965, OA965 +966, OA966 +967, OA967 +968, OA968 +969, OA969 +970, OA970 +971, OA971 +972, OA972 +973, OA973 +974, OA974 +975, OA975 +976, OA976 +977, OA977 +978, OA978 +979, OA979 +980, OA980 +981, OA981 +982, OA982 +983, OA983 +984, OA984 +985, OA985 +986, OA986 +987, OA987 +988, OA988 +989, OA989 +990, OA990 +991, OA991 +992, OA992 +993, OA993 +994, OA994 +995, OA995 +996, OA996 +997, OA997 +998, OA998 +999, OA999 +1000, OA1000 +1001, OA1001 +1002, OA1002 +1003, OA1003 +1004, OA1004 +1005, OA1005 +1006, OA1006 +1007, OA1007 +1008, OA1008 +1009, OA1009 +1010, OA1010 +1011, OA1011 +1012, OA1012 +1013, OA1013 +1014, OA1014 +1015, OA1015 +1016, OA1016 +1017, OA1017 +1018, OA1018 +1019, OA1019 +1020, OA1020 +1021, OA1021 +1022, OA1022 +1023, OA1023 +1024, OA1024 +1025, OA1025 +1026, OA1026 +1027, OA1027 +1028, OA1028 +1029, OA1029 +1030, OA1030 +1031, OA1031 +1032, OA1032 +1033, OA1033 +1034, OA1034 +1035, OA1035 +1036, OA1036 +1037, OA1037 +1038, OA1038 +1039, OA1039 +1040, OA1040 +1041, OA1041 +1042, OA1042 +1043, OA1043 +1044, OA1044 +1045, OA1045 +1046, OA1046 +1047, OA1047 +1048, OA1048 +1049, OA1049 +1050, OA1050 +1051, OA1051 +1052, OA1052 +1053, OA1053 +1054, OA1054 +1055, OA1055 +1056, OA1056 +1057, OA1057 +1058, OA1058 +1059, OA1059 +1060, OA1060 +1061, OA1061 +1062, OA1062 +1063, OA1063 +1064, OA1064 +1065, OA1065 +1066, OA1066 +1067, OA1067 +1068, OA1068 +1069, OA1069 +1070, OA1070 +1071, OA1071 +1072, OA1072 +1073, OA1073 +1074, OA1074 +1075, OA1075 +1076, OA1076 +1077, OA1077 +1078, OA1078 +1079, OA1079 +1080, OA1080 +1081, OA1081 +1082, OA1082 +1083, OA1083 +1084, OA1084 +1085, OA1085 +1086, OA1086 +1087, OA1087 +1088, OA1088 +1089, OA1089 +1090, OA1090 +1091, OA1091 +1092, OA1092 +1093, OA1093 +1094, OA1094 +1095, OA1095 +1096, OA1096 +1097, OA1097 +1098, OA1098 +1099, OA1099 +1100, OA1100 +1101, OA1101 +1102, OA1102 +1103, OA1103 +1104, OA1104 +1105, OA1105 +1106, OA1106 +1107, OA1107 +1108, OA1108 +1109, OA1109 +1110, OA1110 +1111, OA1111 +1112, OA1112 +1113, OA1113 +1114, OA1114 +1115, OA1115 +1116, OA1116 +1117, OA1117 +1118, OA1118 +1119, OA1119 +1120, OA1120 +1121, OA1121 +1122, OA1122 +1123, OA1123 +1124, OA1124 +1125, OA1125 +1126, OA1126 +1127, OA1127 +1128, OA1128 +1129, OA1129 +1130, OA1130 +1131, OA1131 +1132, OA1132 +1133, OA1133 +1134, OA1134 +1135, OA1135 +1136, OA1136 +1137, OA1137 +1138, OA1138 +1139, OA1139 +1140, OA1140 +1141, OA1141 +1142, OA1142 +1143, OA1143 +1144, OA1144 +1145, OA1145 +1146, OA1146 +1147, OA1147 +1148, OA1148 +1149, OA1149 +1150, OA1150 +1151, OA1151 +1152, OA1152 +1153, OA1153 +1154, OA1154 +1155, OA1155 +1156, OA1156 +1157, OA1157 +1158, OA1158 +1159, OA1159 +1160, OA1160 +1161, OA1161 +1162, OA1162 +1163, OA1163 +1164, OA1164 +1165, OA1165 +1166, OA1166 +1167, OA1167 +1168, OA1168 +1169, OA1169 +1170, OA1170 +1171, OA1171 +1172, OA1172 +1173, OA1173 +1174, OA1174 +1175, OA1175 +1176, OA1176 +1177, OA1177 +1178, OA1178 +1179, OA1179 +1180, OA1180 +1181, OA1181 +1182, OA1182 +1183, OA1183 +1184, OA1184 +1185, OA1185 +1186, OA1186 +1187, OA1187 +1188, OA1188 +1189, OA1189 +1190, OA1190 +1191, OA1191 +1192, OA1192 +1193, OA1193 +1194, OA1194 +1195, OA1195 +1196, OA1196 +1197, OA1197 +1198, OA1198 +1199, OA1199 +1200, OA1200 +1201, OA1201 +1202, OA1202 +1203, OA1203 +1204, OA1204 +1205, OA1205 +1206, OA1206 +1207, OA1207 +1208, OA1208 +1209, OA1209 +1210, OA1210 +1211, OA1211 +1212, OA1212 +1213, OA1213 +1214, OA1214 +1215, OA1215 +1216, OA1216 +1217, OA1217 +1218, OA1218 +1219, OA1219 +1220, OA1220 +1221, OA1221 +1222, OA1222 +1223, OA1223 +1224, OA1224 +1225, OA1225 +1226, OA1226 +1227, OA1227 +1228, OA1228 +1229, OA1229 +1230, OA1230 +1231, OA1231 +1232, OA1232 +1233, OA1233 +1234, OA1234 +1235, OA1235 +1236, OA1236 +1237, OA1237 +1238, OA1238 +1239, OA1239 +1240, OA1240 +1241, OA1241 +1242, OA1242 +1243, OA1243 +1244, OA1244 +1245, OA1245 +1246, OA1246 +1247, OA1247 +1248, OA1248 +1249, OA1249 +1250, OA1250 +1251, OA1251 +1252, OA1252 +1253, OA1253 +1254, OA1254 +1255, OA1255 +1256, OA1256 +1257, OA1257 +1258, OA1258 +1259, OA1259 +1260, OA1260 +1261, OA1261 +1262, OA1262 +1263, OA1263 +1264, OA1264 +1265, OA1265 +1266, OA1266 +1267, OA1267 +1268, OA1268 +1269, OA1269 +1270, OA1270 +1271, OA1271 +1272, OA1272 +1273, OA1273 +1274, OA1274 +1275, OA1275 +1276, OA1276 +1277, OA1277 +1278, OA1278 +1279, OA1279 +1280, OA1280 +1281, OA1281 +1282, OA1282 +1283, OA1283 +1284, OA1284 +1285, OA1285 +1286, OA1286 +1287, OA1287 +1288, OA1288 +1289, OA1289 +1290, OA1290 +1291, OA1291 +1292, OA1292 +1293, OA1293 +1294, OA1294 +1295, OA1295 +1296, OA1296 +1297, OA1297 +1298, OA1298 +1299, OA1299 +1300, OA1300 +1301, OA1301 +1302, OA1302 +1303, OA1303 +1304, OA1304 +1305, OA1305 +1306, OA1306 +1307, OA1307 +1308, OA1308 +1309, OA1309 +1310, OA1310 +1311, OA1311 +1312, OA1312 +1313, OA1313 +1314, OA1314 +1315, OA1315 +1316, OA1316 +1317, OA1317 +1318, OA1318 +1319, OA1319 +1320, OA1320 +1321, OA1321 +1322, OA1322 +1323, OA1323 +1324, OA1324 +1325, OA1325 +1326, OA1326 +1327, OA1327 +1328, OA1328 +1329, OA1329 +1330, OA1330 +1331, OA1331 +1332, OA1332 +1333, OA1333 +1334, OA1334 +1335, OA1335 +1336, OA1336 +1337, OA1337 +1338, OA1338 +1339, OA1339 +1340, OA1340 +1341, OA1341 +1342, OA1342 +1343, OA1343 +1344, OA1344 +1345, OA1345 +1346, OA1346 +1347, OA1347 +1348, OA1348 +1349, OA1349 +1350, OA1350 +1351, OA1351 +1352, OA1352 +1353, OA1353 +1354, OA1354 +1355, OA1355 +1356, OA1356 +1357, OA1357 +1358, OA1358 +1359, OA1359 +1360, OA1360 +1361, OA1361 +1362, OA1362 +1363, OA1363 +1364, OA1364 +1365, OA1365 +1366, OA1366 +1367, OA1367 +1368, OA1368 +1369, OA1369 +1370, OA1370 +1371, OA1371 +1372, OA1372 +1373, OA1373 +1374, OA1374 +1375, OA1375 +1376, OA1376 +1377, OA1377 +1378, OA1378 +1379, OA1379 +1380, OA1380 +1381, OA1381 +1382, OA1382 +1383, OA1383 +1384, OA1384 +1385, OA1385 +1386, OA1386 +1387, OA1387 +1388, OA1388 +1389, OA1389 +1390, OA1390 +1391, OA1391 +1392, OA1392 +1393, OA1393 +1394, OA1394 +1395, OA1395 +1396, OA1396 +1397, OA1397 +1398, OA1398 +1399, OA1399 +1400, OA1400 +1401, OA1401 +1402, OA1402 +1403, OA1403 +1404, OA1404 +1405, OA1405 +1406, OA1406 +1407, OA1407 +1408, OA1408 +1409, OA1409 +1410, OA1410 +1411, OA1411 +1412, OA1412 +1413, OA1413 +1414, OA1414 +1415, OA1415 +1416, OA1416 +1417, OA1417 +1418, OA1418 +1419, OA1419 +1420, OA1420 +1421, OA1421 +1422, OA1422 +1423, OA1423 +1424, OA1424 +1425, OA1425 +1426, OA1426 +1427, OA1427 +1428, OA1428 +1429, OA1429 +1430, OA1430 +1431, OA1431 +1432, OA1432 +1433, OA1433 +1434, OA1434 +1435, OA1435 +1436, OA1436 +1437, OA1437 +1438, OA1438 +1439, OA1439 +1440, OA1440 +1441, OA1441 +1442, OA1442 +1443, OA1443 +1444, OA1444 +1445, OA1445 +1446, OA1446 +1447, OA1447 +1448, OA1448 +1449, OA1449 +1450, OA1450 +1451, OA1451 +1452, OA1452 +1453, OA1453 +1454, OA1454 +1455, OA1455 +1456, OA1456 +1457, OA1457 +1458, OA1458 +1459, OA1459 +1460, OA1460 +1461, OA1461 +1462, OA1462 +1463, OA1463 +1464, OA1464 +1465, OA1465 +1466, OA1466 +1467, OA1467 +1468, OA1468 +1469, OA1469 +1470, OA1470 +1471, OA1471 +1472, OA1472 +1473, OA1473 +1474, OA1474 +1475, OA1475 +1476, OA1476 +1477, OA1477 +1478, OA1478 +1479, OA1479 +1480, OA1480 +1481, OA1481 +1482, OA1482 +1483, OA1483 +1484, OA1484 +1485, OA1485 +1486, OA1486 +1487, OA1487 +1488, OA1488 +1489, OA1489 +1490, OA1490 +1491, OA1491 +1492, OA1492 +1493, OA1493 +1494, OA1494 +1495, OA1495 +1496, OA1496 +1497, OA1497 +1498, OA1498 +1499, OA1499 +1500, OA1500 +1501, OA1501 +1502, OA1502 +1503, OA1503 +1504, OA1504 +1505, OA1505 +1506, OA1506 +1507, OA1507 +1508, OA1508 +1509, OA1509 +1510, OA1510 +1511, OA1511 +1512, OA1512 +1513, OA1513 +1514, OA1514 +1515, OA1515 +1516, OA1516 +1517, OA1517 +1518, OA1518 +1519, OA1519 +1520, OA1520 +1521, OA1521 +1522, OA1522 +1523, OA1523 +1524, OA1524 +1525, OA1525 +1526, OA1526 +1527, OA1527 +1528, OA1528 +1529, OA1529 +1530, OA1530 +1531, OA1531 +1532, OA1532 +1533, OA1533 +1534, OA1534 +1535, OA1535 +1536, OA1536 +1537, OA1537 +1538, OA1538 +1539, OA1539 +1540, OA1540 +1541, OA1541 +1542, OA1542 +1543, OA1543 +1544, OA1544 +1545, OA1545 +1546, OA1546 +1547, OA1547 +1548, OA1548 +1549, OA1549 +1550, OA1550 +1551, OA1551 +1552, OA1552 +1553, OA1553 +1554, OA1554 +1555, OA1555 +1556, OA1556 +1557, OA1557 +1558, OA1558 +1559, OA1559 +1560, OA1560 +1561, OA1561 +1562, OA1562 +1563, OA1563 +1564, OA1564 +1565, OA1565 +1566, OA1566 +1567, OA1567 +1568, OA1568 +1569, OA1569 +1570, OA1570 +1571, OA1571 +1572, OA1572 +1573, OA1573 +1574, OA1574 +1575, OA1575 +1576, OA1576 +1577, OA1577 +1578, OA1578 +1579, OA1579 +1580, OA1580 +1581, OA1581 +1582, OA1582 +1583, OA1583 +1584, OA1584 +1585, OA1585 +1586, OA1586 +1587, OA1587 +1588, OA1588 +1589, OA1589 +1590, OA1590 +1591, OA1591 +1592, OA1592 +1593, OA1593 +1594, OA1594 +1595, OA1595 +1596, OA1596 +1597, OA1597 +1598, OA1598 +1599, OA1599 +1600, OA1600 +1601, OA1601 +1602, OA1602 +1603, OA1603 +1604, OA1604 +1605, OA1605 +1606, OA1606 +1607, OA1607 +1608, OA1608 +1609, OA1609 +1610, OA1610 +1611, OA1611 +1612, OA1612 +1613, OA1613 +1614, OA1614 +1615, OA1615 +1616, OA1616 +1617, OA1617 +1618, OA1618 +1619, OA1619 +1620, OA1620 +1621, OA1621 +1622, OA1622 +1623, OA1623 +1624, OA1624 +1625, OA1625 +1626, OA1626 +1627, OA1627 +1628, OA1628 +1629, OA1629 +1630, OA1630 +1631, OA1631 +1632, OA1632 +1633, OA1633 +1634, OA1634 +1635, OA1635 +1636, OA1636 +1637, OA1637 +1638, OA1638 +1639, OA1639 +1640, OA1640 +1641, OA1641 +1642, OA1642 +1643, OA1643 +1644, OA1644 +1645, OA1645 +1646, OA1646 +1647, OA1647 +1648, OA1648 +1649, OA1649 +1650, OA1650 +1651, OA1651 +1652, OA1652 +1653, OA1653 +1654, OA1654 +1655, OA1655 +1656, OA1656 +1657, OA1657 +1658, OA1658 +1659, OA1659 +1660, OA1660 +1661, OA1661 +1662, OA1662 +1663, OA1663 +1664, OA1664 +1665, OA1665 +1666, OA1666 +1667, OA1667 +1668, OA1668 +1669, OA1669 +1670, OA1670 +1671, OA1671 +1672, OA1672 +1673, OA1673 +1674, OA1674 +1675, OA1675 +1676, OA1676 +1677, OA1677 +1678, OA1678 +1679, OA1679 +1680, OA1680 +1681, OA1681 +1682, OA1682 +1683, OA1683 +1684, OA1684 +1685, OA1685 +1686, OA1686 +1687, OA1687 +1688, OA1688 +1689, OA1689 +1690, OA1690 +1691, OA1691 +1692, OA1692 +1693, OA1693 +1694, OA1694 +1695, OA1695 +1696, OA1696 +1697, OA1697 +1698, OA1698 +1699, OA1699 +1700, OA1700 +1701, OA1701 +1702, OA1702 +1703, OA1703 +1704, OA1704 +1705, OA1705 +1706, OA1706 +1707, OA1707 +1708, OA1708 +1709, OA1709 +1710, OA1710 +1711, OA1711 +1712, OA1712 +1713, OA1713 +1714, OA1714 +1715, OA1715 +1716, OA1716 +1717, OA1717 +1718, OA1718 +1719, OA1719 +1720, OA1720 +1721, OA1721 +1722, OA1722 +1723, OA1723 +1724, OA1724 +1725, OA1725 +1726, OA1726 +1727, OA1727 +1728, OA1728 +1729, OA1729 +1730, OA1730 +1731, OA1731 +1732, OA1732 +1733, OA1733 +1734, OA1734 +1735, OA1735 +1736, OA1736 +1737, OA1737 +1738, OA1738 +1739, OA1739 +1740, OA1740 +1741, OA1741 +1742, OA1742 +1743, OA1743 +1744, OA1744 +1745, OA1745 +1746, OA1746 +1747, OA1747 +1748, OA1748 +1749, OA1749 +1750, OA1750 +1751, OA1751 +1752, OA1752 +1753, OA1753 +1754, OA1754 +1755, OA1755 +1756, OA1756 +1757, OA1757 +1758, OA1758 +1759, OA1759 +1760, OA1760 +1761, OA1761 +1762, OA1762 +1763, OA1763 +1764, OA1764 +1765, OA1765 +1766, OA1766 +1767, OA1767 +1768, OA1768 +1769, OA1769 +1770, OA1770 +1771, OA1771 +1772, OA1772 +1773, OA1773 +1774, OA1774 +1775, OA1775 +1776, OA1776 +1777, OA1777 +1778, OA1778 +1779, OA1779 +1780, OA1780 +1781, OA1781 +1782, OA1782 +1783, OA1783 +1784, OA1784 +1785, OA1785 +1786, OA1786 +1787, OA1787 +1788, OA1788 +1789, OA1789 +1790, OA1790 +1791, OA1791 +1792, OA1792 +1793, OA1793 +1794, OA1794 +1795, OA1795 +1796, OA1796 +1797, OA1797 +1798, OA1798 +1799, OA1799 +1800, OA1800 +1801, OA1801 +1802, OA1802 +1803, OA1803 +1804, OA1804 +1805, OA1805 +1806, OA1806 +1807, OA1807 +1808, OA1808 +1809, OA1809 +1810, OA1810 +1811, OA1811 +1812, OA1812 +1813, OA1813 +1814, OA1814 +1815, OA1815 +1816, OA1816 +1817, OA1817 +1818, OA1818 +1819, OA1819 +1820, OA1820 +1821, OA1821 +1822, OA1822 +1823, OA1823 +1824, OA1824 +1825, OA1825 +1826, OA1826 +1827, OA1827 +1828, OA1828 +1829, OA1829 +1830, OA1830 +1831, OA1831 +1832, OA1832 +1833, OA1833 +1834, OA1834 +1835, OA1835 +1836, OA1836 +1837, OA1837 +1838, OA1838 +1839, OA1839 +1840, OA1840 +1841, OA1841 +1842, OA1842 +1843, OA1843 +1844, OA1844 +1845, OA1845 +1846, OA1846 +1847, OA1847 +1848, OA1848 +1849, OA1849 +1850, OA1850 +1851, OA1851 +1852, OA1852 +1853, OA1853 +1854, OA1854 +1855, OA1855 +1856, OA1856 +1857, OA1857 +1858, OA1858 +1859, OA1859 +1860, OA1860 +1861, OA1861 +1862, OA1862 +1863, OA1863 +1864, OA1864 +1865, OA1865 +1866, OA1866 +1867, OA1867 +1868, OA1868 +1869, OA1869 +1870, OA1870 +1871, OA1871 +1872, OA1872 +1873, OA1873 +1874, OA1874 +1875, OA1875 +1876, OA1876 +1877, OA1877 +1878, OA1878 +1879, OA1879 +1880, OA1880 +1881, OA1881 +1882, OA1882 +1883, OA1883 +1884, OA1884 +1885, OA1885 +1886, OA1886 +1887, OA1887 +1888, OA1888 +1889, OA1889 +1890, OA1890 +1891, OA1891 +1892, OA1892 +1893, OA1893 +1894, OA1894 +1895, OA1895 +1896, OA1896 +1897, OA1897 +1898, OA1898 +1899, OA1899 +1900, OA1900 +1901, OA1901 +1902, OA1902 +1903, OA1903 +1904, OA1904 +1905, OA1905 +1906, OA1906 +1907, OA1907 +1908, OA1908 +1909, OA1909 +1910, OA1910 +1911, OA1911 +1912, OA1912 +1913, OA1913 +1914, OA1914 +1915, OA1915 +1916, OA1916 +1917, OA1917 +1918, OA1918 +1919, OA1919 +1920, OA1920 +1921, OA1921 +1922, OA1922 +1923, OA1923 +1924, OA1924 +1925, OA1925 +1926, OA1926 +1927, OA1927 +1928, OA1928 +1929, OA1929 +1930, OA1930 +1931, OA1931 +1932, OA1932 +1933, OA1933 +1934, OA1934 +1935, OA1935 +1936, OA1936 +1937, OA1937 +1938, OA1938 +1939, OA1939 +1940, OA1940 +1941, OA1941 +1942, OA1942 +1943, OA1943 +1944, OA1944 +1945, OA1945 +1946, OA1946 +1947, OA1947 +1948, OA1948 +1949, OA1949 +1950, OA1950 +1951, OA1951 +1952, OA1952 +1953, OA1953 +1954, OA1954 +1955, OA1955 +1956, OA1956 +1957, OA1957 +1958, OA1958 +1959, OA1959 +1960, OA1960 +1961, OA1961 +1962, OA1962 +1963, OA1963 +1964, OA1964 +1965, OA1965 +1966, OA1966 +1967, OA1967 +1968, OA1968 +1969, OA1969 +1970, OA1970 +1971, OA1971 +1972, OA1972 +1973, OA1973 +1974, OA1974 +1975, OA1975 +1976, OA1976 +1977, OA1977 +1978, OA1978 +1979, OA1979 +1980, OA1980 +1981, OA1981 +1982, OA1982 +1983, OA1983 +1984, OA1984 +1985, OA1985 +1986, OA1986 +1987, OA1987 +1988, OA1988 +1989, OA1989 +1990, OA1990 +1991, OA1991 +1992, OA1992 +1993, OA1993 +1994, OA1994 +1995, OA1995 +1996, OA1996 +1997, OA1997 +1998, OA1998 +1999, OA1999 +2000, OA2000 +2001, OA2001 +2002, OA2002 +2003, OA2003 +2004, OA2004 +2005, OA2005 +2006, OA2006 +2007, OA2007 +2008, OA2008 +2009, OA2009 +2010, OA2010 +2011, OA2011 +2012, OA2012 +2013, OA2013 +2014, OA2014 +2015, OA2015 +2016, OA2016 +2017, OA2017 +2018, OA2018 +2019, OA2019 +2020, OA2020 +2021, OA2021 +2022, OA2022 +2023, OA2023 +2024, OA2024 +2025, OA2025 +2026, OA2026 +2027, OA2027 +2028, OA2028 +2029, OA2029 +2030, OA2030 +2031, OA2031 +2032, OA2032 +2033, OA2033 +2034, OA2034 +2035, OA2035 +2036, OA2036 +2037, OA2037 +2038, OA2038 +2039, OA2039 +2040, OA2040 +2041, OA2041 +2042, OA2042 +2043, OA2043 +2044, OA2044 +2045, OA2045 +2046, OA2046 +2047, OA2047 +2048, OA2048 +2049, OA2049 +2050, OA2050 +2051, OA2051 +2052, OA2052 +2053, OA2053 +2054, OA2054 +2055, OA2055 +2056, OA2056 +2057, OA2057 +2058, OA2058 +2059, OA2059 +2060, OA2060 +2061, OA2061 +2062, OA2062 +2063, OA2063 +2064, OA2064 +2065, OA2065 +2066, OA2066 +2067, OA2067 +2068, OA2068 +2069, OA2069 +2070, OA2070 +2071, OA2071 +2072, OA2072 +2073, OA2073 +2074, OA2074 +2075, OA2075 +2076, OA2076 +2077, OA2077 +2078, OA2078 +2079, OA2079 +2080, OA2080 +2081, OA2081 +2082, OA2082 +2083, OA2083 +2084, OA2084 +2085, OA2085 +2086, OA2086 +2087, OA2087 +2088, OA2088 +2089, OA2089 +2090, OA2090 +2091, OA2091 +2092, OA2092 +2093, OA2093 +2094, OA2094 +2095, OA2095 +2096, OA2096 +2097, OA2097 +2098, OA2098 +2099, OA2099 +2100, OA2100 +2101, OA2101 +2102, OA2102 +2103, OA2103 +2104, OA2104 +2105, OA2105 +2106, OA2106 +2107, OA2107 +2108, OA2108 +2109, OA2109 +2110, OA2110 +2111, OA2111 +2112, OA2112 +2113, OA2113 +2114, OA2114 +2115, OA2115 +2116, OA2116 +2117, OA2117 +2118, OA2118 +2119, OA2119 +2120, OA2120 +2121, OA2121 +2122, OA2122 +2123, OA2123 +2124, OA2124 +2125, OA2125 +2126, OA2126 +2127, OA2127 +2128, OA2128 +2129, OA2129 +2130, OA2130 +2131, OA2131 +2132, OA2132 +2133, OA2133 +2134, OA2134 +2135, OA2135 +2136, OA2136 +2137, OA2137 +2138, OA2138 +2139, OA2139 +2140, OA2140 +2141, OA2141 +2142, OA2142 +2143, OA2143 +2144, OA2144 +2145, OA2145 +2146, OA2146 +2147, OA2147 +2148, OA2148 +2149, OA2149 +2150, OA2150 +2151, OA2151 +2152, OA2152 +2153, OA2153 +2154, OA2154 +2155, OA2155 +2156, OA2156 +2157, OA2157 +2158, OA2158 +2159, OA2159 +2160, OA2160 +2161, OA2161 +2162, OA2162 +2163, OA2163 +2164, OA2164 +2165, OA2165 +2166, OA2166 +2167, OA2167 +2168, OA2168 +2169, OA2169 +2170, OA2170 +2171, OA2171 +2172, OA2172 +2173, OA2173 +2174, OA2174 +2175, OA2175 +2176, OA2176 +2177, OA2177 +2178, OA2178 +2179, OA2179 +2180, OA2180 +2181, OA2181 +2182, OA2182 +2183, OA2183 +2184, OA2184 +2185, OA2185 +2186, OA2186 +2187, OA2187 +2188, OA2188 +2189, OA2189 +2190, OA2190 +2191, OA2191 +2192, OA2192 +2193, OA2193 +2194, OA2194 +2195, OA2195 +2196, OA2196 +2197, OA2197 +2198, OA2198 +2199, OA2199 +2200, OA2200 +2201, OA2201 +2202, OA2202 +2203, OA2203 +2204, OA2204 +2205, OA2205 +2206, OA2206 +2207, OA2207 +2208, OA2208 +2209, OA2209 +2210, OA2210 +2211, OA2211 +2212, OA2212 +2213, OA2213 +2214, OA2214 +2215, OA2215 +2216, OA2216 +2217, OA2217 +2218, OA2218 +2219, OA2219 +2220, OA2220 +2221, OA2221 +2222, OA2222 +2223, OA2223 +2224, OA2224 +2225, OA2225 +2226, OA2226 +2227, OA2227 +2228, OA2228 +2229, OA2229 +2230, OA2230 +2231, OA2231 +2232, OA2232 +2233, OA2233 +2234, OA2234 +2235, OA2235 +2236, OA2236 +2237, OA2237 +2238, OA2238 +2239, OA2239 +2240, OA2240 +2241, OA2241 +2242, OA2242 +2243, OA2243 +2244, OA2244 +2245, OA2245 +2246, OA2246 +2247, OA2247 +2248, OA2248 +2249, OA2249 +2250, OA2250 +2251, OA2251 +2252, OA2252 +2253, OA2253 +2254, OA2254 +2255, OA2255 +2256, OA2256 +2257, OA2257 +2258, OA2258 +2259, OA2259 +2260, OA2260 +2261, OA2261 +2262, OA2262 +2263, OA2263 +2264, OA2264 +2265, OA2265 +2266, OA2266 +2267, OA2267 +2268, OA2268 +2269, OA2269 +2270, OA2270 +2271, OA2271 +2272, OA2272 +2273, OA2273 +2274, OA2274 +2275, OA2275 +2276, OA2276 +2277, OA2277 +2278, OA2278 +2279, OA2279 +2280, OA2280 +2281, OA2281 +2282, OA2282 +2283, OA2283 +2284, OA2284 +2285, OA2285 +2286, OA2286 +2287, OA2287 +2288, OA2288 +2289, OA2289 +2290, OA2290 +2291, OA2291 +2292, OA2292 +2293, OA2293 +2294, OA2294 +2295, OA2295 +2296, OA2296 +2297, OA2297 +2298, OA2298 +2299, OA2299 +2300, OA2300 +2301, OA2301 +2302, OA2302 +2303, OA2303 +2304, OA2304 +2305, OA2305 +2306, OA2306 +2307, OA2307 +2308, OA2308 +2309, OA2309 +2310, OA2310 +2311, OA2311 +2312, OA2312 +2313, OA2313 +2314, OA2314 +2315, OA2315 +2316, OA2316 +2317, OA2317 +2318, OA2318 +2319, OA2319 +2320, OA2320 +2321, OA2321 +2322, OA2322 +2323, OA2323 +2324, OA2324 +2325, OA2325 +2326, OA2326 +2327, OA2327 +2328, OA2328 +2329, OA2329 +2330, OA2330 +2331, OA2331 +2332, OA2332 +2333, OA2333 +2334, OA2334 +2335, OA2335 +2336, OA2336 +2337, OA2337 +2338, OA2338 +2339, OA2339 +2340, OA2340 +2341, OA2341 +2342, OA2342 +2343, OA2343 +2344, OA2344 +2345, OA2345 +2346, OA2346 +2347, OA2347 +2348, OA2348 +2349, OA2349 +2350, OA2350 +2351, OA2351 +2352, OA2352 +2353, OA2353 +2354, OA2354 +2355, OA2355 +2356, OA2356 +2357, OA2357 +2358, OA2358 +2359, OA2359 +2360, OA2360 +2361, OA2361 +2362, OA2362 +2363, OA2363 +2364, OA2364 +2365, OA2365 +2366, OA2366 +2367, OA2367 +2368, OA2368 +2369, OA2369 +2370, OA2370 +2371, OA2371 +2372, OA2372 +2373, OA2373 +2374, OA2374 +2375, OA2375 +2376, OA2376 +2377, OA2377 +2378, OA2378 +2379, OA2379 +2380, OA2380 +2381, OA2381 +2382, OA2382 +2383, OA2383 +2384, OA2384 +2385, OA2385 +2386, OA2386 +2387, OA2387 +2388, OA2388 +2389, OA2389 +2390, OA2390 +2391, OA2391 +2392, OA2392 +2393, OA2393 +2394, OA2394 +2395, OA2395 +2396, OA2396 +2397, OA2397 +2398, OA2398 +2399, OA2399 +2400, OA2400 +2401, OA2401 +2402, OA2402 +2403, OA2403 +2404, OA2404 +2405, OA2405 +2406, OA2406 +2407, OA2407 +2408, OA2408 +2409, OA2409 +2410, OA2410 +2411, OA2411 +2412, OA2412 +2413, OA2413 +2414, OA2414 +2415, OA2415 +2416, OA2416 +2417, OA2417 +2418, OA2418 +2419, OA2419 +2420, OA2420 +2421, OA2421 +2422, OA2422 +2423, OA2423 +2424, OA2424 +2425, OA2425 +2426, OA2426 +2427, OA2427 +2428, OA2428 +2429, OA2429 +2430, OA2430 +2431, OA2431 +2432, OA2432 +2433, OA2433 +2434, OA2434 +2435, OA2435 +2436, OA2436 +2437, OA2437 +2438, OA2438 +2439, OA2439 +2440, OA2440 +2441, OA2441 +2442, OA2442 +2443, OA2443 +2444, OA2444 +2445, OA2445 +2446, OA2446 +2447, OA2447 +2448, OA2448 +2449, OA2449 +2450, OA2450 +2451, OA2451 +2452, OA2452 +2453, OA2453 +2454, OA2454 +2455, OA2455 +2456, OA2456 +2457, OA2457 +2458, OA2458 +2459, OA2459 +2460, OA2460 +2461, OA2461 +2462, OA2462 +2463, OA2463 +2464, OA2464 +2465, OA2465 +2466, OA2466 +2467, OA2467 +2468, OA2468 +2469, OA2469 +2470, OA2470 +2471, OA2471 +2472, OA2472 +2473, OA2473 +2474, OA2474 +2475, OA2475 +2476, OA2476 +2477, OA2477 +2478, OA2478 +2479, OA2479 +2480, OA2480 +2481, OA2481 +2482, OA2482 +2483, OA2483 +2484, OA2484 +2485, OA2485 +2486, OA2486 +2487, OA2487 +2488, OA2488 +2489, OA2489 +2490, OA2490 +2491, OA2491 +2492, OA2492 +2493, OA2493 +2494, OA2494 +2495, OA2495 +2496, OA2496 +2497, OA2497 +2498, OA2498 +2499, OA2499 +2500, OA2500 +2501, OA2501 +2502, OA2502 +2503, OA2503 +2504, OA2504 +2505, OA2505 +2506, OA2506 +2507, OA2507 +2508, OA2508 +2509, OA2509 +2510, OA2510 +2511, OA2511 +2512, OA2512 +2513, OA2513 +2514, OA2514 +2515, OA2515 +2516, OA2516 +2517, OA2517 +2518, OA2518 +2519, OA2519 +2520, OA2520 +2521, OA2521 +2522, OA2522 +2523, OA2523 +2524, OA2524 +2525, OA2525 +2526, OA2526 +2527, OA2527 +2528, OA2528 +2529, OA2529 +2530, OA2530 +2531, OA2531 +2532, OA2532 +2533, OA2533 +2534, OA2534 +2535, OA2535 +2536, OA2536 +2537, OA2537 +2538, OA2538 +2539, OA2539 +2540, OA2540 +2541, OA2541 +2542, OA2542 +2543, OA2543 +2544, OA2544 +2545, OA2545 +2546, OA2546 +2547, OA2547 +2548, OA2548 +2549, OA2549 +2550, OA2550 +2551, OA2551 +2552, OA2552 +2553, OA2553 +2554, OA2554 +2555, OA2555 +2556, OA2556 +2557, OA2557 +2558, OA2558 +2559, OA2559 +2560, OA2560 +2561, OA2561 +2562, OA2562 +2563, OA2563 +2564, OA2564 +2565, OA2565 +2566, OA2566 +2567, OA2567 +2568, OA2568 +2569, OA2569 +2570, OA2570 +2571, OA2571 +2572, OA2572 +2573, OA2573 +2574, OA2574 +2575, OA2575 +2576, OA2576 +2577, OA2577 +2578, OA2578 +2579, OA2579 +2580, OA2580 +2581, OA2581 +2582, OA2582 +2583, OA2583 +2584, OA2584 +2585, OA2585 +2586, OA2586 +2587, OA2587 +2588, OA2588 +2589, OA2589 +2590, OA2590 +2591, OA2591 +2592, OA2592 +2593, OA2593 +2594, OA2594 +2595, OA2595 +2596, OA2596 +2597, OA2597 +2598, OA2598 +2599, OA2599 +2600, OA2600 +2601, OA2601 +2602, OA2602 +2603, OA2603 +2604, OA2604 +2605, OA2605 +2606, OA2606 +2607, OA2607 +2608, OA2608 +2609, OA2609 +2610, OA2610 +2611, OA2611 +2612, OA2612 +2613, OA2613 +2614, OA2614 +2615, OA2615 +2616, OA2616 +2617, OA2617 +2618, OA2618 +2619, OA2619 +2620, OA2620 +2621, OA2621 +2622, OA2622 +2623, OA2623 +2624, OA2624 +2625, OA2625 +2626, OA2626 +2627, OA2627 +2628, OA2628 +2629, OA2629 +2630, OA2630 +2631, OA2631 +2632, OA2632 +2633, OA2633 +2634, OA2634 +2635, OA2635 +2636, OA2636 +2637, OA2637 +2638, OA2638 +2639, OA2639 +2640, OA2640 +2641, OA2641 +2642, OA2642 +2643, OA2643 +2644, OA2644 +2645, OA2645 +2646, OA2646 +2647, OA2647 +2648, OA2648 +2649, OA2649 +2650, OA2650 +2651, OA2651 +2652, OA2652 +2653, OA2653 +2654, OA2654 +2655, OA2655 +2656, OA2656 +2657, OA2657 +2658, OA2658 +2659, OA2659 +2660, OA2660 +2661, OA2661 +2662, OA2662 +2663, OA2663 +2664, OA2664 +2665, OA2665 +2666, OA2666 +2667, OA2667 +2668, OA2668 +2669, OA2669 +2670, OA2670 +2671, OA2671 +2672, OA2672 +2673, OA2673 +2674, OA2674 +2675, OA2675 +2676, OA2676 +2677, OA2677 +2678, OA2678 +2679, OA2679 +2680, OA2680 +2681, OA2681 +2682, OA2682 +2683, OA2683 +2684, OA2684 +2685, OA2685 +2686, OA2686 +2687, OA2687 +2688, OA2688 +2689, OA2689 +2690, OA2690 +2691, OA2691 +2692, OA2692 +2693, OA2693 +2694, OA2694 +2695, OA2695 +2696, OA2696 +2697, OA2697 +2698, OA2698 +2699, OA2699 +2700, OA2700 +2701, OA2701 +2702, OA2702 +2703, OA2703 +2704, OA2704 +2705, OA2705 +2706, OA2706 +2707, OA2707 +2708, OA2708 +2709, OA2709 +2710, OA2710 +2711, OA2711 +2712, OA2712 +2713, OA2713 +2714, OA2714 +2715, OA2715 +2716, OA2716 +2717, OA2717 +2718, OA2718 +2719, OA2719 +2720, OA2720 +2721, OA2721 +2722, OA2722 +2723, OA2723 +2724, OA2724 +2725, OA2725 +2726, OA2726 +2727, OA2727 +2728, OA2728 +2729, OA2729 +2730, OA2730 +2731, OA2731 +2732, OA2732 +2733, OA2733 +2734, OA2734 +2735, OA2735 +2736, OA2736 +2737, OA2737 +2738, OA2738 +2739, OA2739 +2740, OA2740 +2741, OA2741 +2742, OA2742 +2743, OA2743 +2744, OA2744 +2745, OA2745 +2746, OA2746 +2747, OA2747 +2748, OA2748 +2749, OA2749 +2750, OA2750 +2751, OA2751 +2752, OA2752 +2753, OA2753 +2754, OA2754 +2755, OA2755 +2756, OA2756 +2757, OA2757 +2758, OA2758 +2759, OA2759 +2760, OA2760 +2761, OA2761 +2762, OA2762 +2763, OA2763 +2764, OA2764 +2765, OA2765 +2766, OA2766 +2767, OA2767 +2768, OA2768 +2769, OA2769 +2770, OA2770 +2771, OA2771 +2772, OA2772 +2773, OA2773 +2774, OA2774 +2775, OA2775 +2776, OA2776 +2777, OA2777 +2778, OA2778 +2779, OA2779 +2780, OA2780 +2781, OA2781 +2782, OA2782 +2783, OA2783 +2784, OA2784 +2785, OA2785 +2786, OA2786 +2787, OA2787 +2788, OA2788 +2789, OA2789 +2790, OA2790 +2791, OA2791 +2792, OA2792 +2793, OA2793 +2794, OA2794 +2795, OA2795 +2796, OA2796 +2797, OA2797 +2798, OA2798 +2799, OA2799 +2800, OA2800 +2801, OA2801 +2802, OA2802 +2803, OA2803 +2804, OA2804 +2805, OA2805 +2806, OA2806 +2807, OA2807 +2808, OA2808 +2809, OA2809 +2810, OA2810 +2811, OA2811 +2812, OA2812 +2813, OA2813 +2814, OA2814 +2815, OA2815 +2816, OA2816 +2817, OA2817 +2818, OA2818 +2819, OA2819 +2820, OA2820 +2821, OA2821 +2822, OA2822 +2823, OA2823 +2824, OA2824 +2825, OA2825 +2826, OA2826 +2827, OA2827 +2828, OA2828 +2829, OA2829 +2830, OA2830 +2831, OA2831 +2832, OA2832 +2833, OA2833 +2834, OA2834 +2835, OA2835 +2836, OA2836 +2837, OA2837 +2838, OA2838 +2839, OA2839 +2840, OA2840 +2841, OA2841 +2842, OA2842 +2843, OA2843 +2844, OA2844 +2845, OA2845 +2846, OA2846 +2847, OA2847 +2848, OA2848 +2849, OA2849 +2850, OA2850 +2851, OA2851 +2852, OA2852 +2853, OA2853 +2854, OA2854 +2855, OA2855 +2856, OA2856 +2857, OA2857 +2858, OA2858 +2859, OA2859 +2860, OA2860 +2861, OA2861 +2862, OA2862 +2863, OA2863 +2864, OA2864 +2865, OA2865 +2866, OA2866 +2867, OA2867 +2868, OA2868 +2869, OA2869 +2870, OA2870 +2871, OA2871 +2872, OA2872 +2873, OA2873 +2874, OA2874 +2875, OA2875 +2876, OA2876 +2877, OA2877 +2878, OA2878 +2879, OA2879 +2880, OA2880 +2881, OA2881 +2882, OA2882 +2883, OA2883 +2884, OA2884 +2885, OA2885 +2886, OA2886 +2887, OA2887 +2888, OA2888 +2889, OA2889 +2890, OA2890 +2891, OA2891 +2892, OA2892 +2893, OA2893 +2894, OA2894 +2895, OA2895 +2896, OA2896 +2897, OA2897 +2898, OA2898 +2899, OA2899 +2900, OA2900 +2901, OA2901 +2902, OA2902 +2903, OA2903 +2904, OA2904 +2905, OA2905 +2906, OA2906 +2907, OA2907 +2908, OA2908 +2909, OA2909 +2910, OA2910 +2911, OA2911 +2912, OA2912 +2913, OA2913 +2914, OA2914 +2915, OA2915 +2916, OA2916 +2917, OA2917 +2918, OA2918 +2919, OA2919 +2920, OA2920 +2921, OA2921 +2922, OA2922 +2923, OA2923 +2924, OA2924 +2925, OA2925 +2926, OA2926 +2927, OA2927 +2928, OA2928 +2929, OA2929 +2930, OA2930 +2931, OA2931 +2932, OA2932 +2933, OA2933 +2934, OA2934 +2935, OA2935 +2936, OA2936 +2937, OA2937 +2938, OA2938 +2939, OA2939 +2940, OA2940 +2941, OA2941 +2942, OA2942 +2943, OA2943 +2944, OA2944 +2945, OA2945 +2946, OA2946 +2947, OA2947 +2948, OA2948 +2949, OA2949 +2950, OA2950 +2951, OA2951 +2952, OA2952 +2953, OA2953 +2954, OA2954 +2955, OA2955 +2956, OA2956 +2957, OA2957 +2958, OA2958 +2959, OA2959 +2960, OA2960 +2961, OA2961 +2962, OA2962 +2963, OA2963 +2964, OA2964 +2965, OA2965 +2966, OA2966 +2967, OA2967 +2968, OA2968 +2969, OA2969 +2970, OA2970 +2971, OA2971 +2972, OA2972 +2973, OA2973 +2974, OA2974 +2975, OA2975 +2976, OA2976 +2977, OA2977 +2978, OA2978 +2979, OA2979 +2980, OA2980 +2981, OA2981 +2982, OA2982 +2983, OA2983 +2984, OA2984 +2985, OA2985 +2986, OA2986 +2987, OA2987 +2988, OA2988 +2989, OA2989 +2990, OA2990 +2991, OA2991 +2992, OA2992 +2993, OA2993 +2994, OA2994 +2995, OA2995 +2996, OA2996 +2997, OA2997 +2998, OA2998 +2999, OA2999 +3000, OA3000 +3001, OA3001 +3002, OA3002 +3003, OA3003 +3004, OA3004 +3005, OA3005 +3006, OA3006 +3007, OA3007 +3008, OA3008 +3009, OA3009 +3010, OA3010 +3011, OA3011 +3012, OA3012 +3013, OA3013 +3014, OA3014 +3015, OA3015 +3016, OA3016 +3017, OA3017 +3018, OA3018 +3019, OA3019 +3020, OA3020 +3021, OA3021 +3022, OA3022 +3023, OA3023 +3024, OA3024 +3025, OA3025 +3026, OA3026 +3027, OA3027 +3028, OA3028 +3029, OA3029 +3030, OA3030 +3031, OA3031 +3032, OA3032 +3033, OA3033 +3034, OA3034 +3035, OA3035 +3036, OA3036 +3037, OA3037 +3038, OA3038 +3039, OA3039 +3040, OA3040 +3041, OA3041 +3042, OA3042 +3043, OA3043 +3044, OA3044 +3045, OA3045 +3046, OA3046 +3047, OA3047 +3048, OA3048 +3049, OA3049 +3050, OA3050 +3051, OA3051 +3052, OA3052 +3053, OA3053 +3054, OA3054 +3055, OA3055 +3056, OA3056 +3057, OA3057 +3058, OA3058 +3059, OA3059 +3060, OA3060 +3061, OA3061 +3062, OA3062 +3063, OA3063 +3064, OA3064 +3065, OA3065 +3066, OA3066 +3067, OA3067 +3068, OA3068 +3069, OA3069 +3070, OA3070 +3071, OA3071 +3072, OA3072 +3073, OA3073 +3074, OA3074 +3075, OA3075 +3076, OA3076 +3077, OA3077 +3078, OA3078 +3079, OA3079 +3080, OA3080 +3081, OA3081 +3082, OA3082 +3083, OA3083 +3084, OA3084 +3085, OA3085 +3086, OA3086 +3087, OA3087 +3088, OA3088 +3089, OA3089 +3090, OA3090 +3091, OA3091 +3092, OA3092 +3093, OA3093 +3094, OA3094 +3095, OA3095 +3096, OA3096 +3097, OA3097 +3098, OA3098 +3099, OA3099 +3100, OA3100 +3101, OA3101 +3102, OA3102 +3103, OA3103 +3104, OA3104 +3105, OA3105 +3106, OA3106 +3107, OA3107 +3108, OA3108 +3109, OA3109 +3110, OA3110 +3111, OA3111 +3112, OA3112 +3113, OA3113 +3114, OA3114 +3115, OA3115 +3116, OA3116 +3117, OA3117 +3118, OA3118 +3119, OA3119 +3120, OA3120 +3121, OA3121 +3122, OA3122 +3123, OA3123 +3124, OA3124 +3125, OA3125 +3126, OA3126 +3127, OA3127 +3128, OA3128 +3129, OA3129 +3130, OA3130 +3131, OA3131 +3132, OA3132 +3133, OA3133 +3134, OA3134 +3135, OA3135 +3136, OA3136 +3137, OA3137 +3138, OA3138 +3139, OA3139 +3140, OA3140 +3141, OA3141 +3142, OA3142 +3143, OA3143 +3144, OA3144 +3145, OA3145 +3146, OA3146 +3147, OA3147 +3148, OA3148 +3149, OA3149 +3150, OA3150 +3151, OA3151 +3152, OA3152 +3153, OA3153 +3154, OA3154 +3155, OA3155 +3156, OA3156 +3157, OA3157 +3158, OA3158 +3159, OA3159 +3160, OA3160 +3161, OA3161 +3162, OA3162 +3163, OA3163 +3164, OA3164 +3165, OA3165 +3166, OA3166 +3167, OA3167 +3168, OA3168 +3169, OA3169 +3170, OA3170 +3171, OA3171 +3172, OA3172 +3173, OA3173 +3174, OA3174 +3175, OA3175 +3176, OA3176 +3177, OA3177 +3178, OA3178 +3179, OA3179 +3180, OA3180 +3181, OA3181 +3182, OA3182 +3183, OA3183 +3184, OA3184 +3185, OA3185 +3186, OA3186 +3187, OA3187 +3188, OA3188 +3189, OA3189 +3190, OA3190 +3191, OA3191 +3192, OA3192 +3193, OA3193 +3194, OA3194 +3195, OA3195 +3196, OA3196 +3197, OA3197 +3198, OA3198 +3199, OA3199 +3200, OA3200 +3201, OA3201 +3202, OA3202 +3203, OA3203 +3204, OA3204 +3205, OA3205 +3206, OA3206 +3207, OA3207 +3208, OA3208 +3209, OA3209 +3210, OA3210 +3211, OA3211 +3212, OA3212 +3213, OA3213 +3214, OA3214 +3215, OA3215 +3216, OA3216 +3217, OA3217 +3218, OA3218 +3219, OA3219 +3220, OA3220 +3221, OA3221 +3222, OA3222 +3223, OA3223 +3224, OA3224 +3225, OA3225 +3226, OA3226 +3227, OA3227 +3228, OA3228 +3229, OA3229 +3230, OA3230 +3231, OA3231 +3232, OA3232 +3233, OA3233 +3234, OA3234 +3235, OA3235 +3236, OA3236 +3237, OA3237 +3238, OA3238 +3239, OA3239 +3240, OA3240 +3241, OA3241 +3242, OA3242 +3243, OA3243 +3244, OA3244 +3245, OA3245 +3246, OA3246 +3247, OA3247 +3248, OA3248 +3249, OA3249 +3250, OA3250 +3251, OA3251 +3252, OA3252 +3253, OA3253 +3254, OA3254 +3255, OA3255 +3256, OA3256 +3257, OA3257 +3258, OA3258 +3259, OA3259 +3260, OA3260 +3261, OA3261 +3262, OA3262 +3263, OA3263 +3264, OA3264 +3265, OA3265 +3266, OA3266 +3267, OA3267 +3268, OA3268 +3269, OA3269 +3270, OA3270 +3271, OA3271 +3272, OA3272 +3273, OA3273 +3274, OA3274 +3275, OA3275 +3276, OA3276 +3277, OA3277 +3278, OA3278 +3279, OA3279 +3280, OA3280 +3281, OA3281 +3282, OA3282 +3283, OA3283 +3284, OA3284 +3285, OA3285 +3286, OA3286 +3287, OA3287 +3288, OA3288 +3289, OA3289 +3290, OA3290 +3291, OA3291 +3292, OA3292 +3293, OA3293 +3294, OA3294 +3295, OA3295 +3296, OA3296 +3297, OA3297 +3298, OA3298 +3299, OA3299 +3300, OA3300 +3301, OA3301 +3302, OA3302 +3303, OA3303 +3304, OA3304 +3305, OA3305 +3306, OA3306 +3307, OA3307 +3308, OA3308 +3309, OA3309 +3310, OA3310 +3311, OA3311 +3312, OA3312 +3313, OA3313 +3314, OA3314 +3315, OA3315 +3316, OA3316 +3317, OA3317 +3318, OA3318 +3319, OA3319 +3320, OA3320 +3321, OA3321 +3322, OA3322 +3323, OA3323 +3324, OA3324 +3325, OA3325 +3326, OA3326 +3327, OA3327 +3328, OA3328 +3329, OA3329 +3330, OA3330 +3331, OA3331 +3332, OA3332 +3333, OA3333 +3334, OA3334 +3335, OA3335 +3336, OA3336 +3337, OA3337 +3338, OA3338 +3339, OA3339 +3340, OA3340 +3341, OA3341 +3342, OA3342 +3343, OA3343 +3344, OA3344 +3345, OA3345 +3346, OA3346 +3347, OA3347 +3348, OA3348 +3349, OA3349 +3350, OA3350 +3351, OA3351 +3352, OA3352 +3353, OA3353 +3354, OA3354 +3355, OA3355 +3356, OA3356 +3357, OA3357 +3358, OA3358 +3359, OA3359 +3360, OA3360 +3361, OA3361 +3362, OA3362 +3363, OA3363 +3364, OA3364 +3365, OA3365 +3366, OA3366 +3367, OA3367 +3368, OA3368 +3369, OA3369 +3370, OA3370 +3371, OA3371 +3372, OA3372 +3373, OA3373 +3374, OA3374 +3375, OA3375 +3376, OA3376 +3377, OA3377 +3378, OA3378 +3379, OA3379 +3380, OA3380 +3381, OA3381 +3382, OA3382 +3383, OA3383 +3384, OA3384 +3385, OA3385 +3386, OA3386 +3387, OA3387 +3388, OA3388 +3389, OA3389 +3390, OA3390 +3391, OA3391 +3392, OA3392 +3393, OA3393 +3394, OA3394 +3395, OA3395 +3396, OA3396 +3397, OA3397 +3398, OA3398 +3399, OA3399 +3400, OA3400 +3401, OA3401 +3402, OA3402 +3403, OA3403 +3404, OA3404 +3405, OA3405 +3406, OA3406 +3407, OA3407 +3408, OA3408 +3409, OA3409 +3410, OA3410 +3411, OA3411 +3412, OA3412 +3413, OA3413 +3414, OA3414 +3415, OA3415 +3416, OA3416 +3417, OA3417 +3418, OA3418 +3419, OA3419 +3420, OA3420 +3421, OA3421 +3422, OA3422 +3423, OA3423 +3424, OA3424 +3425, OA3425 +3426, OA3426 +3427, OA3427 +3428, OA3428 +3429, OA3429 +3430, OA3430 +3431, OA3431 +3432, OA3432 +3433, OA3433 +3434, OA3434 +3435, OA3435 +3436, OA3436 +3437, OA3437 +3438, OA3438 +3439, OA3439 +3440, OA3440 +3441, OA3441 +3442, OA3442 +3443, OA3443 +3444, OA3444 +3445, OA3445 +3446, OA3446 +3447, OA3447 +3448, OA3448 +3449, OA3449 +3450, OA3450 +3451, OA3451 +3452, OA3452 +3453, OA3453 +3454, OA3454 +3455, OA3455 +3456, OA3456 +3457, OA3457 +3458, OA3458 +3459, OA3459 +3460, OA3460 +3461, OA3461 +3462, OA3462 +3463, OA3463 +3464, OA3464 +3465, OA3465 +3466, OA3466 +3467, OA3467 +3468, OA3468 +3469, OA3469 +3470, OA3470 +3471, OA3471 +3472, OA3472 +3473, OA3473 +3474, OA3474 +3475, OA3475 +3476, OA3476 +3477, OA3477 +3478, OA3478 +3479, OA3479 +3480, OA3480 +3481, OA3481 +3482, OA3482 +3483, OA3483 +3484, OA3484 +3485, OA3485 +3486, OA3486 +3487, OA3487 +3488, OA3488 +3489, OA3489 +3490, OA3490 +3491, OA3491 +3492, OA3492 +3493, OA3493 +3494, OA3494 +3495, OA3495 +3496, OA3496 +3497, OA3497 +3498, OA3498 +3499, OA3499 +3500, OA3500 +3501, OA3501 +3502, OA3502 +3503, OA3503 +3504, OA3504 +3505, OA3505 +3506, OA3506 +3507, OA3507 +3508, OA3508 +3509, OA3509 +3510, OA3510 +3511, OA3511 +3512, OA3512 +3513, OA3513 +3514, OA3514 +3515, OA3515 +3516, OA3516 +3517, OA3517 +3518, OA3518 +3519, OA3519 +3520, OA3520 +3521, OA3521 +3522, OA3522 +3523, OA3523 +3524, OA3524 +3525, OA3525 +3526, OA3526 +3527, OA3527 +3528, OA3528 +3529, OA3529 +3530, OA3530 +3531, OA3531 +3532, OA3532 +3533, OA3533 +3534, OA3534 +3535, OA3535 +3536, OA3536 +3537, OA3537 +3538, OA3538 +3539, OA3539 +3540, OA3540 +3541, OA3541 +3542, OA3542 +3543, OA3543 +3544, OA3544 +3545, OA3545 +3546, OA3546 +3547, OA3547 +3548, OA3548 +3549, OA3549 +3550, OA3550 +3551, OA3551 +3552, OA3552 +3553, OA3553 +3554, OA3554 +3555, OA3555 +3556, OA3556 +3557, OA3557 +3558, OA3558 +3559, OA3559 +3560, OA3560 +3561, OA3561 +3562, OA3562 +3563, OA3563 +3564, OA3564 +3565, OA3565 +3566, OA3566 +3567, OA3567 +3568, OA3568 +3569, OA3569 +3570, OA3570 +3571, OA3571 +3572, OA3572 +3573, OA3573 +3574, OA3574 +3575, OA3575 +3576, OA3576 +3577, OA3577 +3578, OA3578 +3579, OA3579 +3580, OA3580 +3581, OA3581 +3582, OA3582 +3583, OA3583 +3584, OA3584 +3585, OA3585 +3586, OA3586 +3587, OA3587 +3588, OA3588 +3589, OA3589 +3590, OA3590 +3591, OA3591 +3592, OA3592 +3593, OA3593 +3594, OA3594 +3595, OA3595 +3596, OA3596 +3597, OA3597 +3598, OA3598 +3599, OA3599 +3600, OA3600 +3601, OA3601 +3602, OA3602 +3603, OA3603 +3604, OA3604 +3605, OA3605 +3606, OA3606 +3607, OA3607 +3608, OA3608 +3609, OA3609 +3610, OA3610 +3611, OA3611 +3612, OA3612 +3613, OA3613 +3614, OA3614 +3615, OA3615 +3616, OA3616 +3617, OA3617 +3618, OA3618 +3619, OA3619 +3620, OA3620 +3621, OA3621 +3622, OA3622 +3623, OA3623 +3624, OA3624 +3625, OA3625 +3626, OA3626 +3627, OA3627 +3628, OA3628 +3629, OA3629 +3630, OA3630 +3631, OA3631 +3632, OA3632 +3633, OA3633 +3634, OA3634 +3635, OA3635 +3636, OA3636 +3637, OA3637 +3638, OA3638 +3639, OA3639 +3640, OA3640 +3641, OA3641 +3642, OA3642 +3643, OA3643 +3644, OA3644 +3645, OA3645 +3646, OA3646 +3647, OA3647 +3648, OA3648 +3649, OA3649 +3650, OA3650 +3651, OA3651 +3652, OA3652 +3653, OA3653 +3654, OA3654 +3655, OA3655 +3656, OA3656 +3657, OA3657 +3658, OA3658 +3659, OA3659 +3660, OA3660 +3661, OA3661 +3662, OA3662 +3663, OA3663 +3664, OA3664 +3665, OA3665 +3666, OA3666 +3667, OA3667 +3668, OA3668 +3669, OA3669 +3670, OA3670 +3671, OA3671 +3672, OA3672 +3673, OA3673 +3674, OA3674 +3675, OA3675 +3676, OA3676 +3677, OA3677 +3678, OA3678 +3679, OA3679 +3680, OA3680 +3681, OA3681 +3682, OA3682 +3683, OA3683 +3684, OA3684 +3685, OA3685 +3686, OA3686 +3687, OA3687 +3688, OA3688 +3689, OA3689 +3690, OA3690 +3691, OA3691 +3692, OA3692 +3693, OA3693 +3694, OA3694 +3695, OA3695 +3696, OA3696 +3697, OA3697 +3698, OA3698 +3699, OA3699 +3700, OA3700 +3701, OA3701 +3702, OA3702 +3703, OA3703 +3704, OA3704 +3705, OA3705 +3706, OA3706 +3707, OA3707 +3708, OA3708 +3709, OA3709 +3710, OA3710 +3711, OA3711 +3712, OA3712 +3713, OA3713 +3714, OA3714 +3715, OA3715 +3716, OA3716 +3717, OA3717 +3718, OA3718 +3719, OA3719 +3720, OA3720 +3721, OA3721 +3722, OA3722 +3723, OA3723 +3724, OA3724 +3725, OA3725 +3726, OA3726 +3727, OA3727 +3728, OA3728 +3729, OA3729 +3730, OA3730 +3731, OA3731 +3732, OA3732 +3733, OA3733 +3734, OA3734 +3735, OA3735 +3736, OA3736 +3737, OA3737 +3738, OA3738 +3739, OA3739 +3740, OA3740 +3741, OA3741 +3742, OA3742 +3743, OA3743 +3744, OA3744 +3745, OA3745 +3746, OA3746 +3747, OA3747 +3748, OA3748 +3749, OA3749 +3750, OA3750 +3751, OA3751 +3752, OA3752 +3753, OA3753 +3754, OA3754 +3755, OA3755 +3756, OA3756 +3757, OA3757 +3758, OA3758 +3759, OA3759 +3760, OA3760 +3761, OA3761 +3762, OA3762 +3763, OA3763 +3764, OA3764 +3765, OA3765 +3766, OA3766 +3767, OA3767 +3768, OA3768 +3769, OA3769 +3770, OA3770 +3771, OA3771 +3772, OA3772 +3773, OA3773 +3774, OA3774 +3775, OA3775 +3776, OA3776 +3777, OA3777 +3778, OA3778 +3779, OA3779 +3780, OA3780 +3781, OA3781 +3782, OA3782 +3783, OA3783 +3784, OA3784 +3785, OA3785 +3786, OA3786 +3787, OA3787 +3788, OA3788 +3789, OA3789 +3790, OA3790 +3791, OA3791 +3792, OA3792 +3793, OA3793 +3794, OA3794 +3795, OA3795 +3796, OA3796 +3797, OA3797 +3798, OA3798 +3799, OA3799 +3800, OA3800 +3801, OA3801 +3802, OA3802 +3803, OA3803 +3804, OA3804 +3805, OA3805 +3806, OA3806 +3807, OA3807 +3808, OA3808 +3809, OA3809 +3810, OA3810 +3811, OA3811 +3812, OA3812 +3813, OA3813 +3814, OA3814 +3815, OA3815 +3816, OA3816 +3817, OA3817 +3818, OA3818 +3819, OA3819 +3820, OA3820 +3821, OA3821 +3822, OA3822 +3823, OA3823 +3824, OA3824 +3825, OA3825 +3826, OA3826 +3827, OA3827 +3828, OA3828 +3829, OA3829 +3830, OA3830 +3831, OA3831 +3832, OA3832 +3833, OA3833 +3834, OA3834 +3835, OA3835 +3836, OA3836 +3837, OA3837 +3838, OA3838 +3839, OA3839 +3840, OA3840 +3841, OA3841 +3842, OA3842 +3843, OA3843 +3844, OA3844 +3845, OA3845 +3846, OA3846 +3847, OA3847 +3848, OA3848 +3849, OA3849 +3850, OA3850 +3851, OA3851 +3852, OA3852 +3853, OA3853 +3854, OA3854 +3855, OA3855 +3856, OA3856 +3857, OA3857 +3858, OA3858 +3859, OA3859 +3860, OA3860 +3861, OA3861 +3862, OA3862 +3863, OA3863 +3864, OA3864 +3865, OA3865 +3866, OA3866 +3867, OA3867 +3868, OA3868 +3869, OA3869 +3870, OA3870 +3871, OA3871 +3872, OA3872 +3873, OA3873 +3874, OA3874 +3875, OA3875 +3876, OA3876 +3877, OA3877 +3878, OA3878 +3879, OA3879 +3880, OA3880 +3881, OA3881 +3882, OA3882 +3883, OA3883 +3884, OA3884 +3885, OA3885 +3886, OA3886 +3887, OA3887 +3888, OA3888 +3889, OA3889 +3890, OA3890 +3891, OA3891 +3892, OA3892 +3893, OA3893 +3894, OA3894 +3895, OA3895 +3896, OA3896 +3897, OA3897 +3898, OA3898 +3899, OA3899 +3900, OA3900 +3901, OA3901 +3902, OA3902 +3903, OA3903 +3904, OA3904 +3905, OA3905 +3906, OA3906 +3907, OA3907 +3908, OA3908 +3909, OA3909 +3910, OA3910 +3911, OA3911 +3912, OA3912 +3913, OA3913 +3914, OA3914 +3915, OA3915 +3916, OA3916 +3917, OA3917 +3918, OA3918 +3919, OA3919 +3920, OA3920 +3921, OA3921 +3922, OA3922 +3923, OA3923 +3924, OA3924 +3925, OA3925 +3926, OA3926 +3927, OA3927 +3928, OA3928 +3929, OA3929 +3930, OA3930 +3931, OA3931 +3932, OA3932 +3933, OA3933 +3934, OA3934 +3935, OA3935 +3936, OA3936 +3937, OA3937 +3938, OA3938 +3939, OA3939 +3940, OA3940 +3941, OA3941 +3942, OA3942 +3943, OA3943 +3944, OA3944 +3945, OA3945 +3946, OA3946 +3947, OA3947 +3948, OA3948 +3949, OA3949 +3950, OA3950 +3951, OA3951 +3952, OA3952 +3953, OA3953 +3954, OA3954 +3955, OA3955 +3956, OA3956 +3957, OA3957 +3958, OA3958 +3959, OA3959 +3960, OA3960 +3961, OA3961 +3962, OA3962 +3963, OA3963 +3964, OA3964 +3965, OA3965 +3966, OA3966 +3967, OA3967 +3968, OA3968 +3969, OA3969 +3970, OA3970 +3971, OA3971 +3972, OA3972 +3973, OA3973 +3974, OA3974 +3975, OA3975 +3976, OA3976 +3977, OA3977 +3978, OA3978 +3979, OA3979 +3980, OA3980 +3981, OA3981 +3982, OA3982 +3983, OA3983 +3984, OA3984 +3985, OA3985 +3986, OA3986 +3987, OA3987 +3988, OA3988 +3989, OA3989 +3990, OA3990 +3991, OA3991 +3992, OA3992 +3993, OA3993 +3994, OA3994 +3995, OA3995 +3996, OA3996 +3997, OA3997 +3998, OA3998 +3999, OA3999 +4000, OA4000 +4001, OA4001 +4002, OA4002 +4003, OA4003 +4004, OA4004 +4005, OA4005 +4006, OA4006 +4007, OA4007 +4008, OA4008 +4009, OA4009 +4010, OA4010 +4011, OA4011 +4012, OA4012 +4013, OA4013 +4014, OA4014 +4015, OA4015 +4016, OA4016 +4017, OA4017 +4018, OA4018 +4019, OA4019 +4020, OA4020 +4021, OA4021 +4022, OA4022 +4023, OA4023 +4024, OA4024 +4025, OA4025 +4026, OA4026 +4027, OA4027 +4028, OA4028 +4029, OA4029 +4030, OA4030 +4031, OA4031 +4032, OA4032 +4033, OA4033 +4034, OA4034 +4035, OA4035 +4036, OA4036 +4037, OA4037 +4038, OA4038 +4039, OA4039 +4040, OA4040 +4041, OA4041 +4042, OA4042 +4043, OA4043 +4044, OA4044 +4045, OA4045 +4046, OA4046 +4047, OA4047 +4048, OA4048 +4049, OA4049 +4050, OA4050 +4051, OA4051 +4052, OA4052 +4053, OA4053 +4054, OA4054 +4055, OA4055 +4056, OA4056 +4057, OA4057 +4058, OA4058 +4059, OA4059 +4060, OA4060 +4061, OA4061 +4062, OA4062 +4063, OA4063 +4064, OA4064 +4065, OA4065 +4066, OA4066 +4067, OA4067 +4068, OA4068 +4069, OA4069 +4070, OA4070 +4071, OA4071 +4072, OA4072 +4073, OA4073 +4074, OA4074 +4075, OA4075 +4076, OA4076 +4077, OA4077 +4078, OA4078 +4079, OA4079 +4080, OA4080 +4081, OA4081 +4082, OA4082 +4083, OA4083 +4084, OA4084 +4085, OA4085 +4086, OA4086 +4087, OA4087 +4088, OA4088 +4089, OA4089 +4090, OA4090 +4091, OA4091 +4092, OA4092 +4093, OA4093 +4094, OA4094 +4095, OA4095 +4096, OA4096 +4097, OA4097 +4098, OA4098 +4099, OA4099 +4100, OA4100 +4101, OA4101 +4102, OA4102 +4103, OA4103 +4104, OA4104 +4105, OA4105 +4106, OA4106 +4107, OA4107 +4108, OA4108 +4109, OA4109 +4110, OA4110 +4111, OA4111 +4112, OA4112 +4113, OA4113 +4114, OA4114 +4115, OA4115 +4116, OA4116 +4117, OA4117 +4118, OA4118 +4119, OA4119 +4120, OA4120 +4121, OA4121 +4122, OA4122 +4123, OA4123 +4124, OA4124 +4125, OA4125 +4126, OA4126 +4127, OA4127 +4128, OA4128 +4129, OA4129 +4130, OA4130 +4131, OA4131 +4132, OA4132 +4133, OA4133 +4134, OA4134 +4135, OA4135 +4136, OA4136 +4137, OA4137 +4138, OA4138 +4139, OA4139 +4140, OA4140 +4141, OA4141 +4142, OA4142 +4143, OA4143 +4144, OA4144 +4145, OA4145 +4146, OA4146 +4147, OA4147 +4148, OA4148 +4149, OA4149 +4150, OA4150 +4151, OA4151 +4152, OA4152 +4153, OA4153 +4154, OA4154 +4155, OA4155 +4156, OA4156 +4157, OA4157 +4158, OA4158 +4159, OA4159 +4160, OA4160 +4161, OA4161 +4162, OA4162 +4163, OA4163 +4164, OA4164 +4165, OA4165 +4166, OA4166 +4167, OA4167 +4168, OA4168 +4169, OA4169 +4170, OA4170 +4171, OA4171 +4172, OA4172 +4173, OA4173 +4174, OA4174 +4175, OA4175 +4176, OA4176 +4177, OA4177 +4178, OA4178 +4179, OA4179 +4180, OA4180 +4181, OA4181 +4182, OA4182 +4183, OA4183 +4184, OA4184 +4185, OA4185 +4186, OA4186 +4187, OA4187 +4188, OA4188 +4189, OA4189 +4190, OA4190 +4191, OA4191 +4192, OA4192 +4193, OA4193 +4194, OA4194 +4195, OA4195 +4196, OA4196 +4197, OA4197 +4198, OA4198 +4199, OA4199 +4200, OA4200 +4201, OA4201 +4202, OA4202 +4203, OA4203 +4204, OA4204 +4205, OA4205 +4206, OA4206 +4207, OA4207 +4208, OA4208 +4209, OA4209 +4210, OA4210 +4211, OA4211 +4212, OA4212 +4213, OA4213 +4214, OA4214 +4215, OA4215 +4216, OA4216 +4217, OA4217 +4218, OA4218 +4219, OA4219 +4220, OA4220 +4221, OA4221 +4222, OA4222 +4223, OA4223 +4224, OA4224 +4225, OA4225 +4226, OA4226 +4227, OA4227 +4228, OA4228 +4229, OA4229 +4230, OA4230 +4231, OA4231 +4232, OA4232 +4233, OA4233 +4234, OA4234 +4235, OA4235 +4236, OA4236 +4237, OA4237 +4238, OA4238 +4239, OA4239 +4240, OA4240 +4241, OA4241 +4242, OA4242 +4243, OA4243 +4244, OA4244 +4245, OA4245 +4246, OA4246 +4247, OA4247 +4248, OA4248 +4249, OA4249 +4250, OA4250 +4251, OA4251 +4252, OA4252 +4253, OA4253 +4254, OA4254 +4255, OA4255 +4256, OA4256 +4257, OA4257 +4258, OA4258 +4259, OA4259 +4260, OA4260 +4261, OA4261 +4262, OA4262 +4263, OA4263 +4264, OA4264 +4265, OA4265 +4266, OA4266 +4267, OA4267 +4268, OA4268 +4269, OA4269 +4270, OA4270 +4271, OA4271 +4272, OA4272 +4273, OA4273 +4274, OA4274 +4275, OA4275 +4276, OA4276 +4277, OA4277 +4278, OA4278 +4279, OA4279 +4280, OA4280 +4281, OA4281 +4282, OA4282 +4283, OA4283 +4284, OA4284 +4285, OA4285 +4286, OA4286 +4287, OA4287 +4288, OA4288 +4289, OA4289 +4290, OA4290 +4291, OA4291 +4292, OA4292 +4293, OA4293 +4294, OA4294 +4295, OA4295 +4296, OA4296 +4297, OA4297 +4298, OA4298 +4299, OA4299 +4300, OA4300 +4301, OA4301 +4302, OA4302 +4303, OA4303 +4304, OA4304 +4305, OA4305 +4306, OA4306 +4307, OA4307 +4308, OA4308 +4309, OA4309 +4310, OA4310 +4311, OA4311 +4312, OA4312 +4313, OA4313 +4314, OA4314 +4315, OA4315 +4316, OA4316 +4317, OA4317 +4318, OA4318 +4319, OA4319 +4320, OA4320 +4321, OA4321 +4322, OA4322 +4323, OA4323 +4324, OA4324 +4325, OA4325 +4326, OA4326 +4327, OA4327 +4328, OA4328 +4329, OA4329 +4330, OA4330 +4331, OA4331 +4332, OA4332 +4333, OA4333 +4334, OA4334 +4335, OA4335 +4336, OA4336 +4337, OA4337 +4338, OA4338 +4339, OA4339 +4340, OA4340 +4341, OA4341 +4342, OA4342 +4343, OA4343 +4344, OA4344 +4345, OA4345 +4346, OA4346 +4347, OA4347 +4348, OA4348 +4349, OA4349 +4350, OA4350 +4351, OA4351 +4352, OA4352 +4353, OA4353 +4354, OA4354 +4355, OA4355 +4356, OA4356 +4357, OA4357 +4358, OA4358 +4359, OA4359 +4360, OA4360 +4361, OA4361 +4362, OA4362 +4363, OA4363 +4364, OA4364 +4365, OA4365 +4366, OA4366 +4367, OA4367 +4368, OA4368 +4369, OA4369 +4370, OA4370 +4371, OA4371 +4372, OA4372 +4373, OA4373 +4374, OA4374 +4375, OA4375 +4376, OA4376 +4377, OA4377 +4378, OA4378 +4379, OA4379 +4380, OA4380 +4381, OA4381 +4382, OA4382 +4383, OA4383 +4384, OA4384 +4385, OA4385 +4386, OA4386 +4387, OA4387 +4388, OA4388 +4389, OA4389 +4390, OA4390 +4391, OA4391 +4392, OA4392 +4393, OA4393 +4394, OA4394 +4395, OA4395 +4396, OA4396 +4397, OA4397 +4398, OA4398 +4399, OA4399 +4400, OA4400 +4401, OA4401 +4402, OA4402 +4403, OA4403 +4404, OA4404 +4405, OA4405 +4406, OA4406 +4407, OA4407 +4408, OA4408 +4409, OA4409 +4410, OA4410 +4411, OA4411 +4412, OA4412 +4413, OA4413 +4414, OA4414 +4415, OA4415 +4416, OA4416 +4417, OA4417 +4418, OA4418 +4419, OA4419 +4420, OA4420 +4421, OA4421 +4422, OA4422 +4423, OA4423 +4424, OA4424 +4425, OA4425 +4426, OA4426 +4427, OA4427 +4428, OA4428 +4429, OA4429 +4430, OA4430 +4431, OA4431 +4432, OA4432 +4433, OA4433 +4434, OA4434 +4435, OA4435 +4436, OA4436 +4437, OA4437 +4438, OA4438 +4439, OA4439 +4440, OA4440 +4441, OA4441 +4442, OA4442 +4443, OA4443 +4444, OA4444 +4445, OA4445 +4446, OA4446 +4447, OA4447 +4448, OA4448 +4449, OA4449 +4450, OA4450 +4451, OA4451 +4452, OA4452 +4453, OA4453 +4454, OA4454 +4455, OA4455 +4456, OA4456 +4457, OA4457 +4458, OA4458 +4459, OA4459 +4460, OA4460 +4461, OA4461 +4462, OA4462 +4463, OA4463 +4464, OA4464 +4465, OA4465 +4466, OA4466 +4467, OA4467 +4468, OA4468 +4469, OA4469 +4470, OA4470 +4471, OA4471 +4472, OA4472 +4473, OA4473 +4474, OA4474 +4475, OA4475 +4476, OA4476 +4477, OA4477 +4478, OA4478 +4479, OA4479 +4480, OA4480 +4481, OA4481 +4482, OA4482 +4483, OA4483 +4484, OA4484 +4485, OA4485 +4486, OA4486 +4487, OA4487 +4488, OA4488 +4489, OA4489 +4490, OA4490 +4491, OA4491 +4492, OA4492 +4493, OA4493 +4494, OA4494 +4495, OA4495 +4496, OA4496 +4497, OA4497 +4498, OA4498 +4499, OA4499 +4500, OA4500 +4501, OA4501 +4502, OA4502 +4503, OA4503 +4504, OA4504 +4505, OA4505 +4506, OA4506 +4507, OA4507 +4508, OA4508 +4509, OA4509 +4510, OA4510 +4511, OA4511 +4512, OA4512 +4513, OA4513 +4514, OA4514 +4515, OA4515 +4516, OA4516 +4517, OA4517 +4518, OA4518 +4519, OA4519 +4520, OA4520 +4521, OA4521 +4522, OA4522 +4523, OA4523 +4524, OA4524 +4525, OA4525 +4526, OA4526 +4527, OA4527 +4528, OA4528 +4529, OA4529 +4530, OA4530 +4531, OA4531 +4532, OA4532 +4533, OA4533 +4534, OA4534 +4535, OA4535 +4536, OA4536 +4537, OA4537 +4538, OA4538 +4539, OA4539 +4540, OA4540 +4541, OA4541 +4542, OA4542 +4543, OA4543 +4544, OA4544 +4545, OA4545 +4546, OA4546 +4547, OA4547 +4548, OA4548 +4549, OA4549 +4550, OA4550 +4551, OA4551 +4552, OA4552 +4553, OA4553 +4554, OA4554 +4555, OA4555 +4556, OA4556 +4557, OA4557 +4558, OA4558 +4559, OA4559 +4560, OA4560 +4561, OA4561 +4562, OA4562 +4563, OA4563 +4564, OA4564 +4565, OA4565 +4566, OA4566 +4567, OA4567 +4568, OA4568 +4569, OA4569 +4570, OA4570 +4571, OA4571 +4572, OA4572 +4573, OA4573 +4574, OA4574 +4575, OA4575 +4576, OA4576 +4577, OA4577 +4578, OA4578 +4579, OA4579 +4580, OA4580 +4581, OA4581 +4582, OA4582 +4583, OA4583 +4584, OA4584 +4585, OA4585 +4586, OA4586 +4587, OA4587 +4588, OA4588 +4589, OA4589 +4590, OA4590 +4591, OA4591 +4592, OA4592 +4593, OA4593 +4594, OA4594 +4595, OA4595 +4596, OA4596 +4597, OA4597 +4598, OA4598 +4599, OA4599 +4600, OA4600 +4601, OA4601 +4602, OA4602 +4603, OA4603 +4604, OA4604 +4605, OA4605 +4606, OA4606 +4607, OA4607 +4608, OA4608 +4609, OA4609 +4610, OA4610 +4611, OA4611 +4612, OA4612 +4613, OA4613 +4614, OA4614 +4615, OA4615 +4616, OA4616 +4617, OA4617 +4618, OA4618 +4619, OA4619 +4620, OA4620 +4621, OA4621 +4622, OA4622 +4623, OA4623 +4624, OA4624 +4625, OA4625 +4626, OA4626 +4627, OA4627 +4628, OA4628 +4629, OA4629 +4630, OA4630 +4631, OA4631 +4632, OA4632 +4633, OA4633 +4634, OA4634 +4635, OA4635 +4636, OA4636 +4637, OA4637 +4638, OA4638 +4639, OA4639 +4640, OA4640 +4641, OA4641 +4642, OA4642 +4643, OA4643 +4644, OA4644 +4645, OA4645 +4646, OA4646 +4647, OA4647 +4648, OA4648 +4649, OA4649 +4650, OA4650 +4651, OA4651 +4652, OA4652 +4653, OA4653 +4654, OA4654 +4655, OA4655 +4656, OA4656 +4657, OA4657 +4658, OA4658 +4659, OA4659 +4660, OA4660 +4661, OA4661 +4662, OA4662 +4663, OA4663 +4664, OA4664 +4665, OA4665 +4666, OA4666 +4667, OA4667 +4668, OA4668 +4669, OA4669 +4670, OA4670 +4671, OA4671 +4672, OA4672 +4673, OA4673 +4674, OA4674 +4675, OA4675 +4676, OA4676 +4677, OA4677 +4678, OA4678 +4679, OA4679 +4680, OA4680 +4681, OA4681 +4682, OA4682 +4683, OA4683 +4684, OA4684 +4685, OA4685 +4686, OA4686 +4687, OA4687 +4688, OA4688 +4689, OA4689 +4690, OA4690 +4691, OA4691 +4692, OA4692 +4693, OA4693 +4694, OA4694 +4695, OA4695 +4696, OA4696 +4697, OA4697 +4698, OA4698 +4699, OA4699 +4700, OA4700 +4701, OA4701 +4702, OA4702 +4703, OA4703 +4704, OA4704 +4705, OA4705 +4706, OA4706 +4707, OA4707 +4708, OA4708 +4709, OA4709 +4710, OA4710 +4711, OA4711 +4712, OA4712 +4713, OA4713 +4714, OA4714 +4715, OA4715 +4716, OA4716 +4717, OA4717 +4718, OA4718 +4719, OA4719 +4720, OA4720 +4721, OA4721 +4722, OA4722 +4723, OA4723 +4724, OA4724 +4725, OA4725 +4726, OA4726 +4727, OA4727 +4728, OA4728 +4729, OA4729 +4730, OA4730 +4731, OA4731 +4732, OA4732 +4733, OA4733 +4734, OA4734 +4735, OA4735 +4736, OA4736 +4737, OA4737 +4738, OA4738 +4739, OA4739 +4740, OA4740 +4741, OA4741 +4742, OA4742 +4743, OA4743 +4744, OA4744 +4745, OA4745 +4746, OA4746 +4747, OA4747 +4748, OA4748 +4749, OA4749 +4750, OA4750 +4751, OA4751 +4752, OA4752 +4753, OA4753 +4754, OA4754 +4755, OA4755 +4756, OA4756 +4757, OA4757 +4758, OA4758 +4759, OA4759 +4760, OA4760 +4761, OA4761 +4762, OA4762 +4763, OA4763 +4764, OA4764 +4765, OA4765 +4766, OA4766 +4767, OA4767 +4768, OA4768 +4769, OA4769 +4770, OA4770 +4771, OA4771 +4772, OA4772 +4773, OA4773 +4774, OA4774 +4775, OA4775 +4776, OA4776 +4777, OA4777 +4778, OA4778 +4779, OA4779 +4780, OA4780 +4781, OA4781 +4782, OA4782 +4783, OA4783 +4784, OA4784 +4785, OA4785 +4786, OA4786 +4787, OA4787 +4788, OA4788 +4789, OA4789 +4790, OA4790 +4791, OA4791 +4792, OA4792 +4793, OA4793 +4794, OA4794 +4795, OA4795 +4796, OA4796 +4797, OA4797 +4798, OA4798 +4799, OA4799 +4800, OA4800 +4801, OA4801 +4802, OA4802 +4803, OA4803 +4804, OA4804 +4805, OA4805 +4806, OA4806 +4807, OA4807 +4808, OA4808 +4809, OA4809 +4810, OA4810 +4811, OA4811 +4812, OA4812 +4813, OA4813 +4814, OA4814 +4815, OA4815 +4816, OA4816 +4817, OA4817 +4818, OA4818 +4819, OA4819 +4820, OA4820 +4821, OA4821 +4822, OA4822 +4823, OA4823 +4824, OA4824 +4825, OA4825 +4826, OA4826 +4827, OA4827 +4828, OA4828 +4829, OA4829 +4830, OA4830 +4831, OA4831 +4832, OA4832 +4833, OA4833 +4834, OA4834 +4835, OA4835 +4836, OA4836 +4837, OA4837 +4838, OA4838 +4839, OA4839 +4840, OA4840 +4841, OA4841 +4842, OA4842 +4843, OA4843 +4844, OA4844 +4845, OA4845 +4846, OA4846 +4847, OA4847 +4848, OA4848 +4849, OA4849 +4850, OA4850 +4851, OA4851 +4852, OA4852 +4853, OA4853 +4854, OA4854 +4855, OA4855 +4856, OA4856 +4857, OA4857 +4858, OA4858 +4859, OA4859 +4860, OA4860 +4861, OA4861 +4862, OA4862 +4863, OA4863 +4864, OA4864 +4865, OA4865 +4866, OA4866 +4867, OA4867 +4868, OA4868 +4869, OA4869 +4870, OA4870 +4871, OA4871 +4872, OA4872 +4873, OA4873 +4874, OA4874 +4875, OA4875 +4876, OA4876 +4877, OA4877 +4878, OA4878 +4879, OA4879 +4880, OA4880 +4881, OA4881 +4882, OA4882 +4883, OA4883 +4884, OA4884 +4885, OA4885 +4886, OA4886 +4887, OA4887 +4888, OA4888 +4889, OA4889 +4890, OA4890 +4891, OA4891 +4892, OA4892 +4893, OA4893 +4894, OA4894 +4895, OA4895 +4896, OA4896 +4897, OA4897 +4898, OA4898 +4899, OA4899 +4900, OA4900 +4901, OA4901 +4902, OA4902 +4903, OA4903 +4904, OA4904 +4905, OA4905 +4906, OA4906 +4907, OA4907 +4908, OA4908 +4909, OA4909 +4910, OA4910 +4911, OA4911 +4912, OA4912 +4913, OA4913 +4914, OA4914 +4915, OA4915 +4916, OA4916 +4917, OA4917 +4918, OA4918 +4919, OA4919 +4920, OA4920 +4921, OA4921 +4922, OA4922 +4923, OA4923 +4924, OA4924 +4925, OA4925 +4926, OA4926 +4927, OA4927 +4928, OA4928 +4929, OA4929 +4930, OA4930 +4931, OA4931 +4932, OA4932 +4933, OA4933 +4934, OA4934 +4935, OA4935 +4936, OA4936 +4937, OA4937 +4938, OA4938 +4939, OA4939 +4940, OA4940 +4941, OA4941 +4942, OA4942 +4943, OA4943 +4944, OA4944 +4945, OA4945 +4946, OA4946 +4947, OA4947 +4948, OA4948 +4949, OA4949 +4950, OA4950 +4951, OA4951 +4952, OA4952 +4953, OA4953 +4954, OA4954 +4955, OA4955 +4956, OA4956 +4957, OA4957 +4958, OA4958 +4959, OA4959 +4960, OA4960 +4961, OA4961 +4962, OA4962 +4963, OA4963 +4964, OA4964 +4965, OA4965 +4966, OA4966 +4967, OA4967 +4968, OA4968 +4969, OA4969 +4970, OA4970 +4971, OA4971 +4972, OA4972 +4973, OA4973 +4974, OA4974 +4975, OA4975 +4976, OA4976 +4977, OA4977 +4978, OA4978 +4979, OA4979 +4980, OA4980 +4981, OA4981 +4982, OA4982 +4983, OA4983 +4984, OA4984 +4985, OA4985 +4986, OA4986 +4987, OA4987 +4988, OA4988 +4989, OA4989 +4990, OA4990 +4991, OA4991 +4992, OA4992 +4993, OA4993 +4994, OA4994 +4995, OA4995 +4996, OA4996 +4997, OA4997 +4998, OA4998 +4999, OA4999 +5000, OA5000 +5001, OA5001 +5002, OA5002 +5003, OA5003 +5004, OA5004 +5005, OA5005 +5006, OA5006 +5007, OA5007 +5008, OA5008 +5009, OA5009 +5010, OA5010 +5011, OA5011 +5012, OA5012 +5013, OA5013 +5014, OA5014 +5015, OA5015 +5016, OA5016 +5017, OA5017 +5018, OA5018 +5019, OA5019 +5020, OA5020 +5021, OA5021 +5022, OA5022 +5023, OA5023 +5024, OA5024 +5025, OA5025 +5026, OA5026 +5027, OA5027 +5028, OA5028 +5029, OA5029 +5030, OA5030 +5031, OA5031 +5032, OA5032 +5033, OA5033 +5034, OA5034 +5035, OA5035 +5036, OA5036 +5037, OA5037 +5038, OA5038 +5039, OA5039 +5040, OA5040 +5041, OA5041 +5042, OA5042 +5043, OA5043 +5044, OA5044 +5045, OA5045 +5046, OA5046 +5047, OA5047 +5048, OA5048 +5049, OA5049 +5050, OA5050 +5051, OA5051 +5052, OA5052 +5053, OA5053 +5054, OA5054 +5055, OA5055 +5056, OA5056 +5057, OA5057 +5058, OA5058 +5059, OA5059 +5060, OA5060 +5061, OA5061 +5062, OA5062 +5063, OA5063 +5064, OA5064 +5065, OA5065 +5066, OA5066 +5067, OA5067 +5068, OA5068 +5069, OA5069 +5070, OA5070 +5071, OA5071 +5072, OA5072 +5073, OA5073 +5074, OA5074 +5075, OA5075 +5076, OA5076 +5077, OA5077 +5078, OA5078 +5079, OA5079 +5080, OA5080 +5081, OA5081 +5082, OA5082 +5083, OA5083 +5084, OA5084 +5085, OA5085 +5086, OA5086 +5087, OA5087 +5088, OA5088 +5089, OA5089 +5090, OA5090 +5091, OA5091 +5092, OA5092 +5093, OA5093 +5094, OA5094 +5095, OA5095 +5096, OA5096 +5097, OA5097 +5098, OA5098 +5099, OA5099 +5100, OA5100 +5101, OA5101 +5102, OA5102 +5103, OA5103 +5104, OA5104 +5105, OA5105 +5106, OA5106 +5107, OA5107 +5108, OA5108 +5109, OA5109 +5110, OA5110 +5111, OA5111 +5112, OA5112 +5113, OA5113 +5114, OA5114 +5115, OA5115 +5116, OA5116 +5117, OA5117 +5118, OA5118 +5119, OA5119 +5120, OA5120 +5121, OA5121 +5122, OA5122 +5123, OA5123 +5124, OA5124 +5125, OA5125 +5126, OA5126 +5127, OA5127 +5128, OA5128 +5129, OA5129 +5130, OA5130 +5131, OA5131 +5132, OA5132 +5133, OA5133 +5134, OA5134 +5135, OA5135 +5136, OA5136 +5137, OA5137 +5138, OA5138 +5139, OA5139 +5140, OA5140 +5141, OA5141 +5142, OA5142 +5143, OA5143 +5144, OA5144 +5145, OA5145 +5146, OA5146 +5147, OA5147 +5148, OA5148 +5149, OA5149 +5150, OA5150 +5151, OA5151 +5152, OA5152 +5153, OA5153 +5154, OA5154 +5155, OA5155 +5156, OA5156 +5157, OA5157 +5158, OA5158 +5159, OA5159 +5160, OA5160 +5161, OA5161 +5162, OA5162 +5163, OA5163 +5164, OA5164 +5165, OA5165 +5166, OA5166 +5167, OA5167 +5168, OA5168 +5169, OA5169 +5170, OA5170 +5171, OA5171 +5172, OA5172 +5173, OA5173 +5174, OA5174 +5175, OA5175 +5176, OA5176 +5177, OA5177 +5178, OA5178 +5179, OA5179 +5180, OA5180 +5181, OA5181 +5182, OA5182 +5183, OA5183 +5184, OA5184 +5185, OA5185 +5186, OA5186 +5187, OA5187 +5188, OA5188 +5189, OA5189 +5190, OA5190 +5191, OA5191 +5192, OA5192 +5193, OA5193 +5194, OA5194 +5195, OA5195 +5196, OA5196 +5197, OA5197 +5198, OA5198 +5199, OA5199 +5200, OA5200 +5201, OA5201 +5202, OA5202 +5203, OA5203 +5204, OA5204 +5205, OA5205 +5206, OA5206 +5207, OA5207 +5208, OA5208 +5209, OA5209 +5210, OA5210 +5211, OA5211 +5212, OA5212 +5213, OA5213 +5214, OA5214 +5215, OA5215 +5216, OA5216 +5217, OA5217 +5218, OA5218 +5219, OA5219 +5220, OA5220 +5221, OA5221 +5222, OA5222 +5223, OA5223 +5224, OA5224 +5225, OA5225 +5226, OA5226 +5227, OA5227 +5228, OA5228 +5229, OA5229 +5230, OA5230 +5231, OA5231 +5232, OA5232 +5233, OA5233 +5234, OA5234 +5235, OA5235 +5236, OA5236 +5237, OA5237 +5238, OA5238 +5239, OA5239 +5240, OA5240 +5241, OA5241 +5242, OA5242 +5243, OA5243 +5244, OA5244 +5245, OA5245 +5246, OA5246 +5247, OA5247 +5248, OA5248 +5249, OA5249 +5250, OA5250 +5251, OA5251 +5252, OA5252 +5253, OA5253 +5254, OA5254 +5255, OA5255 +5256, OA5256 +5257, OA5257 +5258, OA5258 +5259, OA5259 +5260, OA5260 +5261, OA5261 +5262, OA5262 +5263, OA5263 +5264, OA5264 +5265, OA5265 +5266, OA5266 +5267, OA5267 +5268, OA5268 +5269, OA5269 +5270, OA5270 +5271, OA5271 +5272, OA5272 +5273, OA5273 +5274, OA5274 +5275, OA5275 +5276, OA5276 +5277, OA5277 +5278, OA5278 +5279, OA5279 +5280, OA5280 +5281, OA5281 +5282, OA5282 +5283, OA5283 +5284, OA5284 +5285, OA5285 +5286, OA5286 +5287, OA5287 +5288, OA5288 +5289, OA5289 +5290, OA5290 +5291, OA5291 +5292, OA5292 +5293, OA5293 +5294, OA5294 +5295, OA5295 +5296, OA5296 +5297, OA5297 +5298, OA5298 +5299, OA5299 +5300, OA5300 +5301, OA5301 +5302, OA5302 +5303, OA5303 +5304, OA5304 +5305, OA5305 +5306, OA5306 +5307, OA5307 +5308, OA5308 +5309, OA5309 +5310, OA5310 +5311, OA5311 +5312, OA5312 +5313, OA5313 +5314, OA5314 +5315, OA5315 +5316, OA5316 +5317, OA5317 +5318, OA5318 +5319, OA5319 +5320, OA5320 +5321, OA5321 +5322, OA5322 +5323, OA5323 +5324, OA5324 +5325, OA5325 +5326, OA5326 +5327, OA5327 +5328, OA5328 +5329, OA5329 +5330, OA5330 +5331, OA5331 +5332, OA5332 +5333, OA5333 +5334, OA5334 +5335, OA5335 +5336, OA5336 +5337, OA5337 +5338, OA5338 +5339, OA5339 +5340, OA5340 +5341, OA5341 +5342, OA5342 +5343, OA5343 +5344, OA5344 +5345, OA5345 +5346, OA5346 +5347, OA5347 +5348, OA5348 +5349, OA5349 +5350, OA5350 +5351, OA5351 +5352, OA5352 +5353, OA5353 +5354, OA5354 +5355, OA5355 +5356, OA5356 +5357, OA5357 +5358, OA5358 +5359, OA5359 +5360, OA5360 +5361, OA5361 +5362, OA5362 +5363, OA5363 +5364, OA5364 +5365, OA5365 +5366, OA5366 +5367, OA5367 +5368, OA5368 +5369, OA5369 +5370, OA5370 +5371, OA5371 +5372, OA5372 +5373, OA5373 +5374, OA5374 +5375, OA5375 +5376, OA5376 +5377, OA5377 +5378, OA5378 +5379, OA5379 +5380, OA5380 +5381, OA5381 +5382, OA5382 +5383, OA5383 +5384, OA5384 +5385, OA5385 +5386, OA5386 +5387, OA5387 +5388, OA5388 +5389, OA5389 +5390, OA5390 +5391, OA5391 +5392, OA5392 +5393, OA5393 +5394, OA5394 +5395, OA5395 +5396, OA5396 +5397, OA5397 +5398, OA5398 +5399, OA5399 +5400, OA5400 +5401, OA5401 +5402, OA5402 +5403, OA5403 +5404, OA5404 +5405, OA5405 +5406, OA5406 +5407, OA5407 +5408, OA5408 +5409, OA5409 +5410, OA5410 +5411, OA5411 +5412, OA5412 +5413, OA5413 +5414, OA5414 +5415, OA5415 +5416, OA5416 +5417, OA5417 +5418, OA5418 +5419, OA5419 +5420, OA5420 +5421, OA5421 +5422, OA5422 +5423, OA5423 +5424, OA5424 +5425, OA5425 +5426, OA5426 +5427, OA5427 +5428, OA5428 +5429, OA5429 +5430, OA5430 +5431, OA5431 +5432, OA5432 +5433, OA5433 +5434, OA5434 +5435, OA5435 +5436, OA5436 +5437, OA5437 +5438, OA5438 +5439, OA5439 +5440, OA5440 +5441, OA5441 +5442, OA5442 +5443, OA5443 +5444, OA5444 +5445, OA5445 +5446, OA5446 +5447, OA5447 +5448, OA5448 +5449, OA5449 +5450, OA5450 +5451, OA5451 +5452, OA5452 +5453, OA5453 +5454, OA5454 +5455, OA5455 +5456, OA5456 +5457, OA5457 +5458, OA5458 +5459, OA5459 +5460, OA5460 +5461, OA5461 +5462, OA5462 +5463, OA5463 +5464, OA5464 +5465, OA5465 +5466, OA5466 +5467, OA5467 +5468, OA5468 +5469, OA5469 +5470, OA5470 +5471, OA5471 +5472, OA5472 +5473, OA5473 +5474, OA5474 +5475, OA5475 +5476, OA5476 +5477, OA5477 +5478, OA5478 +5479, OA5479 +5480, OA5480 +5481, OA5481 +5482, OA5482 +5483, OA5483 +5484, OA5484 +5485, OA5485 +5486, OA5486 +5487, OA5487 +5488, OA5488 +5489, OA5489 +5490, OA5490 +5491, OA5491 +5492, OA5492 +5493, OA5493 +5494, OA5494 +5495, OA5495 +5496, OA5496 +5497, OA5497 +5498, OA5498 +5499, OA5499 +5500, OA5500 +5501, OA5501 +5502, OA5502 +5503, OA5503 +5504, OA5504 +5505, OA5505 +5506, OA5506 +5507, OA5507 +5508, OA5508 +5509, OA5509 +5510, OA5510 +5511, OA5511 +5512, OA5512 +5513, OA5513 +5514, OA5514 +5515, OA5515 +5516, OA5516 +5517, OA5517 +5518, OA5518 +5519, OA5519 +5520, OA5520 +5521, OA5521 +5522, OA5522 +5523, OA5523 +5524, OA5524 +5525, OA5525 +5526, OA5526 +5527, OA5527 +5528, OA5528 +5529, OA5529 +5530, OA5530 +5531, OA5531 +5532, OA5532 +5533, OA5533 +5534, OA5534 +5535, OA5535 +5536, OA5536 +5537, OA5537 +5538, OA5538 +5539, OA5539 +5540, OA5540 +5541, OA5541 +5542, OA5542 +5543, OA5543 +5544, OA5544 +5545, OA5545 +5546, OA5546 +5547, OA5547 +5548, OA5548 +5549, OA5549 +5550, OA5550 +5551, OA5551 +5552, OA5552 +5553, OA5553 +5554, OA5554 +5555, OA5555 +5556, OA5556 +5557, OA5557 +5558, OA5558 +5559, OA5559 +5560, OA5560 +5561, OA5561 +5562, OA5562 +5563, OA5563 +5564, OA5564 +5565, OA5565 +5566, OA5566 +5567, OA5567 +5568, OA5568 +5569, OA5569 +5570, OA5570 +5571, OA5571 +5572, OA5572 +5573, OA5573 +5574, OA5574 +5575, OA5575 +5576, OA5576 +5577, OA5577 +5578, OA5578 +5579, OA5579 +5580, OA5580 +5581, OA5581 +5582, OA5582 +5583, OA5583 +5584, OA5584 +5585, OA5585 +5586, OA5586 +5587, OA5587 +5588, OA5588 +5589, OA5589 +5590, OA5590 +5591, OA5591 +5592, OA5592 +5593, OA5593 +5594, OA5594 +5595, OA5595 +5596, OA5596 +5597, OA5597 +5598, OA5598 +5599, OA5599 +5600, OA5600 +5601, OA5601 +5602, OA5602 +5603, OA5603 +5604, OA5604 +5605, OA5605 +5606, OA5606 +5607, OA5607 +5608, OA5608 +5609, OA5609 +5610, OA5610 +5611, OA5611 +5612, OA5612 +5613, OA5613 +5614, OA5614 +5615, OA5615 +5616, OA5616 +5617, OA5617 +5618, OA5618 +5619, OA5619 +5620, OA5620 +5621, OA5621 +5622, OA5622 +5623, OA5623 +5624, OA5624 +5625, OA5625 +5626, OA5626 +5627, OA5627 +5628, OA5628 +5629, OA5629 +5630, OA5630 +5631, OA5631 +5632, OA5632 +5633, OA5633 +5634, OA5634 +5635, OA5635 +5636, OA5636 +5637, OA5637 +5638, OA5638 +5639, OA5639 +5640, OA5640 +5641, OA5641 +5642, OA5642 +5643, OA5643 +5644, OA5644 +5645, OA5645 +5646, OA5646 +5647, OA5647 +5648, OA5648 +5649, OA5649 +5650, OA5650 +5651, OA5651 +5652, OA5652 +5653, OA5653 +5654, OA5654 +5655, OA5655 +5656, OA5656 +5657, OA5657 +5658, OA5658 +5659, OA5659 +5660, OA5660 +5661, OA5661 +5662, OA5662 +5663, OA5663 +5664, OA5664 +5665, OA5665 +5666, OA5666 +5667, OA5667 +5668, OA5668 +5669, OA5669 +5670, OA5670 +5671, OA5671 +5672, OA5672 +5673, OA5673 +5674, OA5674 +5675, OA5675 +5676, OA5676 +5677, OA5677 +5678, OA5678 +5679, OA5679 +5680, OA5680 +5681, OA5681 +5682, OA5682 +5683, OA5683 +5684, OA5684 +5685, OA5685 +5686, OA5686 +5687, OA5687 +5688, OA5688 +5689, OA5689 +5690, OA5690 +5691, OA5691 +5692, OA5692 +5693, OA5693 +5694, OA5694 +5695, OA5695 +5696, OA5696 +5697, OA5697 +5698, OA5698 +5699, OA5699 +5700, OA5700 +5701, OA5701 +5702, OA5702 +5703, OA5703 +5704, OA5704 +5705, OA5705 +5706, OA5706 +5707, OA5707 +5708, OA5708 +5709, OA5709 +5710, OA5710 +5711, OA5711 +5712, OA5712 +5713, OA5713 +5714, OA5714 +5715, OA5715 +5716, OA5716 +5717, OA5717 +5718, OA5718 +5719, OA5719 +5720, OA5720 +5721, OA5721 +5722, OA5722 +5723, OA5723 +5724, OA5724 +5725, OA5725 +5726, OA5726 +5727, OA5727 +5728, OA5728 +5729, OA5729 +5730, OA5730 +5731, OA5731 +5732, OA5732 +5733, OA5733 +5734, OA5734 +5735, OA5735 +5736, OA5736 +5737, OA5737 +5738, OA5738 +5739, OA5739 +5740, OA5740 +5741, OA5741 +5742, OA5742 +5743, OA5743 +5744, OA5744 +5745, OA5745 +5746, OA5746 +5747, OA5747 +5748, OA5748 +5749, OA5749 +5750, OA5750 +5751, OA5751 +5752, OA5752 +5753, OA5753 +5754, OA5754 +5755, OA5755 +5756, OA5756 +5757, OA5757 +5758, OA5758 +5759, OA5759 +5760, OA5760 +5761, OA5761 +5762, OA5762 +5763, OA5763 +5764, OA5764 +5765, OA5765 +5766, OA5766 +5767, OA5767 +5768, OA5768 +5769, OA5769 +5770, OA5770 +5771, OA5771 +5772, OA5772 +5773, OA5773 +5774, OA5774 +5775, OA5775 +5776, OA5776 +5777, OA5777 +5778, OA5778 +5779, OA5779 +5780, OA5780 +5781, OA5781 +5782, OA5782 +5783, OA5783 +5784, OA5784 +5785, OA5785 +5786, OA5786 +5787, OA5787 +5788, OA5788 +5789, OA5789 +5790, OA5790 +5791, OA5791 +5792, OA5792 +5793, OA5793 +5794, OA5794 +5795, OA5795 +5796, OA5796 +5797, OA5797 +5798, OA5798 +5799, OA5799 +5800, OA5800 +5801, OA5801 +5802, OA5802 +5803, OA5803 +5804, OA5804 +5805, OA5805 +5806, OA5806 +5807, OA5807 +5808, OA5808 +5809, OA5809 +5810, OA5810 +5811, OA5811 +5812, OA5812 +5813, OA5813 +5814, OA5814 +5815, OA5815 +5816, OA5816 +5817, OA5817 +5818, OA5818 +5819, OA5819 +5820, OA5820 +5821, OA5821 +5822, OA5822 +5823, OA5823 +5824, OA5824 +5825, OA5825 +5826, OA5826 +5827, OA5827 +5828, OA5828 +5829, OA5829 +5830, OA5830 +5831, OA5831 +5832, OA5832 +5833, OA5833 +5834, OA5834 +5835, OA5835 +5836, OA5836 +5837, OA5837 +5838, OA5838 +5839, OA5839 +5840, OA5840 +5841, OA5841 +5842, OA5842 +5843, OA5843 +5844, OA5844 +5845, OA5845 +5846, OA5846 +5847, OA5847 +5848, OA5848 +5849, OA5849 +5850, OA5850 +5851, OA5851 +5852, OA5852 +5853, OA5853 +5854, OA5854 +5855, OA5855 +5856, OA5856 +5857, OA5857 +5858, OA5858 +5859, OA5859 +5860, OA5860 +5861, OA5861 +5862, OA5862 +5863, OA5863 +5864, OA5864 +5865, OA5865 +5866, OA5866 +5867, OA5867 +5868, OA5868 +5869, OA5869 +5870, OA5870 +5871, OA5871 +5872, OA5872 +5873, OA5873 +5874, OA5874 +5875, OA5875 +5876, OA5876 +5877, OA5877 +5878, OA5878 +5879, OA5879 +5880, OA5880 +5881, OA5881 +5882, OA5882 +5883, OA5883 +5884, OA5884 +5885, OA5885 +5886, OA5886 +5887, OA5887 +5888, OA5888 +5889, OA5889 +5890, OA5890 +5891, OA5891 +5892, OA5892 +5893, OA5893 +5894, OA5894 +5895, OA5895 +5896, OA5896 +5897, OA5897 +5898, OA5898 +5899, OA5899 +5900, OA5900 +5901, OA5901 +5902, OA5902 +5903, OA5903 +5904, OA5904 +5905, OA5905 +5906, OA5906 +5907, OA5907 +5908, OA5908 +5909, OA5909 +5910, OA5910 +5911, OA5911 +5912, OA5912 +5913, OA5913 +5914, OA5914 +5915, OA5915 +5916, OA5916 +5917, OA5917 +5918, OA5918 +5919, OA5919 +5920, OA5920 +5921, OA5921 +5922, OA5922 +5923, OA5923 +5924, OA5924 +5925, OA5925 +5926, OA5926 +5927, OA5927 +5928, OA5928 +5929, OA5929 +5930, OA5930 +5931, OA5931 +5932, OA5932 +5933, OA5933 +5934, OA5934 +5935, OA5935 +5936, OA5936 +5937, OA5937 +5938, OA5938 +5939, OA5939 +5940, OA5940 +5941, OA5941 +5942, OA5942 +5943, OA5943 +5944, OA5944 +5945, OA5945 +5946, OA5946 +5947, OA5947 +5948, OA5948 +5949, OA5949 +5950, OA5950 +5951, OA5951 +5952, OA5952 +5953, OA5953 +5954, OA5954 +5955, OA5955 +5956, OA5956 +5957, OA5957 +5958, OA5958 +5959, OA5959 +5960, OA5960 +5961, OA5961 +5962, OA5962 +5963, OA5963 +5964, OA5964 +5965, OA5965 +5966, OA5966 +5967, OA5967 +5968, OA5968 +5969, OA5969 +5970, OA5970 +5971, OA5971 +5972, OA5972 +5973, OA5973 +5974, OA5974 +5975, OA5975 +5976, OA5976 +5977, OA5977 +5978, OA5978 +5979, OA5979 +5980, OA5980 +5981, OA5981 +5982, OA5982 +5983, OA5983 +5984, OA5984 +5985, OA5985 +5986, OA5986 +5987, OA5987 +5988, OA5988 +5989, OA5989 +5990, OA5990 +5991, OA5991 +5992, OA5992 +5993, OA5993 +5994, OA5994 +5995, OA5995 +5996, OA5996 +5997, OA5997 +5998, OA5998 +5999, OA5999 +6000, OA6000 +6001, OA6001 +6002, OA6002 +6003, OA6003 +6004, OA6004 +6005, OA6005 +6006, OA6006 +6007, OA6007 +6008, OA6008 +6009, OA6009 +6010, OA6010 +6011, OA6011 +6012, OA6012 +6013, OA6013 +6014, OA6014 +6015, OA6015 +6016, OA6016 +6017, OA6017 +6018, OA6018 +6019, OA6019 +6020, OA6020 +6021, OA6021 +6022, OA6022 +6023, OA6023 +6024, OA6024 +6025, OA6025 +6026, OA6026 +6027, OA6027 +6028, OA6028 +6029, OA6029 +6030, OA6030 +6031, OA6031 +6032, OA6032 +6033, OA6033 +6034, OA6034 +6035, OA6035 +6036, OA6036 +6037, OA6037 +6038, OA6038 +6039, OA6039 +6040, OA6040 +6041, OA6041 +6042, OA6042 +6043, OA6043 +6044, OA6044 +6045, OA6045 +6046, OA6046 +6047, OA6047 +6048, OA6048 +6049, OA6049 +6050, OA6050 +6051, OA6051 +6052, OA6052 +6053, OA6053 +6054, OA6054 +6055, OA6055 +6056, OA6056 +6057, OA6057 +6058, OA6058 +6059, OA6059 +6060, OA6060 +6061, OA6061 +6062, OA6062 +6063, OA6063 +6064, OA6064 +6065, OA6065 +6066, OA6066 +6067, OA6067 +6068, OA6068 +6069, OA6069 +6070, OA6070 +6071, OA6071 +6072, OA6072 +6073, OA6073 +6074, OA6074 +6075, OA6075 +6076, OA6076 +6077, OA6077 +6078, OA6078 +6079, OA6079 +6080, OA6080 +6081, OA6081 +6082, OA6082 +6083, OA6083 +6084, OA6084 +6085, OA6085 +6086, OA6086 +6087, OA6087 +6088, OA6088 +6089, OA6089 +6090, OA6090 +6091, OA6091 +6092, OA6092 +6093, OA6093 +6094, OA6094 +6095, OA6095 +6096, OA6096 +6097, OA6097 +6098, OA6098 +6099, OA6099 +6100, OA6100 +6101, OA6101 +6102, OA6102 +6103, OA6103 +6104, OA6104 +6105, OA6105 +6106, OA6106 +6107, OA6107 +6108, OA6108 +6109, OA6109 +6110, OA6110 +6111, OA6111 +6112, OA6112 +6113, OA6113 +6114, OA6114 +6115, OA6115 +6116, OA6116 +6117, OA6117 +6118, OA6118 +6119, OA6119 +6120, OA6120 +6121, OA6121 +6122, OA6122 +6123, OA6123 +6124, OA6124 +6125, OA6125 +6126, OA6126 +6127, OA6127 +6128, OA6128 +6129, OA6129 +6130, OA6130 +6131, OA6131 +6132, OA6132 +6133, OA6133 +6134, OA6134 +6135, OA6135 +6136, OA6136 +6137, OA6137 +6138, OA6138 +6139, OA6139 +6140, OA6140 +6141, OA6141 +6142, OA6142 +6143, OA6143 +6144, OA6144 +6145, OA6145 +6146, OA6146 +6147, OA6147 +6148, OA6148 +6149, OA6149 +6150, OA6150 +6151, OA6151 +6152, OA6152 +6153, OA6153 +6154, OA6154 +6155, OA6155 +6156, OA6156 +6157, OA6157 +6158, OA6158 +6159, OA6159 +6160, OA6160 +6161, OA6161 +6162, OA6162 +6163, OA6163 +6164, OA6164 +6165, OA6165 +6166, OA6166 +6167, OA6167 +6168, OA6168 +6169, OA6169 +6170, OA6170 +6171, OA6171 +6172, OA6172 +6173, OA6173 +6174, OA6174 +6175, OA6175 +6176, OA6176 +6177, OA6177 +6178, OA6178 +6179, OA6179 +6180, OA6180 +6181, OA6181 +6182, OA6182 +6183, OA6183 +6184, OA6184 +6185, OA6185 +6186, OA6186 +6187, OA6187 +6188, OA6188 +6189, OA6189 +6190, OA6190 +6191, OA6191 +6192, OA6192 +6193, OA6193 +6194, OA6194 +6195, OA6195 +6196, OA6196 +6197, OA6197 +6198, OA6198 +6199, OA6199 +6200, OA6200 +6201, OA6201 +6202, OA6202 +6203, OA6203 +6204, OA6204 +6205, OA6205 +6206, OA6206 +6207, OA6207 +6208, OA6208 +6209, OA6209 +6210, OA6210 +6211, OA6211 +6212, OA6212 +6213, OA6213 +6214, OA6214 +6215, OA6215 +6216, OA6216 +6217, OA6217 +6218, OA6218 +6219, OA6219 +6220, OA6220 +6221, OA6221 +6222, OA6222 +6223, OA6223 +6224, OA6224 +6225, OA6225 +6226, OA6226 +6227, OA6227 +6228, OA6228 +6229, OA6229 +6230, OA6230 +6231, OA6231 +6232, OA6232 +6233, OA6233 +6234, OA6234 +6235, OA6235 +6236, OA6236 +6237, OA6237 +6238, OA6238 +6239, OA6239 +6240, OA6240 +6241, OA6241 +6242, OA6242 +6243, OA6243 +6244, OA6244 +6245, OA6245 +6246, OA6246 +6247, OA6247 +6248, OA6248 +6249, OA6249 +6250, OA6250 +6251, OA6251 +6252, OA6252 +6253, OA6253 +6254, OA6254 +6255, OA6255 +6256, OA6256 +6257, OA6257 +6258, OA6258 +6259, OA6259 +6260, OA6260 +6261, OA6261 +6262, OA6262 +6263, OA6263 +6264, OA6264 +6265, OA6265 +6266, OA6266 +6267, OA6267 +6268, OA6268 +6269, OA6269 +6270, OA6270 +6271, OA6271 +6272, OA6272 +6273, OA6273 +6274, OA6274 +6275, OA6275 +6276, OA6276 +6277, OA6277 +6278, OA6278 +6279, OA6279 +6280, OA6280 +6281, OA6281 +6282, OA6282 +6283, OA6283 +6284, OA6284 +6285, OA6285 +6286, OA6286 +6287, OA6287 +6288, OA6288 +6289, OA6289 +6290, OA6290 +6291, OA6291 +6292, OA6292 +6293, OA6293 +6294, OA6294 +6295, OA6295 +6296, OA6296 +6297, OA6297 +6298, OA6298 +6299, OA6299 +6300, OA6300 +6301, OA6301 +6302, OA6302 +6303, OA6303 +6304, OA6304 +6305, OA6305 +6306, OA6306 +6307, OA6307 +6308, OA6308 +6309, OA6309 +6310, OA6310 +6311, OA6311 +6312, OA6312 +6313, OA6313 +6314, OA6314 +6315, OA6315 +6316, OA6316 +6317, OA6317 +6318, OA6318 +6319, OA6319 +6320, OA6320 +6321, OA6321 +6322, OA6322 +6323, OA6323 +6324, OA6324 +6325, OA6325 +6326, OA6326 +6327, OA6327 +6328, OA6328 +6329, OA6329 +6330, OA6330 +6331, OA6331 +6332, OA6332 +6333, OA6333 +6334, OA6334 +6335, OA6335 +6336, OA6336 +6337, OA6337 +6338, OA6338 +6339, OA6339 +6340, OA6340 +6341, OA6341 +6342, OA6342 +6343, OA6343 +6344, OA6344 +6345, OA6345 +6346, OA6346 +6347, OA6347 +6348, OA6348 +6349, OA6349 +6350, OA6350 +6351, OA6351 +6352, OA6352 +6353, OA6353 +6354, OA6354 +6355, OA6355 +6356, OA6356 +6357, OA6357 +6358, OA6358 +6359, OA6359 +6360, OA6360 +6361, OA6361 +6362, OA6362 +6363, OA6363 +6364, OA6364 +6365, OA6365 +6366, OA6366 +6367, OA6367 +6368, OA6368 +6369, OA6369 +6370, OA6370 +6371, OA6371 +6372, OA6372 +6373, OA6373 +6374, OA6374 +6375, OA6375 +6376, OA6376 +6377, OA6377 +6378, OA6378 +6379, OA6379 +6380, OA6380 +6381, OA6381 +6382, OA6382 +6383, OA6383 +6384, OA6384 +6385, OA6385 +6386, OA6386 +6387, OA6387 +6388, OA6388 +6389, OA6389 +6390, OA6390 +6391, OA6391 +6392, OA6392 +6393, OA6393 +6394, OA6394 +6395, OA6395 +6396, OA6396 +6397, OA6397 +6398, OA6398 +6399, OA6399 +6400, OA6400 +6401, OA6401 +6402, OA6402 +6403, OA6403 +6404, OA6404 +6405, OA6405 +6406, OA6406 +6407, OA6407 +6408, OA6408 +6409, OA6409 +6410, OA6410 +6411, OA6411 +6412, OA6412 +6413, OA6413 +6414, OA6414 +6415, OA6415 +6416, OA6416 +6417, OA6417 +6418, OA6418 +6419, OA6419 +6420, OA6420 +6421, OA6421 +6422, OA6422 +6423, OA6423 +6424, OA6424 +6425, OA6425 +6426, OA6426 +6427, OA6427 +6428, OA6428 +6429, OA6429 +6430, OA6430 +6431, OA6431 +6432, OA6432 +6433, OA6433 +6434, OA6434 +6435, OA6435 +6436, OA6436 +6437, OA6437 +6438, OA6438 +6439, OA6439 +6440, OA6440 +6441, OA6441 +6442, OA6442 +6443, OA6443 +6444, OA6444 +6445, OA6445 +6446, OA6446 +6447, OA6447 +6448, OA6448 +6449, OA6449 +6450, OA6450 +6451, OA6451 +6452, OA6452 +6453, OA6453 +6454, OA6454 +6455, OA6455 +6456, OA6456 +6457, OA6457 +6458, OA6458 +6459, OA6459 +6460, OA6460 +6461, OA6461 +6462, OA6462 +6463, OA6463 +6464, OA6464 +6465, OA6465 +6466, OA6466 +6467, OA6467 +6468, OA6468 +6469, OA6469 +6470, OA6470 +6471, OA6471 +6472, OA6472 +6473, OA6473 +6474, OA6474 +6475, OA6475 +6476, OA6476 +6477, OA6477 +6478, OA6478 +6479, OA6479 +6480, OA6480 +6481, OA6481 +6482, OA6482 +6483, OA6483 +6484, OA6484 +6485, OA6485 +6486, OA6486 +6487, OA6487 +6488, OA6488 +6489, OA6489 +6490, OA6490 +6491, OA6491 +6492, OA6492 +6493, OA6493 +6494, OA6494 +6495, OA6495 +6496, OA6496 +6497, OA6497 +6498, OA6498 +6499, OA6499 +6500, OA6500 +6501, OA6501 +6502, OA6502 +6503, OA6503 +6504, OA6504 +6505, OA6505 +6506, OA6506 +6507, OA6507 +6508, OA6508 +6509, OA6509 +6510, OA6510 +6511, OA6511 +6512, OA6512 +6513, OA6513 +6514, OA6514 +6515, OA6515 +6516, OA6516 +6517, OA6517 +6518, OA6518 +6519, OA6519 +6520, OA6520 +6521, OA6521 +6522, OA6522 +6523, OA6523 +6524, OA6524 +6525, OA6525 +6526, OA6526 +6527, OA6527 +6528, OA6528 +6529, OA6529 +6530, OA6530 +6531, OA6531 +6532, OA6532 +6533, OA6533 +6534, OA6534 +6535, OA6535 +6536, OA6536 +6537, OA6537 +6538, OA6538 +6539, OA6539 +6540, OA6540 +6541, OA6541 +6542, OA6542 +6543, OA6543 +6544, OA6544 +6545, OA6545 +6546, OA6546 +6547, OA6547 +6548, OA6548 +6549, OA6549 +6550, OA6550 +6551, OA6551 +6552, OA6552 +6553, OA6553 +6554, OA6554 +6555, OA6555 +6556, OA6556 +6557, OA6557 +6558, OA6558 +6559, OA6559 +6560, OA6560 +6561, OA6561 +6562, OA6562 +6563, OA6563 +6564, OA6564 +6565, OA6565 +6566, OA6566 +6567, OA6567 +6568, OA6568 +6569, OA6569 +6570, OA6570 +6571, OA6571 +6572, OA6572 +6573, OA6573 +6574, OA6574 +6575, OA6575 +6576, OA6576 +6577, OA6577 +6578, OA6578 +6579, OA6579 +6580, OA6580 +6581, OA6581 +6582, OA6582 +6583, OA6583 +6584, OA6584 +6585, OA6585 +6586, OA6586 +6587, OA6587 +6588, OA6588 +6589, OA6589 +6590, OA6590 +6591, OA6591 +6592, OA6592 +6593, OA6593 +6594, OA6594 +6595, OA6595 +6596, OA6596 +6597, OA6597 +6598, OA6598 +6599, OA6599 +6600, OA6600 +6601, OA6601 +6602, OA6602 +6603, OA6603 +6604, OA6604 +6605, OA6605 +6606, OA6606 +6607, OA6607 +6608, OA6608 +6609, OA6609 +6610, OA6610 +6611, OA6611 +6612, OA6612 +6613, OA6613 +6614, OA6614 +6615, OA6615 +6616, OA6616 +6617, OA6617 +6618, OA6618 +6619, OA6619 +6620, OA6620 +6621, OA6621 +6622, OA6622 +6623, OA6623 +6624, OA6624 +6625, OA6625 +6626, OA6626 +6627, OA6627 +6628, OA6628 +6629, OA6629 +6630, OA6630 +6631, OA6631 +6632, OA6632 +6633, OA6633 +6634, OA6634 +6635, OA6635 +6636, OA6636 +6637, OA6637 +6638, OA6638 +6639, OA6639 +6640, OA6640 +6641, OA6641 +6642, OA6642 +6643, OA6643 +6644, OA6644 +6645, OA6645 +6646, OA6646 +6647, OA6647 +6648, OA6648 +6649, OA6649 +6650, OA6650 +6651, OA6651 +6652, OA6652 +6653, OA6653 +6654, OA6654 +6655, OA6655 +6656, OA6656 +6657, OA6657 +6658, OA6658 +6659, OA6659 +6660, OA6660 +6661, OA6661 +6662, OA6662 +6663, OA6663 +6664, OA6664 +6665, OA6665 +6666, OA6666 +6667, OA6667 +6668, OA6668 +6669, OA6669 +6670, OA6670 +6671, OA6671 +6672, OA6672 +6673, OA6673 +6674, OA6674 +6675, OA6675 +6676, OA6676 +6677, OA6677 +6678, OA6678 +6679, OA6679 +6680, OA6680 +6681, OA6681 +6682, OA6682 +6683, OA6683 +6684, OA6684 +6685, OA6685 +6686, OA6686 +6687, OA6687 +6688, OA6688 +6689, OA6689 +6690, OA6690 +6691, OA6691 +6692, OA6692 +6693, OA6693 +6694, OA6694 +6695, OA6695 +6696, OA6696 +6697, OA6697 +6698, OA6698 +6699, OA6699 +6700, OA6700 +6701, OA6701 +6702, OA6702 +6703, OA6703 +6704, OA6704 +6705, OA6705 +6706, OA6706 +6707, OA6707 +6708, OA6708 +6709, OA6709 +6710, OA6710 +6711, OA6711 +6712, OA6712 +6713, OA6713 +6714, OA6714 +6715, OA6715 +6716, OA6716 +6717, OA6717 +6718, OA6718 +6719, OA6719 +6720, OA6720 +6721, OA6721 +6722, OA6722 +6723, OA6723 +6724, OA6724 +6725, OA6725 +6726, OA6726 +6727, OA6727 +6728, OA6728 +6729, OA6729 +6730, OA6730 +6731, OA6731 +6732, OA6732 +6733, OA6733 +6734, OA6734 +6735, OA6735 +6736, OA6736 +6737, OA6737 +6738, OA6738 +6739, OA6739 +6740, OA6740 +6741, OA6741 +6742, OA6742 +6743, OA6743 +6744, OA6744 +6745, OA6745 +6746, OA6746 +6747, OA6747 +6748, OA6748 +6749, OA6749 +6750, OA6750 +6751, OA6751 +6752, OA6752 +6753, OA6753 +6754, OA6754 +6755, OA6755 +6756, OA6756 +6757, OA6757 +6758, OA6758 +6759, OA6759 +6760, OA6760 +6761, OA6761 +6762, OA6762 +6763, OA6763 +6764, OA6764 +6765, OA6765 +6766, OA6766 +6767, OA6767 +6768, OA6768 +6769, OA6769 +6770, OA6770 +6771, OA6771 +6772, OA6772 +6773, OA6773 +6774, OA6774 +6775, OA6775 +6776, OA6776 +6777, OA6777 +6778, OA6778 +6779, OA6779 +6780, OA6780 +6781, OA6781 +6782, OA6782 +6783, OA6783 +6784, OA6784 +6785, OA6785 +6786, OA6786 +6787, OA6787 +6788, OA6788 +6789, OA6789 +6790, OA6790 +6791, OA6791 +6792, OA6792 +6793, OA6793 +6794, OA6794 +6795, OA6795 +6796, OA6796 +6797, OA6797 +6798, OA6798 +6799, OA6799 +6800, OA6800 +6801, OA6801 +6802, OA6802 +6803, OA6803 +6804, OA6804 +6805, OA6805 +6806, OA6806 +6807, OA6807 +6808, OA6808 +6809, OA6809 +6810, OA6810 +6811, OA6811 +6812, OA6812 +6813, OA6813 +6814, OA6814 +6815, OA6815 +6816, OA6816 +6817, OA6817 +6818, OA6818 +6819, OA6819 +6820, OA6820 +6821, OA6821 +6822, OA6822 +6823, OA6823 +6824, OA6824 +6825, OA6825 +6826, OA6826 +6827, OA6827 +6828, OA6828 +6829, OA6829 +6830, OA6830 +6831, OA6831 +6832, OA6832 +6833, OA6833 +6834, OA6834 +6835, OA6835 +6836, OA6836 +6837, OA6837 +6838, OA6838 +6839, OA6839 +6840, OA6840 +6841, OA6841 +6842, OA6842 +6843, OA6843 +6844, OA6844 +6845, OA6845 +6846, OA6846 +6847, OA6847 +6848, OA6848 +6849, OA6849 +6850, OA6850 +6851, OA6851 +6852, OA6852 +6853, OA6853 +6854, OA6854 +6855, OA6855 +6856, OA6856 +6857, OA6857 +6858, OA6858 +6859, OA6859 +6860, OA6860 +6861, OA6861 +6862, OA6862 +6863, OA6863 +6864, OA6864 +6865, OA6865 +6866, OA6866 +6867, OA6867 +6868, OA6868 +6869, OA6869 +6870, OA6870 +6871, OA6871 +6872, OA6872 +6873, OA6873 +6874, OA6874 +6875, OA6875 +6876, OA6876 +6877, OA6877 +6878, OA6878 +6879, OA6879 +6880, OA6880 +6881, OA6881 +6882, OA6882 +6883, OA6883 +6884, OA6884 +6885, OA6885 +6886, OA6886 +6887, OA6887 +6888, OA6888 +6889, OA6889 +6890, OA6890 +6891, OA6891 +6892, OA6892 +6893, OA6893 +6894, OA6894 +6895, OA6895 +6896, OA6896 +6897, OA6897 +6898, OA6898 +6899, OA6899 +6900, OA6900 +6901, OA6901 +6902, OA6902 +6903, OA6903 +6904, OA6904 +6905, OA6905 +6906, OA6906 +6907, OA6907 +6908, OA6908 +6909, OA6909 +6910, OA6910 +6911, OA6911 +6912, OA6912 +6913, OA6913 +6914, OA6914 +6915, OA6915 +6916, OA6916 +6917, OA6917 +6918, OA6918 +6919, OA6919 +6920, OA6920 +6921, OA6921 +6922, OA6922 +6923, OA6923 +6924, OA6924 +6925, OA6925 +6926, OA6926 +6927, OA6927 +6928, OA6928 +6929, OA6929 +6930, OA6930 +6931, OA6931 +6932, OA6932 +6933, OA6933 +6934, OA6934 +6935, OA6935 +6936, OA6936 +6937, OA6937 +6938, OA6938 +6939, OA6939 +6940, OA6940 +6941, OA6941 +6942, OA6942 +6943, OA6943 +6944, OA6944 +6945, OA6945 +6946, OA6946 +6947, OA6947 +6948, OA6948 +6949, OA6949 +6950, OA6950 +6951, OA6951 +6952, OA6952 +6953, OA6953 +6954, OA6954 +6955, OA6955 +6956, OA6956 +6957, OA6957 +6958, OA6958 +6959, OA6959 +6960, OA6960 +6961, OA6961 +6962, OA6962 +6963, OA6963 +6964, OA6964 +6965, OA6965 +6966, OA6966 +6967, OA6967 +6968, OA6968 +6969, OA6969 +6970, OA6970 +6971, OA6971 +6972, OA6972 +6973, OA6973 +6974, OA6974 +6975, OA6975 +6976, OA6976 +6977, OA6977 +6978, OA6978 +6979, OA6979 +6980, OA6980 +6981, OA6981 +6982, OA6982 +6983, OA6983 +6984, OA6984 +6985, OA6985 +6986, OA6986 +6987, OA6987 +6988, OA6988 +6989, OA6989 +6990, OA6990 +6991, OA6991 +6992, OA6992 +6993, OA6993 +6994, OA6994 +6995, OA6995 +6996, OA6996 +6997, OA6997 +6998, OA6998 +6999, OA6999 +7000, OA7000 +7001, OA7001 +7002, OA7002 +7003, OA7003 +7004, OA7004 +7005, OA7005 +7006, OA7006 +7007, OA7007 +7008, OA7008 +7009, OA7009 +7010, OA7010 +7011, OA7011 +7012, OA7012 +7013, OA7013 +7014, OA7014 +7015, OA7015 +7016, OA7016 +7017, OA7017 +7018, OA7018 +7019, OA7019 +7020, OA7020 +7021, OA7021 +7022, OA7022 +7023, OA7023 +7024, OA7024 +7025, OA7025 +7026, OA7026 +7027, OA7027 +7028, OA7028 +7029, OA7029 +7030, OA7030 +7031, OA7031 +7032, OA7032 +7033, OA7033 +7034, OA7034 +7035, OA7035 +7036, OA7036 +7037, OA7037 +7038, OA7038 +7039, OA7039 +7040, OA7040 +7041, OA7041 +7042, OA7042 +7043, OA7043 +7044, OA7044 +7045, OA7045 +7046, OA7046 +7047, OA7047 +7048, OA7048 +7049, OA7049 +7050, OA7050 +7051, OA7051 +7052, OA7052 +7053, OA7053 +7054, OA7054 +7055, OA7055 +7056, OA7056 +7057, OA7057 +7058, OA7058 +7059, OA7059 +7060, OA7060 +7061, OA7061 +7062, OA7062 +7063, OA7063 +7064, OA7064 +7065, OA7065 +7066, OA7066 +7067, OA7067 +7068, OA7068 +7069, OA7069 +7070, OA7070 +7071, OA7071 +7072, OA7072 +7073, OA7073 +7074, OA7074 +7075, OA7075 +7076, OA7076 +7077, OA7077 +7078, OA7078 +7079, OA7079 +7080, OA7080 +7081, OA7081 +7082, OA7082 +7083, OA7083 +7084, OA7084 +7085, OA7085 +7086, OA7086 +7087, OA7087 +7088, OA7088 +7089, OA7089 +7090, OA7090 +7091, OA7091 +7092, OA7092 +7093, OA7093 +7094, OA7094 +7095, OA7095 +7096, OA7096 +7097, OA7097 +7098, OA7098 +7099, OA7099 +7100, OA7100 +7101, OA7101 +7102, OA7102 +7103, OA7103 +7104, OA7104 +7105, OA7105 +7106, OA7106 +7107, OA7107 +7108, OA7108 +7109, OA7109 +7110, OA7110 +7111, OA7111 +7112, OA7112 +7113, OA7113 +7114, OA7114 +7115, OA7115 +7116, OA7116 +7117, OA7117 +7118, OA7118 +7119, OA7119 +7120, OA7120 +7121, OA7121 +7122, OA7122 +7123, OA7123 +7124, OA7124 +7125, OA7125 +7126, OA7126 +7127, OA7127 +7128, OA7128 +7129, OA7129 +7130, OA7130 +7131, OA7131 +7132, OA7132 +7133, OA7133 +7134, OA7134 +7135, OA7135 +7136, OA7136 +7137, OA7137 +7138, OA7138 +7139, OA7139 +7140, OA7140 +7141, OA7141 +7142, OA7142 +7143, OA7143 +7144, OA7144 +7145, OA7145 +7146, OA7146 +7147, OA7147 +7148, OA7148 +7149, OA7149 +7150, OA7150 +7151, OA7151 +7152, OA7152 +7153, OA7153 +7154, OA7154 +7155, OA7155 +7156, OA7156 +7157, OA7157 +7158, OA7158 +7159, OA7159 +7160, OA7160 +7161, OA7161 +7162, OA7162 +7163, OA7163 +7164, OA7164 +7165, OA7165 +7166, OA7166 +7167, OA7167 +7168, OA7168 +7169, OA7169 +7170, OA7170 +7171, OA7171 +7172, OA7172 +7173, OA7173 +7174, OA7174 +7175, OA7175 +7176, OA7176 +7177, OA7177 +7178, OA7178 +7179, OA7179 +7180, OA7180 +7181, OA7181 +7182, OA7182 +7183, OA7183 +7184, OA7184 +7185, OA7185 +7186, OA7186 +7187, OA7187 +7188, OA7188 +7189, OA7189 +7190, OA7190 +7191, OA7191 +7192, OA7192 +7193, OA7193 +7194, OA7194 +7195, OA7195 +7196, OA7196 +7197, OA7197 +7198, OA7198 +7199, OA7199 +7200, OA7200 +7201, OA7201 +7202, OA7202 +7203, OA7203 +7204, OA7204 +7205, OA7205 +7206, OA7206 +7207, OA7207 +7208, OA7208 +7209, OA7209 +7210, OA7210 +7211, OA7211 +7212, OA7212 +7213, OA7213 +7214, OA7214 +7215, OA7215 +7216, OA7216 +7217, OA7217 +7218, OA7218 +7219, OA7219 +7220, OA7220 +7221, OA7221 +7222, OA7222 +7223, OA7223 +7224, OA7224 +7225, OA7225 +7226, OA7226 +7227, OA7227 +7228, OA7228 +7229, OA7229 +7230, OA7230 +7231, OA7231 +7232, OA7232 +7233, OA7233 +7234, OA7234 +7235, OA7235 +7236, OA7236 +7237, OA7237 +7238, OA7238 +7239, OA7239 +7240, OA7240 +7241, OA7241 +7242, OA7242 +7243, OA7243 +7244, OA7244 +7245, OA7245 +7246, OA7246 +7247, OA7247 +7248, OA7248 +7249, OA7249 +7250, OA7250 +7251, OA7251 +7252, OA7252 +7253, OA7253 +7254, OA7254 +7255, OA7255 +7256, OA7256 +7257, OA7257 +7258, OA7258 +7259, OA7259 +7260, OA7260 +7261, OA7261 +7262, OA7262 +7263, OA7263 +7264, OA7264 +7265, OA7265 +7266, OA7266 +7267, OA7267 +7268, OA7268 +7269, OA7269 +7270, OA7270 +7271, OA7271 +7272, OA7272 +7273, OA7273 +7274, OA7274 +7275, OA7275 +7276, OA7276 +7277, OA7277 +7278, OA7278 +7279, OA7279 +7280, OA7280 +7281, OA7281 +7282, OA7282 +7283, OA7283 +7284, OA7284 +7285, OA7285 +7286, OA7286 +7287, OA7287 +7288, OA7288 +7289, OA7289 +7290, OA7290 +7291, OA7291 +7292, OA7292 +7293, OA7293 +7294, OA7294 +7295, OA7295 +7296, OA7296 +7297, OA7297 +7298, OA7298 +7299, OA7299 +7300, OA7300 +7301, OA7301 +7302, OA7302 +7303, OA7303 +7304, OA7304 +7305, OA7305 +7306, OA7306 +7307, OA7307 +7308, OA7308 +7309, OA7309 +7310, OA7310 +7311, OA7311 +7312, OA7312 +7313, OA7313 +7314, OA7314 +7315, OA7315 +7316, OA7316 +7317, OA7317 +7318, OA7318 +7319, OA7319 +7320, OA7320 +7321, OA7321 +7322, OA7322 +7323, OA7323 +7324, OA7324 +7325, OA7325 +7326, OA7326 +7327, OA7327 +7328, OA7328 +7329, OA7329 +7330, OA7330 +7331, OA7331 +7332, OA7332 +7333, OA7333 +7334, OA7334 +7335, OA7335 +7336, OA7336 +7337, OA7337 +7338, OA7338 +7339, OA7339 +7340, OA7340 +7341, OA7341 +7342, OA7342 +7343, OA7343 +7344, OA7344 +7345, OA7345 +7346, OA7346 +7347, OA7347 +7348, OA7348 +7349, OA7349 +7350, OA7350 +7351, OA7351 +7352, OA7352 +7353, OA7353 +7354, OA7354 +7355, OA7355 +7356, OA7356 +7357, OA7357 +7358, OA7358 +7359, OA7359 +7360, OA7360 +7361, OA7361 +7362, OA7362 +7363, OA7363 +7364, OA7364 +7365, OA7365 +7366, OA7366 +7367, OA7367 +7368, OA7368 +7369, OA7369 +7370, OA7370 +7371, OA7371 +7372, OA7372 +7373, OA7373 +7374, OA7374 +7375, OA7375 +7376, OA7376 +7377, OA7377 +7378, OA7378 +7379, OA7379 +7380, OA7380 +7381, OA7381 +7382, OA7382 +7383, OA7383 +7384, OA7384 +7385, OA7385 +7386, OA7386 +7387, OA7387 +7388, OA7388 +7389, OA7389 +7390, OA7390 +7391, OA7391 +7392, OA7392 +7393, OA7393 +7394, OA7394 +7395, OA7395 +7396, OA7396 +7397, OA7397 +7398, OA7398 +7399, OA7399 +7400, OA7400 +7401, OA7401 +7402, OA7402 +7403, OA7403 +7404, OA7404 +7405, OA7405 +7406, OA7406 +7407, OA7407 +7408, OA7408 +7409, OA7409 +7410, OA7410 +7411, OA7411 +7412, OA7412 +7413, OA7413 +7414, OA7414 +7415, OA7415 +7416, OA7416 +7417, OA7417 +7418, OA7418 +7419, OA7419 +7420, OA7420 +7421, OA7421 +7422, OA7422 +7423, OA7423 +7424, OA7424 +7425, OA7425 +7426, OA7426 +7427, OA7427 +7428, OA7428 +7429, OA7429 +7430, OA7430 +7431, OA7431 +7432, OA7432 +7433, OA7433 +7434, OA7434 +7435, OA7435 +7436, OA7436 +7437, OA7437 +7438, OA7438 +7439, OA7439 +7440, OA7440 +7441, OA7441 +7442, OA7442 +7443, OA7443 +7444, OA7444 +7445, OA7445 +7446, OA7446 +7447, OA7447 +7448, OA7448 +7449, OA7449 +7450, OA7450 +7451, OA7451 +7452, OA7452 +7453, OA7453 +7454, OA7454 +7455, OA7455 +7456, OA7456 +7457, OA7457 +7458, OA7458 +7459, OA7459 +7460, OA7460 +7461, OA7461 +7462, OA7462 +7463, OA7463 +7464, OA7464 +7465, OA7465 +7466, OA7466 +7467, OA7467 +7468, OA7468 +7469, OA7469 +7470, OA7470 +7471, OA7471 +7472, OA7472 +7473, OA7473 +7474, OA7474 +7475, OA7475 +7476, OA7476 +7477, OA7477 +7478, OA7478 +7479, OA7479 +7480, OA7480 +7481, OA7481 +7482, OA7482 +7483, OA7483 +7484, OA7484 +7485, OA7485 +7486, OA7486 +7487, OA7487 +7488, OA7488 +7489, OA7489 +7490, OA7490 +7491, OA7491 +7492, OA7492 +7493, OA7493 +7494, OA7494 +7495, OA7495 +7496, OA7496 +7497, OA7497 +7498, OA7498 +7499, OA7499 +7500, OA7500 +7501, OA7501 +7502, OA7502 +7503, OA7503 +7504, OA7504 +7505, OA7505 +7506, OA7506 +7507, OA7507 +7508, OA7508 +7509, OA7509 +7510, OA7510 +7511, OA7511 +7512, OA7512 +7513, OA7513 +7514, OA7514 +7515, OA7515 +7516, OA7516 +7517, OA7517 +7518, OA7518 +7519, OA7519 +7520, OA7520 +7521, OA7521 +7522, OA7522 +7523, OA7523 +7524, OA7524 +7525, OA7525 +7526, OA7526 +7527, OA7527 +7528, OA7528 +7529, OA7529 +7530, OA7530 +7531, OA7531 +7532, OA7532 +7533, OA7533 +7534, OA7534 +7535, OA7535 +7536, OA7536 +7537, OA7537 +7538, OA7538 +7539, OA7539 +7540, OA7540 +7541, OA7541 +7542, OA7542 +7543, OA7543 +7544, OA7544 +7545, OA7545 +7546, OA7546 +7547, OA7547 +7548, OA7548 +7549, OA7549 +7550, OA7550 +7551, OA7551 +7552, OA7552 +7553, OA7553 +7554, OA7554 +7555, OA7555 +7556, OA7556 +7557, OA7557 +7558, OA7558 +7559, OA7559 +7560, OA7560 +7561, OA7561 +7562, OA7562 +7563, OA7563 +7564, OA7564 +7565, OA7565 +7566, OA7566 +7567, OA7567 +7568, OA7568 +7569, OA7569 +7570, OA7570 +7571, OA7571 +7572, OA7572 +7573, OA7573 +7574, OA7574 +7575, OA7575 +7576, OA7576 +7577, OA7577 +7578, OA7578 +7579, OA7579 +7580, OA7580 +7581, OA7581 +7582, OA7582 +7583, OA7583 +7584, OA7584 +7585, OA7585 +7586, OA7586 +7587, OA7587 +7588, OA7588 +7589, OA7589 +7590, OA7590 +7591, OA7591 +7592, OA7592 +7593, OA7593 +7594, OA7594 +7595, OA7595 +7596, OA7596 +7597, OA7597 +7598, OA7598 +7599, OA7599 +7600, OA7600 +7601, OA7601 +7602, OA7602 +7603, OA7603 +7604, OA7604 +7605, OA7605 +7606, OA7606 +7607, OA7607 +7608, OA7608 +7609, OA7609 +7610, OA7610 +7611, OA7611 +7612, OA7612 +7613, OA7613 +7614, OA7614 +7615, OA7615 +7616, OA7616 +7617, OA7617 +7618, OA7618 +7619, OA7619 +7620, OA7620 +7621, OA7621 +7622, OA7622 +7623, OA7623 +7624, OA7624 +7625, OA7625 +7626, OA7626 +7627, OA7627 +7628, OA7628 +7629, OA7629 +7630, OA7630 +7631, OA7631 +7632, OA7632 +7633, OA7633 +7634, OA7634 +7635, OA7635 +7636, OA7636 +7637, OA7637 +7638, OA7638 +7639, OA7639 +7640, OA7640 +7641, OA7641 +7642, OA7642 +7643, OA7643 +7644, OA7644 +7645, OA7645 +7646, OA7646 +7647, OA7647 +7648, OA7648 +7649, OA7649 +7650, OA7650 +7651, OA7651 +7652, OA7652 +7653, OA7653 +7654, OA7654 +7655, OA7655 +7656, OA7656 +7657, OA7657 +7658, OA7658 +7659, OA7659 +7660, OA7660 +7661, OA7661 +7662, OA7662 +7663, OA7663 +7664, OA7664 +7665, OA7665 +7666, OA7666 +7667, OA7667 +7668, OA7668 +7669, OA7669 +7670, OA7670 +7671, OA7671 +7672, OA7672 +7673, OA7673 +7674, OA7674 +7675, OA7675 +7676, OA7676 +7677, OA7677 +7678, OA7678 +7679, OA7679 +7680, OA7680 +7681, OA7681 +7682, OA7682 +7683, OA7683 +7684, OA7684 +7685, OA7685 +7686, OA7686 +7687, OA7687 +7688, OA7688 +7689, OA7689 +7690, OA7690 +7691, OA7691 +7692, OA7692 +7693, OA7693 +7694, OA7694 +7695, OA7695 +7696, OA7696 +7697, OA7697 +7698, OA7698 +7699, OA7699 +7700, OA7700 +7701, OA7701 +7702, OA7702 +7703, OA7703 +7704, OA7704 +7705, OA7705 +7706, OA7706 +7707, OA7707 +7708, OA7708 +7709, OA7709 +7710, OA7710 +7711, OA7711 +7712, OA7712 +7713, OA7713 +7714, OA7714 +7715, OA7715 +7716, OA7716 +7717, OA7717 +7718, OA7718 +7719, OA7719 +7720, OA7720 +7721, OA7721 +7722, OA7722 +7723, OA7723 +7724, OA7724 +7725, OA7725 +7726, OA7726 +7727, OA7727 +7728, OA7728 +7729, OA7729 +7730, OA7730 +7731, OA7731 +7732, OA7732 +7733, OA7733 +7734, OA7734 +7735, OA7735 +7736, OA7736 +7737, OA7737 +7738, OA7738 +7739, OA7739 +7740, OA7740 +7741, OA7741 +7742, OA7742 +7743, OA7743 +7744, OA7744 +7745, OA7745 +7746, OA7746 +7747, OA7747 +7748, OA7748 +7749, OA7749 +7750, OA7750 +7751, OA7751 +7752, OA7752 +7753, OA7753 +7754, OA7754 +7755, OA7755 +7756, OA7756 +7757, OA7757 +7758, OA7758 +7759, OA7759 +7760, OA7760 +7761, OA7761 +7762, OA7762 +7763, OA7763 +7764, OA7764 +7765, OA7765 +7766, OA7766 +7767, OA7767 +7768, OA7768 +7769, OA7769 +7770, OA7770 +7771, OA7771 +7772, OA7772 +7773, OA7773 +7774, OA7774 +7775, OA7775 +7776, OA7776 +7777, OA7777 +7778, OA7778 +7779, OA7779 +7780, OA7780 +7781, OA7781 +7782, OA7782 +7783, OA7783 +7784, OA7784 +7785, OA7785 +7786, OA7786 +7787, OA7787 +7788, OA7788 +7789, OA7789 +7790, OA7790 +7791, OA7791 +7792, OA7792 +7793, OA7793 +7794, OA7794 +7795, OA7795 +7796, OA7796 +7797, OA7797 +7798, OA7798 +7799, OA7799 +7800, OA7800 +7801, OA7801 +7802, OA7802 +7803, OA7803 +7804, OA7804 +7805, OA7805 +7806, OA7806 +7807, OA7807 +7808, OA7808 +7809, OA7809 +7810, OA7810 +7811, OA7811 +7812, OA7812 +7813, OA7813 +7814, OA7814 +7815, OA7815 +7816, OA7816 +7817, OA7817 +7818, OA7818 +7819, OA7819 +7820, OA7820 +7821, OA7821 +7822, OA7822 +7823, OA7823 +7824, OA7824 +7825, OA7825 +7826, OA7826 +7827, OA7827 +7828, OA7828 +7829, OA7829 +7830, OA7830 +7831, OA7831 +7832, OA7832 +7833, OA7833 +7834, OA7834 +7835, OA7835 +7836, OA7836 +7837, OA7837 +7838, OA7838 +7839, OA7839 +7840, OA7840 +7841, OA7841 +7842, OA7842 +7843, OA7843 +7844, OA7844 +7845, OA7845 +7846, OA7846 +7847, OA7847 +7848, OA7848 +7849, OA7849 +7850, OA7850 +7851, OA7851 +7852, OA7852 +7853, OA7853 +7854, OA7854 +7855, OA7855 +7856, OA7856 +7857, OA7857 +7858, OA7858 +7859, OA7859 +7860, OA7860 +7861, OA7861 +7862, OA7862 +7863, OA7863 +7864, OA7864 +7865, OA7865 +7866, OA7866 +7867, OA7867 +7868, OA7868 +7869, OA7869 +7870, OA7870 +7871, OA7871 +7872, OA7872 +7873, OA7873 +7874, OA7874 +7875, OA7875 +7876, OA7876 +7877, OA7877 +7878, OA7878 +7879, OA7879 +7880, OA7880 +7881, OA7881 +7882, OA7882 +7883, OA7883 +7884, OA7884 +7885, OA7885 +7886, OA7886 +7887, OA7887 +7888, OA7888 +7889, OA7889 +7890, OA7890 +7891, OA7891 +7892, OA7892 +7893, OA7893 +7894, OA7894 +7895, OA7895 +7896, OA7896 +7897, OA7897 +7898, OA7898 +7899, OA7899 +7900, OA7900 +7901, OA7901 +7902, OA7902 +7903, OA7903 +7904, OA7904 +7905, OA7905 +7906, OA7906 +7907, OA7907 +7908, OA7908 +7909, OA7909 +7910, OA7910 +7911, OA7911 +7912, OA7912 +7913, OA7913 +7914, OA7914 +7915, OA7915 +7916, OA7916 +7917, OA7917 +7918, OA7918 +7919, OA7919 +7920, OA7920 +7921, OA7921 +7922, OA7922 +7923, OA7923 +7924, OA7924 +7925, OA7925 +7926, OA7926 +7927, OA7927 +7928, OA7928 +7929, OA7929 +7930, OA7930 +7931, OA7931 +7932, OA7932 +7933, OA7933 +7934, OA7934 +7935, OA7935 +7936, OA7936 +7937, OA7937 +7938, OA7938 +7939, OA7939 +7940, OA7940 +7941, OA7941 +7942, OA7942 +7943, OA7943 +7944, OA7944 +7945, OA7945 +7946, OA7946 +7947, OA7947 +7948, OA7948 +7949, OA7949 +7950, OA7950 +7951, OA7951 +7952, OA7952 +7953, OA7953 +7954, OA7954 +7955, OA7955 +7956, OA7956 +7957, OA7957 +7958, OA7958 +7959, OA7959 +7960, OA7960 +7961, OA7961 +7962, OA7962 +7963, OA7963 +7964, OA7964 +7965, OA7965 +7966, OA7966 +7967, OA7967 +7968, OA7968 +7969, OA7969 +7970, OA7970 +7971, OA7971 +7972, OA7972 +7973, OA7973 +7974, OA7974 +7975, OA7975 +7976, OA7976 +7977, OA7977 +7978, OA7978 +7979, OA7979 +7980, OA7980 +7981, OA7981 +7982, OA7982 +7983, OA7983 +7984, OA7984 +7985, OA7985 +7986, OA7986 +7987, OA7987 +7988, OA7988 +7989, OA7989 +7990, OA7990 +7991, OA7991 +7992, OA7992 +7993, OA7993 +7994, OA7994 +7995, OA7995 +7996, OA7996 +7997, OA7997 +7998, OA7998 +7999, OA7999 +8000, OA8000 +8001, OA8001 +8002, OA8002 +8003, OA8003 +8004, OA8004 +8005, OA8005 +8006, OA8006 +8007, OA8007 +8008, OA8008 +8009, OA8009 +8010, OA8010 +8011, OA8011 +8012, OA8012 +8013, OA8013 +8014, OA8014 +8015, OA8015 +8016, OA8016 +8017, OA8017 +8018, OA8018 +8019, OA8019 +8020, OA8020 +8021, OA8021 +8022, OA8022 +8023, OA8023 +8024, OA8024 +8025, OA8025 +8026, OA8026 +8027, OA8027 +8028, OA8028 +8029, OA8029 +8030, OA8030 +8031, OA8031 +8032, OA8032 +8033, OA8033 +8034, OA8034 +8035, OA8035 +8036, OA8036 +8037, OA8037 +8038, OA8038 +8039, OA8039 +8040, OA8040 +8041, OA8041 +8042, OA8042 +8043, OA8043 +8044, OA8044 +8045, OA8045 +8046, OA8046 +8047, OA8047 +8048, OA8048 +8049, OA8049 +8050, OA8050 +8051, OA8051 +8052, OA8052 +8053, OA8053 +8054, OA8054 +8055, OA8055 +8056, OA8056 +8057, OA8057 +8058, OA8058 +8059, OA8059 +8060, OA8060 +8061, OA8061 +8062, OA8062 +8063, OA8063 +8064, OA8064 +8065, OA8065 +8066, OA8066 +8067, OA8067 +8068, OA8068 +8069, OA8069 +8070, OA8070 +8071, OA8071 +8072, OA8072 +8073, OA8073 +8074, OA8074 +8075, OA8075 +8076, OA8076 +8077, OA8077 +8078, OA8078 +8079, OA8079 +8080, OA8080 +8081, OA8081 +8082, OA8082 +8083, OA8083 +8084, OA8084 +8085, OA8085 +8086, OA8086 +8087, OA8087 +8088, OA8088 +8089, OA8089 +8090, OA8090 +8091, OA8091 +8092, OA8092 +8093, OA8093 +8094, OA8094 +8095, OA8095 +8096, OA8096 +8097, OA8097 +8098, OA8098 +8099, OA8099 +8100, OA8100 +8101, OA8101 +8102, OA8102 +8103, OA8103 +8104, OA8104 +8105, OA8105 +8106, OA8106 +8107, OA8107 +8108, OA8108 +8109, OA8109 +8110, OA8110 +8111, OA8111 +8112, OA8112 +8113, OA8113 +8114, OA8114 +8115, OA8115 +8116, OA8116 +8117, OA8117 +8118, OA8118 +8119, OA8119 +8120, OA8120 +8121, OA8121 +8122, OA8122 +8123, OA8123 +8124, OA8124 +8125, OA8125 +8126, OA8126 +8127, OA8127 +8128, OA8128 +8129, OA8129 +8130, OA8130 +8131, OA8131 +8132, OA8132 +8133, OA8133 +8134, OA8134 +8135, OA8135 +8136, OA8136 +8137, OA8137 +8138, OA8138 +8139, OA8139 +8140, OA8140 +8141, OA8141 +8142, OA8142 +8143, OA8143 +8144, OA8144 +8145, OA8145 +8146, OA8146 +8147, OA8147 +8148, OA8148 +8149, OA8149 +8150, OA8150 +8151, OA8151 +8152, OA8152 +8153, OA8153 +8154, OA8154 +8155, OA8155 +8156, OA8156 +8157, OA8157 +8158, OA8158 +8159, OA8159 +8160, OA8160 +8161, OA8161 +8162, OA8162 +8163, OA8163 +8164, OA8164 +8165, OA8165 +8166, OA8166 +8167, OA8167 +8168, OA8168 +8169, OA8169 +8170, OA8170 +8171, OA8171 +8172, OA8172 +8173, OA8173 +8174, OA8174 +8175, OA8175 +8176, OA8176 +8177, OA8177 +8178, OA8178 +8179, OA8179 +8180, OA8180 +8181, OA8181 +8182, OA8182 +8183, OA8183 +8184, OA8184 +8185, OA8185 +8186, OA8186 +8187, OA8187 +8188, OA8188 +8189, OA8189 +8190, OA8190 +8191, OA8191 +8192, OA8192 +8193, OA8193 +8194, OA8194 +8195, OA8195 +8196, OA8196 +8197, OA8197 +8198, OA8198 +8199, OA8199 +8200, OA8200 +8201, OA8201 +8202, OA8202 +8203, OA8203 +8204, OA8204 +8205, OA8205 +8206, OA8206 +8207, OA8207 +8208, OA8208 +8209, OA8209 +8210, OA8210 +8211, OA8211 +8212, OA8212 +8213, OA8213 +8214, OA8214 +8215, OA8215 +8216, OA8216 +8217, OA8217 +8218, OA8218 +8219, OA8219 +8220, OA8220 +8221, OA8221 +8222, OA8222 +8223, OA8223 +8224, OA8224 +8225, OA8225 +8226, OA8226 +8227, OA8227 +8228, OA8228 +8229, OA8229 +8230, OA8230 +8231, OA8231 +8232, OA8232 +8233, OA8233 +8234, OA8234 +8235, OA8235 +8236, OA8236 +8237, OA8237 +8238, OA8238 +8239, OA8239 +8240, OA8240 +8241, OA8241 +8242, OA8242 +8243, OA8243 +8244, OA8244 +8245, OA8245 +8246, OA8246 +8247, OA8247 +8248, OA8248 +8249, OA8249 +8250, OA8250 +8251, OA8251 +8252, OA8252 +8253, OA8253 +8254, OA8254 +8255, OA8255 +8256, OA8256 +8257, OA8257 +8258, OA8258 +8259, OA8259 +8260, OA8260 +8261, OA8261 +8262, OA8262 +8263, OA8263 +8264, OA8264 +8265, OA8265 +8266, OA8266 +8267, OA8267 +8268, OA8268 +8269, OA8269 +8270, OA8270 +8271, OA8271 +8272, OA8272 +8273, OA8273 +8274, OA8274 +8275, OA8275 +8276, OA8276 +8277, OA8277 +8278, OA8278 +8279, OA8279 +8280, OA8280 +8281, OA8281 +8282, OA8282 +8283, OA8283 +8284, OA8284 +8285, OA8285 +8286, OA8286 +8287, OA8287 +8288, OA8288 +8289, OA8289 +8290, OA8290 +8291, OA8291 +8292, OA8292 +8293, OA8293 +8294, OA8294 +8295, OA8295 +8296, OA8296 +8297, OA8297 +8298, OA8298 +8299, OA8299 +8300, OA8300 +8301, OA8301 +8302, OA8302 +8303, OA8303 +8304, OA8304 +8305, OA8305 +8306, OA8306 +8307, OA8307 +8308, OA8308 +8309, OA8309 +8310, OA8310 +8311, OA8311 +8312, OA8312 +8313, OA8313 +8314, OA8314 +8315, OA8315 +8316, OA8316 +8317, OA8317 +8318, OA8318 +8319, OA8319 +8320, OA8320 +8321, OA8321 +8322, OA8322 +8323, OA8323 +8324, OA8324 +8325, OA8325 +8326, OA8326 +8327, OA8327 +8328, OA8328 +8329, OA8329 +8330, OA8330 +8331, OA8331 +8332, OA8332 +8333, OA8333 +8334, OA8334 +8335, OA8335 +8336, OA8336 +8337, OA8337 +8338, OA8338 +8339, OA8339 +8340, OA8340 +8341, OA8341 +8342, OA8342 +8343, OA8343 +8344, OA8344 +8345, OA8345 +8346, OA8346 +8347, OA8347 +8348, OA8348 +8349, OA8349 +8350, OA8350 +8351, OA8351 +8352, OA8352 +8353, OA8353 +8354, OA8354 +8355, OA8355 +8356, OA8356 +8357, OA8357 +8358, OA8358 +8359, OA8359 +8360, OA8360 +8361, OA8361 +8362, OA8362 +8363, OA8363 +8364, OA8364 +8365, OA8365 +8366, OA8366 +8367, OA8367 +8368, OA8368 +8369, OA8369 +8370, OA8370 +8371, OA8371 +8372, OA8372 +8373, OA8373 +8374, OA8374 +8375, OA8375 +8376, OA8376 +8377, OA8377 +8378, OA8378 +8379, OA8379 +8380, OA8380 +8381, OA8381 +8382, OA8382 +8383, OA8383 +8384, OA8384 +8385, OA8385 +8386, OA8386 +8387, OA8387 +8388, OA8388 +8389, OA8389 +8390, OA8390 +8391, OA8391 +8392, OA8392 +8393, OA8393 +8394, OA8394 +8395, OA8395 +8396, OA8396 +8397, OA8397 +8398, OA8398 +8399, OA8399 +8400, OA8400 +8401, OA8401 +8402, OA8402 +8403, OA8403 +8404, OA8404 +8405, OA8405 +8406, OA8406 +8407, OA8407 +8408, OA8408 +8409, OA8409 +8410, OA8410 +8411, OA8411 +8412, OA8412 +8413, OA8413 +8414, OA8414 +8415, OA8415 +8416, OA8416 +8417, OA8417 +8418, OA8418 +8419, OA8419 +8420, OA8420 +8421, OA8421 +8422, OA8422 +8423, OA8423 +8424, OA8424 +8425, OA8425 +8426, OA8426 +8427, OA8427 +8428, OA8428 +8429, OA8429 +8430, OA8430 +8431, OA8431 +8432, OA8432 +8433, OA8433 +8434, OA8434 +8435, OA8435 +8436, OA8436 +8437, OA8437 +8438, OA8438 +8439, OA8439 +8440, OA8440 +8441, OA8441 +8442, OA8442 +8443, OA8443 +8444, OA8444 +8445, OA8445 +8446, OA8446 +8447, OA8447 +8448, OA8448 +8449, OA8449 +8450, OA8450 +8451, OA8451 +8452, OA8452 +8453, OA8453 +8454, OA8454 +8455, OA8455 +8456, OA8456 +8457, OA8457 +8458, OA8458 +8459, OA8459 +8460, OA8460 +8461, OA8461 +8462, OA8462 +8463, OA8463 +8464, OA8464 +8465, OA8465 +8466, OA8466 +8467, OA8467 +8468, OA8468 +8469, OA8469 +8470, OA8470 +8471, OA8471 +8472, OA8472 +8473, OA8473 +8474, OA8474 +8475, OA8475 +8476, OA8476 +8477, OA8477 +8478, OA8478 +8479, OA8479 +8480, OA8480 +8481, OA8481 +8482, OA8482 +8483, OA8483 +8484, OA8484 +8485, OA8485 +8486, OA8486 +8487, OA8487 +8488, OA8488 +8489, OA8489 +8490, OA8490 +8491, OA8491 +8492, OA8492 +8493, OA8493 +8494, OA8494 +8495, OA8495 +8496, OA8496 +8497, OA8497 +8498, OA8498 +8499, OA8499 +8500, OA8500 +8501, OA8501 +8502, OA8502 +8503, OA8503 +8504, OA8504 +8505, OA8505 +8506, OA8506 +8507, OA8507 +8508, OA8508 +8509, OA8509 +8510, OA8510 +8511, OA8511 +8512, OA8512 +8513, OA8513 +8514, OA8514 +8515, OA8515 +8516, OA8516 +8517, OA8517 +8518, OA8518 +8519, OA8519 +8520, OA8520 +8521, OA8521 +8522, OA8522 +8523, OA8523 +8524, OA8524 +8525, OA8525 +8526, OA8526 +8527, OA8527 +8528, OA8528 +8529, OA8529 +8530, OA8530 +8531, OA8531 +8532, OA8532 +8533, OA8533 +8534, OA8534 +8535, OA8535 +8536, OA8536 +8537, OA8537 +8538, OA8538 +8539, OA8539 +8540, OA8540 +8541, OA8541 +8542, OA8542 +8543, OA8543 +8544, OA8544 +8545, OA8545 +8546, OA8546 +8547, OA8547 +8548, OA8548 +8549, OA8549 +8550, OA8550 +8551, OA8551 +8552, OA8552 +8553, OA8553 +8554, OA8554 +8555, OA8555 +8556, OA8556 +8557, OA8557 +8558, OA8558 +8559, OA8559 +8560, OA8560 +8561, OA8561 +8562, OA8562 +8563, OA8563 +8564, OA8564 +8565, OA8565 +8566, OA8566 +8567, OA8567 +8568, OA8568 +8569, OA8569 +8570, OA8570 +8571, OA8571 +8572, OA8572 +8573, OA8573 +8574, OA8574 +8575, OA8575 +8576, OA8576 +8577, OA8577 +8578, OA8578 +8579, OA8579 +8580, OA8580 +8581, OA8581 +8582, OA8582 +8583, OA8583 +8584, OA8584 +8585, OA8585 +8586, OA8586 +8587, OA8587 +8588, OA8588 +8589, OA8589 +8590, OA8590 +8591, OA8591 +8592, OA8592 +8593, OA8593 +8594, OA8594 +8595, OA8595 +8596, OA8596 +8597, OA8597 +8598, OA8598 +8599, OA8599 +8600, OA8600 +8601, OA8601 +8602, OA8602 +8603, OA8603 +8604, OA8604 +8605, OA8605 +8606, OA8606 +8607, OA8607 +8608, OA8608 +8609, OA8609 +8610, OA8610 +8611, OA8611 +8612, OA8612 +8613, OA8613 +8614, OA8614 +8615, OA8615 +8616, OA8616 +8617, OA8617 +8618, OA8618 +8619, OA8619 +8620, OA8620 +8621, OA8621 +8622, OA8622 +8623, OA8623 +8624, OA8624 +8625, OA8625 +8626, OA8626 +8627, OA8627 +8628, OA8628 +8629, OA8629 +8630, OA8630 +8631, OA8631 +8632, OA8632 +8633, OA8633 +8634, OA8634 +8635, OA8635 +8636, OA8636 +8637, OA8637 +8638, OA8638 +8639, OA8639 +8640, OA8640 +8641, OA8641 +8642, OA8642 +8643, OA8643 +8644, OA8644 +8645, OA8645 +8646, OA8646 +8647, OA8647 +8648, OA8648 +8649, OA8649 +8650, OA8650 +8651, OA8651 +8652, OA8652 +8653, OA8653 +8654, OA8654 +8655, OA8655 +8656, OA8656 +8657, OA8657 +8658, OA8658 +8659, OA8659 +8660, OA8660 +8661, OA8661 +8662, OA8662 +8663, OA8663 +8664, OA8664 +8665, OA8665 +8666, OA8666 +8667, OA8667 +8668, OA8668 +8669, OA8669 +8670, OA8670 +8671, OA8671 +8672, OA8672 +8673, OA8673 +8674, OA8674 +8675, OA8675 +8676, OA8676 +8677, OA8677 +8678, OA8678 +8679, OA8679 +8680, OA8680 +8681, OA8681 +8682, OA8682 +8683, OA8683 +8684, OA8684 +8685, OA8685 +8686, OA8686 +8687, OA8687 +8688, OA8688 +8689, OA8689 +8690, OA8690 +8691, OA8691 +8692, OA8692 +8693, OA8693 +8694, OA8694 +8695, OA8695 +8696, OA8696 +8697, OA8697 +8698, OA8698 +8699, OA8699 +8700, OA8700 +8701, OA8701 +8702, OA8702 +8703, OA8703 +8704, OA8704 +8705, OA8705 +8706, OA8706 +8707, OA8707 +8708, OA8708 +8709, OA8709 +8710, OA8710 +8711, OA8711 +8712, OA8712 +8713, OA8713 +8714, OA8714 +8715, OA8715 +8716, OA8716 +8717, OA8717 +8718, OA8718 +8719, OA8719 +8720, OA8720 +8721, OA8721 +8722, OA8722 +8723, OA8723 +8724, OA8724 +8725, OA8725 +8726, OA8726 +8727, OA8727 +8728, OA8728 +8729, OA8729 +8730, OA8730 +8731, OA8731 +8732, OA8732 +8733, OA8733 +8734, OA8734 +8735, OA8735 +8736, OA8736 +8737, OA8737 +8738, OA8738 +8739, OA8739 +8740, OA8740 +8741, OA8741 +8742, OA8742 +8743, OA8743 +8744, OA8744 +8745, OA8745 +8746, OA8746 +8747, OA8747 +8748, OA8748 +8749, OA8749 +8750, OA8750 +8751, OA8751 +8752, OA8752 +8753, OA8753 +8754, OA8754 +8755, OA8755 +8756, OA8756 +8757, OA8757 +8758, OA8758 +8759, OA8759 +8760, OA8760 +8761, OA8761 +8762, OA8762 +8763, OA8763 +8764, OA8764 +8765, OA8765 +8766, OA8766 +8767, OA8767 +8768, OA8768 +8769, OA8769 +8770, OA8770 +8771, OA8771 +8772, OA8772 +8773, OA8773 +8774, OA8774 +8775, OA8775 +8776, OA8776 +8777, OA8777 +8778, OA8778 +8779, OA8779 +8780, OA8780 +8781, OA8781 +8782, OA8782 +8783, OA8783 +8784, OA8784 +8785, OA8785 +8786, OA8786 +8787, OA8787 +8788, OA8788 +8789, OA8789 +8790, OA8790 +8791, OA8791 +8792, OA8792 +8793, OA8793 +8794, OA8794 +8795, OA8795 +8796, OA8796 +8797, OA8797 +8798, OA8798 +8799, OA8799 +8800, OA8800 +8801, OA8801 +8802, OA8802 +8803, OA8803 +8804, OA8804 +8805, OA8805 +8806, OA8806 +8807, OA8807 +8808, OA8808 +8809, OA8809 +8810, OA8810 +8811, OA8811 +8812, OA8812 +8813, OA8813 +8814, OA8814 +8815, OA8815 +8816, OA8816 +8817, OA8817 +8818, OA8818 +8819, OA8819 +8820, OA8820 +8821, OA8821 +8822, OA8822 +8823, OA8823 +8824, OA8824 +8825, OA8825 +8826, OA8826 +8827, OA8827 +8828, OA8828 +8829, OA8829 +8830, OA8830 +8831, OA8831 +8832, OA8832 +8833, OA8833 +8834, OA8834 +8835, OA8835 +8836, OA8836 +8837, OA8837 +8838, OA8838 +8839, OA8839 +8840, OA8840 +8841, OA8841 +8842, OA8842 +8843, OA8843 +8844, OA8844 +8845, OA8845 +8846, OA8846 +8847, OA8847 +8848, OA8848 +8849, OA8849 +8850, OA8850 +8851, OA8851 +8852, OA8852 +8853, OA8853 +8854, OA8854 +8855, OA8855 +8856, OA8856 +8857, OA8857 +8858, OA8858 +8859, OA8859 +8860, OA8860 +8861, OA8861 +8862, OA8862 +8863, OA8863 +8864, OA8864 +8865, OA8865 +8866, OA8866 +8867, OA8867 +8868, OA8868 +8869, OA8869 +8870, OA8870 +8871, OA8871 +8872, OA8872 +8873, OA8873 +8874, OA8874 +8875, OA8875 +8876, OA8876 +8877, OA8877 +8878, OA8878 +8879, OA8879 +8880, OA8880 +8881, OA8881 +8882, OA8882 +8883, OA8883 +8884, OA8884 +8885, OA8885 +8886, OA8886 +8887, OA8887 +8888, OA8888 +8889, OA8889 +8890, OA8890 +8891, OA8891 +8892, OA8892 +8893, OA8893 +8894, OA8894 +8895, OA8895 +8896, OA8896 +8897, OA8897 +8898, OA8898 +8899, OA8899 +8900, OA8900 +8901, OA8901 +8902, OA8902 +8903, OA8903 +8904, OA8904 +8905, OA8905 +8906, OA8906 +8907, OA8907 +8908, OA8908 +8909, OA8909 +8910, OA8910 +8911, OA8911 +8912, OA8912 +8913, OA8913 +8914, OA8914 +8915, OA8915 +8916, OA8916 +8917, OA8917 +8918, OA8918 +8919, OA8919 +8920, OA8920 +8921, OA8921 +8922, OA8922 +8923, OA8923 +8924, OA8924 +8925, OA8925 +8926, OA8926 +8927, OA8927 +8928, OA8928 +8929, OA8929 +8930, OA8930 +8931, OA8931 +8932, OA8932 +8933, OA8933 +8934, OA8934 +8935, OA8935 +8936, OA8936 +8937, OA8937 +8938, OA8938 +8939, OA8939 +8940, OA8940 +8941, OA8941 +8942, OA8942 +8943, OA8943 +8944, OA8944 +8945, OA8945 +8946, OA8946 +8947, OA8947 +8948, OA8948 +8949, OA8949 +8950, OA8950 +8951, OA8951 +8952, OA8952 +8953, OA8953 +8954, OA8954 +8955, OA8955 +8956, OA8956 +8957, OA8957 +8958, OA8958 +8959, OA8959 +8960, OA8960 +8961, OA8961 +8962, OA8962 +8963, OA8963 +8964, OA8964 +8965, OA8965 +8966, OA8966 +8967, OA8967 +8968, OA8968 +8969, OA8969 +8970, OA8970 +8971, OA8971 +8972, OA8972 +8973, OA8973 +8974, OA8974 +8975, OA8975 +8976, OA8976 +8977, OA8977 +8978, OA8978 +8979, OA8979 +8980, OA8980 +8981, OA8981 +8982, OA8982 +8983, OA8983 +8984, OA8984 +8985, OA8985 +8986, OA8986 +8987, OA8987 +8988, OA8988 +8989, OA8989 +8990, OA8990 +8991, OA8991 +8992, OA8992 +8993, OA8993 +8994, OA8994 +8995, OA8995 +8996, OA8996 +8997, OA8997 +8998, OA8998 +8999, OA8999 +9000, OA9000 +9001, OA9001 +9002, OA9002 +9003, OA9003 +9004, OA9004 +9005, OA9005 +9006, OA9006 +9007, OA9007 +9008, OA9008 +9009, OA9009 +9010, OA9010 +9011, OA9011 +9012, OA9012 +9013, OA9013 +9014, OA9014 +9015, OA9015 +9016, OA9016 +9017, OA9017 +9018, OA9018 +9019, OA9019 +9020, OA9020 +9021, OA9021 +9022, OA9022 +9023, OA9023 +9024, OA9024 +9025, OA9025 +9026, OA9026 +9027, OA9027 +9028, OA9028 +9029, OA9029 +9030, OA9030 +9031, OA9031 +9032, OA9032 +9033, OA9033 +9034, OA9034 +9035, OA9035 +9036, OA9036 +9037, OA9037 +9038, OA9038 +9039, OA9039 +9040, OA9040 +9041, OA9041 +9042, OA9042 +9043, OA9043 +9044, OA9044 +9045, OA9045 +9046, OA9046 +9047, OA9047 +9048, OA9048 +9049, OA9049 +9050, OA9050 +9051, OA9051 +9052, OA9052 +9053, OA9053 +9054, OA9054 +9055, OA9055 +9056, OA9056 +9057, OA9057 +9058, OA9058 +9059, OA9059 +9060, OA9060 +9061, OA9061 +9062, OA9062 +9063, OA9063 +9064, OA9064 +9065, OA9065 +9066, OA9066 +9067, OA9067 +9068, OA9068 +9069, OA9069 +9070, OA9070 +9071, OA9071 +9072, OA9072 +9073, OA9073 +9074, OA9074 +9075, OA9075 +9076, OA9076 +9077, OA9077 +9078, OA9078 +9079, OA9079 +9080, OA9080 +9081, OA9081 +9082, OA9082 +9083, OA9083 +9084, OA9084 +9085, OA9085 +9086, OA9086 +9087, OA9087 +9088, OA9088 +9089, OA9089 +9090, OA9090 +9091, OA9091 +9092, OA9092 +9093, OA9093 +9094, OA9094 +9095, OA9095 +9096, OA9096 +9097, OA9097 +9098, OA9098 +9099, OA9099 +9100, OA9100 +9101, OA9101 +9102, OA9102 +9103, OA9103 +9104, OA9104 +9105, OA9105 +9106, OA9106 +9107, OA9107 +9108, OA9108 +9109, OA9109 +9110, OA9110 +9111, OA9111 +9112, OA9112 +9113, OA9113 +9114, OA9114 +9115, OA9115 +9116, OA9116 +9117, OA9117 +9118, OA9118 +9119, OA9119 +9120, OA9120 +9121, OA9121 +9122, OA9122 +9123, OA9123 +9124, OA9124 +9125, OA9125 +9126, OA9126 +9127, OA9127 +9128, OA9128 +9129, OA9129 +9130, OA9130 +9131, OA9131 +9132, OA9132 +9133, OA9133 +9134, OA9134 +9135, OA9135 +9136, OA9136 +9137, OA9137 +9138, OA9138 +9139, OA9139 +9140, OA9140 +9141, OA9141 +9142, OA9142 +9143, OA9143 +9144, OA9144 +9145, OA9145 +9146, OA9146 +9147, OA9147 +9148, OA9148 +9149, OA9149 +9150, OA9150 +9151, OA9151 +9152, OA9152 +9153, OA9153 +9154, OA9154 +9155, OA9155 +9156, OA9156 +9157, OA9157 +9158, OA9158 +9159, OA9159 +9160, OA9160 +9161, OA9161 +9162, OA9162 +9163, OA9163 +9164, OA9164 +9165, OA9165 +9166, OA9166 +9167, OA9167 +9168, OA9168 +9169, OA9169 +9170, OA9170 +9171, OA9171 +9172, OA9172 +9173, OA9173 +9174, OA9174 +9175, OA9175 +9176, OA9176 +9177, OA9177 +9178, OA9178 +9179, OA9179 +9180, OA9180 +9181, OA9181 +9182, OA9182 +9183, OA9183 +9184, OA9184 +9185, OA9185 +9186, OA9186 +9187, OA9187 +9188, OA9188 +9189, OA9189 +9190, OA9190 +9191, OA9191 +9192, OA9192 +9193, OA9193 +9194, OA9194 +9195, OA9195 +9196, OA9196 +9197, OA9197 +9198, OA9198 +9199, OA9199 +9200, OA9200 +9201, OA9201 +9202, OA9202 +9203, OA9203 +9204, OA9204 +9205, OA9205 +9206, OA9206 +9207, OA9207 +9208, OA9208 +9209, OA9209 +9210, OA9210 +9211, OA9211 +9212, OA9212 +9213, OA9213 +9214, OA9214 +9215, OA9215 +9216, OA9216 +9217, OA9217 +9218, OA9218 +9219, OA9219 +9220, OA9220 +9221, OA9221 +9222, OA9222 +9223, OA9223 +9224, OA9224 +9225, OA9225 +9226, OA9226 +9227, OA9227 +9228, OA9228 +9229, OA9229 +9230, OA9230 +9231, OA9231 +9232, OA9232 +9233, OA9233 +9234, OA9234 +9235, OA9235 +9236, OA9236 +9237, OA9237 +9238, OA9238 +9239, OA9239 +9240, OA9240 +9241, OA9241 +9242, OA9242 +9243, OA9243 +9244, OA9244 +9245, OA9245 +9246, OA9246 +9247, OA9247 +9248, OA9248 +9249, OA9249 +9250, OA9250 +9251, OA9251 +9252, OA9252 +9253, OA9253 +9254, OA9254 +9255, OA9255 +9256, OA9256 +9257, OA9257 +9258, OA9258 +9259, OA9259 +9260, OA9260 +9261, OA9261 +9262, OA9262 +9263, OA9263 +9264, OA9264 +9265, OA9265 +9266, OA9266 +9267, OA9267 +9268, OA9268 +9269, OA9269 +9270, OA9270 +9271, OA9271 +9272, OA9272 +9273, OA9273 +9274, OA9274 +9275, OA9275 +9276, OA9276 +9277, OA9277 +9278, OA9278 +9279, OA9279 +9280, OA9280 +9281, OA9281 +9282, OA9282 +9283, OA9283 +9284, OA9284 +9285, OA9285 +9286, OA9286 +9287, OA9287 +9288, OA9288 +9289, OA9289 +9290, OA9290 +9291, OA9291 +9292, OA9292 +9293, OA9293 +9294, OA9294 +9295, OA9295 +9296, OA9296 +9297, OA9297 +9298, OA9298 +9299, OA9299 +9300, OA9300 +9301, OA9301 +9302, OA9302 +9303, OA9303 +9304, OA9304 +9305, OA9305 +9306, OA9306 +9307, OA9307 +9308, OA9308 +9309, OA9309 +9310, OA9310 +9311, OA9311 +9312, OA9312 +9313, OA9313 +9314, OA9314 +9315, OA9315 +9316, OA9316 +9317, OA9317 +9318, OA9318 +9319, OA9319 +9320, OA9320 +9321, OA9321 +9322, OA9322 +9323, OA9323 +9324, OA9324 +9325, OA9325 +9326, OA9326 +9327, OA9327 +9328, OA9328 +9329, OA9329 +9330, OA9330 +9331, OA9331 +9332, OA9332 +9333, OA9333 +9334, OA9334 +9335, OA9335 +9336, OA9336 +9337, OA9337 +9338, OA9338 +9339, OA9339 +9340, OA9340 +9341, OA9341 +9342, OA9342 +9343, OA9343 +9344, OA9344 +9345, OA9345 +9346, OA9346 +9347, OA9347 +9348, OA9348 +9349, OA9349 +9350, OA9350 +9351, OA9351 +9352, OA9352 +9353, OA9353 +9354, OA9354 +9355, OA9355 +9356, OA9356 +9357, OA9357 +9358, OA9358 +9359, OA9359 +9360, OA9360 +9361, OA9361 +9362, OA9362 +9363, OA9363 +9364, OA9364 +9365, OA9365 +9366, OA9366 +9367, OA9367 +9368, OA9368 +9369, OA9369 +9370, OA9370 +9371, OA9371 +9372, OA9372 +9373, OA9373 +9374, OA9374 +9375, OA9375 +9376, OA9376 +9377, OA9377 +9378, OA9378 +9379, OA9379 +9380, OA9380 +9381, OA9381 +9382, OA9382 +9383, OA9383 +9384, OA9384 +9385, OA9385 +9386, OA9386 +9387, OA9387 +9388, OA9388 +9389, OA9389 +9390, OA9390 +9391, OA9391 +9392, OA9392 +9393, OA9393 +9394, OA9394 +9395, OA9395 +9396, OA9396 +9397, OA9397 +9398, OA9398 +9399, OA9399 +9400, OA9400 +9401, OA9401 +9402, OA9402 +9403, OA9403 +9404, OA9404 +9405, OA9405 +9406, OA9406 +9407, OA9407 +9408, OA9408 +9409, OA9409 +9410, OA9410 +9411, OA9411 +9412, OA9412 +9413, OA9413 +9414, OA9414 +9415, OA9415 +9416, OA9416 +9417, OA9417 +9418, OA9418 +9419, OA9419 +9420, OA9420 +9421, OA9421 +9422, OA9422 +9423, OA9423 +9424, OA9424 +9425, OA9425 +9426, OA9426 +9427, OA9427 +9428, OA9428 +9429, OA9429 +9430, OA9430 +9431, OA9431 +9432, OA9432 +9433, OA9433 +9434, OA9434 +9435, OA9435 +9436, OA9436 +9437, OA9437 +9438, OA9438 +9439, OA9439 +9440, OA9440 +9441, OA9441 +9442, OA9442 +9443, OA9443 +9444, OA9444 +9445, OA9445 +9446, OA9446 +9447, OA9447 +9448, OA9448 +9449, OA9449 +9450, OA9450 +9451, OA9451 +9452, OA9452 +9453, OA9453 +9454, OA9454 +9455, OA9455 +9456, OA9456 +9457, OA9457 +9458, OA9458 +9459, OA9459 +9460, OA9460 +9461, OA9461 +9462, OA9462 +9463, OA9463 +9464, OA9464 +9465, OA9465 +9466, OA9466 +9467, OA9467 +9468, OA9468 +9469, OA9469 +9470, OA9470 +9471, OA9471 +9472, OA9472 +9473, OA9473 +9474, OA9474 +9475, OA9475 +9476, OA9476 +9477, OA9477 +9478, OA9478 +9479, OA9479 +9480, OA9480 +9481, OA9481 +9482, OA9482 +9483, OA9483 +9484, OA9484 +9485, OA9485 +9486, OA9486 +9487, OA9487 +9488, OA9488 +9489, OA9489 +9490, OA9490 +9491, OA9491 +9492, OA9492 +9493, OA9493 +9494, OA9494 +9495, OA9495 +9496, OA9496 +9497, OA9497 +9498, OA9498 +9499, OA9499 +9500, OA9500 +9501, OA9501 +9502, OA9502 +9503, OA9503 +9504, OA9504 +9505, OA9505 +9506, OA9506 +9507, OA9507 +9508, OA9508 +9509, OA9509 +9510, OA9510 +9511, OA9511 +9512, OA9512 +9513, OA9513 +9514, OA9514 +9515, OA9515 +9516, OA9516 +9517, OA9517 +9518, OA9518 +9519, OA9519 +9520, OA9520 +9521, OA9521 +9522, OA9522 +9523, OA9523 +9524, OA9524 +9525, OA9525 +9526, OA9526 +9527, OA9527 +9528, OA9528 +9529, OA9529 +9530, OA9530 +9531, OA9531 +9532, OA9532 +9533, OA9533 +9534, OA9534 +9535, OA9535 +9536, OA9536 +9537, OA9537 +9538, OA9538 +9539, OA9539 +9540, OA9540 +9541, OA9541 +9542, OA9542 +9543, OA9543 +9544, OA9544 +9545, OA9545 +9546, OA9546 +9547, OA9547 +9548, OA9548 +9549, OA9549 +9550, OA9550 +9551, OA9551 +9552, OA9552 +9553, OA9553 +9554, OA9554 +9555, OA9555 +9556, OA9556 +9557, OA9557 +9558, OA9558 +9559, OA9559 +9560, OA9560 +9561, OA9561 +9562, OA9562 +9563, OA9563 +9564, OA9564 +9565, OA9565 +9566, OA9566 +9567, OA9567 +9568, OA9568 +9569, OA9569 +9570, OA9570 +9571, OA9571 +9572, OA9572 +9573, OA9573 +9574, OA9574 +9575, OA9575 +9576, OA9576 +9577, OA9577 +9578, OA9578 +9579, OA9579 +9580, OA9580 +9581, OA9581 +9582, OA9582 +9583, OA9583 +9584, OA9584 +9585, OA9585 +9586, OA9586 +9587, OA9587 +9588, OA9588 +9589, OA9589 +9590, OA9590 +9591, OA9591 +9592, OA9592 +9593, OA9593 +9594, OA9594 +9595, OA9595 +9596, OA9596 +9597, OA9597 +9598, OA9598 +9599, OA9599 +9600, OA9600 +9601, OA9601 +9602, OA9602 +9603, OA9603 +9604, OA9604 +9605, OA9605 +9606, OA9606 +9607, OA9607 +9608, OA9608 +9609, OA9609 +9610, OA9610 +9611, OA9611 +9612, OA9612 +9613, OA9613 +9614, OA9614 +9615, OA9615 +9616, OA9616 +9617, OA9617 +9618, OA9618 +9619, OA9619 +9620, OA9620 +9621, OA9621 +9622, OA9622 +9623, OA9623 +9624, OA9624 +9625, OA9625 +9626, OA9626 +9627, OA9627 +9628, OA9628 +9629, OA9629 +9630, OA9630 +9631, OA9631 +9632, OA9632 +9633, OA9633 +9634, OA9634 +9635, OA9635 +9636, OA9636 +9637, OA9637 +9638, OA9638 +9639, OA9639 +9640, OA9640 +9641, OA9641 +9642, OA9642 +9643, OA9643 +9644, OA9644 +9645, OA9645 +9646, OA9646 +9647, OA9647 +9648, OA9648 +9649, OA9649 +9650, OA9650 +9651, OA9651 +9652, OA9652 +9653, OA9653 +9654, OA9654 +9655, OA9655 +9656, OA9656 +9657, OA9657 +9658, OA9658 +9659, OA9659 +9660, OA9660 +9661, OA9661 +9662, OA9662 +9663, OA9663 +9664, OA9664 +9665, OA9665 +9666, OA9666 +9667, OA9667 +9668, OA9668 +9669, OA9669 +9670, OA9670 +9671, OA9671 +9672, OA9672 +9673, OA9673 +9674, OA9674 +9675, OA9675 +9676, OA9676 +9677, OA9677 +9678, OA9678 +9679, OA9679 +9680, OA9680 +9681, OA9681 +9682, OA9682 +9683, OA9683 +9684, OA9684 +9685, OA9685 +9686, OA9686 +9687, OA9687 +9688, OA9688 +9689, OA9689 +9690, OA9690 +9691, OA9691 +9692, OA9692 +9693, OA9693 +9694, OA9694 +9695, OA9695 +9696, OA9696 +9697, OA9697 +9698, OA9698 +9699, OA9699 +9700, OA9700 +9701, OA9701 +9702, OA9702 +9703, OA9703 +9704, OA9704 +9705, OA9705 +9706, OA9706 +9707, OA9707 +9708, OA9708 +9709, OA9709 +9710, OA9710 +9711, OA9711 +9712, OA9712 +9713, OA9713 +9714, OA9714 +9715, OA9715 +9716, OA9716 +9717, OA9717 +9718, OA9718 +9719, OA9719 +9720, OA9720 +9721, OA9721 +9722, OA9722 +9723, OA9723 +9724, OA9724 +9725, OA9725 +9726, OA9726 +9727, OA9727 +9728, OA9728 +9729, OA9729 +9730, OA9730 +9731, OA9731 +9732, OA9732 +9733, OA9733 +9734, OA9734 +9735, OA9735 +9736, OA9736 +9737, OA9737 +9738, OA9738 +9739, OA9739 +9740, OA9740 +9741, OA9741 +9742, OA9742 +9743, OA9743 +9744, OA9744 +9745, OA9745 +9746, OA9746 +9747, OA9747 +9748, OA9748 +9749, OA9749 +9750, OA9750 +9751, OA9751 +9752, OA9752 +9753, OA9753 +9754, OA9754 +9755, OA9755 +9756, OA9756 +9757, OA9757 +9758, OA9758 +9759, OA9759 +9760, OA9760 +9761, OA9761 +9762, OA9762 +9763, OA9763 +9764, OA9764 +9765, OA9765 +9766, OA9766 +9767, OA9767 +9768, OA9768 +9769, OA9769 +9770, OA9770 +9771, OA9771 +9772, OA9772 +9773, OA9773 +9774, OA9774 +9775, OA9775 +9776, OA9776 +9777, OA9777 +9778, OA9778 +9779, OA9779 +9780, OA9780 +9781, OA9781 +9782, OA9782 +9783, OA9783 +9784, OA9784 +9785, OA9785 +9786, OA9786 +9787, OA9787 +9788, OA9788 +9789, OA9789 +9790, OA9790 +9791, OA9791 +9792, OA9792 +9793, OA9793 +9794, OA9794 +9795, OA9795 +9796, OA9796 +9797, OA9797 +9798, OA9798 +9799, OA9799 +9800, OA9800 +9801, OA9801 +9802, OA9802 +9803, OA9803 +9804, OA9804 +9805, OA9805 +9806, OA9806 +9807, OA9807 +9808, OA9808 +9809, OA9809 +9810, OA9810 +9811, OA9811 +9812, OA9812 +9813, OA9813 +9814, OA9814 +9815, OA9815 +9816, OA9816 +9817, OA9817 +9818, OA9818 +9819, OA9819 +9820, OA9820 +9821, OA9821 +9822, OA9822 +9823, OA9823 +9824, OA9824 +9825, OA9825 +9826, OA9826 +9827, OA9827 +9828, OA9828 +9829, OA9829 +9830, OA9830 +9831, OA9831 +9832, OA9832 +9833, OA9833 +9834, OA9834 +9835, OA9835 +9836, OA9836 +9837, OA9837 +9838, OA9838 +9839, OA9839 +9840, OA9840 +9841, OA9841 +9842, OA9842 +9843, OA9843 +9844, OA9844 +9845, OA9845 +9846, OA9846 +9847, OA9847 +9848, OA9848 +9849, OA9849 +9850, OA9850 +9851, OA9851 +9852, OA9852 +9853, OA9853 +9854, OA9854 +9855, OA9855 +9856, OA9856 +9857, OA9857 +9858, OA9858 +9859, OA9859 +9860, OA9860 +9861, OA9861 +9862, OA9862 +9863, OA9863 +9864, OA9864 +9865, OA9865 +9866, OA9866 +9867, OA9867 +9868, OA9868 +9869, OA9869 +9870, OA9870 +9871, OA9871 +9872, OA9872 +9873, OA9873 +9874, OA9874 +9875, OA9875 +9876, OA9876 +9877, OA9877 +9878, OA9878 +9879, OA9879 +9880, OA9880 +9881, OA9881 +9882, OA9882 +9883, OA9883 +9884, OA9884 +9885, OA9885 +9886, OA9886 +9887, OA9887 +9888, OA9888 +9889, OA9889 +9890, OA9890 +9891, OA9891 +9892, OA9892 +9893, OA9893 +9894, OA9894 +9895, OA9895 +9896, OA9896 +9897, OA9897 +9898, OA9898 +9899, OA9899 +9900, OA9900 +9901, OA9901 +9902, OA9902 +9903, OA9903 +9904, OA9904 +9905, OA9905 +9906, OA9906 +9907, OA9907 +9908, OA9908 +9909, OA9909 +9910, OA9910 +9911, OA9911 +9912, OA9912 +9913, OA9913 +9914, OA9914 +9915, OA9915 +9916, OA9916 +9917, OA9917 +9918, OA9918 +9919, OA9919 +9920, OA9920 +9921, OA9921 +9922, OA9922 +9923, OA9923 +9924, OA9924 +9925, OA9925 +9926, OA9926 +9927, OA9927 +9928, OA9928 +9929, OA9929 +9930, OA9930 +9931, OA9931 +9932, OA9932 +9933, OA9933 +9934, OA9934 +9935, OA9935 +9936, OA9936 +9937, OA9937 +9938, OA9938 +9939, OA9939 +9940, OA9940 +9941, OA9941 +9942, OA9942 +9943, OA9943 +9944, OA9944 +9945, OA9945 +9946, OA9946 +9947, OA9947 +9948, OA9948 +9949, OA9949 +9950, OA9950 +9951, OA9951 +9952, OA9952 +9953, OA9953 +9954, OA9954 +9955, OA9955 +9956, OA9956 +9957, OA9957 +9958, OA9958 +9959, OA9959 +9960, OA9960 +9961, OA9961 +9962, OA9962 +9963, OA9963 +9964, OA9964 +9965, OA9965 +9966, OA9966 +9967, OA9967 +9968, OA9968 +9969, OA9969 +9970, OA9970 +9971, OA9971 +9972, OA9972 +9973, OA9973 +9974, OA9974 +9975, OA9975 +9976, OA9976 +9977, OA9977 +9978, OA9978 +9979, OA9979 +9980, OA9980 +9981, OA9981 +9982, OA9982 +9983, OA9983 +9984, OA9984 +9985, OA9985 +9986, OA9986 +9987, OA9987 +9988, OA9988 +9989, OA9989 +9990, OA9990 +9991, OA9991 +9992, OA9992 +9993, OA9993 +9994, OA9994 +9995, OA9995 +9996, OA9996 +9997, OA9997 +9998, OA9998 +9999, OA9999 +10000, OA10000 +10001, OA10001 +10002, OA10002 +10003, OA10003 +10004, OA10004 +10005, OA10005 +10006, OA10006 +10007, OA10007 +10008, OA10008 +10009, OA10009 +10010, OA10010 +10011, OA10011 +10012, OA10012 +10013, OA10013 +10014, OA10014 +10015, OA10015 +10016, OA10016 +10017, OA10017 +10018, OA10018 +10019, OA10019 +10020, OA10020 +10021, OA10021 +10022, OA10022 +10023, OA10023 +10024, OA10024 +10025, OA10025 +10026, OA10026 +10027, OA10027 +10028, OA10028 +10029, OA10029 +10030, OA10030 +10031, OA10031 +10032, OA10032 +10033, OA10033 +10034, OA10034 +10035, OA10035 +10036, OA10036 +10037, OA10037 +10038, OA10038 +10039, OA10039 +10040, OA10040 +10041, OA10041 +10042, OA10042 +10043, OA10043 +10044, OA10044 +10045, OA10045 +10046, OA10046 +10047, OA10047 +10048, OA10048 +10049, OA10049 +10050, OA10050 +10051, OA10051 +10052, OA10052 +10053, OA10053 +10054, OA10054 +10055, OA10055 +10056, OA10056 +10057, OA10057 +10058, OA10058 +10059, OA10059 +10060, OA10060 +10061, OA10061 +10062, OA10062 +10063, OA10063 +10064, OA10064 +10065, OA10065 +10066, OA10066 +10067, OA10067 +10068, OA10068 +10069, OA10069 +10070, OA10070 +10071, OA10071 +10072, OA10072 +10073, OA10073 +10074, OA10074 +10075, OA10075 +10076, OA10076 +10077, OA10077 +10078, OA10078 +10079, OA10079 +10080, OA10080 +10081, OA10081 +10082, OA10082 +10083, OA10083 +10084, OA10084 +10085, OA10085 +10086, OA10086 +10087, OA10087 +10088, OA10088 +10089, OA10089 +10090, OA10090 +10091, OA10091 +10092, OA10092 +10093, OA10093 +10094, OA10094 +10095, OA10095 +10096, OA10096 +10097, OA10097 +10098, OA10098 +10099, OA10099 +10100, OA10100 +10101, OA10101 +10102, OA10102 +10103, OA10103 +10104, OA10104 +10105, OA10105 +10106, OA10106 +10107, OA10107 +10108, OA10108 +10109, OA10109 +10110, OA10110 +10111, OA10111 +10112, OA10112 +10113, OA10113 +10114, OA10114 +10115, OA10115 +10116, OA10116 +10117, OA10117 +10118, OA10118 +10119, OA10119 +10120, OA10120 +10121, OA10121 +10122, OA10122 +10123, OA10123 +10124, OA10124 +10125, OA10125 +10126, OA10126 +10127, OA10127 +10128, OA10128 +10129, OA10129 +10130, OA10130 +10131, OA10131 +10132, OA10132 +10133, OA10133 +10134, OA10134 +10135, OA10135 +10136, OA10136 +10137, OA10137 +10138, OA10138 +10139, OA10139 +10140, OA10140 +10141, OA10141 +10142, OA10142 +10143, OA10143 +10144, OA10144 +10145, OA10145 +10146, OA10146 +10147, OA10147 +10148, OA10148 +10149, OA10149 +10150, OA10150 +10151, OA10151 +10152, OA10152 +10153, OA10153 +10154, OA10154 +10155, OA10155 +10156, OA10156 +10157, OA10157 +10158, OA10158 +10159, OA10159 +10160, OA10160 +10161, OA10161 +10162, OA10162 +10163, OA10163 +10164, OA10164 +10165, OA10165 +10166, OA10166 +10167, OA10167 +10168, OA10168 +10169, OA10169 +10170, OA10170 +10171, OA10171 +10172, OA10172 +10173, OA10173 +10174, OA10174 +10175, OA10175 +10176, OA10176 +10177, OA10177 +10178, OA10178 +10179, OA10179 +10180, OA10180 +10181, OA10181 +10182, OA10182 +10183, OA10183 +10184, OA10184 +10185, OA10185 +10186, OA10186 +10187, OA10187 +10188, OA10188 +10189, OA10189 +10190, OA10190 +10191, OA10191 +10192, OA10192 +10193, OA10193 +10194, OA10194 +10195, OA10195 +10196, OA10196 +10197, OA10197 +10198, OA10198 +10199, OA10199 +10200, OA10200 +10201, OA10201 +10202, OA10202 +10203, OA10203 +10204, OA10204 +10205, OA10205 +10206, OA10206 +10207, OA10207 +10208, OA10208 +10209, OA10209 +10210, OA10210 +10211, OA10211 +10212, OA10212 +10213, OA10213 +10214, OA10214 +10215, OA10215 +10216, OA10216 +10217, OA10217 +10218, OA10218 +10219, OA10219 +10220, OA10220 +10221, OA10221 +10222, OA10222 +10223, OA10223 +10224, OA10224 +10225, OA10225 +10226, OA10226 +10227, OA10227 +10228, OA10228 +10229, OA10229 +10230, OA10230 +10231, OA10231 +10232, OA10232 +10233, OA10233 +10234, OA10234 +10235, OA10235 +10236, OA10236 +10237, OA10237 +10238, OA10238 +10239, OA10239 +10240, OA10240 +10241, OA10241 +10242, OA10242 +10243, OA10243 +10244, OA10244 +10245, OA10245 +10246, OA10246 +10247, OA10247 +10248, OA10248 +10249, OA10249 +10250, OA10250 +10251, OA10251 +10252, OA10252 +10253, OA10253 +10254, OA10254 +10255, OA10255 +10256, OA10256 +10257, OA10257 +10258, OA10258 +10259, OA10259 +10260, OA10260 +10261, OA10261 +10262, OA10262 +10263, OA10263 +10264, OA10264 +10265, OA10265 +10266, OA10266 +10267, OA10267 +10268, OA10268 +10269, OA10269 +10270, OA10270 +10271, OA10271 +10272, OA10272 +10273, OA10273 +10274, OA10274 +10275, OA10275 +10276, OA10276 +10277, OA10277 +10278, OA10278 +10279, OA10279 +10280, OA10280 +10281, OA10281 +10282, OA10282 +10283, OA10283 +10284, OA10284 +10285, OA10285 +10286, OA10286 +10287, OA10287 +10288, OA10288 +10289, OA10289 +10290, OA10290 +10291, OA10291 +10292, OA10292 +10293, OA10293 +10294, OA10294 +10295, OA10295 +10296, OA10296 +10297, OA10297 +10298, OA10298 +10299, OA10299 +10300, OA10300 +10301, OA10301 +10302, OA10302 +10303, OA10303 +10304, OA10304 +10305, OA10305 +10306, OA10306 +10307, OA10307 +10308, OA10308 +10309, OA10309 +10310, OA10310 +10311, OA10311 +10312, OA10312 +10313, OA10313 +10314, OA10314 +10315, OA10315 +10316, OA10316 +10317, OA10317 +10318, OA10318 +10319, OA10319 +10320, OA10320 +10321, OA10321 +10322, OA10322 +10323, OA10323 +10324, OA10324 +10325, OA10325 +10326, OA10326 +10327, OA10327 +10328, OA10328 +10329, OA10329 +10330, OA10330 +10331, OA10331 +10332, OA10332 +10333, OA10333 +10334, OA10334 +10335, OA10335 +10336, OA10336 +10337, OA10337 +10338, OA10338 +10339, OA10339 +10340, OA10340 +10341, OA10341 +10342, OA10342 +10343, OA10343 +10344, OA10344 +10345, OA10345 +10346, OA10346 +10347, OA10347 +10348, OA10348 +10349, OA10349 +10350, OA10350 +10351, OA10351 +10352, OA10352 +10353, OA10353 +10354, OA10354 +10355, OA10355 +10356, OA10356 +10357, OA10357 +10358, OA10358 +10359, OA10359 +10360, OA10360 +10361, OA10361 +10362, OA10362 +10363, OA10363 +10364, OA10364 +10365, OA10365 +10366, OA10366 +10367, OA10367 +10368, OA10368 +10369, OA10369 +10370, OA10370 +10371, OA10371 +10372, OA10372 +10373, OA10373 +10374, OA10374 +10375, OA10375 +10376, OA10376 +10377, OA10377 +10378, OA10378 +10379, OA10379 +10380, OA10380 +10381, OA10381 +10382, OA10382 +10383, OA10383 +10384, OA10384 +10385, OA10385 +10386, OA10386 +10387, OA10387 +10388, OA10388 +10389, OA10389 +10390, OA10390 +10391, OA10391 +10392, OA10392 +10393, OA10393 +10394, OA10394 +10395, OA10395 +10396, OA10396 +10397, OA10397 +10398, OA10398 +10399, OA10399 +10400, OA10400 +10401, OA10401 +10402, OA10402 +10403, OA10403 +10404, OA10404 +10405, OA10405 +10406, OA10406 +10407, OA10407 +10408, OA10408 +10409, OA10409 +10410, OA10410 +10411, OA10411 +10412, OA10412 +10413, OA10413 +10414, OA10414 +10415, OA10415 +10416, OA10416 +10417, OA10417 +10418, OA10418 +10419, OA10419 +10420, OA10420 +10421, OA10421 +10422, OA10422 +10423, OA10423 +10424, OA10424 +10425, OA10425 +10426, OA10426 +10427, OA10427 +10428, OA10428 +10429, OA10429 +10430, OA10430 +10431, OA10431 +10432, OA10432 +10433, OA10433 +10434, OA10434 +10435, OA10435 +10436, OA10436 +10437, OA10437 +10438, OA10438 +10439, OA10439 +10440, OA10440 +10441, OA10441 +10442, OA10442 +10443, OA10443 +10444, OA10444 +10445, OA10445 +10446, OA10446 +10447, OA10447 +10448, OA10448 +10449, OA10449 +10450, OA10450 +10451, OA10451 +10452, OA10452 +10453, OA10453 +10454, OA10454 +10455, OA10455 +10456, OA10456 +10457, OA10457 +10458, OA10458 +10459, OA10459 +10460, OA10460 +10461, OA10461 +10462, OA10462 +10463, OA10463 +10464, OA10464 +10465, OA10465 +10466, OA10466 +10467, OA10467 +10468, OA10468 +10469, OA10469 +10470, OA10470 +10471, OA10471 +10472, OA10472 +10473, OA10473 +10474, OA10474 +10475, OA10475 +10476, OA10476 +10477, OA10477 +10478, OA10478 +10479, OA10479 +10480, OA10480 +10481, OA10481 +10482, OA10482 +10483, OA10483 +10484, OA10484 +10485, OA10485 +10486, OA10486 +10487, OA10487 +10488, OA10488 +10489, OA10489 +10490, OA10490 +10491, OA10491 +10492, OA10492 +10493, OA10493 +10494, OA10494 +10495, OA10495 +10496, OA10496 +10497, OA10497 +10498, OA10498 +10499, OA10499 +10500, OA10500 +10501, OA10501 +10502, OA10502 +10503, OA10503 +10504, OA10504 +10505, OA10505 +10506, OA10506 +10507, OA10507 +10508, OA10508 +10509, OA10509 +10510, OA10510 +10511, OA10511 +10512, OA10512 +10513, OA10513 +10514, OA10514 +10515, OA10515 +10516, OA10516 +10517, OA10517 +10518, OA10518 +10519, OA10519 +10520, OA10520 +10521, OA10521 +10522, OA10522 +10523, OA10523 +10524, OA10524 +10525, OA10525 +10526, OA10526 +10527, OA10527 +10528, OA10528 +10529, OA10529 +10530, OA10530 +10531, OA10531 +10532, OA10532 +10533, OA10533 +10534, OA10534 +10535, OA10535 +10536, OA10536 +10537, OA10537 +10538, OA10538 +10539, OA10539 +10540, OA10540 +10541, OA10541 +10542, OA10542 +10543, OA10543 +10544, OA10544 +10545, OA10545 +10546, OA10546 +10547, OA10547 +10548, OA10548 +10549, OA10549 +10550, OA10550 +10551, OA10551 +10552, OA10552 +10553, OA10553 +10554, OA10554 +10555, OA10555 +10556, OA10556 +10557, OA10557 +10558, OA10558 +10559, OA10559 +10560, OA10560 +10561, OA10561 +10562, OA10562 +10563, OA10563 +10564, OA10564 +10565, OA10565 +10566, OA10566 +10567, OA10567 +10568, OA10568 +10569, OA10569 +10570, OA10570 +10571, OA10571 +10572, OA10572 +10573, OA10573 +10574, OA10574 +10575, OA10575 +10576, OA10576 +10577, OA10577 +10578, OA10578 +10579, OA10579 +10580, OA10580 +10581, OA10581 +10582, OA10582 +10583, OA10583 +10584, OA10584 +10585, OA10585 +10586, OA10586 +10587, OA10587 +10588, OA10588 +10589, OA10589 +10590, OA10590 +10591, OA10591 +10592, OA10592 +10593, OA10593 +10594, OA10594 +10595, OA10595 +10596, OA10596 +10597, OA10597 +10598, OA10598 +10599, OA10599 +10600, OA10600 +10601, OA10601 +10602, OA10602 +10603, OA10603 +10604, OA10604 +10605, OA10605 +10606, OA10606 +10607, OA10607 +10608, OA10608 +10609, OA10609 +10610, OA10610 +10611, OA10611 +10612, OA10612 +10613, OA10613 +10614, OA10614 +10615, OA10615 +10616, OA10616 +10617, OA10617 +10618, OA10618 +10619, OA10619 +10620, OA10620 +10621, OA10621 +10622, OA10622 +10623, OA10623 +10624, OA10624 +10625, OA10625 +10626, OA10626 +10627, OA10627 +10628, OA10628 +10629, OA10629 +10630, OA10630 +10631, OA10631 +10632, OA10632 +10633, OA10633 +10634, OA10634 +10635, OA10635 +10636, OA10636 +10637, OA10637 +10638, OA10638 +10639, OA10639 +10640, OA10640 +10641, OA10641 +10642, OA10642 +10643, OA10643 +10644, OA10644 +10645, OA10645 +10646, OA10646 +10647, OA10647 +10648, OA10648 +10649, OA10649 +10650, OA10650 +10651, OA10651 +10652, OA10652 +10653, OA10653 +10654, OA10654 +10655, OA10655 +10656, OA10656 +10657, OA10657 +10658, OA10658 +10659, OA10659 +10660, OA10660 +10661, OA10661 +10662, OA10662 +10663, OA10663 +10664, OA10664 +10665, OA10665 +10666, OA10666 +10667, OA10667 +10668, OA10668 +10669, OA10669 +10670, OA10670 +10671, OA10671 +10672, OA10672 +10673, OA10673 +10674, OA10674 +10675, OA10675 +10676, OA10676 +10677, OA10677 +10678, OA10678 +10679, OA10679 +10680, OA10680 +10681, OA10681 +10682, OA10682 +10683, OA10683 +10684, OA10684 +10685, OA10685 +10686, OA10686 +10687, OA10687 +10688, OA10688 +10689, OA10689 +10690, OA10690 +10691, OA10691 +10692, OA10692 +10693, OA10693 +10694, OA10694 +10695, OA10695 +10696, OA10696 +10697, OA10697 +10698, OA10698 +10699, OA10699 +10700, OA10700 +10701, OA10701 +10702, OA10702 +10703, OA10703 +10704, OA10704 +10705, OA10705 +10706, OA10706 +10707, OA10707 +10708, OA10708 +10709, OA10709 +10710, OA10710 +10711, OA10711 +10712, OA10712 +10713, OA10713 +10714, OA10714 +10715, OA10715 +10716, OA10716 +10717, OA10717 +10718, OA10718 +10719, OA10719 +10720, OA10720 +10721, OA10721 +10722, OA10722 +10723, OA10723 +10724, OA10724 +10725, OA10725 +10726, OA10726 +10727, OA10727 +10728, OA10728 +10729, OA10729 +10730, OA10730 +10731, OA10731 +10732, OA10732 +10733, OA10733 +10734, OA10734 +10735, OA10735 +10736, OA10736 +10737, OA10737 +10738, OA10738 +10739, OA10739 +10740, OA10740 +10741, OA10741 +10742, OA10742 +10743, OA10743 +10744, OA10744 +10745, OA10745 +10746, OA10746 +10747, OA10747 +10748, OA10748 +10749, OA10749 +10750, OA10750 +10751, OA10751 +10752, OA10752 +10753, OA10753 +10754, OA10754 +10755, OA10755 +10756, OA10756 +10757, OA10757 +10758, OA10758 +10759, OA10759 +10760, OA10760 +10761, OA10761 +10762, OA10762 +10763, OA10763 +10764, OA10764 +10765, OA10765 +10766, OA10766 +10767, OA10767 +10768, OA10768 +10769, OA10769 +10770, OA10770 +10771, OA10771 +10772, OA10772 +10773, OA10773 +10774, OA10774 +10775, OA10775 +10776, OA10776 +10777, OA10777 +10778, OA10778 +10779, OA10779 +10780, OA10780 +10781, OA10781 +10782, OA10782 +10783, OA10783 +10784, OA10784 +10785, OA10785 +10786, OA10786 +10787, OA10787 +10788, OA10788 +10789, OA10789 +10790, OA10790 +10791, OA10791 +10792, OA10792 +10793, OA10793 +10794, OA10794 +10795, OA10795 +10796, OA10796 +10797, OA10797 +10798, OA10798 +10799, OA10799 +10800, OA10800 +10801, OA10801 +10802, OA10802 +10803, OA10803 +10804, OA10804 +10805, OA10805 +10806, OA10806 +10807, OA10807 +10808, OA10808 +10809, OA10809 +10810, OA10810 +10811, OA10811 +10812, OA10812 +10813, OA10813 +10814, OA10814 +10815, OA10815 +10816, OA10816 +10817, OA10817 +10818, OA10818 +10819, OA10819 +10820, OA10820 +10821, OA10821 +10822, OA10822 +10823, OA10823 +10824, OA10824 +10825, OA10825 +10826, OA10826 +10827, OA10827 +10828, OA10828 +10829, OA10829 +10830, OA10830 +10831, OA10831 +10832, OA10832 +10833, OA10833 +10834, OA10834 +10835, OA10835 +10836, OA10836 +10837, OA10837 +10838, OA10838 +10839, OA10839 +10840, OA10840 +10841, OA10841 +10842, OA10842 +10843, OA10843 +10844, OA10844 +10845, OA10845 +10846, OA10846 +10847, OA10847 +10848, OA10848 +10849, OA10849 +10850, OA10850 +10851, OA10851 +10852, OA10852 +10853, OA10853 +10854, OA10854 +10855, OA10855 +10856, OA10856 +10857, OA10857 +10858, OA10858 +10859, OA10859 +10860, OA10860 +10861, OA10861 +10862, OA10862 +10863, OA10863 +10864, OA10864 +10865, OA10865 +10866, OA10866 +10867, OA10867 +10868, OA10868 +10869, OA10869 +10870, OA10870 +10871, OA10871 +10872, OA10872 +10873, OA10873 +10874, OA10874 +10875, OA10875 +10876, OA10876 +10877, OA10877 +10878, OA10878 +10879, OA10879 +10880, OA10880 +10881, OA10881 +10882, OA10882 +10883, OA10883 +10884, OA10884 +10885, OA10885 +10886, OA10886 +10887, OA10887 +10888, OA10888 +10889, OA10889 +10890, OA10890 +10891, OA10891 +10892, OA10892 +10893, OA10893 +10894, OA10894 +10895, OA10895 +10896, OA10896 +10897, OA10897 +10898, OA10898 +10899, OA10899 +10900, OA10900 +10901, OA10901 +10902, OA10902 +10903, OA10903 +10904, OA10904 +10905, OA10905 +10906, OA10906 +10907, OA10907 +10908, OA10908 +10909, OA10909 +10910, OA10910 +10911, OA10911 +10912, OA10912 +10913, OA10913 +10914, OA10914 +10915, OA10915 +10916, OA10916 +10917, OA10917 +10918, OA10918 +10919, OA10919 +10920, OA10920 +10921, OA10921 +10922, OA10922 +10923, OA10923 +10924, OA10924 +10925, OA10925 +10926, OA10926 +10927, OA10927 +10928, OA10928 +10929, OA10929 +10930, OA10930 +10931, OA10931 +10932, OA10932 +10933, OA10933 +10934, OA10934 +10935, OA10935 +10936, OA10936 +10937, OA10937 +10938, OA10938 +10939, OA10939 +10940, OA10940 +10941, OA10941 +10942, OA10942 +10943, OA10943 +10944, OA10944 +10945, OA10945 +10946, OA10946 +10947, OA10947 +10948, OA10948 +10949, OA10949 +10950, OA10950 +10951, OA10951 +10952, OA10952 +10953, OA10953 +10954, OA10954 +10955, OA10955 +10956, OA10956 +10957, OA10957 +10958, OA10958 +10959, OA10959 +10960, OA10960 +10961, OA10961 +10962, OA10962 +10963, OA10963 +10964, OA10964 +10965, OA10965 +10966, OA10966 +10967, OA10967 +10968, OA10968 +10969, OA10969 +10970, OA10970 +10971, OA10971 +10972, OA10972 +10973, OA10973 +10974, OA10974 +10975, OA10975 +10976, OA10976 +10977, OA10977 +10978, OA10978 +10979, OA10979 +10980, OA10980 +10981, OA10981 +10982, OA10982 +10983, OA10983 +10984, OA10984 +10985, OA10985 +10986, OA10986 +10987, OA10987 +10988, OA10988 +10989, OA10989 +10990, OA10990 +10991, OA10991 +10992, OA10992 +10993, OA10993 +10994, OA10994 +10995, OA10995 +10996, OA10996 +10997, OA10997 +10998, OA10998 +10999, OA10999 +11000, OA11000 +11001, OA11001 +11002, OA11002 +11003, OA11003 +11004, OA11004 +11005, OA11005 +11006, OA11006 +11007, OA11007 +11008, OA11008 +11009, OA11009 +11010, OA11010 +11011, OA11011 +11012, OA11012 +11013, OA11013 +11014, OA11014 +11015, OA11015 +11016, OA11016 +11017, OA11017 +11018, OA11018 +11019, OA11019 +11020, OA11020 +11021, OA11021 +11022, OA11022 +11023, OA11023 +11024, OA11024 +11025, OA11025 +11026, OA11026 +11027, OA11027 +11028, OA11028 +11029, OA11029 +11030, OA11030 +11031, OA11031 +11032, OA11032 +11033, OA11033 +11034, OA11034 +11035, OA11035 +11036, OA11036 +11037, OA11037 +11038, OA11038 +11039, OA11039 +11040, OA11040 +11041, OA11041 +11042, OA11042 +11043, OA11043 +11044, OA11044 +11045, OA11045 +11046, OA11046 +11047, OA11047 +11048, OA11048 +11049, OA11049 +11050, OA11050 +11051, OA11051 +11052, OA11052 +11053, OA11053 +11054, OA11054 +11055, OA11055 +11056, OA11056 +11057, OA11057 +11058, OA11058 +11059, OA11059 +11060, OA11060 +11061, OA11061 +11062, OA11062 +11063, OA11063 +11064, OA11064 +11065, OA11065 +11066, OA11066 +11067, OA11067 +11068, OA11068 +11069, OA11069 +11070, OA11070 +11071, OA11071 +11072, OA11072 +11073, OA11073 +11074, OA11074 +11075, OA11075 +11076, OA11076 +11077, OA11077 +11078, OA11078 +11079, OA11079 +11080, OA11080 +11081, OA11081 +11082, OA11082 +11083, OA11083 +11084, OA11084 +11085, OA11085 +11086, OA11086 +11087, OA11087 +11088, OA11088 +11089, OA11089 +11090, OA11090 +11091, OA11091 +11092, OA11092 +11093, OA11093 +11094, OA11094 +11095, OA11095 +11096, OA11096 +11097, OA11097 +11098, OA11098 +11099, OA11099 +11100, OA11100 +11101, OA11101 +11102, OA11102 +11103, OA11103 +11104, OA11104 +11105, OA11105 +11106, OA11106 +11107, OA11107 +11108, OA11108 +11109, OA11109 +11110, OA11110 +11111, OA11111 +11112, OA11112 +11113, OA11113 +11114, OA11114 +11115, OA11115 +11116, OA11116 +11117, OA11117 +11118, OA11118 +11119, OA11119 +11120, OA11120 +11121, OA11121 +11122, OA11122 +11123, OA11123 +11124, OA11124 +11125, OA11125 +11126, OA11126 +11127, OA11127 +11128, OA11128 +11129, OA11129 +11130, OA11130 +11131, OA11131 +11132, OA11132 +11133, OA11133 +11134, OA11134 +11135, OA11135 +11136, OA11136 +11137, OA11137 +11138, OA11138 +11139, OA11139 +11140, OA11140 +11141, OA11141 +11142, OA11142 +11143, OA11143 +11144, OA11144 +11145, OA11145 +11146, OA11146 +11147, OA11147 +11148, OA11148 +11149, OA11149 +11150, OA11150 +11151, OA11151 +11152, OA11152 +11153, OA11153 +11154, OA11154 +11155, OA11155 +11156, OA11156 +11157, OA11157 +11158, OA11158 +11159, OA11159 +11160, OA11160 +11161, OA11161 +11162, OA11162 +11163, OA11163 +11164, OA11164 +11165, OA11165 +11166, OA11166 +11167, OA11167 +11168, OA11168 +11169, OA11169 +11170, OA11170 +11171, OA11171 +11172, OA11172 +11173, OA11173 +11174, OA11174 +11175, OA11175 +11176, OA11176 +11177, OA11177 +11178, OA11178 +11179, OA11179 +11180, OA11180 +11181, OA11181 +11182, OA11182 +11183, OA11183 +11184, OA11184 +11185, OA11185 +11186, OA11186 +11187, OA11187 +11188, OA11188 +11189, OA11189 +11190, OA11190 +11191, OA11191 +11192, OA11192 +11193, OA11193 +11194, OA11194 +11195, OA11195 +11196, OA11196 +11197, OA11197 +11198, OA11198 +11199, OA11199 +11200, OA11200 +11201, OA11201 +11202, OA11202 +11203, OA11203 +11204, OA11204 +11205, OA11205 +11206, OA11206 +11207, OA11207 +11208, OA11208 +11209, OA11209 +11210, OA11210 +11211, OA11211 +11212, OA11212 +11213, OA11213 +11214, OA11214 +11215, OA11215 +11216, OA11216 +11217, OA11217 +11218, OA11218 +11219, OA11219 +11220, OA11220 +11221, OA11221 +11222, OA11222 +11223, OA11223 +11224, OA11224 +11225, OA11225 +11226, OA11226 +11227, OA11227 +11228, OA11228 +11229, OA11229 +11230, OA11230 +11231, OA11231 +11232, OA11232 +11233, OA11233 +11234, OA11234 +11235, OA11235 +11236, OA11236 +11237, OA11237 +11238, OA11238 +11239, OA11239 +11240, OA11240 +11241, OA11241 +11242, OA11242 +11243, OA11243 +11244, OA11244 +11245, OA11245 +11246, OA11246 +11247, OA11247 +11248, OA11248 +11249, OA11249 +11250, OA11250 +11251, OA11251 +11252, OA11252 +11253, OA11253 +11254, OA11254 +11255, OA11255 +11256, OA11256 +11257, OA11257 +11258, OA11258 +11259, OA11259 +11260, OA11260 +11261, OA11261 +11262, OA11262 +11263, OA11263 +11264, OA11264 +11265, OA11265 +11266, OA11266 +11267, OA11267 +11268, OA11268 +11269, OA11269 +11270, OA11270 +11271, OA11271 +11272, OA11272 +11273, OA11273 +11274, OA11274 +11275, OA11275 +11276, OA11276 +11277, OA11277 +11278, OA11278 +11279, OA11279 +11280, OA11280 +11281, OA11281 +11282, OA11282 +11283, OA11283 +11284, OA11284 +11285, OA11285 +11286, OA11286 +11287, OA11287 +11288, OA11288 +11289, OA11289 +11290, OA11290 +11291, OA11291 +11292, OA11292 +11293, OA11293 +11294, OA11294 +11295, OA11295 +11296, OA11296 +11297, OA11297 +11298, OA11298 +11299, OA11299 +11300, OA11300 +11301, OA11301 +11302, OA11302 +11303, OA11303 +11304, OA11304 +11305, OA11305 +11306, OA11306 +11307, OA11307 +11308, OA11308 +11309, OA11309 +11310, OA11310 +11311, OA11311 +11312, OA11312 +11313, OA11313 +11314, OA11314 +11315, OA11315 +11316, OA11316 +11317, OA11317 +11318, OA11318 +11319, OA11319 +11320, OA11320 +11321, OA11321 +11322, OA11322 +11323, OA11323 +11324, OA11324 +11325, OA11325 +11326, OA11326 +11327, OA11327 +11328, OA11328 +11329, OA11329 +11330, OA11330 +11331, OA11331 +11332, OA11332 +11333, OA11333 +11334, OA11334 +11335, OA11335 +11336, OA11336 +11337, OA11337 +11338, OA11338 +11339, OA11339 +11340, OA11340 +11341, OA11341 +11342, OA11342 +11343, OA11343 +11344, OA11344 +11345, OA11345 +11346, OA11346 +11347, OA11347 +11348, OA11348 +11349, OA11349 +11350, OA11350 +11351, OA11351 +11352, OA11352 +11353, OA11353 +11354, OA11354 +11355, OA11355 +11356, OA11356 +11357, OA11357 +11358, OA11358 +11359, OA11359 +11360, OA11360 +11361, OA11361 +11362, OA11362 +11363, OA11363 +11364, OA11364 +11365, OA11365 +11366, OA11366 +11367, OA11367 +11368, OA11368 +11369, OA11369 +11370, OA11370 +11371, OA11371 +11372, OA11372 +11373, OA11373 +11374, OA11374 +11375, OA11375 +11376, OA11376 +11377, OA11377 +11378, OA11378 +11379, OA11379 +11380, OA11380 +11381, OA11381 +11382, OA11382 +11383, OA11383 +11384, OA11384 +11385, OA11385 +11386, OA11386 +11387, OA11387 +11388, OA11388 +11389, OA11389 +11390, OA11390 +11391, OA11391 +11392, OA11392 +11393, OA11393 +11394, OA11394 +11395, OA11395 +11396, OA11396 +11397, OA11397 +11398, OA11398 +11399, OA11399 +11400, OA11400 +11401, OA11401 +11402, OA11402 +11403, OA11403 +11404, OA11404 +11405, OA11405 +11406, OA11406 +11407, OA11407 +11408, OA11408 +11409, OA11409 +11410, OA11410 +11411, OA11411 +11412, OA11412 +11413, OA11413 +11414, OA11414 +11415, OA11415 +11416, OA11416 +11417, OA11417 +11418, OA11418 +11419, OA11419 +11420, OA11420 +11421, OA11421 +11422, OA11422 +11423, OA11423 +11424, OA11424 +11425, OA11425 +11426, OA11426 +11427, OA11427 +11428, OA11428 +11429, OA11429 +11430, OA11430 +11431, OA11431 +11432, OA11432 +11433, OA11433 +11434, OA11434 +11435, OA11435 +11436, OA11436 +11437, OA11437 +11438, OA11438 +11439, OA11439 +11440, OA11440 +11441, OA11441 +11442, OA11442 +11443, OA11443 +11444, OA11444 +11445, OA11445 +11446, OA11446 +11447, OA11447 +11448, OA11448 +11449, OA11449 +11450, OA11450 +11451, OA11451 +11452, OA11452 +11453, OA11453 +11454, OA11454 +11455, OA11455 +11456, OA11456 +11457, OA11457 +11458, OA11458 +11459, OA11459 +11460, OA11460 +11461, OA11461 +11462, OA11462 +11463, OA11463 +11464, OA11464 +11465, OA11465 +11466, OA11466 +11467, OA11467 +11468, OA11468 +11469, OA11469 +11470, OA11470 +11471, OA11471 +11472, OA11472 +11473, OA11473 +11474, OA11474 +11475, OA11475 +11476, OA11476 +11477, OA11477 +11478, OA11478 +11479, OA11479 +11480, OA11480 +11481, OA11481 +11482, OA11482 +11483, OA11483 +11484, OA11484 +11485, OA11485 +11486, OA11486 +11487, OA11487 +11488, OA11488 +11489, OA11489 +11490, OA11490 +11491, OA11491 +11492, OA11492 +11493, OA11493 +11494, OA11494 +11495, OA11495 +11496, OA11496 +11497, OA11497 +11498, OA11498 +11499, OA11499 +11500, OA11500 +11501, OA11501 +11502, OA11502 +11503, OA11503 +11504, OA11504 +11505, OA11505 +11506, OA11506 +11507, OA11507 +11508, OA11508 +11509, OA11509 +11510, OA11510 +11511, OA11511 +11512, OA11512 +11513, OA11513 +11514, OA11514 +11515, OA11515 +11516, OA11516 +11517, OA11517 +11518, OA11518 +11519, OA11519 +11520, OA11520 +11521, OA11521 +11522, OA11522 +11523, OA11523 +11524, OA11524 +11525, OA11525 +11526, OA11526 +11527, OA11527 +11528, OA11528 +11529, OA11529 +11530, OA11530 +11531, OA11531 +11532, OA11532 +11533, OA11533 +11534, OA11534 +11535, OA11535 +11536, OA11536 +11537, OA11537 +11538, OA11538 +11539, OA11539 +11540, OA11540 +11541, OA11541 +11542, OA11542 +11543, OA11543 +11544, OA11544 +11545, OA11545 +11546, OA11546 +11547, OA11547 +11548, OA11548 +11549, OA11549 +11550, OA11550 +11551, OA11551 +11552, OA11552 +11553, OA11553 +11554, OA11554 +11555, OA11555 +11556, OA11556 +11557, OA11557 +11558, OA11558 +11559, OA11559 +11560, OA11560 +11561, OA11561 +11562, OA11562 +11563, OA11563 +11564, OA11564 +11565, OA11565 +11566, OA11566 +11567, OA11567 +11568, OA11568 +11569, OA11569 +11570, OA11570 +11571, OA11571 +11572, OA11572 +11573, OA11573 +11574, OA11574 +11575, OA11575 +11576, OA11576 +11577, OA11577 +11578, OA11578 +11579, OA11579 +11580, OA11580 +11581, OA11581 +11582, OA11582 +11583, OA11583 +11584, OA11584 +11585, OA11585 +11586, OA11586 +11587, OA11587 +11588, OA11588 +11589, OA11589 +11590, OA11590 +11591, OA11591 +11592, OA11592 +11593, OA11593 +11594, OA11594 +11595, OA11595 +11596, OA11596 +11597, OA11597 +11598, OA11598 +11599, OA11599 +11600, OA11600 +11601, OA11601 +11602, OA11602 +11603, OA11603 +11604, OA11604 +11605, OA11605 +11606, OA11606 +11607, OA11607 +11608, OA11608 +11609, OA11609 +11610, OA11610 +11611, OA11611 +11612, OA11612 +11613, OA11613 +11614, OA11614 +11615, OA11615 +11616, OA11616 +11617, OA11617 +11618, OA11618 +11619, OA11619 +11620, OA11620 +11621, OA11621 +11622, OA11622 +11623, OA11623 +11624, OA11624 +11625, OA11625 +11626, OA11626 +11627, OA11627 +11628, OA11628 +11629, OA11629 +11630, OA11630 +11631, OA11631 +11632, OA11632 +11633, OA11633 +11634, OA11634 +11635, OA11635 +11636, OA11636 +11637, OA11637 +11638, OA11638 +11639, OA11639 +11640, OA11640 +11641, OA11641 +11642, OA11642 +11643, OA11643 +11644, OA11644 +11645, OA11645 +11646, OA11646 +11647, OA11647 +11648, OA11648 +11649, OA11649 +11650, OA11650 +11651, OA11651 +11652, OA11652 +11653, OA11653 +11654, OA11654 +11655, OA11655 +11656, OA11656 +11657, OA11657 +11658, OA11658 +11659, OA11659 +11660, OA11660 +11661, OA11661 +11662, OA11662 +11663, OA11663 +11664, OA11664 +11665, OA11665 +11666, OA11666 +11667, OA11667 +11668, OA11668 +11669, OA11669 +11670, OA11670 +11671, OA11671 +11672, OA11672 +11673, OA11673 +11674, OA11674 +11675, OA11675 +11676, OA11676 +11677, OA11677 +11678, OA11678 +11679, OA11679 +11680, OA11680 +11681, OA11681 +11682, OA11682 +11683, OA11683 +11684, OA11684 +11685, OA11685 +11686, OA11686 +11687, OA11687 +11688, OA11688 +11689, OA11689 +11690, OA11690 +11691, OA11691 +11692, OA11692 +11693, OA11693 +11694, OA11694 +11695, OA11695 +11696, OA11696 +11697, OA11697 +11698, OA11698 +11699, OA11699 +11700, OA11700 +11701, OA11701 +11702, OA11702 +11703, OA11703 +11704, OA11704 +11705, OA11705 +11706, OA11706 +11707, OA11707 +11708, OA11708 +11709, OA11709 +11710, OA11710 +11711, OA11711 +11712, OA11712 +11713, OA11713 +11714, OA11714 +11715, OA11715 +11716, OA11716 +11717, OA11717 +11718, OA11718 +11719, OA11719 +11720, OA11720 +11721, OA11721 +11722, OA11722 +11723, OA11723 +11724, OA11724 +11725, OA11725 +11726, OA11726 +11727, OA11727 +11728, OA11728 +11729, OA11729 +11730, OA11730 +11731, OA11731 +11732, OA11732 +11733, OA11733 +11734, OA11734 +11735, OA11735 +11736, OA11736 +11737, OA11737 +11738, OA11738 +11739, OA11739 +11740, OA11740 +11741, OA11741 +11742, OA11742 +11743, OA11743 +11744, OA11744 +11745, OA11745 +11746, OA11746 +11747, OA11747 +11748, OA11748 +11749, OA11749 +11750, OA11750 +11751, OA11751 +11752, OA11752 +11753, OA11753 +11754, OA11754 +11755, OA11755 +11756, OA11756 +11757, OA11757 +11758, OA11758 +11759, OA11759 +11760, OA11760 +11761, OA11761 +11762, OA11762 +11763, OA11763 +11764, OA11764 +11765, OA11765 +11766, OA11766 +11767, OA11767 +11768, OA11768 +11769, OA11769 +11770, OA11770 +11771, OA11771 +11772, OA11772 +11773, OA11773 +11774, OA11774 +11775, OA11775 +11776, OA11776 +11777, OA11777 +11778, OA11778 +11779, OA11779 +11780, OA11780 +11781, OA11781 +11782, OA11782 +11783, OA11783 +11784, OA11784 +11785, OA11785 +11786, OA11786 +11787, OA11787 +11788, OA11788 +11789, OA11789 +11790, OA11790 +11791, OA11791 +11792, OA11792 +11793, OA11793 +11794, OA11794 +11795, OA11795 +11796, OA11796 +11797, OA11797 +11798, OA11798 +11799, OA11799 +11800, OA11800 +11801, OA11801 +11802, OA11802 +11803, OA11803 +11804, OA11804 +11805, OA11805 +11806, OA11806 +11807, OA11807 +11808, OA11808 +11809, OA11809 +11810, OA11810 +11811, OA11811 +11812, OA11812 +11813, OA11813 +11814, OA11814 +11815, OA11815 +11816, OA11816 +11817, OA11817 +11818, OA11818 +11819, OA11819 +11820, OA11820 +11821, OA11821 +11822, OA11822 +11823, OA11823 +11824, OA11824 +11825, OA11825 +11826, OA11826 +11827, OA11827 +11828, OA11828 +11829, OA11829 +11830, OA11830 +11831, OA11831 +11832, OA11832 +11833, OA11833 +11834, OA11834 +11835, OA11835 +11836, OA11836 +11837, OA11837 +11838, OA11838 +11839, OA11839 +11840, OA11840 +11841, OA11841 +11842, OA11842 +11843, OA11843 +11844, OA11844 +11845, OA11845 +11846, OA11846 +11847, OA11847 +11848, OA11848 +11849, OA11849 +11850, OA11850 +11851, OA11851 +11852, OA11852 +11853, OA11853 +11854, OA11854 +11855, OA11855 +11856, OA11856 +11857, OA11857 +11858, OA11858 +11859, OA11859 +11860, OA11860 +11861, OA11861 +11862, OA11862 +11863, OA11863 +11864, OA11864 +11865, OA11865 +11866, OA11866 +11867, OA11867 +11868, OA11868 +11869, OA11869 +11870, OA11870 +11871, OA11871 +11872, OA11872 +11873, OA11873 +11874, OA11874 +11875, OA11875 +11876, OA11876 +11877, OA11877 +11878, OA11878 +11879, OA11879 +11880, OA11880 +11881, OA11881 +11882, OA11882 +11883, OA11883 +11884, OA11884 +11885, OA11885 +11886, OA11886 +11887, OA11887 +11888, OA11888 +11889, OA11889 +11890, OA11890 +11891, OA11891 +11892, OA11892 +11893, OA11893 +11894, OA11894 +11895, OA11895 +11896, OA11896 +11897, OA11897 +11898, OA11898 +11899, OA11899 +11900, OA11900 +11901, OA11901 +11902, OA11902 +11903, OA11903 +11904, OA11904 +11905, OA11905 +11906, OA11906 +11907, OA11907 +11908, OA11908 +11909, OA11909 +11910, OA11910 +11911, OA11911 +11912, OA11912 +11913, OA11913 +11914, OA11914 +11915, OA11915 +11916, OA11916 +11917, OA11917 +11918, OA11918 +11919, OA11919 +11920, OA11920 +11921, OA11921 +11922, OA11922 +11923, OA11923 +11924, OA11924 +11925, OA11925 +11926, OA11926 +11927, OA11927 +11928, OA11928 +11929, OA11929 +11930, OA11930 +11931, OA11931 +11932, OA11932 +11933, OA11933 +11934, OA11934 +11935, OA11935 +11936, OA11936 +11937, OA11937 +11938, OA11938 +11939, OA11939 +11940, OA11940 +11941, OA11941 +11942, OA11942 +11943, OA11943 +11944, OA11944 +11945, OA11945 +11946, OA11946 +11947, OA11947 +11948, OA11948 +11949, OA11949 +11950, OA11950 +11951, OA11951 +11952, OA11952 +11953, OA11953 +11954, OA11954 +11955, OA11955 +11956, OA11956 +11957, OA11957 +11958, OA11958 +11959, OA11959 +11960, OA11960 +11961, OA11961 +11962, OA11962 +11963, OA11963 +11964, OA11964 +11965, OA11965 +11966, OA11966 +11967, OA11967 +11968, OA11968 +11969, OA11969 +11970, OA11970 +11971, OA11971 +11972, OA11972 +11973, OA11973 +11974, OA11974 +11975, OA11975 +11976, OA11976 +11977, OA11977 +11978, OA11978 +11979, OA11979 +11980, OA11980 +11981, OA11981 +11982, OA11982 +11983, OA11983 +11984, OA11984 +11985, OA11985 +11986, OA11986 +11987, OA11987 +11988, OA11988 +11989, OA11989 +11990, OA11990 +11991, OA11991 +11992, OA11992 +11993, OA11993 +11994, OA11994 +11995, OA11995 +11996, OA11996 +11997, OA11997 +11998, OA11998 +11999, OA11999 +12000, OA12000 +12001, OA12001 +12002, OA12002 +12003, OA12003 +12004, OA12004 +12005, OA12005 +12006, OA12006 +12007, OA12007 +12008, OA12008 +12009, OA12009 +12010, OA12010 +12011, OA12011 +12012, OA12012 +12013, OA12013 +12014, OA12014 +12015, OA12015 +12016, OA12016 +12017, OA12017 +12018, OA12018 +12019, OA12019 +12020, OA12020 +12021, OA12021 +12022, OA12022 +12023, OA12023 +12024, OA12024 +12025, OA12025 +12026, OA12026 +12027, OA12027 +12028, OA12028 +12029, OA12029 +12030, OA12030 +12031, OA12031 +12032, OA12032 +12033, OA12033 +12034, OA12034 +12035, OA12035 +12036, OA12036 +12037, OA12037 +12038, OA12038 +12039, OA12039 +12040, OA12040 +12041, OA12041 +12042, OA12042 +12043, OA12043 +12044, OA12044 +12045, OA12045 +12046, OA12046 +12047, OA12047 +12048, OA12048 +12049, OA12049 +12050, OA12050 +12051, OA12051 +12052, OA12052 +12053, OA12053 +12054, OA12054 +12055, OA12055 +12056, OA12056 +12057, OA12057 +12058, OA12058 +12059, OA12059 +12060, OA12060 +12061, OA12061 +12062, OA12062 +12063, OA12063 +12064, OA12064 +12065, OA12065 +12066, OA12066 +12067, OA12067 +12068, OA12068 +12069, OA12069 +12070, OA12070 +12071, OA12071 +12072, OA12072 +12073, OA12073 +12074, OA12074 +12075, OA12075 +12076, OA12076 +12077, OA12077 +12078, OA12078 +12079, OA12079 +12080, OA12080 +12081, OA12081 +12082, OA12082 +12083, OA12083 +12084, OA12084 +12085, OA12085 +12086, OA12086 +12087, OA12087 +12088, OA12088 +12089, OA12089 +12090, OA12090 +12091, OA12091 +12092, OA12092 +12093, OA12093 +12094, OA12094 +12095, OA12095 +12096, OA12096 +12097, OA12097 +12098, OA12098 +12099, OA12099 +12100, OA12100 +12101, OA12101 +12102, OA12102 +12103, OA12103 +12104, OA12104 +12105, OA12105 +12106, OA12106 +12107, OA12107 +12108, OA12108 +12109, OA12109 +12110, OA12110 +12111, OA12111 +12112, OA12112 +12113, OA12113 +12114, OA12114 +12115, OA12115 +12116, OA12116 +12117, OA12117 +12118, OA12118 +12119, OA12119 +12120, OA12120 +12121, OA12121 +12122, OA12122 +12123, OA12123 +12124, OA12124 +12125, OA12125 +12126, OA12126 +12127, OA12127 +12128, OA12128 +12129, OA12129 +12130, OA12130 +12131, OA12131 +12132, OA12132 +12133, OA12133 +12134, OA12134 +12135, OA12135 +12136, OA12136 +12137, OA12137 +12138, OA12138 +12139, OA12139 +12140, OA12140 +12141, OA12141 +12142, OA12142 +12143, OA12143 +12144, OA12144 +12145, OA12145 +12146, OA12146 +12147, OA12147 +12148, OA12148 +12149, OA12149 +12150, OA12150 +12151, OA12151 +12152, OA12152 +12153, OA12153 +12154, OA12154 +12155, OA12155 +12156, OA12156 +12157, OA12157 +12158, OA12158 +12159, OA12159 +12160, OA12160 +12161, OA12161 +12162, OA12162 +12163, OA12163 +12164, OA12164 +12165, OA12165 +12166, OA12166 +12167, OA12167 +12168, OA12168 +12169, OA12169 +12170, OA12170 +12171, OA12171 +12172, OA12172 +12173, OA12173 +12174, OA12174 +12175, OA12175 +12176, OA12176 +12177, OA12177 +12178, OA12178 +12179, OA12179 +12180, OA12180 +12181, OA12181 +12182, OA12182 +12183, OA12183 +12184, OA12184 +12185, OA12185 +12186, OA12186 +12187, OA12187 +12188, OA12188 +12189, OA12189 +12190, OA12190 +12191, OA12191 +12192, OA12192 +12193, OA12193 +12194, OA12194 +12195, OA12195 +12196, OA12196 +12197, OA12197 +12198, OA12198 +12199, OA12199 +12200, OA12200 +12201, OA12201 +12202, OA12202 +12203, OA12203 +12204, OA12204 +12205, OA12205 +12206, OA12206 +12207, OA12207 +12208, OA12208 +12209, OA12209 +12210, OA12210 +12211, OA12211 +12212, OA12212 +12213, OA12213 +12214, OA12214 +12215, OA12215 +12216, OA12216 +12217, OA12217 +12218, OA12218 +12219, OA12219 +12220, OA12220 +12221, OA12221 +12222, OA12222 +12223, OA12223 +12224, OA12224 +12225, OA12225 +12226, OA12226 +12227, OA12227 +12228, OA12228 +12229, OA12229 +12230, OA12230 +12231, OA12231 +12232, OA12232 +12233, OA12233 +12234, OA12234 +12235, OA12235 +12236, OA12236 +12237, OA12237 +12238, OA12238 +12239, OA12239 +12240, OA12240 +12241, OA12241 +12242, OA12242 +12243, OA12243 +12244, OA12244 +12245, OA12245 +12246, OA12246 +12247, OA12247 +12248, OA12248 +12249, OA12249 +12250, OA12250 +12251, OA12251 +12252, OA12252 +12253, OA12253 +12254, OA12254 +12255, OA12255 +12256, OA12256 +12257, OA12257 +12258, OA12258 +12259, OA12259 +12260, OA12260 +12261, OA12261 +12262, OA12262 +12263, OA12263 +12264, OA12264 +12265, OA12265 +12266, OA12266 +12267, OA12267 +12268, OA12268 +12269, OA12269 +12270, OA12270 +12271, OA12271 +12272, OA12272 +12273, OA12273 +12274, OA12274 +12275, OA12275 +12276, OA12276 +12277, OA12277 +12278, OA12278 +12279, OA12279 +12280, OA12280 +12281, OA12281 +12282, OA12282 +12283, OA12283 +12284, OA12284 +12285, OA12285 +12286, OA12286 +12287, OA12287 +12288, OA12288 +12289, OA12289 +12290, OA12290 +12291, OA12291 +12292, OA12292 +12293, OA12293 +12294, OA12294 +12295, OA12295 +12296, OA12296 +12297, OA12297 +12298, OA12298 +12299, OA12299 +12300, OA12300 +12301, OA12301 +12302, OA12302 +12303, OA12303 +12304, OA12304 +12305, OA12305 +12306, OA12306 +12307, OA12307 +12308, OA12308 +12309, OA12309 +12310, OA12310 +12311, OA12311 +12312, OA12312 +12313, OA12313 +12314, OA12314 +12315, OA12315 +12316, OA12316 +12317, OA12317 +12318, OA12318 +12319, OA12319 +12320, OA12320 +12321, OA12321 +12322, OA12322 +12323, OA12323 +12324, OA12324 +12325, OA12325 +12326, OA12326 +12327, OA12327 +12328, OA12328 +12329, OA12329 +12330, OA12330 +12331, OA12331 +12332, OA12332 +12333, OA12333 +12334, OA12334 +12335, OA12335 +12336, OA12336 +12337, OA12337 +12338, OA12338 +12339, OA12339 +12340, OA12340 +12341, OA12341 +12342, OA12342 +12343, OA12343 +12344, OA12344 +12345, OA12345 +12346, OA12346 +12347, OA12347 +12348, OA12348 +12349, OA12349 +12350, OA12350 +12351, OA12351 +12352, OA12352 +12353, OA12353 +12354, OA12354 +12355, OA12355 +12356, OA12356 +12357, OA12357 +12358, OA12358 +12359, OA12359 +12360, OA12360 +12361, OA12361 +12362, OA12362 +12363, OA12363 +12364, OA12364 +12365, OA12365 +12366, OA12366 +12367, OA12367 +12368, OA12368 +12369, OA12369 +12370, OA12370 +12371, OA12371 +12372, OA12372 +12373, OA12373 +12374, OA12374 +12375, OA12375 +12376, OA12376 +12377, OA12377 +12378, OA12378 +12379, OA12379 +12380, OA12380 +12381, OA12381 +12382, OA12382 +12383, OA12383 +12384, OA12384 +12385, OA12385 +12386, OA12386 +12387, OA12387 +12388, OA12388 +12389, OA12389 +12390, OA12390 +12391, OA12391 +12392, OA12392 +12393, OA12393 +12394, OA12394 +12395, OA12395 +12396, OA12396 +12397, OA12397 +12398, OA12398 +12399, OA12399 +12400, OA12400 +12401, OA12401 +12402, OA12402 +12403, OA12403 +12404, OA12404 +12405, OA12405 +12406, OA12406 +12407, OA12407 +12408, OA12408 +12409, OA12409 +12410, OA12410 +12411, OA12411 +12412, OA12412 +12413, OA12413 +12414, OA12414 +12415, OA12415 +12416, OA12416 +12417, OA12417 +12418, OA12418 +12419, OA12419 +12420, OA12420 +12421, OA12421 +12422, OA12422 +12423, OA12423 +12424, OA12424 +12425, OA12425 +12426, OA12426 +12427, OA12427 +12428, OA12428 +12429, OA12429 +12430, OA12430 +12431, OA12431 +12432, OA12432 +12433, OA12433 +12434, OA12434 +12435, OA12435 +12436, OA12436 +12437, OA12437 +12438, OA12438 +12439, OA12439 +12440, OA12440 +12441, OA12441 +12442, OA12442 +12443, OA12443 +12444, OA12444 +12445, OA12445 +12446, OA12446 +12447, OA12447 +12448, OA12448 +12449, OA12449 +12450, OA12450 +12451, OA12451 +12452, OA12452 +12453, OA12453 +12454, OA12454 +12455, OA12455 +12456, OA12456 +12457, OA12457 +12458, OA12458 +12459, OA12459 +12460, OA12460 +12461, OA12461 +12462, OA12462 +12463, OA12463 +12464, OA12464 +12465, OA12465 +12466, OA12466 +12467, OA12467 +12468, OA12468 +12469, OA12469 +12470, OA12470 +12471, OA12471 +12472, OA12472 +12473, OA12473 +12474, OA12474 +12475, OA12475 +12476, OA12476 +12477, OA12477 +12478, OA12478 +12479, OA12479 +12480, OA12480 +12481, OA12481 +12482, OA12482 +12483, OA12483 +12484, OA12484 +12485, OA12485 +12486, OA12486 +12487, OA12487 +12488, OA12488 +12489, OA12489 +12490, OA12490 +12491, OA12491 +12492, OA12492 +12493, OA12493 +12494, OA12494 +12495, OA12495 +12496, OA12496 +12497, OA12497 +12498, OA12498 +12499, OA12499 +12500, OA12500 +12501, OA12501 +12502, OA12502 +12503, OA12503 +12504, OA12504 +12505, OA12505 +12506, OA12506 +12507, OA12507 +12508, OA12508 +12509, OA12509 +12510, OA12510 +12511, OA12511 +12512, OA12512 +12513, OA12513 +12514, OA12514 +12515, OA12515 +12516, OA12516 +12517, OA12517 +12518, OA12518 +12519, OA12519 +12520, OA12520 +12521, OA12521 +12522, OA12522 +12523, OA12523 +12524, OA12524 +12525, OA12525 +12526, OA12526 +12527, OA12527 +12528, OA12528 +12529, OA12529 +12530, OA12530 +12531, OA12531 +12532, OA12532 +12533, OA12533 +12534, OA12534 +12535, OA12535 +12536, OA12536 +12537, OA12537 +12538, OA12538 +12539, OA12539 +12540, OA12540 +12541, OA12541 +12542, OA12542 +12543, OA12543 +12544, OA12544 +12545, OA12545 +12546, OA12546 +12547, OA12547 +12548, OA12548 +12549, OA12549 +12550, OA12550 +12551, OA12551 +12552, OA12552 +12553, OA12553 +12554, OA12554 +12555, OA12555 +12556, OA12556 +12557, OA12557 +12558, OA12558 +12559, OA12559 +12560, OA12560 +12561, OA12561 +12562, OA12562 +12563, OA12563 +12564, OA12564 +12565, OA12565 +12566, OA12566 +12567, OA12567 +12568, OA12568 +12569, OA12569 +12570, OA12570 +12571, OA12571 +12572, OA12572 +12573, OA12573 +12574, OA12574 +12575, OA12575 +12576, OA12576 +12577, OA12577 +12578, OA12578 +12579, OA12579 +12580, OA12580 +12581, OA12581 +12582, OA12582 +12583, OA12583 +12584, OA12584 +12585, OA12585 +12586, OA12586 +12587, OA12587 +12588, OA12588 +12589, OA12589 +12590, OA12590 +12591, OA12591 +12592, OA12592 +12593, OA12593 +12594, OA12594 +12595, OA12595 +12596, OA12596 +12597, OA12597 +12598, OA12598 +12599, OA12599 +12600, OA12600 +12601, OA12601 +12602, OA12602 +12603, OA12603 +12604, OA12604 +12605, OA12605 +12606, OA12606 +12607, OA12607 +12608, OA12608 +12609, OA12609 +12610, OA12610 +12611, OA12611 +12612, OA12612 +12613, OA12613 +12614, OA12614 +12615, OA12615 +12616, OA12616 +12617, OA12617 +12618, OA12618 +12619, OA12619 +12620, OA12620 +12621, OA12621 +12622, OA12622 +12623, OA12623 +12624, OA12624 +12625, OA12625 +12626, OA12626 +12627, OA12627 +12628, OA12628 +12629, OA12629 +12630, OA12630 +12631, OA12631 +12632, OA12632 +12633, OA12633 +12634, OA12634 +12635, OA12635 +12636, OA12636 +12637, OA12637 +12638, OA12638 +12639, OA12639 +12640, OA12640 +12641, OA12641 +12642, OA12642 +12643, OA12643 +12644, OA12644 +12645, OA12645 +12646, OA12646 +12647, OA12647 +12648, OA12648 +12649, OA12649 +12650, OA12650 +12651, OA12651 +12652, OA12652 +12653, OA12653 +12654, OA12654 +12655, OA12655 +12656, OA12656 +12657, OA12657 +12658, OA12658 +12659, OA12659 +12660, OA12660 +12661, OA12661 +12662, OA12662 +12663, OA12663 +12664, OA12664 +12665, OA12665 +12666, OA12666 +12667, OA12667 +12668, OA12668 +12669, OA12669 +12670, OA12670 +12671, OA12671 +12672, OA12672 +12673, OA12673 +12674, OA12674 +12675, OA12675 +12676, OA12676 +12677, OA12677 +12678, OA12678 +12679, OA12679 +12680, OA12680 +12681, OA12681 +12682, OA12682 +12683, OA12683 +12684, OA12684 +12685, OA12685 +12686, OA12686 +12687, OA12687 +12688, OA12688 +12689, OA12689 +12690, OA12690 +12691, OA12691 +12692, OA12692 +12693, OA12693 +12694, OA12694 +12695, OA12695 +12696, OA12696 +12697, OA12697 +12698, OA12698 +12699, OA12699 +12700, OA12700 +12701, OA12701 +12702, OA12702 +12703, OA12703 +12704, OA12704 +12705, OA12705 +12706, OA12706 +12707, OA12707 +12708, OA12708 +12709, OA12709 +12710, OA12710 +12711, OA12711 +12712, OA12712 +12713, OA12713 +12714, OA12714 +12715, OA12715 +12716, OA12716 +12717, OA12717 +12718, OA12718 +12719, OA12719 +12720, OA12720 +12721, OA12721 +12722, OA12722 +12723, OA12723 +12724, OA12724 +12725, OA12725 +12726, OA12726 +12727, OA12727 +12728, OA12728 +12729, OA12729 +12730, OA12730 +12731, OA12731 +12732, OA12732 +12733, OA12733 +12734, OA12734 +12735, OA12735 +12736, OA12736 +12737, OA12737 +12738, OA12738 +12739, OA12739 +12740, OA12740 +12741, OA12741 +12742, OA12742 +12743, OA12743 +12744, OA12744 +12745, OA12745 +12746, OA12746 +12747, OA12747 +12748, OA12748 +12749, OA12749 +12750, OA12750 +12751, OA12751 +12752, OA12752 +12753, OA12753 +12754, OA12754 +12755, OA12755 +12756, OA12756 +12757, OA12757 +12758, OA12758 +12759, OA12759 +12760, OA12760 +12761, OA12761 +12762, OA12762 +12763, OA12763 +12764, OA12764 +12765, OA12765 +12766, OA12766 +12767, OA12767 +12768, OA12768 +12769, OA12769 +12770, OA12770 +12771, OA12771 +12772, OA12772 +12773, OA12773 +12774, OA12774 +12775, OA12775 +12776, OA12776 +12777, OA12777 +12778, OA12778 +12779, OA12779 +12780, OA12780 +12781, OA12781 +12782, OA12782 +12783, OA12783 +12784, OA12784 +12785, OA12785 +12786, OA12786 +12787, OA12787 +12788, OA12788 +12789, OA12789 +12790, OA12790 +12791, OA12791 +12792, OA12792 +12793, OA12793 +12794, OA12794 +12795, OA12795 +12796, OA12796 +12797, OA12797 +12798, OA12798 +12799, OA12799 +12800, OA12800 +12801, OA12801 +12802, OA12802 +12803, OA12803 +12804, OA12804 +12805, OA12805 +12806, OA12806 +12807, OA12807 +12808, OA12808 +12809, OA12809 +12810, OA12810 +12811, OA12811 +12812, OA12812 +12813, OA12813 +12814, OA12814 +12815, OA12815 +12816, OA12816 +12817, OA12817 +12818, OA12818 +12819, OA12819 +12820, OA12820 +12821, OA12821 +12822, OA12822 +12823, OA12823 +12824, OA12824 +12825, OA12825 +12826, OA12826 +12827, OA12827 +12828, OA12828 +12829, OA12829 +12830, OA12830 +12831, OA12831 +12832, OA12832 +12833, OA12833 +12834, OA12834 +12835, OA12835 +12836, OA12836 +12837, OA12837 +12838, OA12838 +12839, OA12839 +12840, OA12840 +12841, OA12841 +12842, OA12842 +12843, OA12843 +12844, OA12844 +12845, OA12845 +12846, OA12846 +12847, OA12847 +12848, OA12848 +12849, OA12849 +12850, OA12850 +12851, OA12851 +12852, OA12852 +12853, OA12853 +12854, OA12854 +12855, OA12855 +12856, OA12856 +12857, OA12857 +12858, OA12858 +12859, OA12859 +12860, OA12860 +12861, OA12861 +12862, OA12862 +12863, OA12863 +12864, OA12864 +12865, OA12865 +12866, OA12866 +12867, OA12867 +12868, OA12868 +12869, OA12869 +12870, OA12870 +12871, OA12871 +12872, OA12872 +12873, OA12873 +12874, OA12874 +12875, OA12875 +12876, OA12876 +12877, OA12877 +12878, OA12878 +12879, OA12879 +12880, OA12880 +12881, OA12881 +12882, OA12882 +12883, OA12883 +12884, OA12884 +12885, OA12885 +12886, OA12886 +12887, OA12887 +12888, OA12888 +12889, OA12889 +12890, OA12890 +12891, OA12891 +12892, OA12892 +12893, OA12893 +12894, OA12894 +12895, OA12895 +12896, OA12896 +12897, OA12897 +12898, OA12898 +12899, OA12899 +12900, OA12900 +12901, OA12901 +12902, OA12902 +12903, OA12903 +12904, OA12904 +12905, OA12905 +12906, OA12906 +12907, OA12907 +12908, OA12908 +12909, OA12909 +12910, OA12910 +12911, OA12911 +12912, OA12912 +12913, OA12913 +12914, OA12914 +12915, OA12915 +12916, OA12916 +12917, OA12917 +12918, OA12918 +12919, OA12919 +12920, OA12920 +12921, OA12921 +12922, OA12922 +12923, OA12923 +12924, OA12924 +12925, OA12925 +12926, OA12926 +12927, OA12927 +12928, OA12928 +12929, OA12929 +12930, OA12930 +12931, OA12931 +12932, OA12932 +12933, OA12933 +12934, OA12934 +12935, OA12935 +12936, OA12936 +12937, OA12937 +12938, OA12938 +12939, OA12939 +12940, OA12940 +12941, OA12941 +12942, OA12942 +12943, OA12943 +12944, OA12944 +12945, OA12945 +12946, OA12946 +12947, OA12947 +12948, OA12948 +12949, OA12949 +12950, OA12950 +12951, OA12951 +12952, OA12952 +12953, OA12953 +12954, OA12954 +12955, OA12955 +12956, OA12956 +12957, OA12957 +12958, OA12958 +12959, OA12959 +12960, OA12960 +12961, OA12961 +12962, OA12962 +12963, OA12963 +12964, OA12964 +12965, OA12965 +12966, OA12966 +12967, OA12967 +12968, OA12968 +12969, OA12969 +12970, OA12970 +12971, OA12971 +12972, OA12972 +12973, OA12973 +12974, OA12974 +12975, OA12975 +12976, OA12976 +12977, OA12977 +12978, OA12978 +12979, OA12979 +12980, OA12980 +12981, OA12981 +12982, OA12982 +12983, OA12983 +12984, OA12984 +12985, OA12985 +12986, OA12986 +12987, OA12987 +12988, OA12988 +12989, OA12989 +12990, OA12990 +12991, OA12991 +12992, OA12992 +12993, OA12993 +12994, OA12994 +12995, OA12995 +12996, OA12996 +12997, OA12997 +12998, OA12998 +12999, OA12999 +13000, OA13000 +13001, OA13001 +13002, OA13002 +13003, OA13003 +13004, OA13004 +13005, OA13005 +13006, OA13006 +13007, OA13007 +13008, OA13008 +13009, OA13009 +13010, OA13010 +13011, OA13011 +13012, OA13012 +13013, OA13013 +13014, OA13014 +13015, OA13015 +13016, OA13016 +13017, OA13017 +13018, OA13018 +13019, OA13019 +13020, OA13020 +13021, OA13021 +13022, OA13022 +13023, OA13023 +13024, OA13024 +13025, OA13025 +13026, OA13026 +13027, OA13027 +13028, OA13028 +13029, OA13029 +13030, OA13030 +13031, OA13031 +13032, OA13032 +13033, OA13033 +13034, OA13034 +13035, OA13035 +13036, OA13036 +13037, OA13037 +13038, OA13038 +13039, OA13039 +13040, OA13040 +13041, OA13041 +13042, OA13042 +13043, OA13043 +13044, OA13044 +13045, OA13045 +13046, OA13046 +13047, OA13047 +13048, OA13048 +13049, OA13049 +13050, OA13050 +13051, OA13051 +13052, OA13052 +13053, OA13053 +13054, OA13054 +13055, OA13055 +13056, OA13056 +13057, OA13057 +13058, OA13058 +13059, OA13059 +13060, OA13060 +13061, OA13061 +13062, OA13062 +13063, OA13063 +13064, OA13064 +13065, OA13065 +13066, OA13066 +13067, OA13067 +13068, OA13068 +13069, OA13069 +13070, OA13070 +13071, OA13071 +13072, OA13072 +13073, OA13073 +13074, OA13074 +13075, OA13075 +13076, OA13076 +13077, OA13077 +13078, OA13078 +13079, OA13079 +13080, OA13080 +13081, OA13081 +13082, OA13082 +13083, OA13083 +13084, OA13084 +13085, OA13085 +13086, OA13086 +13087, OA13087 +13088, OA13088 +13089, OA13089 +13090, OA13090 +13091, OA13091 +13092, OA13092 +13093, OA13093 +13094, OA13094 +13095, OA13095 +13096, OA13096 +13097, OA13097 +13098, OA13098 +13099, OA13099 +13100, OA13100 +13101, OA13101 +13102, OA13102 +13103, OA13103 +13104, OA13104 +13105, OA13105 +13106, OA13106 +13107, OA13107 +13108, OA13108 +13109, OA13109 +13110, OA13110 +13111, OA13111 +13112, OA13112 +13113, OA13113 +13114, OA13114 +13115, OA13115 +13116, OA13116 +13117, OA13117 +13118, OA13118 +13119, OA13119 +13120, OA13120 +13121, OA13121 +13122, OA13122 +13123, OA13123 +13124, OA13124 +13125, OA13125 +13126, OA13126 +13127, OA13127 +13128, OA13128 +13129, OA13129 +13130, OA13130 +13131, OA13131 +13132, OA13132 +13133, OA13133 +13134, OA13134 +13135, OA13135 +13136, OA13136 +13137, OA13137 +13138, OA13138 +13139, OA13139 +13140, OA13140 +13141, OA13141 +13142, OA13142 +13143, OA13143 +13144, OA13144 +13145, OA13145 +13146, OA13146 +13147, OA13147 +13148, OA13148 +13149, OA13149 +13150, OA13150 +13151, OA13151 +13152, OA13152 +13153, OA13153 +13154, OA13154 +13155, OA13155 +13156, OA13156 +13157, OA13157 +13158, OA13158 +13159, OA13159 +13160, OA13160 +13161, OA13161 +13162, OA13162 +13163, OA13163 +13164, OA13164 +13165, OA13165 +13166, OA13166 +13167, OA13167 +13168, OA13168 +13169, OA13169 +13170, OA13170 +13171, OA13171 +13172, OA13172 +13173, OA13173 +13174, OA13174 +13175, OA13175 +13176, OA13176 +13177, OA13177 +13178, OA13178 +13179, OA13179 +13180, OA13180 +13181, OA13181 +13182, OA13182 +13183, OA13183 +13184, OA13184 +13185, OA13185 +13186, OA13186 +13187, OA13187 +13188, OA13188 +13189, OA13189 +13190, OA13190 +13191, OA13191 +13192, OA13192 +13193, OA13193 +13194, OA13194 +13195, OA13195 +13196, OA13196 +13197, OA13197 +13198, OA13198 +13199, OA13199 +13200, OA13200 +13201, OA13201 +13202, OA13202 +13203, OA13203 +13204, OA13204 +13205, OA13205 +13206, OA13206 +13207, OA13207 +13208, OA13208 +13209, OA13209 +13210, OA13210 +13211, OA13211 +13212, OA13212 +13213, OA13213 +13214, OA13214 +13215, OA13215 +13216, OA13216 +13217, OA13217 +13218, OA13218 +13219, OA13219 +13220, OA13220 +13221, OA13221 +13222, OA13222 +13223, OA13223 +13224, OA13224 +13225, OA13225 +13226, OA13226 +13227, OA13227 +13228, OA13228 +13229, OA13229 +13230, OA13230 +13231, OA13231 +13232, OA13232 +13233, OA13233 +13234, OA13234 +13235, OA13235 +13236, OA13236 +13237, OA13237 +13238, OA13238 +13239, OA13239 +13240, OA13240 +13241, OA13241 +13242, OA13242 +13243, OA13243 +13244, OA13244 +13245, OA13245 +13246, OA13246 +13247, OA13247 +13248, OA13248 +13249, OA13249 +13250, OA13250 +13251, OA13251 +13252, OA13252 +13253, OA13253 +13254, OA13254 +13255, OA13255 +13256, OA13256 +13257, OA13257 +13258, OA13258 +13259, OA13259 +13260, OA13260 +13261, OA13261 +13262, OA13262 +13263, OA13263 +13264, OA13264 +13265, OA13265 +13266, OA13266 +13267, OA13267 +13268, OA13268 +13269, OA13269 +13270, OA13270 +13271, OA13271 +13272, OA13272 +13273, OA13273 +13274, OA13274 +13275, OA13275 +13276, OA13276 +13277, OA13277 +13278, OA13278 +13279, OA13279 +13280, OA13280 +13281, OA13281 +13282, OA13282 +13283, OA13283 +13284, OA13284 +13285, OA13285 +13286, OA13286 +13287, OA13287 +13288, OA13288 +13289, OA13289 +13290, OA13290 +13291, OA13291 +13292, OA13292 +13293, OA13293 +13294, OA13294 +13295, OA13295 +13296, OA13296 +13297, OA13297 +13298, OA13298 +13299, OA13299 +13300, OA13300 +13301, OA13301 +13302, OA13302 +13303, OA13303 +13304, OA13304 +13305, OA13305 +13306, OA13306 +13307, OA13307 +13308, OA13308 +13309, OA13309 +13310, OA13310 +13311, OA13311 +13312, OA13312 +13313, OA13313 +13314, OA13314 +13315, OA13315 +13316, OA13316 +13317, OA13317 +13318, OA13318 +13319, OA13319 +13320, OA13320 +13321, OA13321 +13322, OA13322 +13323, OA13323 +13324, OA13324 +13325, OA13325 +13326, OA13326 +13327, OA13327 +13328, OA13328 +13329, OA13329 +13330, OA13330 +13331, OA13331 +13332, OA13332 +13333, OA13333 +13334, OA13334 +13335, OA13335 +13336, OA13336 +13337, OA13337 +13338, OA13338 +13339, OA13339 +13340, OA13340 +13341, OA13341 +13342, OA13342 +13343, OA13343 +13344, OA13344 +13345, OA13345 +13346, OA13346 +13347, OA13347 +13348, OA13348 +13349, OA13349 +13350, OA13350 +13351, OA13351 +13352, OA13352 +13353, OA13353 +13354, OA13354 +13355, OA13355 +13356, OA13356 +13357, OA13357 +13358, OA13358 +13359, OA13359 +13360, OA13360 +13361, OA13361 +13362, OA13362 +13363, OA13363 +13364, OA13364 +13365, OA13365 +13366, OA13366 +13367, OA13367 +13368, OA13368 +13369, OA13369 +13370, OA13370 +13371, OA13371 +13372, OA13372 +13373, OA13373 +13374, OA13374 +13375, OA13375 +13376, OA13376 +13377, OA13377 +13378, OA13378 +13379, OA13379 +13380, OA13380 +13381, OA13381 +13382, OA13382 +13383, OA13383 +13384, OA13384 +13385, OA13385 +13386, OA13386 +13387, OA13387 +13388, OA13388 +13389, OA13389 +13390, OA13390 +13391, OA13391 +13392, OA13392 +13393, OA13393 +13394, OA13394 +13395, OA13395 +13396, OA13396 +13397, OA13397 +13398, OA13398 +13399, OA13399 +13400, OA13400 +13401, OA13401 +13402, OA13402 +13403, OA13403 +13404, OA13404 +13405, OA13405 +13406, OA13406 +13407, OA13407 +13408, OA13408 +13409, OA13409 +13410, OA13410 +13411, OA13411 +13412, OA13412 +13413, OA13413 +13414, OA13414 +13415, OA13415 +13416, OA13416 +13417, OA13417 +13418, OA13418 +13419, OA13419 +13420, OA13420 +13421, OA13421 +13422, OA13422 +13423, OA13423 +13424, OA13424 +13425, OA13425 +13426, OA13426 +13427, OA13427 +13428, OA13428 +13429, OA13429 +13430, OA13430 +13431, OA13431 +13432, OA13432 +13433, OA13433 +13434, OA13434 +13435, OA13435 +13436, OA13436 +13437, OA13437 +13438, OA13438 +13439, OA13439 +13440, OA13440 +13441, OA13441 +13442, OA13442 +13443, OA13443 +13444, OA13444 +13445, OA13445 +13446, OA13446 +13447, OA13447 +13448, OA13448 +13449, OA13449 +13450, OA13450 +13451, OA13451 +13452, OA13452 +13453, OA13453 +13454, OA13454 +13455, OA13455 +13456, OA13456 +13457, OA13457 +13458, OA13458 +13459, OA13459 +13460, OA13460 +13461, OA13461 +13462, OA13462 +13463, OA13463 +13464, OA13464 +13465, OA13465 +13466, OA13466 +13467, OA13467 +13468, OA13468 +13469, OA13469 +13470, OA13470 +13471, OA13471 +13472, OA13472 +13473, OA13473 +13474, OA13474 +13475, OA13475 +13476, OA13476 +13477, OA13477 +13478, OA13478 +13479, OA13479 +13480, OA13480 +13481, OA13481 +13482, OA13482 +13483, OA13483 +13484, OA13484 +13485, OA13485 +13486, OA13486 +13487, OA13487 +13488, OA13488 +13489, OA13489 +13490, OA13490 +13491, OA13491 +13492, OA13492 +13493, OA13493 +13494, OA13494 +13495, OA13495 +13496, OA13496 +13497, OA13497 +13498, OA13498 +13499, OA13499 +13500, OA13500 +13501, OA13501 +13502, OA13502 +13503, OA13503 +13504, OA13504 +13505, OA13505 +13506, OA13506 +13507, OA13507 +13508, OA13508 +13509, OA13509 +13510, OA13510 +13511, OA13511 +13512, OA13512 +13513, OA13513 +13514, OA13514 +13515, OA13515 +13516, OA13516 +13517, OA13517 +13518, OA13518 +13519, OA13519 +13520, OA13520 +13521, OA13521 +13522, OA13522 +13523, OA13523 +13524, OA13524 +13525, OA13525 +13526, OA13526 +13527, OA13527 +13528, OA13528 +13529, OA13529 +13530, OA13530 +13531, OA13531 +13532, OA13532 +13533, OA13533 +13534, OA13534 +13535, OA13535 +13536, OA13536 +13537, OA13537 +13538, OA13538 +13539, OA13539 +13540, OA13540 +13541, OA13541 +13542, OA13542 +13543, OA13543 +13544, OA13544 +13545, OA13545 +13546, OA13546 +13547, OA13547 +13548, OA13548 +13549, OA13549 +13550, OA13550 +13551, OA13551 +13552, OA13552 +13553, OA13553 +13554, OA13554 +13555, OA13555 +13556, OA13556 +13557, OA13557 +13558, OA13558 +13559, OA13559 +13560, OA13560 +13561, OA13561 +13562, OA13562 +13563, OA13563 +13564, OA13564 +13565, OA13565 +13566, OA13566 +13567, OA13567 +13568, OA13568 +13569, OA13569 +13570, OA13570 +13571, OA13571 +13572, OA13572 +13573, OA13573 +13574, OA13574 +13575, OA13575 +13576, OA13576 +13577, OA13577 +13578, OA13578 +13579, OA13579 +13580, OA13580 +13581, OA13581 +13582, OA13582 +13583, OA13583 +13584, OA13584 +13585, OA13585 +13586, OA13586 +13587, OA13587 +13588, OA13588 +13589, OA13589 +13590, OA13590 +13591, OA13591 +13592, OA13592 +13593, OA13593 +13594, OA13594 +13595, OA13595 +13596, OA13596 +13597, OA13597 +13598, OA13598 +13599, OA13599 +13600, OA13600 +13601, OA13601 +13602, OA13602 +13603, OA13603 +13604, OA13604 +13605, OA13605 +13606, OA13606 +13607, OA13607 +13608, OA13608 +13609, OA13609 +13610, OA13610 +13611, OA13611 +13612, OA13612 +13613, OA13613 +13614, OA13614 +13615, OA13615 +13616, OA13616 +13617, OA13617 +13618, OA13618 +13619, OA13619 +13620, OA13620 +13621, OA13621 +13622, OA13622 +13623, OA13623 +13624, OA13624 +13625, OA13625 +13626, OA13626 +13627, OA13627 +13628, OA13628 +13629, OA13629 +13630, OA13630 +13631, OA13631 +13632, OA13632 +13633, OA13633 +13634, OA13634 +13635, OA13635 +13636, OA13636 +13637, OA13637 +13638, OA13638 +13639, OA13639 +13640, OA13640 +13641, OA13641 +13642, OA13642 +13643, OA13643 +13644, OA13644 +13645, OA13645 +13646, OA13646 +13647, OA13647 +13648, OA13648 +13649, OA13649 +13650, OA13650 +13651, OA13651 +13652, OA13652 +13653, OA13653 +13654, OA13654 +13655, OA13655 +13656, OA13656 +13657, OA13657 +13658, OA13658 +13659, OA13659 +13660, OA13660 +13661, OA13661 +13662, OA13662 +13663, OA13663 +13664, OA13664 +13665, OA13665 +13666, OA13666 +13667, OA13667 +13668, OA13668 +13669, OA13669 +13670, OA13670 +13671, OA13671 +13672, OA13672 +13673, OA13673 +13674, OA13674 +13675, OA13675 +13676, OA13676 +13677, OA13677 +13678, OA13678 +13679, OA13679 +13680, OA13680 +13681, OA13681 +13682, OA13682 +13683, OA13683 +13684, OA13684 +13685, OA13685 +13686, OA13686 +13687, OA13687 +13688, OA13688 +13689, OA13689 +13690, OA13690 +13691, OA13691 +13692, OA13692 +13693, OA13693 +13694, OA13694 +13695, OA13695 +13696, OA13696 +13697, OA13697 +13698, OA13698 +13699, OA13699 +13700, OA13700 +13701, OA13701 +13702, OA13702 +13703, OA13703 +13704, OA13704 +13705, OA13705 +13706, OA13706 +13707, OA13707 +13708, OA13708 +13709, OA13709 +13710, OA13710 +13711, OA13711 +13712, OA13712 +13713, OA13713 +13714, OA13714 +13715, OA13715 +13716, OA13716 +13717, OA13717 +13718, OA13718 +13719, OA13719 +13720, OA13720 +13721, OA13721 +13722, OA13722 +13723, OA13723 +13724, OA13724 +13725, OA13725 +13726, OA13726 +13727, OA13727 +13728, OA13728 +13729, OA13729 +13730, OA13730 +13731, OA13731 +13732, OA13732 +13733, OA13733 +13734, OA13734 +13735, OA13735 +13736, OA13736 +13737, OA13737 +13738, OA13738 +13739, OA13739 +13740, OA13740 +13741, OA13741 +13742, OA13742 +13743, OA13743 +13744, OA13744 +13745, OA13745 +13746, OA13746 +13747, OA13747 +13748, OA13748 +13749, OA13749 +13750, OA13750 +13751, OA13751 +13752, OA13752 +13753, OA13753 +13754, OA13754 +13755, OA13755 +13756, OA13756 +13757, OA13757 +13758, OA13758 +13759, OA13759 +13760, OA13760 +13761, OA13761 +13762, OA13762 +13763, OA13763 +13764, OA13764 +13765, OA13765 +13766, OA13766 +13767, OA13767 +13768, OA13768 +13769, OA13769 +13770, OA13770 +13771, OA13771 +13772, OA13772 +13773, OA13773 +13774, OA13774 +13775, OA13775 +13776, OA13776 +13777, OA13777 +13778, OA13778 +13779, OA13779 +13780, OA13780 +13781, OA13781 +13782, OA13782 +13783, OA13783 +13784, OA13784 +13785, OA13785 +13786, OA13786 +13787, OA13787 +13788, OA13788 +13789, OA13789 +13790, OA13790 +13791, OA13791 +13792, OA13792 +13793, OA13793 +13794, OA13794 +13795, OA13795 +13796, OA13796 +13797, OA13797 +13798, OA13798 +13799, OA13799 +13800, OA13800 +13801, OA13801 +13802, OA13802 +13803, OA13803 +13804, OA13804 +13805, OA13805 +13806, OA13806 +13807, OA13807 +13808, OA13808 +13809, OA13809 +13810, OA13810 +13811, OA13811 +13812, OA13812 +13813, OA13813 +13814, OA13814 +13815, OA13815 +13816, OA13816 +13817, OA13817 +13818, OA13818 +13819, OA13819 +13820, OA13820 +13821, OA13821 +13822, OA13822 +13823, OA13823 +13824, OA13824 +13825, OA13825 +13826, OA13826 +13827, OA13827 +13828, OA13828 +13829, OA13829 +13830, OA13830 +13831, OA13831 +13832, OA13832 +13833, OA13833 +13834, OA13834 +13835, OA13835 +13836, OA13836 +13837, OA13837 +13838, OA13838 +13839, OA13839 +13840, OA13840 +13841, OA13841 +13842, OA13842 +13843, OA13843 +13844, OA13844 +13845, OA13845 +13846, OA13846 +13847, OA13847 +13848, OA13848 +13849, OA13849 +13850, OA13850 +13851, OA13851 +13852, OA13852 +13853, OA13853 +13854, OA13854 +13855, OA13855 +13856, OA13856 +13857, OA13857 +13858, OA13858 +13859, OA13859 +13860, OA13860 +13861, OA13861 +13862, OA13862 +13863, OA13863 +13864, OA13864 +13865, OA13865 +13866, OA13866 +13867, OA13867 +13868, OA13868 +13869, OA13869 +13870, OA13870 +13871, OA13871 +13872, OA13872 +13873, OA13873 +13874, OA13874 +13875, OA13875 +13876, OA13876 +13877, OA13877 +13878, OA13878 +13879, OA13879 +13880, OA13880 +13881, OA13881 +13882, OA13882 +13883, OA13883 +13884, OA13884 +13885, OA13885 +13886, OA13886 +13887, OA13887 +13888, OA13888 +13889, OA13889 +13890, OA13890 +13891, OA13891 +13892, OA13892 +13893, OA13893 +13894, OA13894 +13895, OA13895 +13896, OA13896 +13897, OA13897 +13898, OA13898 +13899, OA13899 +13900, OA13900 +13901, OA13901 +13902, OA13902 +13903, OA13903 +13904, OA13904 +13905, OA13905 +13906, OA13906 +13907, OA13907 +13908, OA13908 +13909, OA13909 +13910, OA13910 +13911, OA13911 +13912, OA13912 +13913, OA13913 +13914, OA13914 +13915, OA13915 +13916, OA13916 +13917, OA13917 +13918, OA13918 +13919, OA13919 +13920, OA13920 +13921, OA13921 +13922, OA13922 +13923, OA13923 +13924, OA13924 +13925, OA13925 +13926, OA13926 +13927, OA13927 +13928, OA13928 +13929, OA13929 +13930, OA13930 +13931, OA13931 +13932, OA13932 +13933, OA13933 +13934, OA13934 +13935, OA13935 +13936, OA13936 +13937, OA13937 +13938, OA13938 +13939, OA13939 +13940, OA13940 +13941, OA13941 +13942, OA13942 +13943, OA13943 +13944, OA13944 +13945, OA13945 +13946, OA13946 +13947, OA13947 +13948, OA13948 +13949, OA13949 +13950, OA13950 +13951, OA13951 +13952, OA13952 +13953, OA13953 +13954, OA13954 +13955, OA13955 +13956, OA13956 +13957, OA13957 +13958, OA13958 +13959, OA13959 +13960, OA13960 +13961, OA13961 +13962, OA13962 +13963, OA13963 +13964, OA13964 +13965, OA13965 +13966, OA13966 +13967, OA13967 +13968, OA13968 +13969, OA13969 +13970, OA13970 +13971, OA13971 +13972, OA13972 +13973, OA13973 +13974, OA13974 +13975, OA13975 +13976, OA13976 +13977, OA13977 +13978, OA13978 +13979, OA13979 +13980, OA13980 +13981, OA13981 +13982, OA13982 +13983, OA13983 +13984, OA13984 +13985, OA13985 +13986, OA13986 +13987, OA13987 +13988, OA13988 +13989, OA13989 +13990, OA13990 +13991, OA13991 +13992, OA13992 +13993, OA13993 +13994, OA13994 +13995, OA13995 +13996, OA13996 +13997, OA13997 +13998, OA13998 +13999, OA13999 +14000, OA14000 +14001, OA14001 +14002, OA14002 +14003, OA14003 +14004, OA14004 +14005, OA14005 +14006, OA14006 +14007, OA14007 +14008, OA14008 +14009, OA14009 +14010, OA14010 +14011, OA14011 +14012, OA14012 +14013, OA14013 +14014, OA14014 +14015, OA14015 +14016, OA14016 +14017, OA14017 +14018, OA14018 +14019, OA14019 +14020, OA14020 +14021, OA14021 +14022, OA14022 +14023, OA14023 +14024, OA14024 +14025, OA14025 +14026, OA14026 +14027, OA14027 +14028, OA14028 +14029, OA14029 +14030, OA14030 +14031, OA14031 +14032, OA14032 +14033, OA14033 +14034, OA14034 +14035, OA14035 +14036, OA14036 +14037, OA14037 +14038, OA14038 +14039, OA14039 +14040, OA14040 +14041, OA14041 +14042, OA14042 +14043, OA14043 +14044, OA14044 +14045, OA14045 +14046, OA14046 +14047, OA14047 +14048, OA14048 +14049, OA14049 +14050, OA14050 +14051, OA14051 +14052, OA14052 +14053, OA14053 +14054, OA14054 +14055, OA14055 +14056, OA14056 +14057, OA14057 +14058, OA14058 +14059, OA14059 +14060, OA14060 +14061, OA14061 +14062, OA14062 +14063, OA14063 +14064, OA14064 +14065, OA14065 +14066, OA14066 +14067, OA14067 +14068, OA14068 +14069, OA14069 +14070, OA14070 +14071, OA14071 +14072, OA14072 +14073, OA14073 +14074, OA14074 +14075, OA14075 +14076, OA14076 +14077, OA14077 +14078, OA14078 +14079, OA14079 +14080, OA14080 +14081, OA14081 +14082, OA14082 +14083, OA14083 +14084, OA14084 +14085, OA14085 +14086, OA14086 +14087, OA14087 +14088, OA14088 +14089, OA14089 +14090, OA14090 +14091, OA14091 +14092, OA14092 +14093, OA14093 +14094, OA14094 +14095, OA14095 +14096, OA14096 +14097, OA14097 +14098, OA14098 +14099, OA14099 +14100, OA14100 +14101, OA14101 +14102, OA14102 +14103, OA14103 +14104, OA14104 +14105, OA14105 +14106, OA14106 +14107, OA14107 +14108, OA14108 +14109, OA14109 +14110, OA14110 +14111, OA14111 +14112, OA14112 +14113, OA14113 +14114, OA14114 +14115, OA14115 +14116, OA14116 +14117, OA14117 +14118, OA14118 +14119, OA14119 +14120, OA14120 +14121, OA14121 +14122, OA14122 +14123, OA14123 +14124, OA14124 +14125, OA14125 +14126, OA14126 +14127, OA14127 +14128, OA14128 +14129, OA14129 +14130, OA14130 +14131, OA14131 +14132, OA14132 +14133, OA14133 +14134, OA14134 +14135, OA14135 +14136, OA14136 +14137, OA14137 +14138, OA14138 +14139, OA14139 +14140, OA14140 +14141, OA14141 +14142, OA14142 +14143, OA14143 +14144, OA14144 +14145, OA14145 +14146, OA14146 +14147, OA14147 +14148, OA14148 +14149, OA14149 +14150, OA14150 +14151, OA14151 +14152, OA14152 +14153, OA14153 +14154, OA14154 +14155, OA14155 +14156, OA14156 +14157, OA14157 +14158, OA14158 +14159, OA14159 +14160, OA14160 +14161, OA14161 +14162, OA14162 +14163, OA14163 +14164, OA14164 +14165, OA14165 +14166, OA14166 +14167, OA14167 +14168, OA14168 +14169, OA14169 +14170, OA14170 +14171, OA14171 +14172, OA14172 +14173, OA14173 +14174, OA14174 +14175, OA14175 +14176, OA14176 +14177, OA14177 +14178, OA14178 +14179, OA14179 +14180, OA14180 +14181, OA14181 +14182, OA14182 +14183, OA14183 +14184, OA14184 +14185, OA14185 +14186, OA14186 +14187, OA14187 +14188, OA14188 +14189, OA14189 +14190, OA14190 +14191, OA14191 +14192, OA14192 +14193, OA14193 +14194, OA14194 +14195, OA14195 +14196, OA14196 +14197, OA14197 +14198, OA14198 +14199, OA14199 +14200, OA14200 +14201, OA14201 +14202, OA14202 +14203, OA14203 +14204, OA14204 +14205, OA14205 +14206, OA14206 +14207, OA14207 +14208, OA14208 +14209, OA14209 +14210, OA14210 +14211, OA14211 +14212, OA14212 +14213, OA14213 +14214, OA14214 +14215, OA14215 +14216, OA14216 +14217, OA14217 +14218, OA14218 +14219, OA14219 +14220, OA14220 +14221, OA14221 +14222, OA14222 +14223, OA14223 +14224, OA14224 +14225, OA14225 +14226, OA14226 +14227, OA14227 +14228, OA14228 +14229, OA14229 +14230, OA14230 +14231, OA14231 +14232, OA14232 +14233, OA14233 +14234, OA14234 +14235, OA14235 +14236, OA14236 +14237, OA14237 +14238, OA14238 +14239, OA14239 +14240, OA14240 +14241, OA14241 +14242, OA14242 +14243, OA14243 +14244, OA14244 +14245, OA14245 +14246, OA14246 +14247, OA14247 +14248, OA14248 +14249, OA14249 +14250, OA14250 +14251, OA14251 +14252, OA14252 +14253, OA14253 +14254, OA14254 +14255, OA14255 +14256, OA14256 +14257, OA14257 +14258, OA14258 +14259, OA14259 +14260, OA14260 +14261, OA14261 +14262, OA14262 +14263, OA14263 +14264, OA14264 +14265, OA14265 +14266, OA14266 +14267, OA14267 +14268, OA14268 +14269, OA14269 +14270, OA14270 +14271, OA14271 +14272, OA14272 +14273, OA14273 +14274, OA14274 +14275, OA14275 +14276, OA14276 +14277, OA14277 +14278, OA14278 +14279, OA14279 +14280, OA14280 +14281, OA14281 +14282, OA14282 +14283, OA14283 +14284, OA14284 +14285, OA14285 +14286, OA14286 +14287, OA14287 +14288, OA14288 +14289, OA14289 +14290, OA14290 +14291, OA14291 +14292, OA14292 +14293, OA14293 +14294, OA14294 +14295, OA14295 +14296, OA14296 +14297, OA14297 +14298, OA14298 +14299, OA14299 +14300, OA14300 +14301, OA14301 +14302, OA14302 +14303, OA14303 +14304, OA14304 +14305, OA14305 +14306, OA14306 +14307, OA14307 +14308, OA14308 +14309, OA14309 +14310, OA14310 +14311, OA14311 +14312, OA14312 +14313, OA14313 +14314, OA14314 +14315, OA14315 +14316, OA14316 +14317, OA14317 +14318, OA14318 +14319, OA14319 +14320, OA14320 +14321, OA14321 +14322, OA14322 +14323, OA14323 +14324, OA14324 +14325, OA14325 +14326, OA14326 +14327, OA14327 +14328, OA14328 +14329, OA14329 +14330, OA14330 +14331, OA14331 +14332, OA14332 +14333, OA14333 +14334, OA14334 +14335, OA14335 +14336, OA14336 +14337, OA14337 +14338, OA14338 +14339, OA14339 +14340, OA14340 +14341, OA14341 +14342, OA14342 +14343, OA14343 +14344, OA14344 +14345, OA14345 +14346, OA14346 +14347, OA14347 +14348, OA14348 +14349, OA14349 +14350, OA14350 +14351, OA14351 +14352, OA14352 +14353, OA14353 +14354, OA14354 +14355, OA14355 +14356, OA14356 +14357, OA14357 +14358, OA14358 +14359, OA14359 +14360, OA14360 +14361, OA14361 +14362, OA14362 +14363, OA14363 +14364, OA14364 +14365, OA14365 +14366, OA14366 +14367, OA14367 +14368, OA14368 +14369, OA14369 +14370, OA14370 +14371, OA14371 +14372, OA14372 +14373, OA14373 +14374, OA14374 +14375, OA14375 +14376, OA14376 +14377, OA14377 +14378, OA14378 +14379, OA14379 +14380, OA14380 +14381, OA14381 +14382, OA14382 +14383, OA14383 +14384, OA14384 +14385, OA14385 +14386, OA14386 +14387, OA14387 +14388, OA14388 +14389, OA14389 +14390, OA14390 +14391, OA14391 +14392, OA14392 +14393, OA14393 +14394, OA14394 +14395, OA14395 +14396, OA14396 +14397, OA14397 +14398, OA14398 +14399, OA14399 +14400, OA14400 +14401, OA14401 +14402, OA14402 +14403, OA14403 +14404, OA14404 +14405, OA14405 +14406, OA14406 +14407, OA14407 +14408, OA14408 +14409, OA14409 +14410, OA14410 +14411, OA14411 +14412, OA14412 +14413, OA14413 +14414, OA14414 +14415, OA14415 +14416, OA14416 +14417, OA14417 +14418, OA14418 +14419, OA14419 +14420, OA14420 +14421, OA14421 +14422, OA14422 +14423, OA14423 +14424, OA14424 +14425, OA14425 +14426, OA14426 +14427, OA14427 +14428, OA14428 +14429, OA14429 +14430, OA14430 +14431, OA14431 +14432, OA14432 +14433, OA14433 +14434, OA14434 +14435, OA14435 +14436, OA14436 +14437, OA14437 +14438, OA14438 +14439, OA14439 +14440, OA14440 +14441, OA14441 +14442, OA14442 +14443, OA14443 +14444, OA14444 +14445, OA14445 +14446, OA14446 +14447, OA14447 +14448, OA14448 +14449, OA14449 +14450, OA14450 +14451, OA14451 +14452, OA14452 +14453, OA14453 +14454, OA14454 +14455, OA14455 +14456, OA14456 +14457, OA14457 +14458, OA14458 +14459, OA14459 +14460, OA14460 +14461, OA14461 +14462, OA14462 +14463, OA14463 +14464, OA14464 +14465, OA14465 +14466, OA14466 +14467, OA14467 +14468, OA14468 +14469, OA14469 +14470, OA14470 +14471, OA14471 +14472, OA14472 +14473, OA14473 +14474, OA14474 +14475, OA14475 +14476, OA14476 +14477, OA14477 +14478, OA14478 +14479, OA14479 +14480, OA14480 +14481, OA14481 +14482, OA14482 +14483, OA14483 +14484, OA14484 +14485, OA14485 +14486, OA14486 +14487, OA14487 +14488, OA14488 +14489, OA14489 +14490, OA14490 +14491, OA14491 +14492, OA14492 +14493, OA14493 +14494, OA14494 +14495, OA14495 +14496, OA14496 +14497, OA14497 +14498, OA14498 +14499, OA14499 +14500, OA14500 +14501, OA14501 +14502, OA14502 +14503, OA14503 +14504, OA14504 +14505, OA14505 +14506, OA14506 +14507, OA14507 +14508, OA14508 +14509, OA14509 +14510, OA14510 +14511, OA14511 +14512, OA14512 +14513, OA14513 +14514, OA14514 +14515, OA14515 +14516, OA14516 +14517, OA14517 +14518, OA14518 +14519, OA14519 +14520, OA14520 +14521, OA14521 +14522, OA14522 +14523, OA14523 +14524, OA14524 +14525, OA14525 +14526, OA14526 +14527, OA14527 +14528, OA14528 +14529, OA14529 +14530, OA14530 +14531, OA14531 +14532, OA14532 +14533, OA14533 +14534, OA14534 +14535, OA14535 +14536, OA14536 +14537, OA14537 +14538, OA14538 +14539, OA14539 +14540, OA14540 +14541, OA14541 +14542, OA14542 +14543, OA14543 +14544, OA14544 +14545, OA14545 +14546, OA14546 +14547, OA14547 +14548, OA14548 +14549, OA14549 +14550, OA14550 +14551, OA14551 +14552, OA14552 +14553, OA14553 +14554, OA14554 +14555, OA14555 +14556, OA14556 +14557, OA14557 +14558, OA14558 +14559, OA14559 +14560, OA14560 +14561, OA14561 +14562, OA14562 +14563, OA14563 +14564, OA14564 +14565, OA14565 +14566, OA14566 +14567, OA14567 +14568, OA14568 +14569, OA14569 +14570, OA14570 +14571, OA14571 +14572, OA14572 +14573, OA14573 +14574, OA14574 +14575, OA14575 +14576, OA14576 +14577, OA14577 +14578, OA14578 +14579, OA14579 +14580, OA14580 +14581, OA14581 +14582, OA14582 +14583, OA14583 +14584, OA14584 +14585, OA14585 +14586, OA14586 +14587, OA14587 +14588, OA14588 +14589, OA14589 +14590, OA14590 +14591, OA14591 +14592, OA14592 +14593, OA14593 +14594, OA14594 +14595, OA14595 +14596, OA14596 +14597, OA14597 +14598, OA14598 +14599, OA14599 +14600, OA14600 +14601, OA14601 +14602, OA14602 +14603, OA14603 +14604, OA14604 +14605, OA14605 +14606, OA14606 +14607, OA14607 +14608, OA14608 +14609, OA14609 +14610, OA14610 +14611, OA14611 +14612, OA14612 +14613, OA14613 +14614, OA14614 +14615, OA14615 +14616, OA14616 +14617, OA14617 +14618, OA14618 +14619, OA14619 +14620, OA14620 +14621, OA14621 +14622, OA14622 +14623, OA14623 +14624, OA14624 +14625, OA14625 +14626, OA14626 +14627, OA14627 +14628, OA14628 +14629, OA14629 +14630, OA14630 +14631, OA14631 +14632, OA14632 +14633, OA14633 +14634, OA14634 +14635, OA14635 +14636, OA14636 +14637, OA14637 +14638, OA14638 +14639, OA14639 +14640, OA14640 +14641, OA14641 +14642, OA14642 +14643, OA14643 +14644, OA14644 +14645, OA14645 +14646, OA14646 +14647, OA14647 +14648, OA14648 +14649, OA14649 +14650, OA14650 +14651, OA14651 +14652, OA14652 +14653, OA14653 +14654, OA14654 +14655, OA14655 +14656, OA14656 +14657, OA14657 +14658, OA14658 +14659, OA14659 +14660, OA14660 +14661, OA14661 +14662, OA14662 +14663, OA14663 +14664, OA14664 +14665, OA14665 +14666, OA14666 +14667, OA14667 +14668, OA14668 +14669, OA14669 +14670, OA14670 +14671, OA14671 +14672, OA14672 +14673, OA14673 +14674, OA14674 +14675, OA14675 +14676, OA14676 +14677, OA14677 +14678, OA14678 +14679, OA14679 +14680, OA14680 +14681, OA14681 +14682, OA14682 +14683, OA14683 +14684, OA14684 +14685, OA14685 +14686, OA14686 +14687, OA14687 +14688, OA14688 +14689, OA14689 +14690, OA14690 +14691, OA14691 +14692, OA14692 +14693, OA14693 +14694, OA14694 +14695, OA14695 +14696, OA14696 +14697, OA14697 +14698, OA14698 +14699, OA14699 +14700, OA14700 +14701, OA14701 +14702, OA14702 +14703, OA14703 +14704, OA14704 +14705, OA14705 +14706, OA14706 +14707, OA14707 +14708, OA14708 +14709, OA14709 +14710, OA14710 +14711, OA14711 +14712, OA14712 +14713, OA14713 +14714, OA14714 +14715, OA14715 +14716, OA14716 +14717, OA14717 +14718, OA14718 +14719, OA14719 +14720, OA14720 +14721, OA14721 +14722, OA14722 +14723, OA14723 +14724, OA14724 +14725, OA14725 +14726, OA14726 +14727, OA14727 +14728, OA14728 +14729, OA14729 +14730, OA14730 +14731, OA14731 +14732, OA14732 +14733, OA14733 +14734, OA14734 +14735, OA14735 +14736, OA14736 +14737, OA14737 +14738, OA14738 +14739, OA14739 +14740, OA14740 +14741, OA14741 +14742, OA14742 +14743, OA14743 +14744, OA14744 +14745, OA14745 +14746, OA14746 +14747, OA14747 +14748, OA14748 +14749, OA14749 +14750, OA14750 +14751, OA14751 +14752, OA14752 +14753, OA14753 +14754, OA14754 +14755, OA14755 +14756, OA14756 +14757, OA14757 +14758, OA14758 +14759, OA14759 +14760, OA14760 +14761, OA14761 +14762, OA14762 +14763, OA14763 +14764, OA14764 +14765, OA14765 +14766, OA14766 +14767, OA14767 +14768, OA14768 +14769, OA14769 +14770, OA14770 +14771, OA14771 +14772, OA14772 +14773, OA14773 +14774, OA14774 +14775, OA14775 +14776, OA14776 +14777, OA14777 +14778, OA14778 +14779, OA14779 +14780, OA14780 +14781, OA14781 +14782, OA14782 +14783, OA14783 +14784, OA14784 +14785, OA14785 +14786, OA14786 +14787, OA14787 +14788, OA14788 +14789, OA14789 +14790, OA14790 +14791, OA14791 +14792, OA14792 +14793, OA14793 +14794, OA14794 +14795, OA14795 +14796, OA14796 +14797, OA14797 +14798, OA14798 +14799, OA14799 +14800, OA14800 +14801, OA14801 +14802, OA14802 +14803, OA14803 +14804, OA14804 +14805, OA14805 +14806, OA14806 +14807, OA14807 +14808, OA14808 +14809, OA14809 +14810, OA14810 +14811, OA14811 +14812, OA14812 +14813, OA14813 +14814, OA14814 +14815, OA14815 +14816, OA14816 +14817, OA14817 +14818, OA14818 +14819, OA14819 +14820, OA14820 +14821, OA14821 +14822, OA14822 +14823, OA14823 +14824, OA14824 +14825, OA14825 +14826, OA14826 +14827, OA14827 +14828, OA14828 +14829, OA14829 +14830, OA14830 +14831, OA14831 +14832, OA14832 +14833, OA14833 +14834, OA14834 +14835, OA14835 +14836, OA14836 +14837, OA14837 +14838, OA14838 +14839, OA14839 +14840, OA14840 +14841, OA14841 +14842, OA14842 +14843, OA14843 +14844, OA14844 +14845, OA14845 +14846, OA14846 +14847, OA14847 +14848, OA14848 +14849, OA14849 +14850, OA14850 +14851, OA14851 +14852, OA14852 +14853, OA14853 +14854, OA14854 +14855, OA14855 +14856, OA14856 +14857, OA14857 +14858, OA14858 +14859, OA14859 +14860, OA14860 +14861, OA14861 +14862, OA14862 +14863, OA14863 +14864, OA14864 +14865, OA14865 +14866, OA14866 +14867, OA14867 +14868, OA14868 +14869, OA14869 +14870, OA14870 +14871, OA14871 +14872, OA14872 +14873, OA14873 +14874, OA14874 +14875, OA14875 +14876, OA14876 +14877, OA14877 +14878, OA14878 +14879, OA14879 +14880, OA14880 +14881, OA14881 +14882, OA14882 +14883, OA14883 +14884, OA14884 +14885, OA14885 +14886, OA14886 +14887, OA14887 +14888, OA14888 +14889, OA14889 +14890, OA14890 +14891, OA14891 +14892, OA14892 +14893, OA14893 +14894, OA14894 +14895, OA14895 +14896, OA14896 +14897, OA14897 +14898, OA14898 +14899, OA14899 +14900, OA14900 +14901, OA14901 +14902, OA14902 +14903, OA14903 +14904, OA14904 +14905, OA14905 +14906, OA14906 +14907, OA14907 +14908, OA14908 +14909, OA14909 +14910, OA14910 +14911, OA14911 +14912, OA14912 +14913, OA14913 +14914, OA14914 +14915, OA14915 +14916, OA14916 +14917, OA14917 +14918, OA14918 +14919, OA14919 +14920, OA14920 +14921, OA14921 +14922, OA14922 +14923, OA14923 +14924, OA14924 +14925, OA14925 +14926, OA14926 +14927, OA14927 +14928, OA14928 +14929, OA14929 +14930, OA14930 +14931, OA14931 +14932, OA14932 +14933, OA14933 +14934, OA14934 +14935, OA14935 +14936, OA14936 +14937, OA14937 +14938, OA14938 +14939, OA14939 +14940, OA14940 +14941, OA14941 +14942, OA14942 +14943, OA14943 +14944, OA14944 +14945, OA14945 +14946, OA14946 +14947, OA14947 +14948, OA14948 +14949, OA14949 +14950, OA14950 +14951, OA14951 +14952, OA14952 +14953, OA14953 +14954, OA14954 +14955, OA14955 +14956, OA14956 +14957, OA14957 +14958, OA14958 +14959, OA14959 +14960, OA14960 +14961, OA14961 +14962, OA14962 +14963, OA14963 +14964, OA14964 +14965, OA14965 +14966, OA14966 +14967, OA14967 +14968, OA14968 +14969, OA14969 +14970, OA14970 +14971, OA14971 +14972, OA14972 +14973, OA14973 +14974, OA14974 +14975, OA14975 +14976, OA14976 +14977, OA14977 +14978, OA14978 +14979, OA14979 +14980, OA14980 +14981, OA14981 +14982, OA14982 +14983, OA14983 +14984, OA14984 +14985, OA14985 +14986, OA14986 +14987, OA14987 +14988, OA14988 +14989, OA14989 +14990, OA14990 +14991, OA14991 +14992, OA14992 +14993, OA14993 +14994, OA14994 +14995, OA14995 +14996, OA14996 +14997, OA14997 +14998, OA14998 +14999, OA14999 +15000, OA15000 +15001, OA15001 +15002, OA15002 +15003, OA15003 +15004, OA15004 +15005, OA15005 +15006, OA15006 +15007, OA15007 +15008, OA15008 +15009, OA15009 +15010, OA15010 +15011, OA15011 +15012, OA15012 +15013, OA15013 +15014, OA15014 +15015, OA15015 +15016, OA15016 +15017, OA15017 +15018, OA15018 +15019, OA15019 +15020, OA15020 +15021, OA15021 +15022, OA15022 +15023, OA15023 +15024, OA15024 +15025, OA15025 +15026, OA15026 +15027, OA15027 +15028, OA15028 +15029, OA15029 +15030, OA15030 +15031, OA15031 +15032, OA15032 +15033, OA15033 +15034, OA15034 +15035, OA15035 +15036, OA15036 +15037, OA15037 +15038, OA15038 +15039, OA15039 +15040, OA15040 +15041, OA15041 +15042, OA15042 +15043, OA15043 +15044, OA15044 +15045, OA15045 +15046, OA15046 +15047, OA15047 +15048, OA15048 +15049, OA15049 +15050, OA15050 +15051, OA15051 +15052, OA15052 +15053, OA15053 +15054, OA15054 +15055, OA15055 +15056, OA15056 +15057, OA15057 +15058, OA15058 +15059, OA15059 +15060, OA15060 +15061, OA15061 +15062, OA15062 +15063, OA15063 +15064, OA15064 +15065, OA15065 +15066, OA15066 +15067, OA15067 +15068, OA15068 +15069, OA15069 +15070, OA15070 +15071, OA15071 +15072, OA15072 +15073, OA15073 +15074, OA15074 +15075, OA15075 +15076, OA15076 +15077, OA15077 +15078, OA15078 +15079, OA15079 +15080, OA15080 +15081, OA15081 +15082, OA15082 +15083, OA15083 +15084, OA15084 +15085, OA15085 +15086, OA15086 +15087, OA15087 +15088, OA15088 +15089, OA15089 +15090, OA15090 +15091, OA15091 +15092, OA15092 +15093, OA15093 +15094, OA15094 +15095, OA15095 +15096, OA15096 +15097, OA15097 +15098, OA15098 +15099, OA15099 +15100, OA15100 +15101, OA15101 +15102, OA15102 +15103, OA15103 +15104, OA15104 +15105, OA15105 +15106, OA15106 +15107, OA15107 +15108, OA15108 +15109, OA15109 +15110, OA15110 +15111, OA15111 +15112, OA15112 +15113, OA15113 +15114, OA15114 +15115, OA15115 +15116, OA15116 +15117, OA15117 +15118, OA15118 +15119, OA15119 +15120, OA15120 +15121, OA15121 +15122, OA15122 +15123, OA15123 +15124, OA15124 +15125, OA15125 +15126, OA15126 +15127, OA15127 +15128, OA15128 +15129, OA15129 +15130, OA15130 +15131, OA15131 +15132, OA15132 +15133, OA15133 +15134, OA15134 +15135, OA15135 +15136, OA15136 +15137, OA15137 +15138, OA15138 +15139, OA15139 +15140, OA15140 +15141, OA15141 +15142, OA15142 +15143, OA15143 +15144, OA15144 +15145, OA15145 +15146, OA15146 +15147, OA15147 +15148, OA15148 +15149, OA15149 +15150, OA15150 +15151, OA15151 +15152, OA15152 +15153, OA15153 +15154, OA15154 +15155, OA15155 +15156, OA15156 +15157, OA15157 +15158, OA15158 +15159, OA15159 +15160, OA15160 +15161, OA15161 +15162, OA15162 +15163, OA15163 +15164, OA15164 +15165, OA15165 +15166, OA15166 +15167, OA15167 +15168, OA15168 +15169, OA15169 +15170, OA15170 +15171, OA15171 +15172, OA15172 +15173, OA15173 +15174, OA15174 +15175, OA15175 +15176, OA15176 +15177, OA15177 +15178, OA15178 +15179, OA15179 +15180, OA15180 +15181, OA15181 +15182, OA15182 +15183, OA15183 +15184, OA15184 +15185, OA15185 +15186, OA15186 +15187, OA15187 +15188, OA15188 +15189, OA15189 +15190, OA15190 +15191, OA15191 +15192, OA15192 +15193, OA15193 +15194, OA15194 +15195, OA15195 +15196, OA15196 +15197, OA15197 +15198, OA15198 +15199, OA15199 +15200, OA15200 +15201, OA15201 +15202, OA15202 +15203, OA15203 +15204, OA15204 +15205, OA15205 +15206, OA15206 +15207, OA15207 +15208, OA15208 +15209, OA15209 +15210, OA15210 +15211, OA15211 +15212, OA15212 +15213, OA15213 +15214, OA15214 +15215, OA15215 +15216, OA15216 +15217, OA15217 +15218, OA15218 +15219, OA15219 +15220, OA15220 +15221, OA15221 +15222, OA15222 +15223, OA15223 +15224, OA15224 +15225, OA15225 +15226, OA15226 +15227, OA15227 +15228, OA15228 +15229, OA15229 +15230, OA15230 +15231, OA15231 +15232, OA15232 +15233, OA15233 +15234, OA15234 +15235, OA15235 +15236, OA15236 +15237, OA15237 +15238, OA15238 +15239, OA15239 +15240, OA15240 +15241, OA15241 +15242, OA15242 +15243, OA15243 +15244, OA15244 +15245, OA15245 +15246, OA15246 +15247, OA15247 +15248, OA15248 +15249, OA15249 +15250, OA15250 +15251, OA15251 +15252, OA15252 +15253, OA15253 +15254, OA15254 +15255, OA15255 +15256, OA15256 +15257, OA15257 +15258, OA15258 +15259, OA15259 +15260, OA15260 +15261, OA15261 +15262, OA15262 +15263, OA15263 +15264, OA15264 +15265, OA15265 +15266, OA15266 +15267, OA15267 +15268, OA15268 +15269, OA15269 +15270, OA15270 +15271, OA15271 +15272, OA15272 +15273, OA15273 +15274, OA15274 +15275, OA15275 +15276, OA15276 +15277, OA15277 +15278, OA15278 +15279, OA15279 +15280, OA15280 +15281, OA15281 +15282, OA15282 +15283, OA15283 +15284, OA15284 +15285, OA15285 +15286, OA15286 +15287, OA15287 +15288, OA15288 +15289, OA15289 +15290, OA15290 +15291, OA15291 +15292, OA15292 +15293, OA15293 +15294, OA15294 +15295, OA15295 +15296, OA15296 +15297, OA15297 +15298, OA15298 +15299, OA15299 +15300, OA15300 +15301, OA15301 +15302, OA15302 +15303, OA15303 +15304, OA15304 +15305, OA15305 +15306, OA15306 +15307, OA15307 +15308, OA15308 +15309, OA15309 +15310, OA15310 +15311, OA15311 +15312, OA15312 +15313, OA15313 +15314, OA15314 +15315, OA15315 +15316, OA15316 +15317, OA15317 +15318, OA15318 +15319, OA15319 +15320, OA15320 +15321, OA15321 +15322, OA15322 +15323, OA15323 +15324, OA15324 +15325, OA15325 +15326, OA15326 +15327, OA15327 +15328, OA15328 +15329, OA15329 +15330, OA15330 +15331, OA15331 +15332, OA15332 +15333, OA15333 +15334, OA15334 +15335, OA15335 +15336, OA15336 +15337, OA15337 +15338, OA15338 +15339, OA15339 +15340, OA15340 +15341, OA15341 +15342, OA15342 +15343, OA15343 +15344, OA15344 +15345, OA15345 +15346, OA15346 +15347, OA15347 +15348, OA15348 +15349, OA15349 +15350, OA15350 +15351, OA15351 +15352, OA15352 +15353, OA15353 +15354, OA15354 +15355, OA15355 +15356, OA15356 +15357, OA15357 +15358, OA15358 +15359, OA15359 +15360, OA15360 +15361, OA15361 +15362, OA15362 +15363, OA15363 +15364, OA15364 +15365, OA15365 +15366, OA15366 +15367, OA15367 +15368, OA15368 +15369, OA15369 +15370, OA15370 +15371, OA15371 +15372, OA15372 +15373, OA15373 +15374, OA15374 +15375, OA15375 +15376, OA15376 +15377, OA15377 +15378, OA15378 +15379, OA15379 +15380, OA15380 +15381, OA15381 +15382, OA15382 +15383, OA15383 +15384, OA15384 +15385, OA15385 +15386, OA15386 +15387, OA15387 +15388, OA15388 +15389, OA15389 +15390, OA15390 +15391, OA15391 +15392, OA15392 +15393, OA15393 +15394, OA15394 +15395, OA15395 +15396, OA15396 +15397, OA15397 +15398, OA15398 +15399, OA15399 +15400, OA15400 +15401, OA15401 +15402, OA15402 +15403, OA15403 +15404, OA15404 +15405, OA15405 +15406, OA15406 +15407, OA15407 +15408, OA15408 +15409, OA15409 +15410, OA15410 +15411, OA15411 +15412, OA15412 +15413, OA15413 +15414, OA15414 +15415, OA15415 +15416, OA15416 +15417, OA15417 +15418, OA15418 +15419, OA15419 +15420, OA15420 +15421, OA15421 +15422, OA15422 +15423, OA15423 +15424, OA15424 +15425, OA15425 +15426, OA15426 +15427, OA15427 +15428, OA15428 +15429, OA15429 +15430, OA15430 +15431, OA15431 +15432, OA15432 +15433, OA15433 +15434, OA15434 +15435, OA15435 +15436, OA15436 +15437, OA15437 +15438, OA15438 +15439, OA15439 +15440, OA15440 +15441, OA15441 +15442, OA15442 +15443, OA15443 +15444, OA15444 +15445, OA15445 +15446, OA15446 +15447, OA15447 +15448, OA15448 +15449, OA15449 +15450, OA15450 +15451, OA15451 +15452, OA15452 +15453, OA15453 +15454, OA15454 +15455, OA15455 +15456, OA15456 +15457, OA15457 +15458, OA15458 +15459, OA15459 +15460, OA15460 +15461, OA15461 +15462, OA15462 +15463, OA15463 +15464, OA15464 +15465, OA15465 +15466, OA15466 +15467, OA15467 +15468, OA15468 +15469, OA15469 +15470, OA15470 +15471, OA15471 +15472, OA15472 +15473, OA15473 +15474, OA15474 +15475, OA15475 +15476, OA15476 +15477, OA15477 +15478, OA15478 +15479, OA15479 +15480, OA15480 +15481, OA15481 +15482, OA15482 +15483, OA15483 +15484, OA15484 +15485, OA15485 +15486, OA15486 +15487, OA15487 +15488, OA15488 +15489, OA15489 +15490, OA15490 +15491, OA15491 +15492, OA15492 +15493, OA15493 +15494, OA15494 +15495, OA15495 +15496, OA15496 +15497, OA15497 +15498, OA15498 +15499, OA15499 +15500, OA15500 +15501, OA15501 +15502, OA15502 +15503, OA15503 +15504, OA15504 +15505, OA15505 +15506, OA15506 +15507, OA15507 +15508, OA15508 +15509, OA15509 +15510, OA15510 +15511, OA15511 +15512, OA15512 +15513, OA15513 +15514, OA15514 +15515, OA15515 +15516, OA15516 +15517, OA15517 +15518, OA15518 +15519, OA15519 +15520, OA15520 +15521, OA15521 +15522, OA15522 +15523, OA15523 +15524, OA15524 +15525, OA15525 +15526, OA15526 +15527, OA15527 +15528, OA15528 +15529, OA15529 +15530, OA15530 +15531, OA15531 +15532, OA15532 +15533, OA15533 +15534, OA15534 +15535, OA15535 +15536, OA15536 +15537, OA15537 +15538, OA15538 +15539, OA15539 +15540, OA15540 +15541, OA15541 +15542, OA15542 +15543, OA15543 +15544, OA15544 +15545, OA15545 +15546, OA15546 +15547, OA15547 +15548, OA15548 +15549, OA15549 +15550, OA15550 +15551, OA15551 +15552, OA15552 +15553, OA15553 +15554, OA15554 +15555, OA15555 +15556, OA15556 +15557, OA15557 +15558, OA15558 +15559, OA15559 +15560, OA15560 +15561, OA15561 +15562, OA15562 +15563, OA15563 +15564, OA15564 +15565, OA15565 +15566, OA15566 +15567, OA15567 +15568, OA15568 +15569, OA15569 +15570, OA15570 +15571, OA15571 +15572, OA15572 +15573, OA15573 +15574, OA15574 +15575, OA15575 +15576, OA15576 +15577, OA15577 +15578, OA15578 +15579, OA15579 +15580, OA15580 +15581, OA15581 +15582, OA15582 +15583, OA15583 +15584, OA15584 +15585, OA15585 +15586, OA15586 +15587, OA15587 +15588, OA15588 +15589, OA15589 +15590, OA15590 +15591, OA15591 +15592, OA15592 +15593, OA15593 +15594, OA15594 +15595, OA15595 +15596, OA15596 +15597, OA15597 +15598, OA15598 +15599, OA15599 +15600, OA15600 +15601, OA15601 +15602, OA15602 +15603, OA15603 +15604, OA15604 +15605, OA15605 +15606, OA15606 +15607, OA15607 +15608, OA15608 +15609, OA15609 +15610, OA15610 +15611, OA15611 +15612, OA15612 +15613, OA15613 +15614, OA15614 +15615, OA15615 +15616, OA15616 +15617, OA15617 +15618, OA15618 +15619, OA15619 +15620, OA15620 +15621, OA15621 +15622, OA15622 +15623, OA15623 +15624, OA15624 +15625, OA15625 +15626, OA15626 +15627, OA15627 +15628, OA15628 +15629, OA15629 +15630, OA15630 +15631, OA15631 +15632, OA15632 +15633, OA15633 +15634, OA15634 +15635, OA15635 +15636, OA15636 +15637, OA15637 +15638, OA15638 +15639, OA15639 +15640, OA15640 +15641, OA15641 +15642, OA15642 +15643, OA15643 +15644, OA15644 +15645, OA15645 +15646, OA15646 +15647, OA15647 +15648, OA15648 +15649, OA15649 +15650, OA15650 +15651, OA15651 +15652, OA15652 +15653, OA15653 +15654, OA15654 +15655, OA15655 +15656, OA15656 +15657, OA15657 +15658, OA15658 +15659, OA15659 +15660, OA15660 +15661, OA15661 +15662, OA15662 +15663, OA15663 +15664, OA15664 +15665, OA15665 +15666, OA15666 +15667, OA15667 +15668, OA15668 +15669, OA15669 +15670, OA15670 +15671, OA15671 +15672, OA15672 +15673, OA15673 +15674, OA15674 +15675, OA15675 +15676, OA15676 +15677, OA15677 +15678, OA15678 +15679, OA15679 +15680, OA15680 +15681, OA15681 +15682, OA15682 +15683, OA15683 +15684, OA15684 +15685, OA15685 +15686, OA15686 +15687, OA15687 +15688, OA15688 +15689, OA15689 +15690, OA15690 +15691, OA15691 +15692, OA15692 +15693, OA15693 +15694, OA15694 +15695, OA15695 +15696, OA15696 +15697, OA15697 +15698, OA15698 +15699, OA15699 +15700, OA15700 +15701, OA15701 +15702, OA15702 +15703, OA15703 +15704, OA15704 +15705, OA15705 +15706, OA15706 +15707, OA15707 +15708, OA15708 +15709, OA15709 +15710, OA15710 +15711, OA15711 +15712, OA15712 +15713, OA15713 +15714, OA15714 +15715, OA15715 +15716, OA15716 +15717, OA15717 +15718, OA15718 +15719, OA15719 +15720, OA15720 +15721, OA15721 +15722, OA15722 +15723, OA15723 +15724, OA15724 +15725, OA15725 +15726, OA15726 +15727, OA15727 +15728, OA15728 +15729, OA15729 +15730, OA15730 +15731, OA15731 +15732, OA15732 +15733, OA15733 +15734, OA15734 +15735, OA15735 +15736, OA15736 +15737, OA15737 +15738, OA15738 +15739, OA15739 +15740, OA15740 +15741, OA15741 +15742, OA15742 +15743, OA15743 +15744, OA15744 +15745, OA15745 +15746, OA15746 +15747, OA15747 +15748, OA15748 +15749, OA15749 +15750, OA15750 +15751, OA15751 +15752, OA15752 +15753, OA15753 +15754, OA15754 +15755, OA15755 +15756, OA15756 +15757, OA15757 +15758, OA15758 +15759, OA15759 +15760, OA15760 +15761, OA15761 +15762, OA15762 +15763, OA15763 +15764, OA15764 +15765, OA15765 +15766, OA15766 +15767, OA15767 +15768, OA15768 +15769, OA15769 +15770, OA15770 +15771, OA15771 +15772, OA15772 +15773, OA15773 +15774, OA15774 +15775, OA15775 +15776, OA15776 +15777, OA15777 +15778, OA15778 +15779, OA15779 +15780, OA15780 +15781, OA15781 +15782, OA15782 +15783, OA15783 +15784, OA15784 +15785, OA15785 +15786, OA15786 +15787, OA15787 +15788, OA15788 +15789, OA15789 +15790, OA15790 +15791, OA15791 +15792, OA15792 +15793, OA15793 +15794, OA15794 +15795, OA15795 +15796, OA15796 +15797, OA15797 +15798, OA15798 +15799, OA15799 +15800, OA15800 +15801, OA15801 +15802, OA15802 +15803, OA15803 +15804, OA15804 +15805, OA15805 +15806, OA15806 +15807, OA15807 +15808, OA15808 +15809, OA15809 +15810, OA15810 +15811, OA15811 +15812, OA15812 +15813, OA15813 +15814, OA15814 +15815, OA15815 +15816, OA15816 +15817, OA15817 +15818, OA15818 +15819, OA15819 +15820, OA15820 +15821, OA15821 +15822, OA15822 +15823, OA15823 +15824, OA15824 +15825, OA15825 +15826, OA15826 +15827, OA15827 +15828, OA15828 +15829, OA15829 +15830, OA15830 +15831, OA15831 +15832, OA15832 +15833, OA15833 +15834, OA15834 +15835, OA15835 +15836, OA15836 +15837, OA15837 +15838, OA15838 +15839, OA15839 +15840, OA15840 +15841, OA15841 +15842, OA15842 +15843, OA15843 +15844, OA15844 +15845, OA15845 +15846, OA15846 +15847, OA15847 +15848, OA15848 +15849, OA15849 +15850, OA15850 +15851, OA15851 +15852, OA15852 +15853, OA15853 +15854, OA15854 +15855, OA15855 +15856, OA15856 +15857, OA15857 +15858, OA15858 +15859, OA15859 +15860, OA15860 +15861, OA15861 +15862, OA15862 +15863, OA15863 +15864, OA15864 +15865, OA15865 +15866, OA15866 +15867, OA15867 +15868, OA15868 +15869, OA15869 +15870, OA15870 +15871, OA15871 +15872, OA15872 +15873, OA15873 +15874, OA15874 +15875, OA15875 +15876, OA15876 +15877, OA15877 +15878, OA15878 +15879, OA15879 +15880, OA15880 +15881, OA15881 +15882, OA15882 +15883, OA15883 +15884, OA15884 +15885, OA15885 +15886, OA15886 +15887, OA15887 +15888, OA15888 +15889, OA15889 +15890, OA15890 +15891, OA15891 +15892, OA15892 +15893, OA15893 +15894, OA15894 +15895, OA15895 +15896, OA15896 +15897, OA15897 +15898, OA15898 +15899, OA15899 +15900, OA15900 +15901, OA15901 +15902, OA15902 +15903, OA15903 +15904, OA15904 +15905, OA15905 +15906, OA15906 +15907, OA15907 +15908, OA15908 +15909, OA15909 +15910, OA15910 +15911, OA15911 +15912, OA15912 +15913, OA15913 +15914, OA15914 +15915, OA15915 +15916, OA15916 +15917, OA15917 +15918, OA15918 +15919, OA15919 +15920, OA15920 +15921, OA15921 +15922, OA15922 +15923, OA15923 +15924, OA15924 +15925, OA15925 +15926, OA15926 +15927, OA15927 +15928, OA15928 +15929, OA15929 +15930, OA15930 +15931, OA15931 +15932, OA15932 +15933, OA15933 +15934, OA15934 +15935, OA15935 +15936, OA15936 +15937, OA15937 +15938, OA15938 +15939, OA15939 +15940, OA15940 +15941, OA15941 +15942, OA15942 +15943, OA15943 +15944, OA15944 +15945, OA15945 +15946, OA15946 +15947, OA15947 +15948, OA15948 +15949, OA15949 +15950, OA15950 +15951, OA15951 +15952, OA15952 +15953, OA15953 +15954, OA15954 +15955, OA15955 +15956, OA15956 +15957, OA15957 +15958, OA15958 +15959, OA15959 +15960, OA15960 +15961, OA15961 +15962, OA15962 +15963, OA15963 +15964, OA15964 +15965, OA15965 +15966, OA15966 +15967, OA15967 +15968, OA15968 +15969, OA15969 +15970, OA15970 +15971, OA15971 +15972, OA15972 +15973, OA15973 +15974, OA15974 +15975, OA15975 +15976, OA15976 +15977, OA15977 +15978, OA15978 +15979, OA15979 +15980, OA15980 +15981, OA15981 +15982, OA15982 +15983, OA15983 +15984, OA15984 +15985, OA15985 +15986, OA15986 +15987, OA15987 +15988, OA15988 +15989, OA15989 +15990, OA15990 +15991, OA15991 +15992, OA15992 +15993, OA15993 +15994, OA15994 +15995, OA15995 +15996, OA15996 +15997, OA15997 +15998, OA15998 +15999, OA15999 +16000, OA16000 +16001, OA16001 +16002, OA16002 +16003, OA16003 +16004, OA16004 +16005, OA16005 +16006, OA16006 +16007, OA16007 +16008, OA16008 +16009, OA16009 +16010, OA16010 +16011, OA16011 +16012, OA16012 +16013, OA16013 +16014, OA16014 +16015, OA16015 +16016, OA16016 +16017, OA16017 +16018, OA16018 +16019, OA16019 +16020, OA16020 +16021, OA16021 +16022, OA16022 +16023, OA16023 +16024, OA16024 +16025, OA16025 +16026, OA16026 +16027, OA16027 +16028, OA16028 +16029, OA16029 +16030, OA16030 +16031, OA16031 +16032, OA16032 +16033, OA16033 +16034, OA16034 +16035, OA16035 +16036, OA16036 +16037, OA16037 +16038, OA16038 +16039, OA16039 +16040, OA16040 +16041, OA16041 +16042, OA16042 +16043, OA16043 +16044, OA16044 +16045, OA16045 +16046, OA16046 +16047, OA16047 +16048, OA16048 +16049, OA16049 +16050, OA16050 +16051, OA16051 +16052, OA16052 +16053, OA16053 +16054, OA16054 +16055, OA16055 +16056, OA16056 +16057, OA16057 +16058, OA16058 +16059, OA16059 +16060, OA16060 +16061, OA16061 +16062, OA16062 +16063, OA16063 +16064, OA16064 +16065, OA16065 +16066, OA16066 +16067, OA16067 +16068, OA16068 +16069, OA16069 +16070, OA16070 +16071, OA16071 +16072, OA16072 +16073, OA16073 +16074, OA16074 +16075, OA16075 +16076, OA16076 +16077, OA16077 +16078, OA16078 +16079, OA16079 +16080, OA16080 +16081, OA16081 +16082, OA16082 +16083, OA16083 +16084, OA16084 +16085, OA16085 +16086, OA16086 +16087, OA16087 +16088, OA16088 +16089, OA16089 +16090, OA16090 +16091, OA16091 +16092, OA16092 +16093, OA16093 +16094, OA16094 +16095, OA16095 +16096, OA16096 +16097, OA16097 +16098, OA16098 +16099, OA16099 +16100, OA16100 +16101, OA16101 +16102, OA16102 +16103, OA16103 +16104, OA16104 +16105, OA16105 +16106, OA16106 +16107, OA16107 +16108, OA16108 +16109, OA16109 +16110, OA16110 +16111, OA16111 +16112, OA16112 +16113, OA16113 +16114, OA16114 +16115, OA16115 +16116, OA16116 +16117, OA16117 +16118, OA16118 +16119, OA16119 +16120, OA16120 +16121, OA16121 +16122, OA16122 +16123, OA16123 +16124, OA16124 +16125, OA16125 +16126, OA16126 +16127, OA16127 +16128, OA16128 +16129, OA16129 +16130, OA16130 +16131, OA16131 +16132, OA16132 +16133, OA16133 +16134, OA16134 +16135, OA16135 +16136, OA16136 +16137, OA16137 +16138, OA16138 +16139, OA16139 +16140, OA16140 +16141, OA16141 +16142, OA16142 +16143, OA16143 +16144, OA16144 +16145, OA16145 +16146, OA16146 +16147, OA16147 +16148, OA16148 +16149, OA16149 +16150, OA16150 +16151, OA16151 +16152, OA16152 +16153, OA16153 +16154, OA16154 +16155, OA16155 +16156, OA16156 +16157, OA16157 +16158, OA16158 +16159, OA16159 +16160, OA16160 +16161, OA16161 +16162, OA16162 +16163, OA16163 +16164, OA16164 +16165, OA16165 +16166, OA16166 +16167, OA16167 +16168, OA16168 +16169, OA16169 +16170, OA16170 +16171, OA16171 +16172, OA16172 +16173, OA16173 +16174, OA16174 +16175, OA16175 +16176, OA16176 +16177, OA16177 +16178, OA16178 +16179, OA16179 +16180, OA16180 +16181, OA16181 +16182, OA16182 +16183, OA16183 +16184, OA16184 +16185, OA16185 +16186, OA16186 +16187, OA16187 +16188, OA16188 +16189, OA16189 +16190, OA16190 +16191, OA16191 +16192, OA16192 +16193, OA16193 +16194, OA16194 +16195, OA16195 +16196, OA16196 +16197, OA16197 +16198, OA16198 +16199, OA16199 +16200, OA16200 +16201, OA16201 +16202, OA16202 +16203, OA16203 +16204, OA16204 +16205, OA16205 +16206, OA16206 +16207, OA16207 +16208, OA16208 +16209, OA16209 +16210, OA16210 +16211, OA16211 +16212, OA16212 +16213, OA16213 +16214, OA16214 +16215, OA16215 +16216, OA16216 +16217, OA16217 +16218, OA16218 +16219, OA16219 +16220, OA16220 +16221, OA16221 +16222, OA16222 +16223, OA16223 +16224, OA16224 +16225, OA16225 +16226, OA16226 +16227, OA16227 +16228, OA16228 +16229, OA16229 +16230, OA16230 +16231, OA16231 +16232, OA16232 +16233, OA16233 +16234, OA16234 +16235, OA16235 +16236, OA16236 +16237, OA16237 +16238, OA16238 +16239, OA16239 +16240, OA16240 +16241, OA16241 +16242, OA16242 +16243, OA16243 +16244, OA16244 +16245, OA16245 +16246, OA16246 +16247, OA16247 +16248, OA16248 +16249, OA16249 +16250, OA16250 +16251, OA16251 +16252, OA16252 +16253, OA16253 +16254, OA16254 +16255, OA16255 +16256, OA16256 +16257, OA16257 +16258, OA16258 +16259, OA16259 +16260, OA16260 +16261, OA16261 +16262, OA16262 +16263, OA16263 +16264, OA16264 +16265, OA16265 +16266, OA16266 +16267, OA16267 +16268, OA16268 +16269, OA16269 +16270, OA16270 +16271, OA16271 +16272, OA16272 +16273, OA16273 +16274, OA16274 +16275, OA16275 +16276, OA16276 +16277, OA16277 +16278, OA16278 +16279, OA16279 +16280, OA16280 +16281, OA16281 +16282, OA16282 +16283, OA16283 +16284, OA16284 +16285, OA16285 +16286, OA16286 +16287, OA16287 +16288, OA16288 +16289, OA16289 +16290, OA16290 +16291, OA16291 +16292, OA16292 +16293, OA16293 +16294, OA16294 +16295, OA16295 +16296, OA16296 +16297, OA16297 +16298, OA16298 +16299, OA16299 +16300, OA16300 +16301, OA16301 +16302, OA16302 +16303, OA16303 +16304, OA16304 +16305, OA16305 +16306, OA16306 +16307, OA16307 +16308, OA16308 +16309, OA16309 +16310, OA16310 +16311, OA16311 +16312, OA16312 +16313, OA16313 +16314, OA16314 +16315, OA16315 +16316, OA16316 +16317, OA16317 +16318, OA16318 +16319, OA16319 +16320, OA16320 +16321, OA16321 +16322, OA16322 +16323, OA16323 +16324, OA16324 +16325, OA16325 +16326, OA16326 +16327, OA16327 +16328, OA16328 +16329, OA16329 +16330, OA16330 +16331, OA16331 +16332, OA16332 +16333, OA16333 +16334, OA16334 +16335, OA16335 +16336, OA16336 +16337, OA16337 +16338, OA16338 +16339, OA16339 +16340, OA16340 +16341, OA16341 +16342, OA16342 +16343, OA16343 +16344, OA16344 +16345, OA16345 +16346, OA16346 +16347, OA16347 +16348, OA16348 +16349, OA16349 +16350, OA16350 +16351, OA16351 +16352, OA16352 +16353, OA16353 +16354, OA16354 +16355, OA16355 +16356, OA16356 +16357, OA16357 +16358, OA16358 +16359, OA16359 +16360, OA16360 +16361, OA16361 +16362, OA16362 +16363, OA16363 +16364, OA16364 +16365, OA16365 +16366, OA16366 +16367, OA16367 +16368, OA16368 +16369, OA16369 +16370, OA16370 +16371, OA16371 +16372, OA16372 +16373, OA16373 +16374, OA16374 +16375, OA16375 +16376, OA16376 +16377, OA16377 +16378, OA16378 +16379, OA16379 +16380, OA16380 +16381, OA16381 +16382, OA16382 +16383, OA16383 +16384, OA16384 +16385, OA16385 +16386, OA16386 +16387, OA16387 +16388, OA16388 +16389, OA16389 +16390, OA16390 +16391, OA16391 +16392, OA16392 +16393, OA16393 +16394, OA16394 +16395, OA16395 +16396, OA16396 +16397, OA16397 +16398, OA16398 +16399, OA16399 +16400, OA16400 +16401, OA16401 +16402, OA16402 +16403, OA16403 +16404, OA16404 +16405, OA16405 +16406, OA16406 +16407, OA16407 +16408, OA16408 +16409, OA16409 +16410, OA16410 +16411, OA16411 +16412, OA16412 +16413, OA16413 +16414, OA16414 +16415, OA16415 +16416, OA16416 +16417, OA16417 +16418, OA16418 +16419, OA16419 +16420, OA16420 +16421, OA16421 +16422, OA16422 +16423, OA16423 +16424, OA16424 +16425, OA16425 +16426, OA16426 +16427, OA16427 +16428, OA16428 +16429, OA16429 +16430, OA16430 +16431, OA16431 +16432, OA16432 +16433, OA16433 +16434, OA16434 +16435, OA16435 +16436, OA16436 +16437, OA16437 +16438, OA16438 +16439, OA16439 +16440, OA16440 +16441, OA16441 +16442, OA16442 +16443, OA16443 +16444, OA16444 +16445, OA16445 +16446, OA16446 +16447, OA16447 +16448, OA16448 +16449, OA16449 +16450, OA16450 +16451, OA16451 +16452, OA16452 +16453, OA16453 +16454, OA16454 +16455, OA16455 +16456, OA16456 +16457, OA16457 +16458, OA16458 +16459, OA16459 +16460, OA16460 +16461, OA16461 +16462, OA16462 +16463, OA16463 +16464, OA16464 +16465, OA16465 +16466, OA16466 +16467, OA16467 +16468, OA16468 +16469, OA16469 +16470, OA16470 +16471, OA16471 +16472, OA16472 +16473, OA16473 +16474, OA16474 +16475, OA16475 +16476, OA16476 +16477, OA16477 +16478, OA16478 +16479, OA16479 +16480, OA16480 +16481, OA16481 +16482, OA16482 +16483, OA16483 +16484, OA16484 +16485, OA16485 +16486, OA16486 +16487, OA16487 +16488, OA16488 +16489, OA16489 +16490, OA16490 +16491, OA16491 +16492, OA16492 +16493, OA16493 +16494, OA16494 +16495, OA16495 +16496, OA16496 +16497, OA16497 +16498, OA16498 +16499, OA16499 +16500, OA16500 +16501, OA16501 +16502, OA16502 +16503, OA16503 +16504, OA16504 +16505, OA16505 +16506, OA16506 +16507, OA16507 +16508, OA16508 +16509, OA16509 +16510, OA16510 +16511, OA16511 +16512, OA16512 +16513, OA16513 +16514, OA16514 +16515, OA16515 +16516, OA16516 +16517, OA16517 +16518, OA16518 +16519, OA16519 +16520, OA16520 +16521, OA16521 +16522, OA16522 +16523, OA16523 +16524, OA16524 +16525, OA16525 +16526, OA16526 +16527, OA16527 +16528, OA16528 +16529, OA16529 +16530, OA16530 +16531, OA16531 +16532, OA16532 +16533, OA16533 +16534, OA16534 +16535, OA16535 +16536, OA16536 +16537, OA16537 +16538, OA16538 +16539, OA16539 +16540, OA16540 +16541, OA16541 +16542, OA16542 +16543, OA16543 +16544, OA16544 +16545, OA16545 +16546, OA16546 +16547, OA16547 +16548, OA16548 +16549, OA16549 +16550, OA16550 +16551, OA16551 +16552, OA16552 +16553, OA16553 +16554, OA16554 +16555, OA16555 +16556, OA16556 +16557, OA16557 +16558, OA16558 +16559, OA16559 +16560, OA16560 +16561, OA16561 +16562, OA16562 +16563, OA16563 +16564, OA16564 +16565, OA16565 +16566, OA16566 +16567, OA16567 +16568, OA16568 +16569, OA16569 +16570, OA16570 +16571, OA16571 +16572, OA16572 +16573, OA16573 +16574, OA16574 +16575, OA16575 +16576, OA16576 +16577, OA16577 +16578, OA16578 +16579, OA16579 +16580, OA16580 +16581, OA16581 +16582, OA16582 +16583, OA16583 +16584, OA16584 +16585, OA16585 +16586, OA16586 +16587, OA16587 +16588, OA16588 +16589, OA16589 +16590, OA16590 +16591, OA16591 +16592, OA16592 +16593, OA16593 +16594, OA16594 +16595, OA16595 +16596, OA16596 +16597, OA16597 +16598, OA16598 +16599, OA16599 +16600, OA16600 +16601, OA16601 +16602, OA16602 +16603, OA16603 +16604, OA16604 +16605, OA16605 +16606, OA16606 +16607, OA16607 +16608, OA16608 +16609, OA16609 +16610, OA16610 +16611, OA16611 +16612, OA16612 +16613, OA16613 +16614, OA16614 +16615, OA16615 +16616, OA16616 +16617, OA16617 +16618, OA16618 +16619, OA16619 +16620, OA16620 +16621, OA16621 +16622, OA16622 +16623, OA16623 +16624, OA16624 +16625, OA16625 +16626, OA16626 +16627, OA16627 +16628, OA16628 +16629, OA16629 +16630, OA16630 +16631, OA16631 +16632, OA16632 +16633, OA16633 +16634, OA16634 +16635, OA16635 +16636, OA16636 +16637, OA16637 +16638, OA16638 +16639, OA16639 +16640, OA16640 +16641, OA16641 +16642, OA16642 +16643, OA16643 +16644, OA16644 +16645, OA16645 +16646, OA16646 +16647, OA16647 +16648, OA16648 +16649, OA16649 +16650, OA16650 +16651, OA16651 +16652, OA16652 +16653, OA16653 +16654, OA16654 +16655, OA16655 +16656, OA16656 +16657, OA16657 +16658, OA16658 +16659, OA16659 +16660, OA16660 +16661, OA16661 +16662, OA16662 +16663, OA16663 +16664, OA16664 +16665, OA16665 +16666, OA16666 +16667, OA16667 +16668, OA16668 +16669, OA16669 +16670, OA16670 +16671, OA16671 +16672, OA16672 +16673, OA16673 +16674, OA16674 +16675, OA16675 +16676, OA16676 +16677, OA16677 +16678, OA16678 +16679, OA16679 +16680, OA16680 +16681, OA16681 +16682, OA16682 +16683, OA16683 +16684, OA16684 +16685, OA16685 +16686, OA16686 +16687, OA16687 +16688, OA16688 +16689, OA16689 +16690, OA16690 +16691, OA16691 +16692, OA16692 +16693, OA16693 +16694, OA16694 +16695, OA16695 +16696, OA16696 +16697, OA16697 +16698, OA16698 +16699, OA16699 +16700, OA16700 +16701, OA16701 +16702, OA16702 +16703, OA16703 +16704, OA16704 +16705, OA16705 +16706, OA16706 +16707, OA16707 +16708, OA16708 +16709, OA16709 +16710, OA16710 +16711, OA16711 +16712, OA16712 +16713, OA16713 +16714, OA16714 +16715, OA16715 +16716, OA16716 +16717, OA16717 +16718, OA16718 +16719, OA16719 +16720, OA16720 +16721, OA16721 +16722, OA16722 +16723, OA16723 +16724, OA16724 +16725, OA16725 +16726, OA16726 +16727, OA16727 +16728, OA16728 +16729, OA16729 +16730, OA16730 +16731, OA16731 +16732, OA16732 +16733, OA16733 +16734, OA16734 +16735, OA16735 +16736, OA16736 +16737, OA16737 +16738, OA16738 +16739, OA16739 +16740, OA16740 +16741, OA16741 +16742, OA16742 +16743, OA16743 +16744, OA16744 +16745, OA16745 +16746, OA16746 +16747, OA16747 +16748, OA16748 +16749, OA16749 +16750, OA16750 +16751, OA16751 +16752, OA16752 +16753, OA16753 +16754, OA16754 +16755, OA16755 +16756, OA16756 +16757, OA16757 +16758, OA16758 +16759, OA16759 +16760, OA16760 +16761, OA16761 +16762, OA16762 +16763, OA16763 +16764, OA16764 +16765, OA16765 +16766, OA16766 +16767, OA16767 +16768, OA16768 +16769, OA16769 +16770, OA16770 +16771, OA16771 +16772, OA16772 +16773, OA16773 +16774, OA16774 +16775, OA16775 +16776, OA16776 +16777, OA16777 +16778, OA16778 +16779, OA16779 +16780, OA16780 +16781, OA16781 +16782, OA16782 +16783, OA16783 +16784, OA16784 +16785, OA16785 +16786, OA16786 +16787, OA16787 +16788, OA16788 +16789, OA16789 +16790, OA16790 +16791, OA16791 +16792, OA16792 +16793, OA16793 +16794, OA16794 +16795, OA16795 +16796, OA16796 +16797, OA16797 +16798, OA16798 +16799, OA16799 +16800, OA16800 +16801, OA16801 +16802, OA16802 +16803, OA16803 +16804, OA16804 +16805, OA16805 +16806, OA16806 +16807, OA16807 +16808, OA16808 +16809, OA16809 +16810, OA16810 +16811, OA16811 +16812, OA16812 +16813, OA16813 +16814, OA16814 +16815, OA16815 +16816, OA16816 +16817, OA16817 +16818, OA16818 +16819, OA16819 +16820, OA16820 +16821, OA16821 +16822, OA16822 +16823, OA16823 +16824, OA16824 +16825, OA16825 +16826, OA16826 +16827, OA16827 +16828, OA16828 +16829, OA16829 +16830, OA16830 +16831, OA16831 +16832, OA16832 +16833, OA16833 +16834, OA16834 +16835, OA16835 +16836, OA16836 +16837, OA16837 +16838, OA16838 +16839, OA16839 +16840, OA16840 +16841, OA16841 +16842, OA16842 +16843, OA16843 +16844, OA16844 +16845, OA16845 +16846, OA16846 +16847, OA16847 +16848, OA16848 +16849, OA16849 +16850, OA16850 +16851, OA16851 +16852, OA16852 +16853, OA16853 +16854, OA16854 +16855, OA16855 +16856, OA16856 +16857, OA16857 +16858, OA16858 +16859, OA16859 +16860, OA16860 +16861, OA16861 +16862, OA16862 +16863, OA16863 +16864, OA16864 +16865, OA16865 +16866, OA16866 +16867, OA16867 +16868, OA16868 +16869, OA16869 +16870, OA16870 +16871, OA16871 +16872, OA16872 +16873, OA16873 +16874, OA16874 +16875, OA16875 +16876, OA16876 +16877, OA16877 +16878, OA16878 +16879, OA16879 +16880, OA16880 +16881, OA16881 +16882, OA16882 +16883, OA16883 +16884, OA16884 +16885, OA16885 +16886, OA16886 +16887, OA16887 +16888, OA16888 +16889, OA16889 +16890, OA16890 +16891, OA16891 +16892, OA16892 +16893, OA16893 +16894, OA16894 +16895, OA16895 +16896, OA16896 +16897, OA16897 +16898, OA16898 +16899, OA16899 +16900, OA16900 +16901, OA16901 +16902, OA16902 +16903, OA16903 +16904, OA16904 +16905, OA16905 +16906, OA16906 +16907, OA16907 +16908, OA16908 +16909, OA16909 +16910, OA16910 +16911, OA16911 +16912, OA16912 +16913, OA16913 +16914, OA16914 +16915, OA16915 +16916, OA16916 +16917, OA16917 +16918, OA16918 +16919, OA16919 +16920, OA16920 +16921, OA16921 +16922, OA16922 +16923, OA16923 +16924, OA16924 +16925, OA16925 +16926, OA16926 +16927, OA16927 +16928, OA16928 +16929, OA16929 +16930, OA16930 +16931, OA16931 +16932, OA16932 +16933, OA16933 +16934, OA16934 +16935, OA16935 +16936, OA16936 +16937, OA16937 +16938, OA16938 +16939, OA16939 +16940, OA16940 +16941, OA16941 +16942, OA16942 +16943, OA16943 +16944, OA16944 +16945, OA16945 +16946, OA16946 +16947, OA16947 +16948, OA16948 +16949, OA16949 +16950, OA16950 +16951, OA16951 +16952, OA16952 +16953, OA16953 +16954, OA16954 +16955, OA16955 +16956, OA16956 +16957, OA16957 +16958, OA16958 +16959, OA16959 +16960, OA16960 +16961, OA16961 +16962, OA16962 +16963, OA16963 +16964, OA16964 +16965, OA16965 +16966, OA16966 +16967, OA16967 +16968, OA16968 +16969, OA16969 +16970, OA16970 +16971, OA16971 +16972, OA16972 +16973, OA16973 +16974, OA16974 +16975, OA16975 +16976, OA16976 +16977, OA16977 +16978, OA16978 +16979, OA16979 +16980, OA16980 +16981, OA16981 +16982, OA16982 +16983, OA16983 +16984, OA16984 +16985, OA16985 +16986, OA16986 +16987, OA16987 +16988, OA16988 +16989, OA16989 +16990, OA16990 +16991, OA16991 +16992, OA16992 +16993, OA16993 +16994, OA16994 +16995, OA16995 +16996, OA16996 +16997, OA16997 +16998, OA16998 +16999, OA16999 +17000, OA17000 +17001, OA17001 +17002, OA17002 +17003, OA17003 +17004, OA17004 +17005, OA17005 +17006, OA17006 +17007, OA17007 +17008, OA17008 +17009, OA17009 +17010, OA17010 +17011, OA17011 +17012, OA17012 +17013, OA17013 +17014, OA17014 +17015, OA17015 +17016, OA17016 +17017, OA17017 +17018, OA17018 +17019, OA17019 +17020, OA17020 +17021, OA17021 +17022, OA17022 +17023, OA17023 +17024, OA17024 +17025, OA17025 +17026, OA17026 +17027, OA17027 +17028, OA17028 +17029, OA17029 +17030, OA17030 +17031, OA17031 +17032, OA17032 +17033, OA17033 +17034, OA17034 +17035, OA17035 +17036, OA17036 +17037, OA17037 +17038, OA17038 +17039, OA17039 +17040, OA17040 +17041, OA17041 +17042, OA17042 +17043, OA17043 +17044, OA17044 +17045, OA17045 +17046, OA17046 +17047, OA17047 +17048, OA17048 +17049, OA17049 +17050, OA17050 +17051, OA17051 +17052, OA17052 +17053, OA17053 +17054, OA17054 +17055, OA17055 +17056, OA17056 +17057, OA17057 +17058, OA17058 +17059, OA17059 +17060, OA17060 +17061, OA17061 +17062, OA17062 +17063, OA17063 +17064, OA17064 +17065, OA17065 +17066, OA17066 +17067, OA17067 +17068, OA17068 +17069, OA17069 +17070, OA17070 +17071, OA17071 +17072, OA17072 +17073, OA17073 +17074, OA17074 +17075, OA17075 +17076, OA17076 +17077, OA17077 +17078, OA17078 +17079, OA17079 +17080, OA17080 +17081, OA17081 +17082, OA17082 +17083, OA17083 +17084, OA17084 +17085, OA17085 +17086, OA17086 +17087, OA17087 +17088, OA17088 +17089, OA17089 +17090, OA17090 +17091, OA17091 +17092, OA17092 +17093, OA17093 +17094, OA17094 +17095, OA17095 +17096, OA17096 +17097, OA17097 +17098, OA17098 +17099, OA17099 +17100, OA17100 +17101, OA17101 +17102, OA17102 +17103, OA17103 +17104, OA17104 +17105, OA17105 +17106, OA17106 +17107, OA17107 +17108, OA17108 +17109, OA17109 +17110, OA17110 +17111, OA17111 +17112, OA17112 +17113, OA17113 +17114, OA17114 +17115, OA17115 +17116, OA17116 +17117, OA17117 +17118, OA17118 +17119, OA17119 +17120, OA17120 +17121, OA17121 +17122, OA17122 +17123, OA17123 +17124, OA17124 +17125, OA17125 +17126, OA17126 +17127, OA17127 +17128, OA17128 +17129, OA17129 +17130, OA17130 +17131, OA17131 +17132, OA17132 +17133, OA17133 +17134, OA17134 +17135, OA17135 +17136, OA17136 +17137, OA17137 +17138, OA17138 +17139, OA17139 +17140, OA17140 +17141, OA17141 +17142, OA17142 +17143, OA17143 +17144, OA17144 +17145, OA17145 +17146, OA17146 +17147, OA17147 +17148, OA17148 +17149, OA17149 +17150, OA17150 +17151, OA17151 +17152, OA17152 +17153, OA17153 +17154, OA17154 +17155, OA17155 +17156, OA17156 +17157, OA17157 +17158, OA17158 +17159, OA17159 +17160, OA17160 +17161, OA17161 +17162, OA17162 +17163, OA17163 +17164, OA17164 +17165, OA17165 +17166, OA17166 +17167, OA17167 +17168, OA17168 +17169, OA17169 +17170, OA17170 +17171, OA17171 +17172, OA17172 +17173, OA17173 +17174, OA17174 +17175, OA17175 +17176, OA17176 +17177, OA17177 +17178, OA17178 +17179, OA17179 +17180, OA17180 +17181, OA17181 +17182, OA17182 +17183, OA17183 +17184, OA17184 +17185, OA17185 +17186, OA17186 +17187, OA17187 +17188, OA17188 +17189, OA17189 +17190, OA17190 +17191, OA17191 +17192, OA17192 +17193, OA17193 +17194, OA17194 +17195, OA17195 +17196, OA17196 +17197, OA17197 +17198, OA17198 +17199, OA17199 +17200, OA17200 +17201, OA17201 +17202, OA17202 +17203, OA17203 +17204, OA17204 +17205, OA17205 +17206, OA17206 +17207, OA17207 +17208, OA17208 +17209, OA17209 +17210, OA17210 +17211, OA17211 +17212, OA17212 +17213, OA17213 +17214, OA17214 +17215, OA17215 +17216, OA17216 +17217, OA17217 +17218, OA17218 +17219, OA17219 +17220, OA17220 +17221, OA17221 +17222, OA17222 +17223, OA17223 +17224, OA17224 +17225, OA17225 +17226, OA17226 +17227, OA17227 +17228, OA17228 +17229, OA17229 +17230, OA17230 +17231, OA17231 +17232, OA17232 +17233, OA17233 +17234, OA17234 +17235, OA17235 +17236, OA17236 +17237, OA17237 +17238, OA17238 +17239, OA17239 +17240, OA17240 +17241, OA17241 +17242, OA17242 +17243, OA17243 +17244, OA17244 +17245, OA17245 +17246, OA17246 +17247, OA17247 +17248, OA17248 +17249, OA17249 +17250, OA17250 +17251, OA17251 +17252, OA17252 +17253, OA17253 +17254, OA17254 +17255, OA17255 +17256, OA17256 +17257, OA17257 +17258, OA17258 +17259, OA17259 +17260, OA17260 +17261, OA17261 +17262, OA17262 +17263, OA17263 +17264, OA17264 +17265, OA17265 +17266, OA17266 +17267, OA17267 +17268, OA17268 +17269, OA17269 +17270, OA17270 +17271, OA17271 +17272, OA17272 +17273, OA17273 +17274, OA17274 +17275, OA17275 +17276, OA17276 +17277, OA17277 +17278, OA17278 +17279, OA17279 +17280, OA17280 +17281, OA17281 +17282, OA17282 +17283, OA17283 +17284, OA17284 +17285, OA17285 +17286, OA17286 +17287, OA17287 +17288, OA17288 +17289, OA17289 +17290, OA17290 +17291, OA17291 +17292, OA17292 +17293, OA17293 +17294, OA17294 +17295, OA17295 +17296, OA17296 +17297, OA17297 +17298, OA17298 +17299, OA17299 +17300, OA17300 +17301, OA17301 +17302, OA17302 +17303, OA17303 +17304, OA17304 +17305, OA17305 +17306, OA17306 +17307, OA17307 +17308, OA17308 +17309, OA17309 +17310, OA17310 +17311, OA17311 +17312, OA17312 +17313, OA17313 +17314, OA17314 +17315, OA17315 +17316, OA17316 +17317, OA17317 +17318, OA17318 +17319, OA17319 +17320, OA17320 +17321, OA17321 +17322, OA17322 +17323, OA17323 +17324, OA17324 +17325, OA17325 +17326, OA17326 +17327, OA17327 +17328, OA17328 +17329, OA17329 +17330, OA17330 +17331, OA17331 +17332, OA17332 +17333, OA17333 +17334, OA17334 +17335, OA17335 +17336, OA17336 +17337, OA17337 +17338, OA17338 +17339, OA17339 +17340, OA17340 +17341, OA17341 +17342, OA17342 +17343, OA17343 +17344, OA17344 +17345, OA17345 +17346, OA17346 +17347, OA17347 +17348, OA17348 +17349, OA17349 +17350, OA17350 +17351, OA17351 +17352, OA17352 +17353, OA17353 +17354, OA17354 +17355, OA17355 +17356, OA17356 +17357, OA17357 +17358, OA17358 +17359, OA17359 +17360, OA17360 +17361, OA17361 +17362, OA17362 +17363, OA17363 +17364, OA17364 +17365, OA17365 +17366, OA17366 +17367, OA17367 +17368, OA17368 +17369, OA17369 +17370, OA17370 +17371, OA17371 +17372, OA17372 +17373, OA17373 +17374, OA17374 +17375, OA17375 +17376, OA17376 +17377, OA17377 +17378, OA17378 +17379, OA17379 +17380, OA17380 +17381, OA17381 +17382, OA17382 +17383, OA17383 +17384, OA17384 +17385, OA17385 +17386, OA17386 +17387, OA17387 +17388, OA17388 +17389, OA17389 +17390, OA17390 +17391, OA17391 +17392, OA17392 +17393, OA17393 +17394, OA17394 +17395, OA17395 +17396, OA17396 +17397, OA17397 +17398, OA17398 +17399, OA17399 +17400, OA17400 +17401, OA17401 +17402, OA17402 +17403, OA17403 +17404, OA17404 +17405, OA17405 +17406, OA17406 +17407, OA17407 +17408, OA17408 +17409, OA17409 +17410, OA17410 +17411, OA17411 +17412, OA17412 +17413, OA17413 +17414, OA17414 +17415, OA17415 +17416, OA17416 +17417, OA17417 +17418, OA17418 +17419, OA17419 +17420, OA17420 +17421, OA17421 +17422, OA17422 +17423, OA17423 +17424, OA17424 +17425, OA17425 +17426, OA17426 +17427, OA17427 +17428, OA17428 +17429, OA17429 +17430, OA17430 +17431, OA17431 +17432, OA17432 +17433, OA17433 +17434, OA17434 +17435, OA17435 +17436, OA17436 +17437, OA17437 +17438, OA17438 +17439, OA17439 +17440, OA17440 +17441, OA17441 +17442, OA17442 +17443, OA17443 +17444, OA17444 +17445, OA17445 +17446, OA17446 +17447, OA17447 +17448, OA17448 +17449, OA17449 +17450, OA17450 +17451, OA17451 +17452, OA17452 +17453, OA17453 +17454, OA17454 +17455, OA17455 +17456, OA17456 +17457, OA17457 +17458, OA17458 +17459, OA17459 +17460, OA17460 +17461, OA17461 +17462, OA17462 +17463, OA17463 +17464, OA17464 +17465, OA17465 +17466, OA17466 +17467, OA17467 +17468, OA17468 +17469, OA17469 +17470, OA17470 +17471, OA17471 +17472, OA17472 +17473, OA17473 +17474, OA17474 +17475, OA17475 +17476, OA17476 +17477, OA17477 +17478, OA17478 +17479, OA17479 +17480, OA17480 +17481, OA17481 +17482, OA17482 +17483, OA17483 +17484, OA17484 +17485, OA17485 +17486, OA17486 +17487, OA17487 +17488, OA17488 +17489, OA17489 +17490, OA17490 +17491, OA17491 +17492, OA17492 +17493, OA17493 +17494, OA17494 +17495, OA17495 +17496, OA17496 +17497, OA17497 +17498, OA17498 +17499, OA17499 +17500, OA17500 +17501, OA17501 +17502, OA17502 +17503, OA17503 +17504, OA17504 +17505, OA17505 +17506, OA17506 +17507, OA17507 +17508, OA17508 +17509, OA17509 +17510, OA17510 +17511, OA17511 +17512, OA17512 +17513, OA17513 +17514, OA17514 +17515, OA17515 +17516, OA17516 +17517, OA17517 +17518, OA17518 +17519, OA17519 +17520, OA17520 +17521, OA17521 +17522, OA17522 +17523, OA17523 +17524, OA17524 +17525, OA17525 +17526, OA17526 +17527, OA17527 +17528, OA17528 +17529, OA17529 +17530, OA17530 +17531, OA17531 +17532, OA17532 +17533, OA17533 +17534, OA17534 +17535, OA17535 +17536, OA17536 +17537, OA17537 +17538, OA17538 +17539, OA17539 +17540, OA17540 +17541, OA17541 +17542, OA17542 +17543, OA17543 +17544, OA17544 +17545, OA17545 +17546, OA17546 +17547, OA17547 +17548, OA17548 +17549, OA17549 +17550, OA17550 +17551, OA17551 +17552, OA17552 +17553, OA17553 +17554, OA17554 +17555, OA17555 +17556, OA17556 +17557, OA17557 +17558, OA17558 +17559, OA17559 +17560, OA17560 +17561, OA17561 +17562, OA17562 +17563, OA17563 +17564, OA17564 +17565, OA17565 +17566, OA17566 +17567, OA17567 +17568, OA17568 +17569, OA17569 +17570, OA17570 +17571, OA17571 +17572, OA17572 +17573, OA17573 +17574, OA17574 +17575, OA17575 +17576, OA17576 +17577, OA17577 +17578, OA17578 +17579, OA17579 +17580, OA17580 +17581, OA17581 +17582, OA17582 +17583, OA17583 +17584, OA17584 +17585, OA17585 +17586, OA17586 +17587, OA17587 +17588, OA17588 +17589, OA17589 +17590, OA17590 +17591, OA17591 +17592, OA17592 +17593, OA17593 +17594, OA17594 +17595, OA17595 +17596, OA17596 +17597, OA17597 +17598, OA17598 +17599, OA17599 +17600, OA17600 +17601, OA17601 +17602, OA17602 +17603, OA17603 +17604, OA17604 +17605, OA17605 +17606, OA17606 +17607, OA17607 +17608, OA17608 +17609, OA17609 +17610, OA17610 +17611, OA17611 +17612, OA17612 +17613, OA17613 +17614, OA17614 +17615, OA17615 +17616, OA17616 +17617, OA17617 +17618, OA17618 +17619, OA17619 +17620, OA17620 +17621, OA17621 +17622, OA17622 +17623, OA17623 +17624, OA17624 +17625, OA17625 +17626, OA17626 +17627, OA17627 +17628, OA17628 +17629, OA17629 +17630, OA17630 +17631, OA17631 +17632, OA17632 +17633, OA17633 +17634, OA17634 +17635, OA17635 +17636, OA17636 +17637, OA17637 +17638, OA17638 +17639, OA17639 +17640, OA17640 +17641, OA17641 +17642, OA17642 +17643, OA17643 +17644, OA17644 +17645, OA17645 +17646, OA17646 +17647, OA17647 +17648, OA17648 +17649, OA17649 +17650, OA17650 +17651, OA17651 +17652, OA17652 +17653, OA17653 +17654, OA17654 +17655, OA17655 +17656, OA17656 +17657, OA17657 +17658, OA17658 +17659, OA17659 +17660, OA17660 +17661, OA17661 +17662, OA17662 +17663, OA17663 +17664, OA17664 +17665, OA17665 +17666, OA17666 +17667, OA17667 +17668, OA17668 +17669, OA17669 +17670, OA17670 +17671, OA17671 +17672, OA17672 +17673, OA17673 +17674, OA17674 +17675, OA17675 +17676, OA17676 +17677, OA17677 +17678, OA17678 +17679, OA17679 +17680, OA17680 +17681, OA17681 +17682, OA17682 +17683, OA17683 +17684, OA17684 +17685, OA17685 +17686, OA17686 +17687, OA17687 +17688, OA17688 +17689, OA17689 +17690, OA17690 +17691, OA17691 +17692, OA17692 +17693, OA17693 +17694, OA17694 +17695, OA17695 +17696, OA17696 +17697, OA17697 +17698, OA17698 +17699, OA17699 +17700, OA17700 +17701, OA17701 +17702, OA17702 +17703, OA17703 +17704, OA17704 +17705, OA17705 +17706, OA17706 +17707, OA17707 +17708, OA17708 +17709, OA17709 +17710, OA17710 +17711, OA17711 +17712, OA17712 +17713, OA17713 +17714, OA17714 +17715, OA17715 +17716, OA17716 +17717, OA17717 +17718, OA17718 +17719, OA17719 +17720, OA17720 +17721, OA17721 +17722, OA17722 +17723, OA17723 +17724, OA17724 +17725, OA17725 +17726, OA17726 +17727, OA17727 +17728, OA17728 +17729, OA17729 +17730, OA17730 +17731, OA17731 +17732, OA17732 +17733, OA17733 +17734, OA17734 +17735, OA17735 +17736, OA17736 +17737, OA17737 +17738, OA17738 +17739, OA17739 +17740, OA17740 +17741, OA17741 +17742, OA17742 +17743, OA17743 +17744, OA17744 +17745, OA17745 +17746, OA17746 +17747, OA17747 +17748, OA17748 +17749, OA17749 +17750, OA17750 +17751, OA17751 +17752, OA17752 +17753, OA17753 +17754, OA17754 +17755, OA17755 +17756, OA17756 +17757, OA17757 +17758, OA17758 +17759, OA17759 +17760, OA17760 +17761, OA17761 +17762, OA17762 +17763, OA17763 +17764, OA17764 +17765, OA17765 +17766, OA17766 +17767, OA17767 +17768, OA17768 +17769, OA17769 +17770, OA17770 +17771, OA17771 +17772, OA17772 +17773, OA17773 +17774, OA17774 +17775, OA17775 +17776, OA17776 +17777, OA17777 +17778, OA17778 +17779, OA17779 +17780, OA17780 +17781, OA17781 +17782, OA17782 +17783, OA17783 +17784, OA17784 +17785, OA17785 +17786, OA17786 +17787, OA17787 +17788, OA17788 +17789, OA17789 +17790, OA17790 +17791, OA17791 +17792, OA17792 +17793, OA17793 +17794, OA17794 +17795, OA17795 +17796, OA17796 +17797, OA17797 +17798, OA17798 +17799, OA17799 +17800, OA17800 +17801, OA17801 +17802, OA17802 +17803, OA17803 +17804, OA17804 +17805, OA17805 +17806, OA17806 +17807, OA17807 +17808, OA17808 +17809, OA17809 +17810, OA17810 +17811, OA17811 +17812, OA17812 +17813, OA17813 +17814, OA17814 +17815, OA17815 +17816, OA17816 +17817, OA17817 +17818, OA17818 +17819, OA17819 +17820, OA17820 +17821, OA17821 +17822, OA17822 +17823, OA17823 +17824, OA17824 +17825, OA17825 +17826, OA17826 +17827, OA17827 +17828, OA17828 +17829, OA17829 +17830, OA17830 +17831, OA17831 +17832, OA17832 +17833, OA17833 +17834, OA17834 +17835, OA17835 +17836, OA17836 +17837, OA17837 +17838, OA17838 +17839, OA17839 +17840, OA17840 +17841, OA17841 +17842, OA17842 +17843, OA17843 +17844, OA17844 +17845, OA17845 +17846, OA17846 +17847, OA17847 +17848, OA17848 +17849, OA17849 +17850, OA17850 +17851, OA17851 +17852, OA17852 +17853, OA17853 +17854, OA17854 +17855, OA17855 +17856, OA17856 +17857, OA17857 +17858, OA17858 +17859, OA17859 +17860, OA17860 +17861, OA17861 +17862, OA17862 +17863, OA17863 +17864, OA17864 +17865, OA17865 +17866, OA17866 +17867, OA17867 +17868, OA17868 +17869, OA17869 +17870, OA17870 +17871, OA17871 +17872, OA17872 +17873, OA17873 +17874, OA17874 +17875, OA17875 +17876, OA17876 +17877, OA17877 +17878, OA17878 +17879, OA17879 +17880, OA17880 +17881, OA17881 +17882, OA17882 +17883, OA17883 +17884, OA17884 +17885, OA17885 +17886, OA17886 +17887, OA17887 +17888, OA17888 +17889, OA17889 +17890, OA17890 +17891, OA17891 +17892, OA17892 +17893, OA17893 +17894, OA17894 +17895, OA17895 +17896, OA17896 +17897, OA17897 +17898, OA17898 +17899, OA17899 +17900, OA17900 +17901, OA17901 +17902, OA17902 +17903, OA17903 +17904, OA17904 +17905, OA17905 +17906, OA17906 +17907, OA17907 +17908, OA17908 +17909, OA17909 +17910, OA17910 +17911, OA17911 +17912, OA17912 +17913, OA17913 +17914, OA17914 +17915, OA17915 +17916, OA17916 +17917, OA17917 +17918, OA17918 +17919, OA17919 +17920, OA17920 +17921, OA17921 +17922, OA17922 +17923, OA17923 +17924, OA17924 +17925, OA17925 +17926, OA17926 +17927, OA17927 +17928, OA17928 +17929, OA17929 +17930, OA17930 +17931, OA17931 +17932, OA17932 +17933, OA17933 +17934, OA17934 +17935, OA17935 +17936, OA17936 +17937, OA17937 +17938, OA17938 +17939, OA17939 +17940, OA17940 +17941, OA17941 +17942, OA17942 +17943, OA17943 +17944, OA17944 +17945, OA17945 +17946, OA17946 +17947, OA17947 +17948, OA17948 +17949, OA17949 +17950, OA17950 +17951, OA17951 +17952, OA17952 +17953, OA17953 +17954, OA17954 +17955, OA17955 +17956, OA17956 +17957, OA17957 +17958, OA17958 +17959, OA17959 +17960, OA17960 +17961, OA17961 +17962, OA17962 +17963, OA17963 +17964, OA17964 +17965, OA17965 +17966, OA17966 +17967, OA17967 +17968, OA17968 +17969, OA17969 +17970, OA17970 +17971, OA17971 +17972, OA17972 +17973, OA17973 +17974, OA17974 +17975, OA17975 +17976, OA17976 +17977, OA17977 +17978, OA17978 +17979, OA17979 +17980, OA17980 +17981, OA17981 +17982, OA17982 +17983, OA17983 +17984, OA17984 +17985, OA17985 +17986, OA17986 +17987, OA17987 +17988, OA17988 +17989, OA17989 +17990, OA17990 +17991, OA17991 +17992, OA17992 +17993, OA17993 +17994, OA17994 +17995, OA17995 +17996, OA17996 +17997, OA17997 +17998, OA17998 +17999, OA17999 +18000, OA18000 +18001, OA18001 +18002, OA18002 +18003, OA18003 +18004, OA18004 +18005, OA18005 +18006, OA18006 +18007, OA18007 +18008, OA18008 +18009, OA18009 +18010, OA18010 +18011, OA18011 +18012, OA18012 +18013, OA18013 +18014, OA18014 +18015, OA18015 +18016, OA18016 +18017, OA18017 +18018, OA18018 +18019, OA18019 +18020, OA18020 +18021, OA18021 +18022, OA18022 +18023, OA18023 +18024, OA18024 +18025, OA18025 +18026, OA18026 +18027, OA18027 +18028, OA18028 +18029, OA18029 +18030, OA18030 +18031, OA18031 +18032, OA18032 +18033, OA18033 +18034, OA18034 +18035, OA18035 +18036, OA18036 +18037, OA18037 +18038, OA18038 +18039, OA18039 +18040, OA18040 +18041, OA18041 +18042, OA18042 +18043, OA18043 +18044, OA18044 +18045, OA18045 +18046, OA18046 +18047, OA18047 +18048, OA18048 +18049, OA18049 +18050, OA18050 +18051, OA18051 +18052, OA18052 +18053, OA18053 +18054, OA18054 +18055, OA18055 +18056, OA18056 +18057, OA18057 +18058, OA18058 +18059, OA18059 +18060, OA18060 +18061, OA18061 +18062, OA18062 +18063, OA18063 +18064, OA18064 +18065, OA18065 +18066, OA18066 +18067, OA18067 +18068, OA18068 +18069, OA18069 +18070, OA18070 +18071, OA18071 +18072, OA18072 +18073, OA18073 +18074, OA18074 +18075, OA18075 +18076, OA18076 +18077, OA18077 +18078, OA18078 +18079, OA18079 +18080, OA18080 +18081, OA18081 +18082, OA18082 +18083, OA18083 +18084, OA18084 +18085, OA18085 +18086, OA18086 +18087, OA18087 +18088, OA18088 +18089, OA18089 +18090, OA18090 +18091, OA18091 +18092, OA18092 +18093, OA18093 +18094, OA18094 +18095, OA18095 +18096, OA18096 +18097, OA18097 +18098, OA18098 +18099, OA18099 +18100, OA18100 +18101, OA18101 +18102, OA18102 +18103, OA18103 +18104, OA18104 +18105, OA18105 +18106, OA18106 +18107, OA18107 +18108, OA18108 +18109, OA18109 +18110, OA18110 +18111, OA18111 +18112, OA18112 +18113, OA18113 +18114, OA18114 +18115, OA18115 +18116, OA18116 +18117, OA18117 +18118, OA18118 +18119, OA18119 +18120, OA18120 +18121, OA18121 +18122, OA18122 +18123, OA18123 +18124, OA18124 +18125, OA18125 +18126, OA18126 +18127, OA18127 +18128, OA18128 +18129, OA18129 +18130, OA18130 +18131, OA18131 +18132, OA18132 +18133, OA18133 +18134, OA18134 +18135, OA18135 +18136, OA18136 +18137, OA18137 +18138, OA18138 +18139, OA18139 +18140, OA18140 +18141, OA18141 +18142, OA18142 +18143, OA18143 +18144, OA18144 +18145, OA18145 +18146, OA18146 +18147, OA18147 +18148, OA18148 +18149, OA18149 +18150, OA18150 +18151, OA18151 +18152, OA18152 +18153, OA18153 +18154, OA18154 +18155, OA18155 +18156, OA18156 +18157, OA18157 +18158, OA18158 +18159, OA18159 +18160, OA18160 +18161, OA18161 +18162, OA18162 +18163, OA18163 +18164, OA18164 +18165, OA18165 +18166, OA18166 +18167, OA18167 +18168, OA18168 +18169, OA18169 +18170, OA18170 +18171, OA18171 +18172, OA18172 +18173, OA18173 +18174, OA18174 +18175, OA18175 +18176, OA18176 +18177, OA18177 +18178, OA18178 +18179, OA18179 +18180, OA18180 +18181, OA18181 +18182, OA18182 +18183, OA18183 +18184, OA18184 +18185, OA18185 +18186, OA18186 +18187, OA18187 +18188, OA18188 +18189, OA18189 +18190, OA18190 +18191, OA18191 +18192, OA18192 +18193, OA18193 +18194, OA18194 +18195, OA18195 +18196, OA18196 +18197, OA18197 +18198, OA18198 +18199, OA18199 +18200, OA18200 +18201, OA18201 +18202, OA18202 +18203, OA18203 +18204, OA18204 +18205, OA18205 +18206, OA18206 +18207, OA18207 +18208, OA18208 +18209, OA18209 +18210, OA18210 +18211, OA18211 +18212, OA18212 +18213, OA18213 +18214, OA18214 +18215, OA18215 +18216, OA18216 +18217, OA18217 +18218, OA18218 +18219, OA18219 +18220, OA18220 +18221, OA18221 +18222, OA18222 +18223, OA18223 +18224, OA18224 +18225, OA18225 +18226, OA18226 +18227, OA18227 +18228, OA18228 +18229, OA18229 +18230, OA18230 +18231, OA18231 +18232, OA18232 +18233, OA18233 +18234, OA18234 +18235, OA18235 +18236, OA18236 +18237, OA18237 +18238, OA18238 +18239, OA18239 +18240, OA18240 +18241, OA18241 +18242, OA18242 +18243, OA18243 +18244, OA18244 +18245, OA18245 +18246, OA18246 +18247, OA18247 +18248, OA18248 +18249, OA18249 +18250, OA18250 +18251, OA18251 +18252, OA18252 +18253, OA18253 +18254, OA18254 +18255, OA18255 +18256, OA18256 +18257, OA18257 +18258, OA18258 +18259, OA18259 +18260, OA18260 +18261, OA18261 +18262, OA18262 +18263, OA18263 +18264, OA18264 +18265, OA18265 +18266, OA18266 +18267, OA18267 +18268, OA18268 +18269, OA18269 +18270, OA18270 +18271, OA18271 +18272, OA18272 +18273, OA18273 +18274, OA18274 +18275, OA18275 +18276, OA18276 +18277, OA18277 +18278, OA18278 +18279, OA18279 +18280, OA18280 +18281, OA18281 +18282, OA18282 +18283, OA18283 +18284, OA18284 +18285, OA18285 +18286, OA18286 +18287, OA18287 +18288, OA18288 +18289, OA18289 +18290, OA18290 +18291, OA18291 +18292, OA18292 +18293, OA18293 +18294, OA18294 +18295, OA18295 +18296, OA18296 +18297, OA18297 +18298, OA18298 +18299, OA18299 +18300, OA18300 +18301, OA18301 +18302, OA18302 +18303, OA18303 +18304, OA18304 +18305, OA18305 +18306, OA18306 +18307, OA18307 +18308, OA18308 +18309, OA18309 +18310, OA18310 +18311, OA18311 +18312, OA18312 +18313, OA18313 +18314, OA18314 +18315, OA18315 +18316, OA18316 +18317, OA18317 +18318, OA18318 +18319, OA18319 +18320, OA18320 +18321, OA18321 +18322, OA18322 +18323, OA18323 +18324, OA18324 +18325, OA18325 +18326, OA18326 +18327, OA18327 +18328, OA18328 +18329, OA18329 +18330, OA18330 +18331, OA18331 +18332, OA18332 +18333, OA18333 +18334, OA18334 +18335, OA18335 +18336, OA18336 +18337, OA18337 +18338, OA18338 +18339, OA18339 +18340, OA18340 +18341, OA18341 +18342, OA18342 +18343, OA18343 +18344, OA18344 +18345, OA18345 +18346, OA18346 +18347, OA18347 +18348, OA18348 +18349, OA18349 +18350, OA18350 +18351, OA18351 +18352, OA18352 +18353, OA18353 +18354, OA18354 +18355, OA18355 +18356, OA18356 +18357, OA18357 +18358, OA18358 +18359, OA18359 +18360, OA18360 +18361, OA18361 +18362, OA18362 +18363, OA18363 +18364, OA18364 +18365, OA18365 +18366, OA18366 +18367, OA18367 +18368, OA18368 +18369, OA18369 +18370, OA18370 +18371, OA18371 +18372, OA18372 +18373, OA18373 +18374, OA18374 +18375, OA18375 +18376, OA18376 +18377, OA18377 +18378, OA18378 +18379, OA18379 +18380, OA18380 +18381, OA18381 +18382, OA18382 +18383, OA18383 +18384, OA18384 +18385, OA18385 +18386, OA18386 +18387, OA18387 +18388, OA18388 +18389, OA18389 +18390, OA18390 +18391, OA18391 +18392, OA18392 +18393, OA18393 +18394, OA18394 +18395, OA18395 +18396, OA18396 +18397, OA18397 +18398, OA18398 +18399, OA18399 +18400, OA18400 +18401, OA18401 +18402, OA18402 +18403, OA18403 +18404, OA18404 +18405, OA18405 +18406, OA18406 +18407, OA18407 +18408, OA18408 +18409, OA18409 +18410, OA18410 +18411, OA18411 +18412, OA18412 +18413, OA18413 +18414, OA18414 +18415, OA18415 +18416, OA18416 +18417, OA18417 +18418, OA18418 +18419, OA18419 +18420, OA18420 +18421, OA18421 +18422, OA18422 +18423, OA18423 +18424, OA18424 +18425, OA18425 +18426, OA18426 +18427, OA18427 +18428, OA18428 +18429, OA18429 +18430, OA18430 +18431, OA18431 +18432, OA18432 +18433, OA18433 +18434, OA18434 +18435, OA18435 +18436, OA18436 +18437, OA18437 +18438, OA18438 +18439, OA18439 +18440, OA18440 +18441, OA18441 +18442, OA18442 +18443, OA18443 +18444, OA18444 +18445, OA18445 +18446, OA18446 +18447, OA18447 +18448, OA18448 +18449, OA18449 +18450, OA18450 +18451, OA18451 +18452, OA18452 +18453, OA18453 +18454, OA18454 +18455, OA18455 +18456, OA18456 +18457, OA18457 +18458, OA18458 +18459, OA18459 +18460, OA18460 +18461, OA18461 +18462, OA18462 +18463, OA18463 +18464, OA18464 +18465, OA18465 +18466, OA18466 +18467, OA18467 +18468, OA18468 +18469, OA18469 +18470, OA18470 +18471, OA18471 +18472, OA18472 +18473, OA18473 +18474, OA18474 +18475, OA18475 +18476, OA18476 +18477, OA18477 +18478, OA18478 +18479, OA18479 +18480, OA18480 +18481, OA18481 +18482, OA18482 +18483, OA18483 +18484, OA18484 +18485, OA18485 +18486, OA18486 +18487, OA18487 +18488, OA18488 +18489, OA18489 +18490, OA18490 +18491, OA18491 +18492, OA18492 +18493, OA18493 +18494, OA18494 +18495, OA18495 +18496, OA18496 +18497, OA18497 +18498, OA18498 +18499, OA18499 +18500, OA18500 +18501, OA18501 +18502, OA18502 +18503, OA18503 +18504, OA18504 +18505, OA18505 +18506, OA18506 +18507, OA18507 +18508, OA18508 +18509, OA18509 +18510, OA18510 +18511, OA18511 +18512, OA18512 +18513, OA18513 +18514, OA18514 +18515, OA18515 +18516, OA18516 +18517, OA18517 +18518, OA18518 +18519, OA18519 +18520, OA18520 +18521, OA18521 +18522, OA18522 +18523, OA18523 +18524, OA18524 +18525, OA18525 +18526, OA18526 +18527, OA18527 +18528, OA18528 +18529, OA18529 +18530, OA18530 +18531, OA18531 +18532, OA18532 +18533, OA18533 +18534, OA18534 +18535, OA18535 +18536, OA18536 +18537, OA18537 +18538, OA18538 +18539, OA18539 +18540, OA18540 +18541, OA18541 +18542, OA18542 +18543, OA18543 +18544, OA18544 +18545, OA18545 +18546, OA18546 +18547, OA18547 +18548, OA18548 +18549, OA18549 +18550, OA18550 +18551, OA18551 +18552, OA18552 +18553, OA18553 +18554, OA18554 +18555, OA18555 +18556, OA18556 +18557, OA18557 +18558, OA18558 +18559, OA18559 +18560, OA18560 +18561, OA18561 +18562, OA18562 +18563, OA18563 +18564, OA18564 +18565, OA18565 +18566, OA18566 +18567, OA18567 +18568, OA18568 +18569, OA18569 +18570, OA18570 +18571, OA18571 +18572, OA18572 +18573, OA18573 +18574, OA18574 +18575, OA18575 +18576, OA18576 +18577, OA18577 +18578, OA18578 +18579, OA18579 +18580, OA18580 +18581, OA18581 +18582, OA18582 +18583, OA18583 +18584, OA18584 +18585, OA18585 +18586, OA18586 +18587, OA18587 +18588, OA18588 +18589, OA18589 +18590, OA18590 +18591, OA18591 +18592, OA18592 +18593, OA18593 +18594, OA18594 +18595, OA18595 +18596, OA18596 +18597, OA18597 +18598, OA18598 +18599, OA18599 +18600, OA18600 +18601, OA18601 +18602, OA18602 +18603, OA18603 +18604, OA18604 +18605, OA18605 +18606, OA18606 +18607, OA18607 +18608, OA18608 +18609, OA18609 +18610, OA18610 +18611, OA18611 +18612, OA18612 +18613, OA18613 +18614, OA18614 +18615, OA18615 +18616, OA18616 +18617, OA18617 +18618, OA18618 +18619, OA18619 +18620, OA18620 +18621, OA18621 +18622, OA18622 +18623, OA18623 +18624, OA18624 +18625, OA18625 +18626, OA18626 +18627, OA18627 +18628, OA18628 +18629, OA18629 +18630, OA18630 +18631, OA18631 +18632, OA18632 +18633, OA18633 +18634, OA18634 +18635, OA18635 +18636, OA18636 +18637, OA18637 +18638, OA18638 +18639, OA18639 +18640, OA18640 +18641, OA18641 +18642, OA18642 +18643, OA18643 +18644, OA18644 +18645, OA18645 +18646, OA18646 +18647, OA18647 +18648, OA18648 +18649, OA18649 +18650, OA18650 +18651, OA18651 +18652, OA18652 +18653, OA18653 +18654, OA18654 +18655, OA18655 +18656, OA18656 +18657, OA18657 +18658, OA18658 +18659, OA18659 +18660, OA18660 +18661, OA18661 +18662, OA18662 +18663, OA18663 +18664, OA18664 +18665, OA18665 +18666, OA18666 +18667, OA18667 +18668, OA18668 +18669, OA18669 +18670, OA18670 +18671, OA18671 +18672, OA18672 +18673, OA18673 +18674, OA18674 +18675, OA18675 +18676, OA18676 +18677, OA18677 +18678, OA18678 +18679, OA18679 +18680, OA18680 +18681, OA18681 +18682, OA18682 +18683, OA18683 +18684, OA18684 +18685, OA18685 +18686, OA18686 +18687, OA18687 +18688, OA18688 +18689, OA18689 +18690, OA18690 +18691, OA18691 +18692, OA18692 +18693, OA18693 +18694, OA18694 +18695, OA18695 +18696, OA18696 +18697, OA18697 +18698, OA18698 +18699, OA18699 +18700, OA18700 +18701, OA18701 +18702, OA18702 +18703, OA18703 +18704, OA18704 +18705, OA18705 +18706, OA18706 +18707, OA18707 +18708, OA18708 +18709, OA18709 +18710, OA18710 +18711, OA18711 +18712, OA18712 +18713, OA18713 +18714, OA18714 +18715, OA18715 +18716, OA18716 +18717, OA18717 +18718, OA18718 +18719, OA18719 +18720, OA18720 +18721, OA18721 +18722, OA18722 +18723, OA18723 +18724, OA18724 +18725, OA18725 +18726, OA18726 +18727, OA18727 +18728, OA18728 +18729, OA18729 +18730, OA18730 +18731, OA18731 +18732, OA18732 +18733, OA18733 +18734, OA18734 +18735, OA18735 +18736, OA18736 +18737, OA18737 +18738, OA18738 +18739, OA18739 +18740, OA18740 +18741, OA18741 +18742, OA18742 +18743, OA18743 +18744, OA18744 +18745, OA18745 +18746, OA18746 +18747, OA18747 +18748, OA18748 +18749, OA18749 +18750, OA18750 +18751, OA18751 +18752, OA18752 +18753, OA18753 +18754, OA18754 +18755, OA18755 +18756, OA18756 +18757, OA18757 +18758, OA18758 +18759, OA18759 +18760, OA18760 +18761, OA18761 +18762, OA18762 +18763, OA18763 +18764, OA18764 +18765, OA18765 +18766, OA18766 +18767, OA18767 +18768, OA18768 +18769, OA18769 +18770, OA18770 +18771, OA18771 +18772, OA18772 +18773, OA18773 +18774, OA18774 +18775, OA18775 +18776, OA18776 +18777, OA18777 +18778, OA18778 +18779, OA18779 +18780, OA18780 +18781, OA18781 +18782, OA18782 +18783, OA18783 +18784, OA18784 +18785, OA18785 +18786, OA18786 +18787, OA18787 +18788, OA18788 +18789, OA18789 +18790, OA18790 +18791, OA18791 +18792, OA18792 +18793, OA18793 +18794, OA18794 +18795, OA18795 +18796, OA18796 +18797, OA18797 +18798, OA18798 +18799, OA18799 +18800, OA18800 +18801, OA18801 +18802, OA18802 +18803, OA18803 +18804, OA18804 +18805, OA18805 +18806, OA18806 +18807, OA18807 +18808, OA18808 +18809, OA18809 +18810, OA18810 +18811, OA18811 +18812, OA18812 +18813, OA18813 +18814, OA18814 +18815, OA18815 +18816, OA18816 +18817, OA18817 +18818, OA18818 +18819, OA18819 +18820, OA18820 +18821, OA18821 +18822, OA18822 +18823, OA18823 +18824, OA18824 +18825, OA18825 +18826, OA18826 +18827, OA18827 +18828, OA18828 +18829, OA18829 +18830, OA18830 +18831, OA18831 +18832, OA18832 +18833, OA18833 +18834, OA18834 +18835, OA18835 +18836, OA18836 +18837, OA18837 +18838, OA18838 +18839, OA18839 +18840, OA18840 +18841, OA18841 +18842, OA18842 +18843, OA18843 +18844, OA18844 +18845, OA18845 +18846, OA18846 +18847, OA18847 +18848, OA18848 +18849, OA18849 +18850, OA18850 +18851, OA18851 +18852, OA18852 +18853, OA18853 +18854, OA18854 +18855, OA18855 +18856, OA18856 +18857, OA18857 +18858, OA18858 +18859, OA18859 +18860, OA18860 +18861, OA18861 +18862, OA18862 +18863, OA18863 +18864, OA18864 +18865, OA18865 +18866, OA18866 +18867, OA18867 +18868, OA18868 +18869, OA18869 +18870, OA18870 +18871, OA18871 +18872, OA18872 +18873, OA18873 +18874, OA18874 +18875, OA18875 +18876, OA18876 +18877, OA18877 +18878, OA18878 +18879, OA18879 +18880, OA18880 +18881, OA18881 +18882, OA18882 +18883, OA18883 +18884, OA18884 +18885, OA18885 +18886, OA18886 +18887, OA18887 +18888, OA18888 +18889, OA18889 +18890, OA18890 +18891, OA18891 +18892, OA18892 +18893, OA18893 +18894, OA18894 +18895, OA18895 +18896, OA18896 +18897, OA18897 +18898, OA18898 +18899, OA18899 +18900, OA18900 +18901, OA18901 +18902, OA18902 +18903, OA18903 +18904, OA18904 +18905, OA18905 +18906, OA18906 +18907, OA18907 +18908, OA18908 +18909, OA18909 +18910, OA18910 +18911, OA18911 +18912, OA18912 +18913, OA18913 +18914, OA18914 +18915, OA18915 +18916, OA18916 +18917, OA18917 +18918, OA18918 +18919, OA18919 +18920, OA18920 +18921, OA18921 +18922, OA18922 +18923, OA18923 +18924, OA18924 +18925, OA18925 +18926, OA18926 +18927, OA18927 +18928, OA18928 +18929, OA18929 +18930, OA18930 +18931, OA18931 +18932, OA18932 +18933, OA18933 +18934, OA18934 +18935, OA18935 +18936, OA18936 +18937, OA18937 +18938, OA18938 +18939, OA18939 +18940, OA18940 +18941, OA18941 +18942, OA18942 +18943, OA18943 +18944, OA18944 +18945, OA18945 +18946, OA18946 +18947, OA18947 +18948, OA18948 +18949, OA18949 +18950, OA18950 +18951, OA18951 +18952, OA18952 +18953, OA18953 +18954, OA18954 +18955, OA18955 +18956, OA18956 +18957, OA18957 +18958, OA18958 +18959, OA18959 +18960, OA18960 +18961, OA18961 +18962, OA18962 +18963, OA18963 +18964, OA18964 +18965, OA18965 +18966, OA18966 +18967, OA18967 +18968, OA18968 +18969, OA18969 +18970, OA18970 +18971, OA18971 +18972, OA18972 +18973, OA18973 +18974, OA18974 +18975, OA18975 +18976, OA18976 +18977, OA18977 +18978, OA18978 +18979, OA18979 +18980, OA18980 +18981, OA18981 +18982, OA18982 +18983, OA18983 +18984, OA18984 +18985, OA18985 +18986, OA18986 +18987, OA18987 +18988, OA18988 +18989, OA18989 +18990, OA18990 +18991, OA18991 +18992, OA18992 +18993, OA18993 +18994, OA18994 +18995, OA18995 +18996, OA18996 +18997, OA18997 +18998, OA18998 +18999, OA18999 +19000, OA19000 +19001, OA19001 +19002, OA19002 +19003, OA19003 +19004, OA19004 +19005, OA19005 +19006, OA19006 +19007, OA19007 +19008, OA19008 +19009, OA19009 +19010, OA19010 +19011, OA19011 +19012, OA19012 +19013, OA19013 +19014, OA19014 +19015, OA19015 +19016, OA19016 +19017, OA19017 +19018, OA19018 +19019, OA19019 +19020, OA19020 +19021, OA19021 +19022, OA19022 +19023, OA19023 +19024, OA19024 +19025, OA19025 +19026, OA19026 +19027, OA19027 +19028, OA19028 +19029, OA19029 +19030, OA19030 +19031, OA19031 +19032, OA19032 +19033, OA19033 +19034, OA19034 +19035, OA19035 +19036, OA19036 +19037, OA19037 +19038, OA19038 +19039, OA19039 +19040, OA19040 +19041, OA19041 +19042, OA19042 +19043, OA19043 +19044, OA19044 +19045, OA19045 +19046, OA19046 +19047, OA19047 +19048, OA19048 +19049, OA19049 +19050, OA19050 +19051, OA19051 +19052, OA19052 +19053, OA19053 +19054, OA19054 +19055, OA19055 +19056, OA19056 +19057, OA19057 +19058, OA19058 +19059, OA19059 +19060, OA19060 +19061, OA19061 +19062, OA19062 +19063, OA19063 +19064, OA19064 +19065, OA19065 +19066, OA19066 +19067, OA19067 +19068, OA19068 +19069, OA19069 +19070, OA19070 +19071, OA19071 +19072, OA19072 +19073, OA19073 +19074, OA19074 +19075, OA19075 +19076, OA19076 +19077, OA19077 +19078, OA19078 +19079, OA19079 +19080, OA19080 +19081, OA19081 +19082, OA19082 +19083, OA19083 +19084, OA19084 +19085, OA19085 +19086, OA19086 +19087, OA19087 +19088, OA19088 +19089, OA19089 +19090, OA19090 +19091, OA19091 +19092, OA19092 +19093, OA19093 +19094, OA19094 +19095, OA19095 +19096, OA19096 +19097, OA19097 +19098, OA19098 +19099, OA19099 +19100, OA19100 +19101, OA19101 +19102, OA19102 +19103, OA19103 +19104, OA19104 +19105, OA19105 +19106, OA19106 +19107, OA19107 +19108, OA19108 +19109, OA19109 +19110, OA19110 +19111, OA19111 +19112, OA19112 +19113, OA19113 +19114, OA19114 +19115, OA19115 +19116, OA19116 +19117, OA19117 +19118, OA19118 +19119, OA19119 +19120, OA19120 +19121, OA19121 +19122, OA19122 +19123, OA19123 +19124, OA19124 +19125, OA19125 +19126, OA19126 +19127, OA19127 +19128, OA19128 +19129, OA19129 +19130, OA19130 +19131, OA19131 +19132, OA19132 +19133, OA19133 +19134, OA19134 +19135, OA19135 +19136, OA19136 +19137, OA19137 +19138, OA19138 +19139, OA19139 +19140, OA19140 +19141, OA19141 +19142, OA19142 +19143, OA19143 +19144, OA19144 +19145, OA19145 +19146, OA19146 +19147, OA19147 +19148, OA19148 +19149, OA19149 +19150, OA19150 +19151, OA19151 +19152, OA19152 +19153, OA19153 +19154, OA19154 +19155, OA19155 +19156, OA19156 +19157, OA19157 +19158, OA19158 +19159, OA19159 +19160, OA19160 +19161, OA19161 +19162, OA19162 +19163, OA19163 +19164, OA19164 +19165, OA19165 +19166, OA19166 +19167, OA19167 +19168, OA19168 +19169, OA19169 +19170, OA19170 +19171, OA19171 +19172, OA19172 +19173, OA19173 +19174, OA19174 +19175, OA19175 +19176, OA19176 +19177, OA19177 +19178, OA19178 +19179, OA19179 +19180, OA19180 +19181, OA19181 +19182, OA19182 +19183, OA19183 +19184, OA19184 +19185, OA19185 +19186, OA19186 +19187, OA19187 +19188, OA19188 +19189, OA19189 +19190, OA19190 +19191, OA19191 +19192, OA19192 +19193, OA19193 +19194, OA19194 +19195, OA19195 +19196, OA19196 +19197, OA19197 +19198, OA19198 +19199, OA19199 +19200, OA19200 +19201, OA19201 +19202, OA19202 +19203, OA19203 +19204, OA19204 +19205, OA19205 +19206, OA19206 +19207, OA19207 +19208, OA19208 +19209, OA19209 +19210, OA19210 +19211, OA19211 +19212, OA19212 +19213, OA19213 +19214, OA19214 +19215, OA19215 +19216, OA19216 +19217, OA19217 +19218, OA19218 +19219, OA19219 +19220, OA19220 +19221, OA19221 +19222, OA19222 +19223, OA19223 +19224, OA19224 +19225, OA19225 +19226, OA19226 +19227, OA19227 +19228, OA19228 +19229, OA19229 +19230, OA19230 +19231, OA19231 +19232, OA19232 +19233, OA19233 +19234, OA19234 +19235, OA19235 +19236, OA19236 +19237, OA19237 +19238, OA19238 +19239, OA19239 +19240, OA19240 +19241, OA19241 +19242, OA19242 +19243, OA19243 +19244, OA19244 +19245, OA19245 +19246, OA19246 +19247, OA19247 +19248, OA19248 +19249, OA19249 +19250, OA19250 +19251, OA19251 +19252, OA19252 +19253, OA19253 +19254, OA19254 +19255, OA19255 +19256, OA19256 +19257, OA19257 +19258, OA19258 +19259, OA19259 +19260, OA19260 +19261, OA19261 +19262, OA19262 +19263, OA19263 +19264, OA19264 +19265, OA19265 +19266, OA19266 +19267, OA19267 +19268, OA19268 +19269, OA19269 +19270, OA19270 +19271, OA19271 +19272, OA19272 +19273, OA19273 +19274, OA19274 +19275, OA19275 +19276, OA19276 +19277, OA19277 +19278, OA19278 +19279, OA19279 +19280, OA19280 +19281, OA19281 +19282, OA19282 +19283, OA19283 +19284, OA19284 +19285, OA19285 +19286, OA19286 +19287, OA19287 +19288, OA19288 +19289, OA19289 +19290, OA19290 +19291, OA19291 +19292, OA19292 +19293, OA19293 +19294, OA19294 +19295, OA19295 +19296, OA19296 +19297, OA19297 +19298, OA19298 +19299, OA19299 +19300, OA19300 +19301, OA19301 +19302, OA19302 +19303, OA19303 +19304, OA19304 +19305, OA19305 +19306, OA19306 +19307, OA19307 +19308, OA19308 +19309, OA19309 +19310, OA19310 +19311, OA19311 +19312, OA19312 +19313, OA19313 +19314, OA19314 +19315, OA19315 +19316, OA19316 +19317, OA19317 +19318, OA19318 +19319, OA19319 +19320, OA19320 +19321, OA19321 +19322, OA19322 +19323, OA19323 +19324, OA19324 +19325, OA19325 +19326, OA19326 +19327, OA19327 +19328, OA19328 +19329, OA19329 +19330, OA19330 +19331, OA19331 +19332, OA19332 +19333, OA19333 +19334, OA19334 +19335, OA19335 +19336, OA19336 +19337, OA19337 +19338, OA19338 +19339, OA19339 +19340, OA19340 +19341, OA19341 +19342, OA19342 +19343, OA19343 +19344, OA19344 +19345, OA19345 +19346, OA19346 +19347, OA19347 +19348, OA19348 +19349, OA19349 +19350, OA19350 +19351, OA19351 +19352, OA19352 +19353, OA19353 +19354, OA19354 +19355, OA19355 +19356, OA19356 +19357, OA19357 +19358, OA19358 +19359, OA19359 +19360, OA19360 +19361, OA19361 +19362, OA19362 +19363, OA19363 +19364, OA19364 +19365, OA19365 +19366, OA19366 +19367, OA19367 +19368, OA19368 +19369, OA19369 +19370, OA19370 +19371, OA19371 +19372, OA19372 +19373, OA19373 +19374, OA19374 +19375, OA19375 +19376, OA19376 +19377, OA19377 +19378, OA19378 +19379, OA19379 +19380, OA19380 +19381, OA19381 +19382, OA19382 +19383, OA19383 +19384, OA19384 +19385, OA19385 +19386, OA19386 +19387, OA19387 +19388, OA19388 +19389, OA19389 +19390, OA19390 +19391, OA19391 +19392, OA19392 +19393, OA19393 +19394, OA19394 +19395, OA19395 +19396, OA19396 +19397, OA19397 +19398, OA19398 +19399, OA19399 +19400, OA19400 +19401, OA19401 +19402, OA19402 +19403, OA19403 +19404, OA19404 +19405, OA19405 +19406, OA19406 +19407, OA19407 +19408, OA19408 +19409, OA19409 +19410, OA19410 +19411, OA19411 +19412, OA19412 +19413, OA19413 +19414, OA19414 +19415, OA19415 +19416, OA19416 +19417, OA19417 +19418, OA19418 +19419, OA19419 +19420, OA19420 +19421, OA19421 +19422, OA19422 +19423, OA19423 +19424, OA19424 +19425, OA19425 +19426, OA19426 +19427, OA19427 +19428, OA19428 +19429, OA19429 +19430, OA19430 +19431, OA19431 +19432, OA19432 +19433, OA19433 +19434, OA19434 +19435, OA19435 +19436, OA19436 +19437, OA19437 +19438, OA19438 +19439, OA19439 +19440, OA19440 +19441, OA19441 +19442, OA19442 +19443, OA19443 +19444, OA19444 +19445, OA19445 +19446, OA19446 +19447, OA19447 +19448, OA19448 +19449, OA19449 +19450, OA19450 +19451, OA19451 +19452, OA19452 +19453, OA19453 +19454, OA19454 +19455, OA19455 +19456, OA19456 +19457, OA19457 +19458, OA19458 +19459, OA19459 +19460, OA19460 +19461, OA19461 +19462, OA19462 +19463, OA19463 +19464, OA19464 +19465, OA19465 +19466, OA19466 +19467, OA19467 +19468, OA19468 +19469, OA19469 +19470, OA19470 +19471, OA19471 +19472, OA19472 +19473, OA19473 +19474, OA19474 +19475, OA19475 +19476, OA19476 +19477, OA19477 +19478, OA19478 +19479, OA19479 +19480, OA19480 +19481, OA19481 +19482, OA19482 +19483, OA19483 +19484, OA19484 +19485, OA19485 +19486, OA19486 +19487, OA19487 +19488, OA19488 +19489, OA19489 +19490, OA19490 +19491, OA19491 +19492, OA19492 +19493, OA19493 +19494, OA19494 +19495, OA19495 +19496, OA19496 +19497, OA19497 +19498, OA19498 +19499, OA19499 +19500, OA19500 +19501, OA19501 +19502, OA19502 +19503, OA19503 +19504, OA19504 +19505, OA19505 +19506, OA19506 +19507, OA19507 +19508, OA19508 +19509, OA19509 +19510, OA19510 +19511, OA19511 +19512, OA19512 +19513, OA19513 +19514, OA19514 +19515, OA19515 +19516, OA19516 +19517, OA19517 +19518, OA19518 +19519, OA19519 +19520, OA19520 +19521, OA19521 +19522, OA19522 +19523, OA19523 +19524, OA19524 +19525, OA19525 +19526, OA19526 +19527, OA19527 +19528, OA19528 +19529, OA19529 +19530, OA19530 +19531, OA19531 +19532, OA19532 +19533, OA19533 +19534, OA19534 +19535, OA19535 +19536, OA19536 +19537, OA19537 +19538, OA19538 +19539, OA19539 +19540, OA19540 +19541, OA19541 +19542, OA19542 +19543, OA19543 +19544, OA19544 +19545, OA19545 +19546, OA19546 +19547, OA19547 +19548, OA19548 +19549, OA19549 +19550, OA19550 +19551, OA19551 +19552, OA19552 +19553, OA19553 +19554, OA19554 +19555, OA19555 +19556, OA19556 +19557, OA19557 +19558, OA19558 +19559, OA19559 +19560, OA19560 +19561, OA19561 +19562, OA19562 +19563, OA19563 +19564, OA19564 +19565, OA19565 +19566, OA19566 +19567, OA19567 +19568, OA19568 +19569, OA19569 +19570, OA19570 +19571, OA19571 +19572, OA19572 +19573, OA19573 +19574, OA19574 +19575, OA19575 +19576, OA19576 +19577, OA19577 +19578, OA19578 +19579, OA19579 +19580, OA19580 +19581, OA19581 +19582, OA19582 +19583, OA19583 +19584, OA19584 +19585, OA19585 +19586, OA19586 +19587, OA19587 +19588, OA19588 +19589, OA19589 +19590, OA19590 +19591, OA19591 +19592, OA19592 +19593, OA19593 +19594, OA19594 +19595, OA19595 +19596, OA19596 +19597, OA19597 +19598, OA19598 +19599, OA19599 +19600, OA19600 +19601, OA19601 +19602, OA19602 +19603, OA19603 +19604, OA19604 +19605, OA19605 +19606, OA19606 +19607, OA19607 +19608, OA19608 +19609, OA19609 +19610, OA19610 +19611, OA19611 +19612, OA19612 +19613, OA19613 +19614, OA19614 +19615, OA19615 +19616, OA19616 +19617, OA19617 +19618, OA19618 +19619, OA19619 +19620, OA19620 +19621, OA19621 +19622, OA19622 +19623, OA19623 +19624, OA19624 +19625, OA19625 +19626, OA19626 +19627, OA19627 +19628, OA19628 +19629, OA19629 +19630, OA19630 +19631, OA19631 +19632, OA19632 +19633, OA19633 +19634, OA19634 +19635, OA19635 +19636, OA19636 +19637, OA19637 +19638, OA19638 +19639, OA19639 +19640, OA19640 +19641, OA19641 +19642, OA19642 +19643, OA19643 +19644, OA19644 +19645, OA19645 +19646, OA19646 +19647, OA19647 +19648, OA19648 +19649, OA19649 +19650, OA19650 +19651, OA19651 +19652, OA19652 +19653, OA19653 +19654, OA19654 +19655, OA19655 +19656, OA19656 +19657, OA19657 +19658, OA19658 +19659, OA19659 +19660, OA19660 +19661, OA19661 +19662, OA19662 +19663, OA19663 +19664, OA19664 +19665, OA19665 +19666, OA19666 +19667, OA19667 +19668, OA19668 +19669, OA19669 +19670, OA19670 +19671, OA19671 +19672, OA19672 +19673, OA19673 +19674, OA19674 +19675, OA19675 +19676, OA19676 +19677, OA19677 +19678, OA19678 +19679, OA19679 +19680, OA19680 +19681, OA19681 +19682, OA19682 +19683, OA19683 +19684, OA19684 +19685, OA19685 +19686, OA19686 +19687, OA19687 +19688, OA19688 +19689, OA19689 +19690, OA19690 +19691, OA19691 +19692, OA19692 +19693, OA19693 +19694, OA19694 +19695, OA19695 +19696, OA19696 +19697, OA19697 +19698, OA19698 +19699, OA19699 +19700, OA19700 +19701, OA19701 +19702, OA19702 +19703, OA19703 +19704, OA19704 +19705, OA19705 +19706, OA19706 +19707, OA19707 +19708, OA19708 +19709, OA19709 +19710, OA19710 +19711, OA19711 +19712, OA19712 +19713, OA19713 +19714, OA19714 +19715, OA19715 +19716, OA19716 +19717, OA19717 +19718, OA19718 +19719, OA19719 +19720, OA19720 +19721, OA19721 +19722, OA19722 +19723, OA19723 +19724, OA19724 +19725, OA19725 +19726, OA19726 +19727, OA19727 +19728, OA19728 +19729, OA19729 +19730, OA19730 +19731, OA19731 +19732, OA19732 +19733, OA19733 +19734, OA19734 +19735, OA19735 +19736, OA19736 +19737, OA19737 +19738, OA19738 +19739, OA19739 +19740, OA19740 +19741, OA19741 +19742, OA19742 +19743, OA19743 +19744, OA19744 +19745, OA19745 +19746, OA19746 +19747, OA19747 +19748, OA19748 +19749, OA19749 +19750, OA19750 +19751, OA19751 +19752, OA19752 +19753, OA19753 +19754, OA19754 +19755, OA19755 +19756, OA19756 +19757, OA19757 +19758, OA19758 +19759, OA19759 +19760, OA19760 +19761, OA19761 +19762, OA19762 +19763, OA19763 +19764, OA19764 +19765, OA19765 +19766, OA19766 +19767, OA19767 +19768, OA19768 +19769, OA19769 +19770, OA19770 +19771, OA19771 +19772, OA19772 +19773, OA19773 +19774, OA19774 +19775, OA19775 +19776, OA19776 +19777, OA19777 +19778, OA19778 +19779, OA19779 +19780, OA19780 +19781, OA19781 +19782, OA19782 +19783, OA19783 +19784, OA19784 +19785, OA19785 +19786, OA19786 +19787, OA19787 +19788, OA19788 +19789, OA19789 +19790, OA19790 +19791, OA19791 +19792, OA19792 +19793, OA19793 +19794, OA19794 +19795, OA19795 +19796, OA19796 +19797, OA19797 +19798, OA19798 +19799, OA19799 +19800, OA19800 +19801, OA19801 +19802, OA19802 +19803, OA19803 +19804, OA19804 +19805, OA19805 +19806, OA19806 +19807, OA19807 +19808, OA19808 +19809, OA19809 +19810, OA19810 +19811, OA19811 +19812, OA19812 +19813, OA19813 +19814, OA19814 +19815, OA19815 +19816, OA19816 +19817, OA19817 +19818, OA19818 +19819, OA19819 +19820, OA19820 +19821, OA19821 +19822, OA19822 +19823, OA19823 +19824, OA19824 +19825, OA19825 +19826, OA19826 +19827, OA19827 +19828, OA19828 +19829, OA19829 +19830, OA19830 +19831, OA19831 +19832, OA19832 +19833, OA19833 +19834, OA19834 +19835, OA19835 +19836, OA19836 +19837, OA19837 +19838, OA19838 +19839, OA19839 +19840, OA19840 +19841, OA19841 +19842, OA19842 +19843, OA19843 +19844, OA19844 +19845, OA19845 +19846, OA19846 +19847, OA19847 +19848, OA19848 +19849, OA19849 +19850, OA19850 +19851, OA19851 +19852, OA19852 +19853, OA19853 +19854, OA19854 +19855, OA19855 +19856, OA19856 +19857, OA19857 +19858, OA19858 +19859, OA19859 +19860, OA19860 +19861, OA19861 +19862, OA19862 +19863, OA19863 +19864, OA19864 +19865, OA19865 +19866, OA19866 +19867, OA19867 +19868, OA19868 +19869, OA19869 +19870, OA19870 +19871, OA19871 +19872, OA19872 +19873, OA19873 +19874, OA19874 +19875, OA19875 +19876, OA19876 +19877, OA19877 +19878, OA19878 +19879, OA19879 +19880, OA19880 +19881, OA19881 +19882, OA19882 +19883, OA19883 +19884, OA19884 +19885, OA19885 +19886, OA19886 +19887, OA19887 +19888, OA19888 +19889, OA19889 +19890, OA19890 +19891, OA19891 +19892, OA19892 +19893, OA19893 +19894, OA19894 +19895, OA19895 +19896, OA19896 +19897, OA19897 +19898, OA19898 +19899, OA19899 +19900, OA19900 +19901, OA19901 +19902, OA19902 +19903, OA19903 +19904, OA19904 +19905, OA19905 +19906, OA19906 +19907, OA19907 +19908, OA19908 +19909, OA19909 +19910, OA19910 +19911, OA19911 +19912, OA19912 +19913, OA19913 +19914, OA19914 +19915, OA19915 +19916, OA19916 +19917, OA19917 +19918, OA19918 +19919, OA19919 +19920, OA19920 +19921, OA19921 +19922, OA19922 +19923, OA19923 +19924, OA19924 +19925, OA19925 +19926, OA19926 +19927, OA19927 +19928, OA19928 +19929, OA19929 +19930, OA19930 +19931, OA19931 +19932, OA19932 +19933, OA19933 +19934, OA19934 +19935, OA19935 +19936, OA19936 +19937, OA19937 +19938, OA19938 +19939, OA19939 +19940, OA19940 +19941, OA19941 +19942, OA19942 +19943, OA19943 +19944, OA19944 +19945, OA19945 +19946, OA19946 +19947, OA19947 +19948, OA19948 +19949, OA19949 +19950, OA19950 +19951, OA19951 +19952, OA19952 +19953, OA19953 +19954, OA19954 +19955, OA19955 +19956, OA19956 +19957, OA19957 +19958, OA19958 +19959, OA19959 +19960, OA19960 +19961, OA19961 +19962, OA19962 +19963, OA19963 +19964, OA19964 +19965, OA19965 +19966, OA19966 +19967, OA19967 +19968, OA19968 +19969, OA19969 +19970, OA19970 +19971, OA19971 +19972, OA19972 +19973, OA19973 +19974, OA19974 +19975, OA19975 +19976, OA19976 +19977, OA19977 +19978, OA19978 +19979, OA19979 +19980, OA19980 +19981, OA19981 +19982, OA19982 +19983, OA19983 +19984, OA19984 +19985, OA19985 +19986, OA19986 +19987, OA19987 +19988, OA19988 +19989, OA19989 +19990, OA19990 +19991, OA19991 +19992, OA19992 +19993, OA19993 +19994, OA19994 +19995, OA19995 +19996, OA19996 +19997, OA19997 +19998, OA19998 +19999, OA19999 +20000, OA20000 +20001, OA20001 +20002, OA20002 +20003, OA20003 +20004, OA20004 +20005, OA20005 +20006, OA20006 +20007, OA20007 +20008, OA20008 +20009, OA20009 +20010, OA20010 +20011, OA20011 +20012, OA20012 +20013, OA20013 +20014, OA20014 +20015, OA20015 +20016, OA20016 +20017, OA20017 +20018, OA20018 +20019, OA20019 +20020, OA20020 +20021, OA20021 +20022, OA20022 +20023, OA20023 +20024, OA20024 +20025, OA20025 +20026, OA20026 +20027, OA20027 +20028, OA20028 +20029, OA20029 +20030, OA20030 +20031, OA20031 +20032, OA20032 +20033, OA20033 +20034, OA20034 +20035, OA20035 +20036, OA20036 +20037, OA20037 +20038, OA20038 +20039, OA20039 +20040, OA20040 +20041, OA20041 +20042, OA20042 +20043, OA20043 +20044, OA20044 +20045, OA20045 +20046, OA20046 +20047, OA20047 +20048, OA20048 +20049, OA20049 +20050, OA20050 +20051, OA20051 +20052, OA20052 +20053, OA20053 +20054, OA20054 +20055, OA20055 +20056, OA20056 +20057, OA20057 +20058, OA20058 +20059, OA20059 +20060, OA20060 +20061, OA20061 +20062, OA20062 +20063, OA20063 +20064, OA20064 +20065, OA20065 +20066, OA20066 +20067, OA20067 +20068, OA20068 +20069, OA20069 +20070, OA20070 +20071, OA20071 +20072, OA20072 +20073, OA20073 +20074, OA20074 +20075, OA20075 +20076, OA20076 +20077, OA20077 +20078, OA20078 +20079, OA20079 +20080, OA20080 +20081, OA20081 +20082, OA20082 +20083, OA20083 +20084, OA20084 +20085, OA20085 +20086, OA20086 +20087, OA20087 +20088, OA20088 +20089, OA20089 +20090, OA20090 +20091, OA20091 +20092, OA20092 +20093, OA20093 +20094, OA20094 +20095, OA20095 +20096, OA20096 +20097, OA20097 +20098, OA20098 +20099, OA20099 +20100, OA20100 +20101, OA20101 +20102, OA20102 +20103, OA20103 +20104, OA20104 +20105, OA20105 +20106, OA20106 +20107, OA20107 +20108, OA20108 +20109, OA20109 +20110, OA20110 +20111, OA20111 +20112, OA20112 +20113, OA20113 +20114, OA20114 +20115, OA20115 +20116, OA20116 +20117, OA20117 +20118, OA20118 +20119, OA20119 +20120, OA20120 +20121, OA20121 +20122, OA20122 +20123, OA20123 +20124, OA20124 +20125, OA20125 +20126, OA20126 +20127, OA20127 +20128, OA20128 +20129, OA20129 +20130, OA20130 +20131, OA20131 +20132, OA20132 +20133, OA20133 +20134, OA20134 +20135, OA20135 +20136, OA20136 +20137, OA20137 +20138, OA20138 +20139, OA20139 +20140, OA20140 +20141, OA20141 +20142, OA20142 +20143, OA20143 +20144, OA20144 +20145, OA20145 +20146, OA20146 +20147, OA20147 +20148, OA20148 +20149, OA20149 +20150, OA20150 +20151, OA20151 +20152, OA20152 +20153, OA20153 +20154, OA20154 +20155, OA20155 +20156, OA20156 +20157, OA20157 +20158, OA20158 +20159, OA20159 +20160, OA20160 +20161, OA20161 +20162, OA20162 +20163, OA20163 +20164, OA20164 +20165, OA20165 +20166, OA20166 +20167, OA20167 +20168, OA20168 +20169, OA20169 +20170, OA20170 +20171, OA20171 +20172, OA20172 +20173, OA20173 +20174, OA20174 +20175, OA20175 +20176, OA20176 +20177, OA20177 +20178, OA20178 +20179, OA20179 +20180, OA20180 +20181, OA20181 +20182, OA20182 +20183, OA20183 +20184, OA20184 +20185, OA20185 +20186, OA20186 +20187, OA20187 +20188, OA20188 +20189, OA20189 +20190, OA20190 +20191, OA20191 +20192, OA20192 +20193, OA20193 +20194, OA20194 +20195, OA20195 +20196, OA20196 +20197, OA20197 +20198, OA20198 +20199, OA20199 +20200, OA20200 +20201, OA20201 +20202, OA20202 +20203, OA20203 +20204, OA20204 +20205, OA20205 +20206, OA20206 +20207, OA20207 +20208, OA20208 +20209, OA20209 +20210, OA20210 +20211, OA20211 +20212, OA20212 +20213, OA20213 +20214, OA20214 +20215, OA20215 +20216, OA20216 +20217, OA20217 +20218, OA20218 +20219, OA20219 +20220, OA20220 +20221, OA20221 +20222, OA20222 +20223, OA20223 +20224, OA20224 +20225, OA20225 +20226, OA20226 +20227, OA20227 +20228, OA20228 +20229, OA20229 +20230, OA20230 +20231, OA20231 +20232, OA20232 +20233, OA20233 +20234, OA20234 +20235, OA20235 +20236, OA20236 +20237, OA20237 +20238, OA20238 +20239, OA20239 +20240, OA20240 +20241, OA20241 +20242, OA20242 +20243, OA20243 +20244, OA20244 +20245, OA20245 +20246, OA20246 +20247, OA20247 +20248, OA20248 +20249, OA20249 +20250, OA20250 +20251, OA20251 +20252, OA20252 +20253, OA20253 +20254, OA20254 +20255, OA20255 +20256, OA20256 +20257, OA20257 +20258, OA20258 +20259, OA20259 +20260, OA20260 +20261, OA20261 +20262, OA20262 +20263, OA20263 +20264, OA20264 +20265, OA20265 +20266, OA20266 +20267, OA20267 +20268, OA20268 +20269, OA20269 +20270, OA20270 +20271, OA20271 +20272, OA20272 +20273, OA20273 +20274, OA20274 +20275, OA20275 +20276, OA20276 +20277, OA20277 +20278, OA20278 +20279, OA20279 +20280, OA20280 +20281, OA20281 +20282, OA20282 +20283, OA20283 +20284, OA20284 +20285, OA20285 +20286, OA20286 +20287, OA20287 +20288, OA20288 +20289, OA20289 +20290, OA20290 +20291, OA20291 +20292, OA20292 +20293, OA20293 +20294, OA20294 +20295, OA20295 +20296, OA20296 +20297, OA20297 +20298, OA20298 +20299, OA20299 +20300, OA20300 +20301, OA20301 +20302, OA20302 +20303, OA20303 +20304, OA20304 +20305, OA20305 +20306, OA20306 +20307, OA20307 +20308, OA20308 +20309, OA20309 +20310, OA20310 +20311, OA20311 +20312, OA20312 +20313, OA20313 +20314, OA20314 +20315, OA20315 +20316, OA20316 +20317, OA20317 +20318, OA20318 +20319, OA20319 +20320, OA20320 +20321, OA20321 +20322, OA20322 +20323, OA20323 +20324, OA20324 +20325, OA20325 +20326, OA20326 +20327, OA20327 +20328, OA20328 +20329, OA20329 +20330, OA20330 +20331, OA20331 +20332, OA20332 +20333, OA20333 +20334, OA20334 +20335, OA20335 +20336, OA20336 +20337, OA20337 +20338, OA20338 +20339, OA20339 +20340, OA20340 +20341, OA20341 +20342, OA20342 +20343, OA20343 +20344, OA20344 +20345, OA20345 +20346, OA20346 +20347, OA20347 +20348, OA20348 +20349, OA20349 +20350, OA20350 +20351, OA20351 +20352, OA20352 +20353, OA20353 +20354, OA20354 +20355, OA20355 +20356, OA20356 +20357, OA20357 +20358, OA20358 +20359, OA20359 +20360, OA20360 +20361, OA20361 +20362, OA20362 +20363, OA20363 +20364, OA20364 +20365, OA20365 +20366, OA20366 +20367, OA20367 +20368, OA20368 +20369, OA20369 +20370, OA20370 +20371, OA20371 +20372, OA20372 +20373, OA20373 +20374, OA20374 +20375, OA20375 +20376, OA20376 +20377, OA20377 +20378, OA20378 +20379, OA20379 +20380, OA20380 +20381, OA20381 +20382, OA20382 +20383, OA20383 +20384, OA20384 +20385, OA20385 +20386, OA20386 +20387, OA20387 +20388, OA20388 +20389, OA20389 +20390, OA20390 +20391, OA20391 +20392, OA20392 +20393, OA20393 +20394, OA20394 +20395, OA20395 +20396, OA20396 +20397, OA20397 +20398, OA20398 +20399, OA20399 +20400, OA20400 +20401, OA20401 +20402, OA20402 +20403, OA20403 +20404, OA20404 +20405, OA20405 +20406, OA20406 +20407, OA20407 +20408, OA20408 +20409, OA20409 +20410, OA20410 +20411, OA20411 +20412, OA20412 +20413, OA20413 +20414, OA20414 +20415, OA20415 +20416, OA20416 +20417, OA20417 +20418, OA20418 +20419, OA20419 +20420, OA20420 +20421, OA20421 +20422, OA20422 +20423, OA20423 +20424, OA20424 +20425, OA20425 +20426, OA20426 +20427, OA20427 +20428, OA20428 +20429, OA20429 +20430, OA20430 +20431, OA20431 +20432, OA20432 +20433, OA20433 +20434, OA20434 +20435, OA20435 +20436, OA20436 +20437, OA20437 +20438, OA20438 +20439, OA20439 +20440, OA20440 +20441, OA20441 +20442, OA20442 +20443, OA20443 +20444, OA20444 +20445, OA20445 +20446, OA20446 +20447, OA20447 +20448, OA20448 +20449, OA20449 +20450, OA20450 +20451, OA20451 +20452, OA20452 +20453, OA20453 +20454, OA20454 +20455, OA20455 +20456, OA20456 +20457, OA20457 +20458, OA20458 +20459, OA20459 +20460, OA20460 +20461, OA20461 +20462, OA20462 +20463, OA20463 +20464, OA20464 +20465, OA20465 +20466, OA20466 +20467, OA20467 +20468, OA20468 +20469, OA20469 +20470, OA20470 +20471, OA20471 +20472, OA20472 +20473, OA20473 +20474, OA20474 +20475, OA20475 +20476, OA20476 +20477, OA20477 +20478, OA20478 +20479, OA20479 +20480, OA20480 +20481, OA20481 +20482, OA20482 +20483, OA20483 +20484, OA20484 +20485, OA20485 +20486, OA20486 +20487, OA20487 +20488, OA20488 +20489, OA20489 +20490, OA20490 +20491, OA20491 +20492, OA20492 +20493, OA20493 +20494, OA20494 +20495, OA20495 +20496, OA20496 +20497, OA20497 +20498, OA20498 +20499, OA20499 +20500, OA20500 +20501, OA20501 +20502, OA20502 +20503, OA20503 +20504, OA20504 +20505, OA20505 +20506, OA20506 +20507, OA20507 +20508, OA20508 +20509, OA20509 +20510, OA20510 +20511, OA20511 +20512, OA20512 +20513, OA20513 +20514, OA20514 +20515, OA20515 +20516, OA20516 +20517, OA20517 +20518, OA20518 +20519, OA20519 +20520, OA20520 +20521, OA20521 +20522, OA20522 +20523, OA20523 +20524, OA20524 +20525, OA20525 +20526, OA20526 +20527, OA20527 +20528, OA20528 +20529, OA20529 +20530, OA20530 +20531, OA20531 +20532, OA20532 +20533, OA20533 +20534, OA20534 +20535, OA20535 +20536, OA20536 +20537, OA20537 +20538, OA20538 +20539, OA20539 +20540, OA20540 +20541, OA20541 +20542, OA20542 +20543, OA20543 +20544, OA20544 +20545, OA20545 +20546, OA20546 +20547, OA20547 +20548, OA20548 +20549, OA20549 +20550, OA20550 +20551, OA20551 +20552, OA20552 +20553, OA20553 +20554, OA20554 +20555, OA20555 +20556, OA20556 +20557, OA20557 +20558, OA20558 +20559, OA20559 +20560, OA20560 +20561, OA20561 +20562, OA20562 +20563, OA20563 +20564, OA20564 +20565, OA20565 +20566, OA20566 +20567, OA20567 +20568, OA20568 +20569, OA20569 +20570, OA20570 +20571, OA20571 +20572, OA20572 +20573, OA20573 +20574, OA20574 +20575, OA20575 +20576, OA20576 +20577, OA20577 +20578, OA20578 +20579, OA20579 +20580, OA20580 +20581, OA20581 +20582, OA20582 +20583, OA20583 +20584, OA20584 +20585, OA20585 +20586, OA20586 +20587, OA20587 +20588, OA20588 +20589, OA20589 +20590, OA20590 +20591, OA20591 +20592, OA20592 +20593, OA20593 +20594, OA20594 +20595, OA20595 +20596, OA20596 +20597, OA20597 +20598, OA20598 +20599, OA20599 +20600, OA20600 +20601, OA20601 +20602, OA20602 +20603, OA20603 +20604, OA20604 +20605, OA20605 +20606, OA20606 +20607, OA20607 +20608, OA20608 +20609, OA20609 +20610, OA20610 +20611, OA20611 +20612, OA20612 +20613, OA20613 +20614, OA20614 +20615, OA20615 +20616, OA20616 +20617, OA20617 +20618, OA20618 +20619, OA20619 +20620, OA20620 +20621, OA20621 +20622, OA20622 +20623, OA20623 +20624, OA20624 +20625, OA20625 +20626, OA20626 +20627, OA20627 +20628, OA20628 +20629, OA20629 +20630, OA20630 +20631, OA20631 +20632, OA20632 +20633, OA20633 +20634, OA20634 +20635, OA20635 +20636, OA20636 +20637, OA20637 +20638, OA20638 +20639, OA20639 +20640, OA20640 +20641, OA20641 +20642, OA20642 +20643, OA20643 +20644, OA20644 +20645, OA20645 +20646, OA20646 +20647, OA20647 +20648, OA20648 +20649, OA20649 +20650, OA20650 +20651, OA20651 +20652, OA20652 +20653, OA20653 +20654, OA20654 +20655, OA20655 +20656, OA20656 +20657, OA20657 +20658, OA20658 +20659, OA20659 +20660, OA20660 +20661, OA20661 +20662, OA20662 +20663, OA20663 +20664, OA20664 +20665, OA20665 +20666, OA20666 +20667, OA20667 +20668, OA20668 +20669, OA20669 +20670, OA20670 +20671, OA20671 +20672, OA20672 +20673, OA20673 +20674, OA20674 +20675, OA20675 +20676, OA20676 +20677, OA20677 +20678, OA20678 +20679, OA20679 +20680, OA20680 +20681, OA20681 +20682, OA20682 +20683, OA20683 +20684, OA20684 +20685, OA20685 +20686, OA20686 +20687, OA20687 +20688, OA20688 +20689, OA20689 +20690, OA20690 +20691, OA20691 +20692, OA20692 +20693, OA20693 +20694, OA20694 +20695, OA20695 +20696, OA20696 +20697, OA20697 +20698, OA20698 +20699, OA20699 +20700, OA20700 +20701, OA20701 +20702, OA20702 +20703, OA20703 +20704, OA20704 +20705, OA20705 +20706, OA20706 +20707, OA20707 +20708, OA20708 +20709, OA20709 +20710, OA20710 +20711, OA20711 +20712, OA20712 +20713, OA20713 +20714, OA20714 +20715, OA20715 +20716, OA20716 +20717, OA20717 +20718, OA20718 +20719, OA20719 +20720, OA20720 +20721, OA20721 +20722, OA20722 +20723, OA20723 +20724, OA20724 +20725, OA20725 +20726, OA20726 +20727, OA20727 +20728, OA20728 +20729, OA20729 +20730, OA20730 +20731, OA20731 +20732, OA20732 +20733, OA20733 +20734, OA20734 +20735, OA20735 +20736, OA20736 +20737, OA20737 +20738, OA20738 +20739, OA20739 +20740, OA20740 +20741, OA20741 +20742, OA20742 +20743, OA20743 +20744, OA20744 +20745, OA20745 +20746, OA20746 +20747, OA20747 +20748, OA20748 +20749, OA20749 +20750, OA20750 +20751, OA20751 +20752, OA20752 +20753, OA20753 +20754, OA20754 +20755, OA20755 +20756, OA20756 +20757, OA20757 +20758, OA20758 +20759, OA20759 +20760, OA20760 +20761, OA20761 +20762, OA20762 +20763, OA20763 +20764, OA20764 +20765, OA20765 +20766, OA20766 +20767, OA20767 +20768, OA20768 +20769, OA20769 +20770, OA20770 +20771, OA20771 +20772, OA20772 +20773, OA20773 +20774, OA20774 +20775, OA20775 +20776, OA20776 +20777, OA20777 +20778, OA20778 +20779, OA20779 +20780, OA20780 +20781, OA20781 +20782, OA20782 +20783, OA20783 +20784, OA20784 +20785, OA20785 +20786, OA20786 +20787, OA20787 +20788, OA20788 +20789, OA20789 +20790, OA20790 +20791, OA20791 +20792, OA20792 +20793, OA20793 +20794, OA20794 +20795, OA20795 +20796, OA20796 +20797, OA20797 +20798, OA20798 +20799, OA20799 +20800, OA20800 +20801, OA20801 +20802, OA20802 +20803, OA20803 +20804, OA20804 +20805, OA20805 +20806, OA20806 +20807, OA20807 +20808, OA20808 +20809, OA20809 +20810, OA20810 +20811, OA20811 +20812, OA20812 +20813, OA20813 +20814, OA20814 +20815, OA20815 +20816, OA20816 +20817, OA20817 +20818, OA20818 +20819, OA20819 +20820, OA20820 +20821, OA20821 +20822, OA20822 +20823, OA20823 +20824, OA20824 +20825, OA20825 +20826, OA20826 +20827, OA20827 +20828, OA20828 +20829, OA20829 +20830, OA20830 +20831, OA20831 +20832, OA20832 +20833, OA20833 +20834, OA20834 +20835, OA20835 +20836, OA20836 +20837, OA20837 +20838, OA20838 +20839, OA20839 +20840, OA20840 +20841, OA20841 +20842, OA20842 +20843, OA20843 +20844, OA20844 +20845, OA20845 +20846, OA20846 +20847, OA20847 +20848, OA20848 +20849, OA20849 +20850, OA20850 +20851, OA20851 +20852, OA20852 +20853, OA20853 +20854, OA20854 +20855, OA20855 +20856, OA20856 +20857, OA20857 +20858, OA20858 +20859, OA20859 +20860, OA20860 +20861, OA20861 +20862, OA20862 +20863, OA20863 +20864, OA20864 +20865, OA20865 +20866, OA20866 +20867, OA20867 +20868, OA20868 +20869, OA20869 +20870, OA20870 +20871, OA20871 +20872, OA20872 +20873, OA20873 +20874, OA20874 +20875, OA20875 +20876, OA20876 +20877, OA20877 +20878, OA20878 +20879, OA20879 +20880, OA20880 +20881, OA20881 +20882, OA20882 +20883, OA20883 +20884, OA20884 +20885, OA20885 +20886, OA20886 +20887, OA20887 +20888, OA20888 +20889, OA20889 +20890, OA20890 +20891, OA20891 +20892, OA20892 +20893, OA20893 +20894, OA20894 +20895, OA20895 +20896, OA20896 +20897, OA20897 +20898, OA20898 +20899, OA20899 +20900, OA20900 +20901, OA20901 +20902, OA20902 +20903, OA20903 +20904, OA20904 +20905, OA20905 +20906, OA20906 +20907, OA20907 +20908, OA20908 +20909, OA20909 +20910, OA20910 +20911, OA20911 +20912, OA20912 +20913, OA20913 +20914, OA20914 +20915, OA20915 +20916, OA20916 +20917, OA20917 +20918, OA20918 +20919, OA20919 +20920, OA20920 +20921, OA20921 +20922, OA20922 +20923, OA20923 +20924, OA20924 +20925, OA20925 +20926, OA20926 +20927, OA20927 +20928, OA20928 +20929, OA20929 +20930, OA20930 +20931, OA20931 +20932, OA20932 +20933, OA20933 +20934, OA20934 +20935, OA20935 +20936, OA20936 +20937, OA20937 +20938, OA20938 +20939, OA20939 +20940, OA20940 +20941, OA20941 +20942, OA20942 +20943, OA20943 +20944, OA20944 +20945, OA20945 +20946, OA20946 +20947, OA20947 +20948, OA20948 +20949, OA20949 +20950, OA20950 +20951, OA20951 +20952, OA20952 +20953, OA20953 +20954, OA20954 +20955, OA20955 +20956, OA20956 +20957, OA20957 +20958, OA20958 +20959, OA20959 +20960, OA20960 +20961, OA20961 +20962, OA20962 +20963, OA20963 +20964, OA20964 +20965, OA20965 +20966, OA20966 +20967, OA20967 +20968, OA20968 +20969, OA20969 +20970, OA20970 +20971, OA20971 +20972, OA20972 +20973, OA20973 +20974, OA20974 +20975, OA20975 +20976, OA20976 +20977, OA20977 +20978, OA20978 +20979, OA20979 +20980, OA20980 +20981, OA20981 +20982, OA20982 +20983, OA20983 +20984, OA20984 +20985, OA20985 +20986, OA20986 +20987, OA20987 +20988, OA20988 +20989, OA20989 +20990, OA20990 +20991, OA20991 +20992, OA20992 +20993, OA20993 +20994, OA20994 +20995, OA20995 +20996, OA20996 +20997, OA20997 +20998, OA20998 +20999, OA20999 +21000, OA21000 +21001, OA21001 +21002, OA21002 +21003, OA21003 +21004, OA21004 +21005, OA21005 +21006, OA21006 +21007, OA21007 +21008, OA21008 +21009, OA21009 +21010, OA21010 +21011, OA21011 +21012, OA21012 +21013, OA21013 +21014, OA21014 +21015, OA21015 +21016, OA21016 +21017, OA21017 +21018, OA21018 +21019, OA21019 +21020, OA21020 +21021, OA21021 +21022, OA21022 +21023, OA21023 +21024, OA21024 +21025, OA21025 +21026, OA21026 +21027, OA21027 +21028, OA21028 +21029, OA21029 +21030, OA21030 +21031, OA21031 +21032, OA21032 +21033, OA21033 +21034, OA21034 +21035, OA21035 +21036, OA21036 +21037, OA21037 +21038, OA21038 +21039, OA21039 +21040, OA21040 +21041, OA21041 +21042, OA21042 +21043, OA21043 +21044, OA21044 +21045, OA21045 +21046, OA21046 +21047, OA21047 +21048, OA21048 +21049, OA21049 +21050, OA21050 +21051, OA21051 +21052, OA21052 +21053, OA21053 +21054, OA21054 +21055, OA21055 +21056, OA21056 +21057, OA21057 +21058, OA21058 +21059, OA21059 +21060, OA21060 +21061, OA21061 +21062, OA21062 +21063, OA21063 +21064, OA21064 +21065, OA21065 +21066, OA21066 +21067, OA21067 +21068, OA21068 +21069, OA21069 +21070, OA21070 +21071, OA21071 +21072, OA21072 +21073, OA21073 +21074, OA21074 +21075, OA21075 +21076, OA21076 +21077, OA21077 +21078, OA21078 +21079, OA21079 +21080, OA21080 +21081, OA21081 +21082, OA21082 +21083, OA21083 +21084, OA21084 +21085, OA21085 +21086, OA21086 +21087, OA21087 +21088, OA21088 +21089, OA21089 +21090, OA21090 +21091, OA21091 +21092, OA21092 +21093, OA21093 +21094, OA21094 +21095, OA21095 +21096, OA21096 +21097, OA21097 +21098, OA21098 +21099, OA21099 +21100, OA21100 +21101, OA21101 +21102, OA21102 +21103, OA21103 +21104, OA21104 +21105, OA21105 +21106, OA21106 +21107, OA21107 +21108, OA21108 +21109, OA21109 +21110, OA21110 +21111, OA21111 +21112, OA21112 +21113, OA21113 +21114, OA21114 +21115, OA21115 +21116, OA21116 +21117, OA21117 +21118, OA21118 +21119, OA21119 +21120, OA21120 +21121, OA21121 +21122, OA21122 +21123, OA21123 +21124, OA21124 +21125, OA21125 +21126, OA21126 +21127, OA21127 +21128, OA21128 +21129, OA21129 +21130, OA21130 +21131, OA21131 +21132, OA21132 +21133, OA21133 +21134, OA21134 +21135, OA21135 +21136, OA21136 +21137, OA21137 +21138, OA21138 +21139, OA21139 +21140, OA21140 +21141, OA21141 +21142, OA21142 +21143, OA21143 +21144, OA21144 +21145, OA21145 +21146, OA21146 +21147, OA21147 +21148, OA21148 +21149, OA21149 +21150, OA21150 +21151, OA21151 +21152, OA21152 +21153, OA21153 +21154, OA21154 +21155, OA21155 +21156, OA21156 +21157, OA21157 +21158, OA21158 +21159, OA21159 +21160, OA21160 +21161, OA21161 +21162, OA21162 +21163, OA21163 +21164, OA21164 +21165, OA21165 +21166, OA21166 +21167, OA21167 +21168, OA21168 +21169, OA21169 +21170, OA21170 +21171, OA21171 +21172, OA21172 +21173, OA21173 +21174, OA21174 +21175, OA21175 +21176, OA21176 +21177, OA21177 +21178, OA21178 +21179, OA21179 +21180, OA21180 +21181, OA21181 +21182, OA21182 +21183, OA21183 +21184, OA21184 +21185, OA21185 +21186, OA21186 +21187, OA21187 +21188, OA21188 +21189, OA21189 +21190, OA21190 +21191, OA21191 +21192, OA21192 +21193, OA21193 +21194, OA21194 +21195, OA21195 +21196, OA21196 +21197, OA21197 +21198, OA21198 +21199, OA21199 +21200, OA21200 +21201, OA21201 +21202, OA21202 +21203, OA21203 +21204, OA21204 +21205, OA21205 +21206, OA21206 +21207, OA21207 +21208, OA21208 +21209, OA21209 +21210, OA21210 +21211, OA21211 +21212, OA21212 +21213, OA21213 +21214, OA21214 +21215, OA21215 +21216, OA21216 +21217, OA21217 +21218, OA21218 +21219, OA21219 +21220, OA21220 +21221, OA21221 +21222, OA21222 +21223, OA21223 +21224, OA21224 +21225, OA21225 +21226, OA21226 +21227, OA21227 +21228, OA21228 +21229, OA21229 +21230, OA21230 +21231, OA21231 +21232, OA21232 +21233, OA21233 +21234, OA21234 +21235, OA21235 +21236, OA21236 +21237, OA21237 +21238, OA21238 +21239, OA21239 +21240, OA21240 +21241, OA21241 +21242, OA21242 +21243, OA21243 +21244, OA21244 +21245, OA21245 +21246, OA21246 +21247, OA21247 +21248, OA21248 +21249, OA21249 +21250, OA21250 +21251, OA21251 +21252, OA21252 +21253, OA21253 +21254, OA21254 +21255, OA21255 +21256, OA21256 +21257, OA21257 +21258, OA21258 +21259, OA21259 +21260, OA21260 +21261, OA21261 +21262, OA21262 +21263, OA21263 +21264, OA21264 +21265, OA21265 +21266, OA21266 +21267, OA21267 +21268, OA21268 +21269, OA21269 +21270, OA21270 +21271, OA21271 +21272, OA21272 +21273, OA21273 +21274, OA21274 +21275, OA21275 +21276, OA21276 +21277, OA21277 +21278, OA21278 +21279, OA21279 +21280, OA21280 +21281, OA21281 +21282, OA21282 +21283, OA21283 +21284, OA21284 +21285, OA21285 +21286, OA21286 +21287, OA21287 +21288, OA21288 +21289, OA21289 +21290, OA21290 +21291, OA21291 +21292, OA21292 +21293, OA21293 +21294, OA21294 +21295, OA21295 +21296, OA21296 +21297, OA21297 +21298, OA21298 +21299, OA21299 +21300, OA21300 +21301, OA21301 +21302, OA21302 +21303, OA21303 +21304, OA21304 +21305, OA21305 +21306, OA21306 +21307, OA21307 +21308, OA21308 +21309, OA21309 +21310, OA21310 +21311, OA21311 +21312, OA21312 +21313, OA21313 +21314, OA21314 +21315, OA21315 +21316, OA21316 +21317, OA21317 +21318, OA21318 +21319, OA21319 +21320, OA21320 +21321, OA21321 +21322, OA21322 +21323, OA21323 +21324, OA21324 +21325, OA21325 +21326, OA21326 +21327, OA21327 +21328, OA21328 +21329, OA21329 +21330, OA21330 +21331, OA21331 +21332, OA21332 +21333, OA21333 +21334, OA21334 +21335, OA21335 +21336, OA21336 +21337, OA21337 +21338, OA21338 +21339, OA21339 +21340, OA21340 +21341, OA21341 +21342, OA21342 +21343, OA21343 +21344, OA21344 +21345, OA21345 +21346, OA21346 +21347, OA21347 +21348, OA21348 +21349, OA21349 +21350, OA21350 +21351, OA21351 +21352, OA21352 +21353, OA21353 +21354, OA21354 +21355, OA21355 +21356, OA21356 +21357, OA21357 +21358, OA21358 +21359, OA21359 +21360, OA21360 +21361, OA21361 +21362, OA21362 +21363, OA21363 +21364, OA21364 +21365, OA21365 +21366, OA21366 +21367, OA21367 +21368, OA21368 +21369, OA21369 +21370, OA21370 +21371, OA21371 +21372, OA21372 +21373, OA21373 +21374, OA21374 +21375, OA21375 +21376, OA21376 +21377, OA21377 +21378, OA21378 +21379, OA21379 +21380, OA21380 +21381, OA21381 +21382, OA21382 +21383, OA21383 +21384, OA21384 +21385, OA21385 +21386, OA21386 +21387, OA21387 +21388, OA21388 +21389, OA21389 +21390, OA21390 +21391, OA21391 +21392, OA21392 +21393, OA21393 +21394, OA21394 +21395, OA21395 +21396, OA21396 +21397, OA21397 +21398, OA21398 +21399, OA21399 +21400, OA21400 +21401, OA21401 +21402, OA21402 +21403, OA21403 +21404, OA21404 +21405, OA21405 +21406, OA21406 +21407, OA21407 +21408, OA21408 +21409, OA21409 +21410, OA21410 +21411, OA21411 +21412, OA21412 +21413, OA21413 +21414, OA21414 +21415, OA21415 +21416, OA21416 +21417, OA21417 +21418, OA21418 +21419, OA21419 +21420, OA21420 +21421, OA21421 +21422, OA21422 +21423, OA21423 +21424, OA21424 +21425, OA21425 +21426, OA21426 +21427, OA21427 +21428, OA21428 +21429, OA21429 +21430, OA21430 +21431, OA21431 +21432, OA21432 +21433, OA21433 +21434, OA21434 +21435, OA21435 +21436, OA21436 +21437, OA21437 +21438, OA21438 +21439, OA21439 +21440, OA21440 +21441, OA21441 +21442, OA21442 +21443, OA21443 +21444, OA21444 +21445, OA21445 +21446, OA21446 +21447, OA21447 +21448, OA21448 +21449, OA21449 +21450, OA21450 +21451, OA21451 +21452, OA21452 +21453, OA21453 +21454, OA21454 +21455, OA21455 +21456, OA21456 +21457, OA21457 +21458, OA21458 +21459, OA21459 +21460, OA21460 +21461, OA21461 +21462, OA21462 +21463, OA21463 +21464, OA21464 +21465, OA21465 +21466, OA21466 +21467, OA21467 +21468, OA21468 +21469, OA21469 +21470, OA21470 +21471, OA21471 +21472, OA21472 +21473, OA21473 +21474, OA21474 +21475, OA21475 +21476, OA21476 +21477, OA21477 +21478, OA21478 +21479, OA21479 +21480, OA21480 +21481, OA21481 +21482, OA21482 +21483, OA21483 +21484, OA21484 +21485, OA21485 +21486, OA21486 +21487, OA21487 +21488, OA21488 +21489, OA21489 +21490, OA21490 +21491, OA21491 +21492, OA21492 +21493, OA21493 +21494, OA21494 +21495, OA21495 +21496, OA21496 +21497, OA21497 +21498, OA21498 +21499, OA21499 +21500, OA21500 +21501, OA21501 +21502, OA21502 +21503, OA21503 +21504, OA21504 +21505, OA21505 +21506, OA21506 +21507, OA21507 +21508, OA21508 +21509, OA21509 +21510, OA21510 +21511, OA21511 +21512, OA21512 +21513, OA21513 +21514, OA21514 +21515, OA21515 +21516, OA21516 +21517, OA21517 +21518, OA21518 +21519, OA21519 +21520, OA21520 +21521, OA21521 +21522, OA21522 +21523, OA21523 +21524, OA21524 +21525, OA21525 +21526, OA21526 +21527, OA21527 +21528, OA21528 +21529, OA21529 +21530, OA21530 +21531, OA21531 +21532, OA21532 +21533, OA21533 +21534, OA21534 +21535, OA21535 +21536, OA21536 +21537, OA21537 +21538, OA21538 +21539, OA21539 +21540, OA21540 +21541, OA21541 +21542, OA21542 +21543, OA21543 +21544, OA21544 +21545, OA21545 +21546, OA21546 +21547, OA21547 +21548, OA21548 +21549, OA21549 +21550, OA21550 +21551, OA21551 +21552, OA21552 +21553, OA21553 +21554, OA21554 +21555, OA21555 +21556, OA21556 +21557, OA21557 +21558, OA21558 +21559, OA21559 +21560, OA21560 +21561, OA21561 +21562, OA21562 +21563, OA21563 +21564, OA21564 +21565, OA21565 +21566, OA21566 +21567, OA21567 +21568, OA21568 +21569, OA21569 +21570, OA21570 +21571, OA21571 +21572, OA21572 +21573, OA21573 +21574, OA21574 +21575, OA21575 +21576, OA21576 +21577, OA21577 +21578, OA21578 +21579, OA21579 +21580, OA21580 +21581, OA21581 +21582, OA21582 +21583, OA21583 +21584, OA21584 +21585, OA21585 +21586, OA21586 +21587, OA21587 +21588, OA21588 +21589, OA21589 +21590, OA21590 +21591, OA21591 +21592, OA21592 +21593, OA21593 +21594, OA21594 +21595, OA21595 +21596, OA21596 +21597, OA21597 +21598, OA21598 +21599, OA21599 +21600, OA21600 +21601, OA21601 +21602, OA21602 +21603, OA21603 +21604, OA21604 +21605, OA21605 +21606, OA21606 +21607, OA21607 +21608, OA21608 +21609, OA21609 +21610, OA21610 +21611, OA21611 +21612, OA21612 +21613, OA21613 +21614, OA21614 +21615, OA21615 +21616, OA21616 +21617, OA21617 +21618, OA21618 +21619, OA21619 +21620, OA21620 +21621, OA21621 +21622, OA21622 +21623, OA21623 +21624, OA21624 +21625, OA21625 +21626, OA21626 +21627, OA21627 +21628, OA21628 +21629, OA21629 +21630, OA21630 +21631, OA21631 +21632, OA21632 +21633, OA21633 +21634, OA21634 +21635, OA21635 +21636, OA21636 +21637, OA21637 +21638, OA21638 +21639, OA21639 +21640, OA21640 +21641, OA21641 +21642, OA21642 +21643, OA21643 +21644, OA21644 +21645, OA21645 +21646, OA21646 +21647, OA21647 +21648, OA21648 +21649, OA21649 +21650, OA21650 +21651, OA21651 +21652, OA21652 +21653, OA21653 +21654, OA21654 +21655, OA21655 +21656, OA21656 +21657, OA21657 +21658, OA21658 +21659, OA21659 +21660, OA21660 +21661, OA21661 +21662, OA21662 +21663, OA21663 +21664, OA21664 +21665, OA21665 +21666, OA21666 +21667, OA21667 +21668, OA21668 +21669, OA21669 +21670, OA21670 +21671, OA21671 +21672, OA21672 +21673, OA21673 +21674, OA21674 +21675, OA21675 +21676, OA21676 +21677, OA21677 +21678, OA21678 +21679, OA21679 +21680, OA21680 +21681, OA21681 +21682, OA21682 +21683, OA21683 +21684, OA21684 +21685, OA21685 +21686, OA21686 +21687, OA21687 +21688, OA21688 +21689, OA21689 +21690, OA21690 +21691, OA21691 +21692, OA21692 +21693, OA21693 +21694, OA21694 +21695, OA21695 +21696, OA21696 +21697, OA21697 +21698, OA21698 +21699, OA21699 +21700, OA21700 +21701, OA21701 +21702, OA21702 +21703, OA21703 +21704, OA21704 +21705, OA21705 +21706, OA21706 +21707, OA21707 +21708, OA21708 +21709, OA21709 +21710, OA21710 +21711, OA21711 +21712, OA21712 +21713, OA21713 +21714, OA21714 +21715, OA21715 +21716, OA21716 +21717, OA21717 +21718, OA21718 +21719, OA21719 +21720, OA21720 +21721, OA21721 +21722, OA21722 +21723, OA21723 +21724, OA21724 +21725, OA21725 +21726, OA21726 +21727, OA21727 +21728, OA21728 +21729, OA21729 +21730, OA21730 +21731, OA21731 +21732, OA21732 +21733, OA21733 +21734, OA21734 +21735, OA21735 +21736, OA21736 +21737, OA21737 +21738, OA21738 +21739, OA21739 +21740, OA21740 +21741, OA21741 +21742, OA21742 +21743, OA21743 +21744, OA21744 +21745, OA21745 +21746, OA21746 +21747, OA21747 +21748, OA21748 +21749, OA21749 +21750, OA21750 +21751, OA21751 +21752, OA21752 +21753, OA21753 +21754, OA21754 +21755, OA21755 +21756, OA21756 +21757, OA21757 +21758, OA21758 +21759, OA21759 +21760, OA21760 +21761, OA21761 +21762, OA21762 +21763, OA21763 +21764, OA21764 +21765, OA21765 +21766, OA21766 +21767, OA21767 +21768, OA21768 +21769, OA21769 +21770, OA21770 +21771, OA21771 +21772, OA21772 +21773, OA21773 +21774, OA21774 +21775, OA21775 +21776, OA21776 +21777, OA21777 +21778, OA21778 +21779, OA21779 +21780, OA21780 +21781, OA21781 +21782, OA21782 +21783, OA21783 +21784, OA21784 +21785, OA21785 +21786, OA21786 +21787, OA21787 +21788, OA21788 +21789, OA21789 +21790, OA21790 +21791, OA21791 +21792, OA21792 +21793, OA21793 +21794, OA21794 +21795, OA21795 +21796, OA21796 +21797, OA21797 +21798, OA21798 +21799, OA21799 +21800, OA21800 +21801, OA21801 +21802, OA21802 +21803, OA21803 +21804, OA21804 +21805, OA21805 +21806, OA21806 +21807, OA21807 +21808, OA21808 +21809, OA21809 +21810, OA21810 +21811, OA21811 +21812, OA21812 +21813, OA21813 +21814, OA21814 +21815, OA21815 +21816, OA21816 +21817, OA21817 +21818, OA21818 +21819, OA21819 +21820, OA21820 +21821, OA21821 +21822, OA21822 +21823, OA21823 +21824, OA21824 +21825, OA21825 +21826, OA21826 +21827, OA21827 +21828, OA21828 +21829, OA21829 +21830, OA21830 +21831, OA21831 +21832, OA21832 +21833, OA21833 +21834, OA21834 +21835, OA21835 +21836, OA21836 +21837, OA21837 +21838, OA21838 +21839, OA21839 +21840, OA21840 +21841, OA21841 +21842, OA21842 +21843, OA21843 +21844, OA21844 +21845, OA21845 +21846, OA21846 +21847, OA21847 +21848, OA21848 +21849, OA21849 +21850, OA21850 +21851, OA21851 +21852, OA21852 +21853, OA21853 +21854, OA21854 +21855, OA21855 +21856, OA21856 +21857, OA21857 +21858, OA21858 +21859, OA21859 +21860, OA21860 +21861, OA21861 +21862, OA21862 +21863, OA21863 +21864, OA21864 +21865, OA21865 +21866, OA21866 +21867, OA21867 +21868, OA21868 +21869, OA21869 +21870, OA21870 +21871, OA21871 +21872, OA21872 +21873, OA21873 +21874, OA21874 +21875, OA21875 +21876, OA21876 +21877, OA21877 +21878, OA21878 +21879, OA21879 +21880, OA21880 +21881, OA21881 +21882, OA21882 +21883, OA21883 +21884, OA21884 +21885, OA21885 +21886, OA21886 +21887, OA21887 +21888, OA21888 +21889, OA21889 +21890, OA21890 +21891, OA21891 +21892, OA21892 +21893, OA21893 +21894, OA21894 +21895, OA21895 +21896, OA21896 +21897, OA21897 +21898, OA21898 +21899, OA21899 +21900, OA21900 +21901, OA21901 +21902, OA21902 +21903, OA21903 +21904, OA21904 +21905, OA21905 +21906, OA21906 +21907, OA21907 +21908, OA21908 +21909, OA21909 +21910, OA21910 +21911, OA21911 +21912, OA21912 +21913, OA21913 +21914, OA21914 +21915, OA21915 +21916, OA21916 +21917, OA21917 +21918, OA21918 +21919, OA21919 +21920, OA21920 +21921, OA21921 +21922, OA21922 +21923, OA21923 +21924, OA21924 +21925, OA21925 +21926, OA21926 +21927, OA21927 +21928, OA21928 +21929, OA21929 +21930, OA21930 +21931, OA21931 +21932, OA21932 +21933, OA21933 +21934, OA21934 +21935, OA21935 +21936, OA21936 +21937, OA21937 +21938, OA21938 +21939, OA21939 +21940, OA21940 +21941, OA21941 +21942, OA21942 +21943, OA21943 +21944, OA21944 +21945, OA21945 +21946, OA21946 +21947, OA21947 +21948, OA21948 +21949, OA21949 +21950, OA21950 +21951, OA21951 +21952, OA21952 +21953, OA21953 +21954, OA21954 +21955, OA21955 +21956, OA21956 +21957, OA21957 +21958, OA21958 +21959, OA21959 +21960, OA21960 +21961, OA21961 +21962, OA21962 +21963, OA21963 +21964, OA21964 +21965, OA21965 +21966, OA21966 +21967, OA21967 +21968, OA21968 +21969, OA21969 +21970, OA21970 +21971, OA21971 +21972, OA21972 +21973, OA21973 +21974, OA21974 +21975, OA21975 +21976, OA21976 +21977, OA21977 +21978, OA21978 +21979, OA21979 +21980, OA21980 +21981, OA21981 +21982, OA21982 +21983, OA21983 +21984, OA21984 +21985, OA21985 +21986, OA21986 +21987, OA21987 +21988, OA21988 +21989, OA21989 +21990, OA21990 +21991, OA21991 +21992, OA21992 +21993, OA21993 +21994, OA21994 +21995, OA21995 +21996, OA21996 +21997, OA21997 +21998, OA21998 +21999, OA21999 +22000, OA22000 +22001, OA22001 +22002, OA22002 +22003, OA22003 +22004, OA22004 +22005, OA22005 +22006, OA22006 +22007, OA22007 +22008, OA22008 +22009, OA22009 +22010, OA22010 +22011, OA22011 +22012, OA22012 +22013, OA22013 +22014, OA22014 +22015, OA22015 +22016, OA22016 +22017, OA22017 +22018, OA22018 +22019, OA22019 +22020, OA22020 +22021, OA22021 +22022, OA22022 +22023, OA22023 +22024, OA22024 +22025, OA22025 +22026, OA22026 +22027, OA22027 +22028, OA22028 +22029, OA22029 +22030, OA22030 +22031, OA22031 +22032, OA22032 +22033, OA22033 +22034, OA22034 +22035, OA22035 +22036, OA22036 +22037, OA22037 +22038, OA22038 +22039, OA22039 +22040, OA22040 +22041, OA22041 +22042, OA22042 +22043, OA22043 +22044, OA22044 +22045, OA22045 +22046, OA22046 +22047, OA22047 +22048, OA22048 +22049, OA22049 +22050, OA22050 +22051, OA22051 +22052, OA22052 +22053, OA22053 +22054, OA22054 +22055, OA22055 +22056, OA22056 +22057, OA22057 +22058, OA22058 +22059, OA22059 +22060, OA22060 +22061, OA22061 +22062, OA22062 +22063, OA22063 +22064, OA22064 +22065, OA22065 +22066, OA22066 +22067, OA22067 +22068, OA22068 +22069, OA22069 +22070, OA22070 +22071, OA22071 +22072, OA22072 +22073, OA22073 +22074, OA22074 +22075, OA22075 +22076, OA22076 +22077, OA22077 +22078, OA22078 +22079, OA22079 +22080, OA22080 +22081, OA22081 +22082, OA22082 +22083, OA22083 +22084, OA22084 +22085, OA22085 +22086, OA22086 +22087, OA22087 +22088, OA22088 +22089, OA22089 +22090, OA22090 +22091, OA22091 +22092, OA22092 +22093, OA22093 +22094, OA22094 +22095, OA22095 +22096, OA22096 +22097, OA22097 +22098, OA22098 +22099, OA22099 +22100, OA22100 +22101, OA22101 +22102, OA22102 +22103, OA22103 +22104, OA22104 +22105, OA22105 +22106, OA22106 +22107, OA22107 +22108, OA22108 +22109, OA22109 +22110, OA22110 +22111, OA22111 +22112, OA22112 +22113, OA22113 +22114, OA22114 +22115, OA22115 +22116, OA22116 +22117, OA22117 +22118, OA22118 +22119, OA22119 +22120, OA22120 +22121, OA22121 +22122, OA22122 +22123, OA22123 +22124, OA22124 +22125, OA22125 +22126, OA22126 +22127, OA22127 +22128, OA22128 +22129, OA22129 +22130, OA22130 +22131, OA22131 +22132, OA22132 +22133, OA22133 +22134, OA22134 +22135, OA22135 +22136, OA22136 +22137, OA22137 +22138, OA22138 +22139, OA22139 +22140, OA22140 +22141, OA22141 +22142, OA22142 +22143, OA22143 +22144, OA22144 +22145, OA22145 +22146, OA22146 +22147, OA22147 +22148, OA22148 +22149, OA22149 +22150, OA22150 +22151, OA22151 +22152, OA22152 +22153, OA22153 +22154, OA22154 +22155, OA22155 +22156, OA22156 +22157, OA22157 +22158, OA22158 +22159, OA22159 +22160, OA22160 +22161, OA22161 +22162, OA22162 +22163, OA22163 +22164, OA22164 +22165, OA22165 +22166, OA22166 +22167, OA22167 +22168, OA22168 +22169, OA22169 +22170, OA22170 +22171, OA22171 +22172, OA22172 +22173, OA22173 +22174, OA22174 +22175, OA22175 +22176, OA22176 +22177, OA22177 +22178, OA22178 +22179, OA22179 +22180, OA22180 +22181, OA22181 +22182, OA22182 +22183, OA22183 +22184, OA22184 +22185, OA22185 +22186, OA22186 +22187, OA22187 +22188, OA22188 +22189, OA22189 +22190, OA22190 +22191, OA22191 +22192, OA22192 +22193, OA22193 +22194, OA22194 +22195, OA22195 +22196, OA22196 +22197, OA22197 +22198, OA22198 +22199, OA22199 +22200, OA22200 +22201, OA22201 +22202, OA22202 +22203, OA22203 +22204, OA22204 +22205, OA22205 +22206, OA22206 +22207, OA22207 +22208, OA22208 +22209, OA22209 +22210, OA22210 +22211, OA22211 +22212, OA22212 +22213, OA22213 +22214, OA22214 +22215, OA22215 +22216, OA22216 +22217, OA22217 +22218, OA22218 +22219, OA22219 +22220, OA22220 +22221, OA22221 +22222, OA22222 +22223, OA22223 +22224, OA22224 +22225, OA22225 +22226, OA22226 +22227, OA22227 +22228, OA22228 +22229, OA22229 +22230, OA22230 +22231, OA22231 +22232, OA22232 +22233, OA22233 +22234, OA22234 +22235, OA22235 +22236, OA22236 +22237, OA22237 +22238, OA22238 +22239, OA22239 +22240, OA22240 +22241, OA22241 +22242, OA22242 +22243, OA22243 +22244, OA22244 +22245, OA22245 +22246, OA22246 +22247, OA22247 +22248, OA22248 +22249, OA22249 +22250, OA22250 +22251, OA22251 +22252, OA22252 +22253, OA22253 +22254, OA22254 +22255, OA22255 +22256, OA22256 +22257, OA22257 +22258, OA22258 +22259, OA22259 +22260, OA22260 +22261, OA22261 +22262, OA22262 +22263, OA22263 +22264, OA22264 +22265, OA22265 +22266, OA22266 +22267, OA22267 +22268, OA22268 +22269, OA22269 +22270, OA22270 +22271, OA22271 +22272, OA22272 +22273, OA22273 +22274, OA22274 +22275, OA22275 +22276, OA22276 +22277, OA22277 +22278, OA22278 +22279, OA22279 +22280, OA22280 +22281, OA22281 +22282, OA22282 +22283, OA22283 +22284, OA22284 +22285, OA22285 +22286, OA22286 +22287, OA22287 +22288, OA22288 +22289, OA22289 +22290, OA22290 +22291, OA22291 +22292, OA22292 +22293, OA22293 +22294, OA22294 +22295, OA22295 +22296, OA22296 +22297, OA22297 +22298, OA22298 +22299, OA22299 +22300, OA22300 +22301, OA22301 +22302, OA22302 +22303, OA22303 +22304, OA22304 +22305, OA22305 +22306, OA22306 +22307, OA22307 +22308, OA22308 +22309, OA22309 +22310, OA22310 +22311, OA22311 +22312, OA22312 +22313, OA22313 +22314, OA22314 +22315, OA22315 +22316, OA22316 +22317, OA22317 +22318, OA22318 +22319, OA22319 +22320, OA22320 +22321, OA22321 +22322, OA22322 +22323, OA22323 +22324, OA22324 +22325, OA22325 +22326, OA22326 +22327, OA22327 +22328, OA22328 +22329, OA22329 +22330, OA22330 +22331, OA22331 +22332, OA22332 +22333, OA22333 +22334, OA22334 +22335, OA22335 +22336, OA22336 +22337, OA22337 +22338, OA22338 +22339, OA22339 +22340, OA22340 +22341, OA22341 +22342, OA22342 +22343, OA22343 +22344, OA22344 +22345, OA22345 +22346, OA22346 +22347, OA22347 +22348, OA22348 +22349, OA22349 +22350, OA22350 +22351, OA22351 +22352, OA22352 +22353, OA22353 +22354, OA22354 +22355, OA22355 +22356, OA22356 +22357, OA22357 +22358, OA22358 +22359, OA22359 +22360, OA22360 +22361, OA22361 +22362, OA22362 +22363, OA22363 +22364, OA22364 +22365, OA22365 +22366, OA22366 +22367, OA22367 +22368, OA22368 +22369, OA22369 +22370, OA22370 +22371, OA22371 +22372, OA22372 +22373, OA22373 +22374, OA22374 +22375, OA22375 +22376, OA22376 +22377, OA22377 +22378, OA22378 +22379, OA22379 +22380, OA22380 +22381, OA22381 +22382, OA22382 +22383, OA22383 +22384, OA22384 +22385, OA22385 +22386, OA22386 +22387, OA22387 +22388, OA22388 +22389, OA22389 +22390, OA22390 +22391, OA22391 +22392, OA22392 +22393, OA22393 +22394, OA22394 +22395, OA22395 +22396, OA22396 +22397, OA22397 +22398, OA22398 +22399, OA22399 +22400, OA22400 +22401, OA22401 +22402, OA22402 +22403, OA22403 +22404, OA22404 +22405, OA22405 +22406, OA22406 +22407, OA22407 +22408, OA22408 +22409, OA22409 +22410, OA22410 +22411, OA22411 +22412, OA22412 +22413, OA22413 +22414, OA22414 +22415, OA22415 +22416, OA22416 +22417, OA22417 +22418, OA22418 +22419, OA22419 +22420, OA22420 +22421, OA22421 +22422, OA22422 +22423, OA22423 +22424, OA22424 +22425, OA22425 +22426, OA22426 +22427, OA22427 +22428, OA22428 +22429, OA22429 +22430, OA22430 +22431, OA22431 +22432, OA22432 +22433, OA22433 +22434, OA22434 +22435, OA22435 +22436, OA22436 +22437, OA22437 +22438, OA22438 +22439, OA22439 +22440, OA22440 +22441, OA22441 +22442, OA22442 +22443, OA22443 +22444, OA22444 +22445, OA22445 +22446, OA22446 +22447, OA22447 +22448, OA22448 +22449, OA22449 +22450, OA22450 +22451, OA22451 +22452, OA22452 +22453, OA22453 +22454, OA22454 +22455, OA22455 +22456, OA22456 +22457, OA22457 +22458, OA22458 +22459, OA22459 +22460, OA22460 +22461, OA22461 +22462, OA22462 +22463, OA22463 +22464, OA22464 +22465, OA22465 +22466, OA22466 +22467, OA22467 +22468, OA22468 +22469, OA22469 +22470, OA22470 +22471, OA22471 +22472, OA22472 +22473, OA22473 +22474, OA22474 +22475, OA22475 +22476, OA22476 +22477, OA22477 +22478, OA22478 +22479, OA22479 +22480, OA22480 +22481, OA22481 +22482, OA22482 +22483, OA22483 +22484, OA22484 +22485, OA22485 +22486, OA22486 +22487, OA22487 +22488, OA22488 +22489, OA22489 +22490, OA22490 +22491, OA22491 +22492, OA22492 +22493, OA22493 +22494, OA22494 +22495, OA22495 +22496, OA22496 +22497, OA22497 +22498, OA22498 +22499, OA22499 +22500, OA22500 +22501, OA22501 +22502, OA22502 +22503, OA22503 +22504, OA22504 +22505, OA22505 +22506, OA22506 +22507, OA22507 +22508, OA22508 +22509, OA22509 +22510, OA22510 +22511, OA22511 +22512, OA22512 +22513, OA22513 +22514, OA22514 +22515, OA22515 +22516, OA22516 +22517, OA22517 +22518, OA22518 +22519, OA22519 +22520, OA22520 +22521, OA22521 +22522, OA22522 +22523, OA22523 +22524, OA22524 +22525, OA22525 +22526, OA22526 +22527, OA22527 +22528, OA22528 +22529, OA22529 +22530, OA22530 +22531, OA22531 +22532, OA22532 +22533, OA22533 +22534, OA22534 +22535, OA22535 +22536, OA22536 +22537, OA22537 +22538, OA22538 +22539, OA22539 +22540, OA22540 +22541, OA22541 +22542, OA22542 +22543, OA22543 +22544, OA22544 +22545, OA22545 +22546, OA22546 +22547, OA22547 +22548, OA22548 +22549, OA22549 +22550, OA22550 +22551, OA22551 +22552, OA22552 +22553, OA22553 +22554, OA22554 +22555, OA22555 +22556, OA22556 +22557, OA22557 +22558, OA22558 +22559, OA22559 +22560, OA22560 +22561, OA22561 +22562, OA22562 +22563, OA22563 +22564, OA22564 +22565, OA22565 +22566, OA22566 +22567, OA22567 +22568, OA22568 +22569, OA22569 +22570, OA22570 +22571, OA22571 +22572, OA22572 +22573, OA22573 +22574, OA22574 +22575, OA22575 +22576, OA22576 +22577, OA22577 +22578, OA22578 +22579, OA22579 +22580, OA22580 +22581, OA22581 +22582, OA22582 +22583, OA22583 +22584, OA22584 +22585, OA22585 +22586, OA22586 +22587, OA22587 +22588, OA22588 +22589, OA22589 +22590, OA22590 +22591, OA22591 +22592, OA22592 +22593, OA22593 +22594, OA22594 +22595, OA22595 +22596, OA22596 +22597, OA22597 +22598, OA22598 +22599, OA22599 +22600, OA22600 +22601, OA22601 +22602, OA22602 +22603, OA22603 +22604, OA22604 +22605, OA22605 +22606, OA22606 +22607, OA22607 +22608, OA22608 +22609, OA22609 +22610, OA22610 +22611, OA22611 +22612, OA22612 +22613, OA22613 +22614, OA22614 +22615, OA22615 +22616, OA22616 +22617, OA22617 +22618, OA22618 +22619, OA22619 +22620, OA22620 +22621, OA22621 +22622, OA22622 +22623, OA22623 +22624, OA22624 +22625, OA22625 +22626, OA22626 +22627, OA22627 +22628, OA22628 +22629, OA22629 +22630, OA22630 +22631, OA22631 +22632, OA22632 +22633, OA22633 +22634, OA22634 +22635, OA22635 +22636, OA22636 +22637, OA22637 +22638, OA22638 +22639, OA22639 +22640, OA22640 +22641, OA22641 +22642, OA22642 +22643, OA22643 +22644, OA22644 +22645, OA22645 +22646, OA22646 +22647, OA22647 +22648, OA22648 +22649, OA22649 +22650, OA22650 +22651, OA22651 +22652, OA22652 +22653, OA22653 +22654, OA22654 +22655, OA22655 +22656, OA22656 +22657, OA22657 +22658, OA22658 +22659, OA22659 +22660, OA22660 +22661, OA22661 +22662, OA22662 +22663, OA22663 +22664, OA22664 +22665, OA22665 +22666, OA22666 +22667, OA22667 +22668, OA22668 +22669, OA22669 +22670, OA22670 +22671, OA22671 +22672, OA22672 +22673, OA22673 +22674, OA22674 +22675, OA22675 +22676, OA22676 +22677, OA22677 +22678, OA22678 +22679, OA22679 +22680, OA22680 +22681, OA22681 +22682, OA22682 +22683, OA22683 +22684, OA22684 +22685, OA22685 +22686, OA22686 +22687, OA22687 +22688, OA22688 +22689, OA22689 +22690, OA22690 +22691, OA22691 +22692, OA22692 +22693, OA22693 +22694, OA22694 +22695, OA22695 +22696, OA22696 +22697, OA22697 +22698, OA22698 +22699, OA22699 +22700, OA22700 +22701, OA22701 +22702, OA22702 +22703, OA22703 +22704, OA22704 +22705, OA22705 +22706, OA22706 +22707, OA22707 +22708, OA22708 +22709, OA22709 +22710, OA22710 +22711, OA22711 +22712, OA22712 +22713, OA22713 +22714, OA22714 +22715, OA22715 +22716, OA22716 +22717, OA22717 +22718, OA22718 +22719, OA22719 +22720, OA22720 +22721, OA22721 +22722, OA22722 +22723, OA22723 +22724, OA22724 +22725, OA22725 +22726, OA22726 +22727, OA22727 +22728, OA22728 +22729, OA22729 +22730, OA22730 +22731, OA22731 +22732, OA22732 +22733, OA22733 +22734, OA22734 +22735, OA22735 +22736, OA22736 +22737, OA22737 +22738, OA22738 +22739, OA22739 +22740, OA22740 +22741, OA22741 +22742, OA22742 +22743, OA22743 +22744, OA22744 +22745, OA22745 +22746, OA22746 +22747, OA22747 +22748, OA22748 +22749, OA22749 +22750, OA22750 +22751, OA22751 +22752, OA22752 +22753, OA22753 +22754, OA22754 +22755, OA22755 +22756, OA22756 +22757, OA22757 +22758, OA22758 +22759, OA22759 +22760, OA22760 +22761, OA22761 +22762, OA22762 +22763, OA22763 +22764, OA22764 +22765, OA22765 +22766, OA22766 +22767, OA22767 +22768, OA22768 +22769, OA22769 +22770, OA22770 +22771, OA22771 +22772, OA22772 +22773, OA22773 +22774, OA22774 +22775, OA22775 +22776, OA22776 +22777, OA22777 +22778, OA22778 +22779, OA22779 +22780, OA22780 +22781, OA22781 +22782, OA22782 +22783, OA22783 +22784, OA22784 +22785, OA22785 +22786, OA22786 +22787, OA22787 +22788, OA22788 +22789, OA22789 +22790, OA22790 +22791, OA22791 +22792, OA22792 +22793, OA22793 +22794, OA22794 +22795, OA22795 +22796, OA22796 +22797, OA22797 +22798, OA22798 +22799, OA22799 +22800, OA22800 +22801, OA22801 +22802, OA22802 +22803, OA22803 +22804, OA22804 +22805, OA22805 +22806, OA22806 +22807, OA22807 +22808, OA22808 +22809, OA22809 +22810, OA22810 +22811, OA22811 +22812, OA22812 +22813, OA22813 +22814, OA22814 +22815, OA22815 +22816, OA22816 +22817, OA22817 +22818, OA22818 +22819, OA22819 +22820, OA22820 +22821, OA22821 +22822, OA22822 +22823, OA22823 +22824, OA22824 +22825, OA22825 +22826, OA22826 +22827, OA22827 +22828, OA22828 +22829, OA22829 +22830, OA22830 +22831, OA22831 +22832, OA22832 +22833, OA22833 +22834, OA22834 +22835, OA22835 +22836, OA22836 +22837, OA22837 +22838, OA22838 +22839, OA22839 +22840, OA22840 +22841, OA22841 +22842, OA22842 +22843, OA22843 +22844, OA22844 +22845, OA22845 +22846, OA22846 +22847, OA22847 +22848, OA22848 +22849, OA22849 +22850, OA22850 +22851, OA22851 +22852, OA22852 +22853, OA22853 +22854, OA22854 +22855, OA22855 +22856, OA22856 +22857, OA22857 +22858, OA22858 +22859, OA22859 +22860, OA22860 +22861, OA22861 +22862, OA22862 +22863, OA22863 +22864, OA22864 +22865, OA22865 +22866, OA22866 +22867, OA22867 +22868, OA22868 +22869, OA22869 +22870, OA22870 +22871, OA22871 +22872, OA22872 +22873, OA22873 +22874, OA22874 +22875, OA22875 +22876, OA22876 +22877, OA22877 +22878, OA22878 +22879, OA22879 +22880, OA22880 +22881, OA22881 +22882, OA22882 +22883, OA22883 +22884, OA22884 +22885, OA22885 +22886, OA22886 +22887, OA22887 +22888, OA22888 +22889, OA22889 +22890, OA22890 +22891, OA22891 +22892, OA22892 +22893, OA22893 +22894, OA22894 +22895, OA22895 +22896, OA22896 +22897, OA22897 +22898, OA22898 +22899, OA22899 +22900, OA22900 +22901, OA22901 +22902, OA22902 +22903, OA22903 +22904, OA22904 +22905, OA22905 +22906, OA22906 +22907, OA22907 +22908, OA22908 +22909, OA22909 +22910, OA22910 +22911, OA22911 +22912, OA22912 +22913, OA22913 +22914, OA22914 +22915, OA22915 +22916, OA22916 +22917, OA22917 +22918, OA22918 +22919, OA22919 +22920, OA22920 +22921, OA22921 +22922, OA22922 +22923, OA22923 +22924, OA22924 +22925, OA22925 +22926, OA22926 +22927, OA22927 +22928, OA22928 +22929, OA22929 +22930, OA22930 +22931, OA22931 +22932, OA22932 +22933, OA22933 +22934, OA22934 +22935, OA22935 +22936, OA22936 +22937, OA22937 +22938, OA22938 +22939, OA22939 +22940, OA22940 +22941, OA22941 +22942, OA22942 +22943, OA22943 +22944, OA22944 +22945, OA22945 +22946, OA22946 +22947, OA22947 +22948, OA22948 +22949, OA22949 +22950, OA22950 +22951, OA22951 +22952, OA22952 +22953, OA22953 +22954, OA22954 +22955, OA22955 +22956, OA22956 +22957, OA22957 +22958, OA22958 +22959, OA22959 +22960, OA22960 +22961, OA22961 +22962, OA22962 +22963, OA22963 +22964, OA22964 +22965, OA22965 +22966, OA22966 +22967, OA22967 +22968, OA22968 +22969, OA22969 +22970, OA22970 +22971, OA22971 +22972, OA22972 +22973, OA22973 +22974, OA22974 +22975, OA22975 +22976, OA22976 +22977, OA22977 +22978, OA22978 +22979, OA22979 +22980, OA22980 +22981, OA22981 +22982, OA22982 +22983, OA22983 +22984, OA22984 +22985, OA22985 +22986, OA22986 +22987, OA22987 +22988, OA22988 +22989, OA22989 +22990, OA22990 +22991, OA22991 +22992, OA22992 +22993, OA22993 +22994, OA22994 +22995, OA22995 +22996, OA22996 +22997, OA22997 +22998, OA22998 +22999, OA22999 +23000, OA23000 +23001, OA23001 +23002, OA23002 +23003, OA23003 +23004, OA23004 +23005, OA23005 +23006, OA23006 +23007, OA23007 +23008, OA23008 +23009, OA23009 +23010, OA23010 +23011, OA23011 +23012, OA23012 +23013, OA23013 +23014, OA23014 +23015, OA23015 +23016, OA23016 +23017, OA23017 +23018, OA23018 +23019, OA23019 +23020, OA23020 +23021, OA23021 +23022, OA23022 +23023, OA23023 +23024, OA23024 +23025, OA23025 +23026, OA23026 +23027, OA23027 +23028, OA23028 +23029, OA23029 +23030, OA23030 +23031, OA23031 +23032, OA23032 +23033, OA23033 +23034, OA23034 +23035, OA23035 +23036, OA23036 +23037, OA23037 +23038, OA23038 +23039, OA23039 +23040, OA23040 +23041, OA23041 +23042, OA23042 +23043, OA23043 +23044, OA23044 +23045, OA23045 +23046, OA23046 +23047, OA23047 +23048, OA23048 +23049, OA23049 +23050, OA23050 +23051, OA23051 +23052, OA23052 +23053, OA23053 +23054, OA23054 +23055, OA23055 +23056, OA23056 +23057, OA23057 +23058, OA23058 +23059, OA23059 +23060, OA23060 +23061, OA23061 +23062, OA23062 +23063, OA23063 +23064, OA23064 +23065, OA23065 +23066, OA23066 +23067, OA23067 +23068, OA23068 +23069, OA23069 +23070, OA23070 +23071, OA23071 +23072, OA23072 +23073, OA23073 +23074, OA23074 +23075, OA23075 +23076, OA23076 +23077, OA23077 +23078, OA23078 +23079, OA23079 +23080, OA23080 +23081, OA23081 +23082, OA23082 +23083, OA23083 +23084, OA23084 +23085, OA23085 +23086, OA23086 +23087, OA23087 +23088, OA23088 +23089, OA23089 +23090, OA23090 +23091, OA23091 +23092, OA23092 +23093, OA23093 +23094, OA23094 +23095, OA23095 +23096, OA23096 +23097, OA23097 +23098, OA23098 +23099, OA23099 +23100, OA23100 +23101, OA23101 +23102, OA23102 +23103, OA23103 +23104, OA23104 +23105, OA23105 +23106, OA23106 +23107, OA23107 +23108, OA23108 +23109, OA23109 +23110, OA23110 +23111, OA23111 +23112, OA23112 +23113, OA23113 +23114, OA23114 +23115, OA23115 +23116, OA23116 +23117, OA23117 +23118, OA23118 +23119, OA23119 +23120, OA23120 +23121, OA23121 +23122, OA23122 +23123, OA23123 +23124, OA23124 +23125, OA23125 +23126, OA23126 +23127, OA23127 +23128, OA23128 +23129, OA23129 +23130, OA23130 +23131, OA23131 +23132, OA23132 +23133, OA23133 +23134, OA23134 +23135, OA23135 +23136, OA23136 +23137, OA23137 +23138, OA23138 +23139, OA23139 +23140, OA23140 +23141, OA23141 +23142, OA23142 +23143, OA23143 +23144, OA23144 +23145, OA23145 +23146, OA23146 +23147, OA23147 +23148, OA23148 +23149, OA23149 +23150, OA23150 +23151, OA23151 +23152, OA23152 +23153, OA23153 +23154, OA23154 +23155, OA23155 +23156, OA23156 +23157, OA23157 +23158, OA23158 +23159, OA23159 +23160, OA23160 +23161, OA23161 +23162, OA23162 +23163, OA23163 +23164, OA23164 +23165, OA23165 +23166, OA23166 +23167, OA23167 +23168, OA23168 +23169, OA23169 +23170, OA23170 +23171, OA23171 +23172, OA23172 +23173, OA23173 +23174, OA23174 +23175, OA23175 +23176, OA23176 +23177, OA23177 +23178, OA23178 +23179, OA23179 +23180, OA23180 +23181, OA23181 +23182, OA23182 +23183, OA23183 +23184, OA23184 +23185, OA23185 +23186, OA23186 +23187, OA23187 +23188, OA23188 +23189, OA23189 +23190, OA23190 +23191, OA23191 +23192, OA23192 +23193, OA23193 +23194, OA23194 +23195, OA23195 +23196, OA23196 +23197, OA23197 +23198, OA23198 +23199, OA23199 +23200, OA23200 +23201, OA23201 +23202, OA23202 +23203, OA23203 +23204, OA23204 +23205, OA23205 +23206, OA23206 +23207, OA23207 +23208, OA23208 +23209, OA23209 +23210, OA23210 +23211, OA23211 +23212, OA23212 +23213, OA23213 +23214, OA23214 +23215, OA23215 +23216, OA23216 +23217, OA23217 +23218, OA23218 +23219, OA23219 +23220, OA23220 +23221, OA23221 +23222, OA23222 +23223, OA23223 +23224, OA23224 +23225, OA23225 +23226, OA23226 +23227, OA23227 +23228, OA23228 +23229, OA23229 +23230, OA23230 +23231, OA23231 +23232, OA23232 +23233, OA23233 +23234, OA23234 +23235, OA23235 +23236, OA23236 +23237, OA23237 +23238, OA23238 +23239, OA23239 +23240, OA23240 +23241, OA23241 +23242, OA23242 +23243, OA23243 +23244, OA23244 +23245, OA23245 +23246, OA23246 +23247, OA23247 +23248, OA23248 +23249, OA23249 +23250, OA23250 +23251, OA23251 +23252, OA23252 +23253, OA23253 +23254, OA23254 +23255, OA23255 +23256, OA23256 +23257, OA23257 +23258, OA23258 +23259, OA23259 +23260, OA23260 +23261, OA23261 +23262, OA23262 +23263, OA23263 +23264, OA23264 +23265, OA23265 +23266, OA23266 +23267, OA23267 +23268, OA23268 +23269, OA23269 +23270, OA23270 +23271, OA23271 +23272, OA23272 +23273, OA23273 +23274, OA23274 +23275, OA23275 +23276, OA23276 +23277, OA23277 +23278, OA23278 +23279, OA23279 +23280, OA23280 +23281, OA23281 +23282, OA23282 +23283, OA23283 +23284, OA23284 +23285, OA23285 +23286, OA23286 +23287, OA23287 +23288, OA23288 +23289, OA23289 +23290, OA23290 +23291, OA23291 +23292, OA23292 +23293, OA23293 +23294, OA23294 +23295, OA23295 +23296, OA23296 +23297, OA23297 +23298, OA23298 +23299, OA23299 +23300, OA23300 +23301, OA23301 +23302, OA23302 +23303, OA23303 +23304, OA23304 +23305, OA23305 +23306, OA23306 +23307, OA23307 +23308, OA23308 +23309, OA23309 +23310, OA23310 +23311, OA23311 +23312, OA23312 +23313, OA23313 +23314, OA23314 +23315, OA23315 +23316, OA23316 +23317, OA23317 +23318, OA23318 +23319, OA23319 +23320, OA23320 +23321, OA23321 +23322, OA23322 +23323, OA23323 +23324, OA23324 +23325, OA23325 +23326, OA23326 +23327, OA23327 +23328, OA23328 +23329, OA23329 +23330, OA23330 +23331, OA23331 +23332, OA23332 +23333, OA23333 +23334, OA23334 +23335, OA23335 +23336, OA23336 +23337, OA23337 +23338, OA23338 +23339, OA23339 +23340, OA23340 +23341, OA23341 +23342, OA23342 +23343, OA23343 +23344, OA23344 +23345, OA23345 +23346, OA23346 +23347, OA23347 +23348, OA23348 +23349, OA23349 +23350, OA23350 +23351, OA23351 +23352, OA23352 +23353, OA23353 +23354, OA23354 +23355, OA23355 +23356, OA23356 +23357, OA23357 +23358, OA23358 +23359, OA23359 +23360, OA23360 +23361, OA23361 +23362, OA23362 +23363, OA23363 +23364, OA23364 +23365, OA23365 +23366, OA23366 +23367, OA23367 +23368, OA23368 +23369, OA23369 +23370, OA23370 +23371, OA23371 +23372, OA23372 +23373, OA23373 +23374, OA23374 +23375, OA23375 +23376, OA23376 +23377, OA23377 +23378, OA23378 +23379, OA23379 +23380, OA23380 +23381, OA23381 +23382, OA23382 +23383, OA23383 +23384, OA23384 +23385, OA23385 +23386, OA23386 +23387, OA23387 +23388, OA23388 +23389, OA23389 +23390, OA23390 +23391, OA23391 +23392, OA23392 +23393, OA23393 +23394, OA23394 +23395, OA23395 +23396, OA23396 +23397, OA23397 +23398, OA23398 +23399, OA23399 +23400, OA23400 +23401, OA23401 +23402, OA23402 +23403, OA23403 +23404, OA23404 +23405, OA23405 +23406, OA23406 +23407, OA23407 +23408, OA23408 +23409, OA23409 +23410, OA23410 +23411, OA23411 +23412, OA23412 +23413, OA23413 +23414, OA23414 +23415, OA23415 +23416, OA23416 +23417, OA23417 +23418, OA23418 +23419, OA23419 +23420, OA23420 +23421, OA23421 +23422, OA23422 +23423, OA23423 +23424, OA23424 +23425, OA23425 +23426, OA23426 +23427, OA23427 +23428, OA23428 +23429, OA23429 +23430, OA23430 +23431, OA23431 +23432, OA23432 +23433, OA23433 +23434, OA23434 +23435, OA23435 +23436, OA23436 +23437, OA23437 +23438, OA23438 +23439, OA23439 +23440, OA23440 +23441, OA23441 +23442, OA23442 +23443, OA23443 +23444, OA23444 +23445, OA23445 +23446, OA23446 +23447, OA23447 +23448, OA23448 +23449, OA23449 +23450, OA23450 +23451, OA23451 +23452, OA23452 +23453, OA23453 +23454, OA23454 +23455, OA23455 +23456, OA23456 +23457, OA23457 +23458, OA23458 +23459, OA23459 +23460, OA23460 +23461, OA23461 +23462, OA23462 +23463, OA23463 +23464, OA23464 +23465, OA23465 +23466, OA23466 +23467, OA23467 +23468, OA23468 +23469, OA23469 +23470, OA23470 +23471, OA23471 +23472, OA23472 +23473, OA23473 +23474, OA23474 +23475, OA23475 +23476, OA23476 +23477, OA23477 +23478, OA23478 +23479, OA23479 +23480, OA23480 +23481, OA23481 +23482, OA23482 +23483, OA23483 +23484, OA23484 +23485, OA23485 +23486, OA23486 +23487, OA23487 +23488, OA23488 +23489, OA23489 +23490, OA23490 +23491, OA23491 +23492, OA23492 +23493, OA23493 +23494, OA23494 +23495, OA23495 +23496, OA23496 +23497, OA23497 +23498, OA23498 +23499, OA23499 +23500, OA23500 +23501, OA23501 +23502, OA23502 +23503, OA23503 +23504, OA23504 +23505, OA23505 +23506, OA23506 +23507, OA23507 +23508, OA23508 +23509, OA23509 +23510, OA23510 +23511, OA23511 +23512, OA23512 +23513, OA23513 +23514, OA23514 +23515, OA23515 +23516, OA23516 +23517, OA23517 +23518, OA23518 +23519, OA23519 +23520, OA23520 +23521, OA23521 +23522, OA23522 +23523, OA23523 +23524, OA23524 +23525, OA23525 +23526, OA23526 +23527, OA23527 +23528, OA23528 +23529, OA23529 +23530, OA23530 +23531, OA23531 +23532, OA23532 +23533, OA23533 +23534, OA23534 +23535, OA23535 +23536, OA23536 +23537, OA23537 +23538, OA23538 +23539, OA23539 +23540, OA23540 +23541, OA23541 +23542, OA23542 +23543, OA23543 +23544, OA23544 +23545, OA23545 +23546, OA23546 +23547, OA23547 +23548, OA23548 +23549, OA23549 +23550, OA23550 +23551, OA23551 +23552, OA23552 +23553, OA23553 +23554, OA23554 +23555, OA23555 +23556, OA23556 +23557, OA23557 +23558, OA23558 +23559, OA23559 +23560, OA23560 +23561, OA23561 +23562, OA23562 +23563, OA23563 +23564, OA23564 +23565, OA23565 +23566, OA23566 +23567, OA23567 +23568, OA23568 +23569, OA23569 +23570, OA23570 +23571, OA23571 +23572, OA23572 +23573, OA23573 +23574, OA23574 +23575, OA23575 +23576, OA23576 +23577, OA23577 +23578, OA23578 +23579, OA23579 +23580, OA23580 +23581, OA23581 +23582, OA23582 +23583, OA23583 +23584, OA23584 +23585, OA23585 +23586, OA23586 +23587, OA23587 +23588, OA23588 +23589, OA23589 +23590, OA23590 +23591, OA23591 +23592, OA23592 +23593, OA23593 +23594, OA23594 +23595, OA23595 +23596, OA23596 +23597, OA23597 +23598, OA23598 +23599, OA23599 +23600, OA23600 +23601, OA23601 +23602, OA23602 +23603, OA23603 +23604, OA23604 +23605, OA23605 +23606, OA23606 +23607, OA23607 +23608, OA23608 +23609, OA23609 +23610, OA23610 +23611, OA23611 +23612, OA23612 +23613, OA23613 +23614, OA23614 +23615, OA23615 +23616, OA23616 +23617, OA23617 +23618, OA23618 +23619, OA23619 +23620, OA23620 +23621, OA23621 +23622, OA23622 +23623, OA23623 +23624, OA23624 +23625, OA23625 +23626, OA23626 +23627, OA23627 +23628, OA23628 +23629, OA23629 +23630, OA23630 +23631, OA23631 +23632, OA23632 +23633, OA23633 +23634, OA23634 +23635, OA23635 +23636, OA23636 +23637, OA23637 +23638, OA23638 +23639, OA23639 +23640, OA23640 +23641, OA23641 +23642, OA23642 +23643, OA23643 +23644, OA23644 +23645, OA23645 +23646, OA23646 +23647, OA23647 +23648, OA23648 +23649, OA23649 +23650, OA23650 +23651, OA23651 +23652, OA23652 +23653, OA23653 +23654, OA23654 +23655, OA23655 +23656, OA23656 +23657, OA23657 +23658, OA23658 +23659, OA23659 +23660, OA23660 +23661, OA23661 +23662, OA23662 +23663, OA23663 +23664, OA23664 +23665, OA23665 +23666, OA23666 +23667, OA23667 +23668, OA23668 +23669, OA23669 +23670, OA23670 +23671, OA23671 +23672, OA23672 +23673, OA23673 +23674, OA23674 +23675, OA23675 +23676, OA23676 +23677, OA23677 +23678, OA23678 +23679, OA23679 +23680, OA23680 +23681, OA23681 +23682, OA23682 +23683, OA23683 +23684, OA23684 +23685, OA23685 +23686, OA23686 +23687, OA23687 +23688, OA23688 +23689, OA23689 +23690, OA23690 +23691, OA23691 +23692, OA23692 +23693, OA23693 +23694, OA23694 +23695, OA23695 +23696, OA23696 +23697, OA23697 +23698, OA23698 +23699, OA23699 +23700, OA23700 +23701, OA23701 +23702, OA23702 +23703, OA23703 +23704, OA23704 +23705, OA23705 +23706, OA23706 +23707, OA23707 +23708, OA23708 +23709, OA23709 +23710, OA23710 +23711, OA23711 +23712, OA23712 +23713, OA23713 +23714, OA23714 +23715, OA23715 +23716, OA23716 +23717, OA23717 +23718, OA23718 +23719, OA23719 +23720, OA23720 +23721, OA23721 +23722, OA23722 +23723, OA23723 +23724, OA23724 +23725, OA23725 +23726, OA23726 +23727, OA23727 +23728, OA23728 +23729, OA23729 +23730, OA23730 +23731, OA23731 +23732, OA23732 +23733, OA23733 +23734, OA23734 +23735, OA23735 +23736, OA23736 +23737, OA23737 +23738, OA23738 +23739, OA23739 +23740, OA23740 +23741, OA23741 +23742, OA23742 +23743, OA23743 +23744, OA23744 +23745, OA23745 +23746, OA23746 +23747, OA23747 +23748, OA23748 +23749, OA23749 +23750, OA23750 +23751, OA23751 +23752, OA23752 +23753, OA23753 +23754, OA23754 +23755, OA23755 +23756, OA23756 +23757, OA23757 +23758, OA23758 +23759, OA23759 +23760, OA23760 +23761, OA23761 +23762, OA23762 +23763, OA23763 +23764, OA23764 +23765, OA23765 +23766, OA23766 +23767, OA23767 +23768, OA23768 +23769, OA23769 +23770, OA23770 +23771, OA23771 +23772, OA23772 +23773, OA23773 +23774, OA23774 +23775, OA23775 +23776, OA23776 +23777, OA23777 +23778, OA23778 +23779, OA23779 +23780, OA23780 +23781, OA23781 +23782, OA23782 +23783, OA23783 +23784, OA23784 +23785, OA23785 +23786, OA23786 +23787, OA23787 +23788, OA23788 +23789, OA23789 +23790, OA23790 +23791, OA23791 +23792, OA23792 +23793, OA23793 +23794, OA23794 +23795, OA23795 +23796, OA23796 +23797, OA23797 +23798, OA23798 +23799, OA23799 +23800, OA23800 +23801, OA23801 +23802, OA23802 +23803, OA23803 +23804, OA23804 +23805, OA23805 +23806, OA23806 +23807, OA23807 +23808, OA23808 +23809, OA23809 +23810, OA23810 +23811, OA23811 +23812, OA23812 +23813, OA23813 +23814, OA23814 +23815, OA23815 +23816, OA23816 +23817, OA23817 +23818, OA23818 +23819, OA23819 +23820, OA23820 +23821, OA23821 +23822, OA23822 +23823, OA23823 +23824, OA23824 +23825, OA23825 +23826, OA23826 +23827, OA23827 +23828, OA23828 +23829, OA23829 +23830, OA23830 +23831, OA23831 +23832, OA23832 +23833, OA23833 +23834, OA23834 +23835, OA23835 +23836, OA23836 +23837, OA23837 +23838, OA23838 +23839, OA23839 +23840, OA23840 +23841, OA23841 +23842, OA23842 +23843, OA23843 +23844, OA23844 +23845, OA23845 +23846, OA23846 +23847, OA23847 +23848, OA23848 +23849, OA23849 +23850, OA23850 +23851, OA23851 +23852, OA23852 +23853, OA23853 +23854, OA23854 +23855, OA23855 +23856, OA23856 +23857, OA23857 +23858, OA23858 +23859, OA23859 +23860, OA23860 +23861, OA23861 +23862, OA23862 +23863, OA23863 +23864, OA23864 +23865, OA23865 +23866, OA23866 +23867, OA23867 +23868, OA23868 +23869, OA23869 +23870, OA23870 +23871, OA23871 +23872, OA23872 +23873, OA23873 +23874, OA23874 +23875, OA23875 +23876, OA23876 +23877, OA23877 +23878, OA23878 +23879, OA23879 +23880, OA23880 +23881, OA23881 +23882, OA23882 +23883, OA23883 +23884, OA23884 +23885, OA23885 +23886, OA23886 +23887, OA23887 +23888, OA23888 +23889, OA23889 +23890, OA23890 +23891, OA23891 +23892, OA23892 +23893, OA23893 +23894, OA23894 +23895, OA23895 +23896, OA23896 +23897, OA23897 +23898, OA23898 +23899, OA23899 +23900, OA23900 +23901, OA23901 +23902, OA23902 +23903, OA23903 +23904, OA23904 +23905, OA23905 +23906, OA23906 +23907, OA23907 +23908, OA23908 +23909, OA23909 +23910, OA23910 +23911, OA23911 +23912, OA23912 +23913, OA23913 +23914, OA23914 +23915, OA23915 +23916, OA23916 +23917, OA23917 +23918, OA23918 +23919, OA23919 +23920, OA23920 +23921, OA23921 +23922, OA23922 +23923, OA23923 +23924, OA23924 +23925, OA23925 +23926, OA23926 +23927, OA23927 +23928, OA23928 +23929, OA23929 +23930, OA23930 +23931, OA23931 +23932, OA23932 +23933, OA23933 +23934, OA23934 +23935, OA23935 +23936, OA23936 +23937, OA23937 +23938, OA23938 +23939, OA23939 +23940, OA23940 +23941, OA23941 +23942, OA23942 +23943, OA23943 +23944, OA23944 +23945, OA23945 +23946, OA23946 +23947, OA23947 +23948, OA23948 +23949, OA23949 +23950, OA23950 +23951, OA23951 +23952, OA23952 +23953, OA23953 +23954, OA23954 +23955, OA23955 +23956, OA23956 +23957, OA23957 +23958, OA23958 +23959, OA23959 +23960, OA23960 +23961, OA23961 +23962, OA23962 +23963, OA23963 +23964, OA23964 +23965, OA23965 +23966, OA23966 +23967, OA23967 +23968, OA23968 +23969, OA23969 +23970, OA23970 +23971, OA23971 +23972, OA23972 +23973, OA23973 +23974, OA23974 +23975, OA23975 +23976, OA23976 +23977, OA23977 +23978, OA23978 +23979, OA23979 +23980, OA23980 +23981, OA23981 +23982, OA23982 +23983, OA23983 +23984, OA23984 +23985, OA23985 +23986, OA23986 +23987, OA23987 +23988, OA23988 +23989, OA23989 +23990, OA23990 +23991, OA23991 +23992, OA23992 +23993, OA23993 +23994, OA23994 +23995, OA23995 +23996, OA23996 +23997, OA23997 +23998, OA23998 +23999, OA23999 +24000, OA24000 +24001, OA24001 +24002, OA24002 +24003, OA24003 +24004, OA24004 +24005, OA24005 +24006, OA24006 +24007, OA24007 +24008, OA24008 +24009, OA24009 +24010, OA24010 +24011, OA24011 +24012, OA24012 +24013, OA24013 +24014, OA24014 +24015, OA24015 +24016, OA24016 +24017, OA24017 +24018, OA24018 +24019, OA24019 +24020, OA24020 +24021, OA24021 +24022, OA24022 +24023, OA24023 +24024, OA24024 +24025, OA24025 +24026, OA24026 +24027, OA24027 +24028, OA24028 +24029, OA24029 +24030, OA24030 +24031, OA24031 +24032, OA24032 +24033, OA24033 +24034, OA24034 +24035, OA24035 +24036, OA24036 +24037, OA24037 +24038, OA24038 +24039, OA24039 +24040, OA24040 +24041, OA24041 +24042, OA24042 +24043, OA24043 +24044, OA24044 +24045, OA24045 +24046, OA24046 +24047, OA24047 +24048, OA24048 +24049, OA24049 +24050, OA24050 +24051, OA24051 +24052, OA24052 +24053, OA24053 +24054, OA24054 +24055, OA24055 +24056, OA24056 +24057, OA24057 +24058, OA24058 +24059, OA24059 +24060, OA24060 +24061, OA24061 +24062, OA24062 +24063, OA24063 +24064, OA24064 +24065, OA24065 +24066, OA24066 +24067, OA24067 +24068, OA24068 +24069, OA24069 +24070, OA24070 +24071, OA24071 +24072, OA24072 +24073, OA24073 +24074, OA24074 +24075, OA24075 +24076, OA24076 +24077, OA24077 +24078, OA24078 +24079, OA24079 +24080, OA24080 +24081, OA24081 +24082, OA24082 +24083, OA24083 +24084, OA24084 +24085, OA24085 +24086, OA24086 +24087, OA24087 +24088, OA24088 +24089, OA24089 +24090, OA24090 +24091, OA24091 +24092, OA24092 +24093, OA24093 +24094, OA24094 +24095, OA24095 +24096, OA24096 +24097, OA24097 +24098, OA24098 +24099, OA24099 +24100, OA24100 +24101, OA24101 +24102, OA24102 +24103, OA24103 +24104, OA24104 +24105, OA24105 +24106, OA24106 +24107, OA24107 +24108, OA24108 +24109, OA24109 +24110, OA24110 +24111, OA24111 +24112, OA24112 +24113, OA24113 +24114, OA24114 +24115, OA24115 +24116, OA24116 +24117, OA24117 +24118, OA24118 +24119, OA24119 +24120, OA24120 +24121, OA24121 +24122, OA24122 +24123, OA24123 +24124, OA24124 +24125, OA24125 +24126, OA24126 +24127, OA24127 +24128, OA24128 +24129, OA24129 +24130, OA24130 +24131, OA24131 +24132, OA24132 +24133, OA24133 +24134, OA24134 +24135, OA24135 +24136, OA24136 +24137, OA24137 +24138, OA24138 +24139, OA24139 +24140, OA24140 +24141, OA24141 +24142, OA24142 +24143, OA24143 +24144, OA24144 +24145, OA24145 +24146, OA24146 +24147, OA24147 +24148, OA24148 +24149, OA24149 +24150, OA24150 +24151, OA24151 +24152, OA24152 +24153, OA24153 +24154, OA24154 +24155, OA24155 +24156, OA24156 +24157, OA24157 +24158, OA24158 +24159, OA24159 +24160, OA24160 +24161, OA24161 +24162, OA24162 +24163, OA24163 +24164, OA24164 +24165, OA24165 +24166, OA24166 +24167, OA24167 +24168, OA24168 +24169, OA24169 +24170, OA24170 +24171, OA24171 +24172, OA24172 +24173, OA24173 +24174, OA24174 +24175, OA24175 +24176, OA24176 +24177, OA24177 +24178, OA24178 +24179, OA24179 +24180, OA24180 +24181, OA24181 +24182, OA24182 +24183, OA24183 +24184, OA24184 +24185, OA24185 +24186, OA24186 +24187, OA24187 +24188, OA24188 +24189, OA24189 +24190, OA24190 +24191, OA24191 +24192, OA24192 +24193, OA24193 +24194, OA24194 +24195, OA24195 +24196, OA24196 +24197, OA24197 +24198, OA24198 +24199, OA24199 +24200, OA24200 +24201, OA24201 +24202, OA24202 +24203, OA24203 +24204, OA24204 +24205, OA24205 +24206, OA24206 +24207, OA24207 +24208, OA24208 +24209, OA24209 +24210, OA24210 +24211, OA24211 +24212, OA24212 +24213, OA24213 +24214, OA24214 +24215, OA24215 +24216, OA24216 +24217, OA24217 +24218, OA24218 +24219, OA24219 +24220, OA24220 +24221, OA24221 +24222, OA24222 +24223, OA24223 +24224, OA24224 +24225, OA24225 +24226, OA24226 +24227, OA24227 +24228, OA24228 +24229, OA24229 +24230, OA24230 +24231, OA24231 +24232, OA24232 +24233, OA24233 +24234, OA24234 +24235, OA24235 +24236, OA24236 +24237, OA24237 +24238, OA24238 +24239, OA24239 +24240, OA24240 +24241, OA24241 +24242, OA24242 +24243, OA24243 +24244, OA24244 +24245, OA24245 +24246, OA24246 +24247, OA24247 +24248, OA24248 +24249, OA24249 +24250, OA24250 +24251, OA24251 +24252, OA24252 +24253, OA24253 +24254, OA24254 +24255, OA24255 +24256, OA24256 +24257, OA24257 +24258, OA24258 +24259, OA24259 +24260, OA24260 +24261, OA24261 +24262, OA24262 +24263, OA24263 +24264, OA24264 +24265, OA24265 +24266, OA24266 +24267, OA24267 +24268, OA24268 +24269, OA24269 +24270, OA24270 +24271, OA24271 +24272, OA24272 +24273, OA24273 +24274, OA24274 +24275, OA24275 +24276, OA24276 +24277, OA24277 +24278, OA24278 +24279, OA24279 +24280, OA24280 +24281, OA24281 +24282, OA24282 +24283, OA24283 +24284, OA24284 +24285, OA24285 +24286, OA24286 +24287, OA24287 +24288, OA24288 +24289, OA24289 +24290, OA24290 +24291, OA24291 +24292, OA24292 +24293, OA24293 +24294, OA24294 +24295, OA24295 +24296, OA24296 +24297, OA24297 +24298, OA24298 +24299, OA24299 +24300, OA24300 +24301, OA24301 +24302, OA24302 +24303, OA24303 +24304, OA24304 +24305, OA24305 +24306, OA24306 +24307, OA24307 +24308, OA24308 +24309, OA24309 +24310, OA24310 +24311, OA24311 +24312, OA24312 +24313, OA24313 +24314, OA24314 +24315, OA24315 +24316, OA24316 +24317, OA24317 +24318, OA24318 +24319, OA24319 +24320, OA24320 +24321, OA24321 +24322, OA24322 +24323, OA24323 +24324, OA24324 +24325, OA24325 +24326, OA24326 +24327, OA24327 +24328, OA24328 +24329, OA24329 +24330, OA24330 +24331, OA24331 +24332, OA24332 +24333, OA24333 +24334, OA24334 +24335, OA24335 +24336, OA24336 +24337, OA24337 +24338, OA24338 +24339, OA24339 +24340, OA24340 +24341, OA24341 +24342, OA24342 +24343, OA24343 +24344, OA24344 +24345, OA24345 +24346, OA24346 +24347, OA24347 +24348, OA24348 +24349, OA24349 +24350, OA24350 +24351, OA24351 +24352, OA24352 +24353, OA24353 +24354, OA24354 +24355, OA24355 +24356, OA24356 +24357, OA24357 +24358, OA24358 +24359, OA24359 +24360, OA24360 +24361, OA24361 +24362, OA24362 +24363, OA24363 +24364, OA24364 +24365, OA24365 +24366, OA24366 +24367, OA24367 +24368, OA24368 +24369, OA24369 +24370, OA24370 +24371, OA24371 +24372, OA24372 +24373, OA24373 +24374, OA24374 +24375, OA24375 +24376, OA24376 +24377, OA24377 +24378, OA24378 +24379, OA24379 +24380, OA24380 +24381, OA24381 +24382, OA24382 +24383, OA24383 +24384, OA24384 +24385, OA24385 +24386, OA24386 +24387, OA24387 +24388, OA24388 +24389, OA24389 +24390, OA24390 +24391, OA24391 +24392, OA24392 +24393, OA24393 +24394, OA24394 +24395, OA24395 +24396, OA24396 +24397, OA24397 +24398, OA24398 +24399, OA24399 +24400, OA24400 +24401, OA24401 +24402, OA24402 +24403, OA24403 +24404, OA24404 +24405, OA24405 +24406, OA24406 +24407, OA24407 +24408, OA24408 +24409, OA24409 +24410, OA24410 +24411, OA24411 +24412, OA24412 +24413, OA24413 +24414, OA24414 +24415, OA24415 +24416, OA24416 +24417, OA24417 +24418, OA24418 +24419, OA24419 +24420, OA24420 +24421, OA24421 +24422, OA24422 +24423, OA24423 +24424, OA24424 +24425, OA24425 +24426, OA24426 +24427, OA24427 +24428, OA24428 +24429, OA24429 +24430, OA24430 +24431, OA24431 +24432, OA24432 +24433, OA24433 +24434, OA24434 +24435, OA24435 +24436, OA24436 +24437, OA24437 +24438, OA24438 +24439, OA24439 +24440, OA24440 +24441, OA24441 +24442, OA24442 +24443, OA24443 +24444, OA24444 +24445, OA24445 +24446, OA24446 +24447, OA24447 +24448, OA24448 +24449, OA24449 +24450, OA24450 +24451, OA24451 +24452, OA24452 +24453, OA24453 +24454, OA24454 +24455, OA24455 +24456, OA24456 +24457, OA24457 +24458, OA24458 +24459, OA24459 +24460, OA24460 +24461, OA24461 +24462, OA24462 +24463, OA24463 +24464, OA24464 +24465, OA24465 +24466, OA24466 +24467, OA24467 +24468, OA24468 +24469, OA24469 +24470, OA24470 +24471, OA24471 +24472, OA24472 +24473, OA24473 +24474, OA24474 +24475, OA24475 +24476, OA24476 +24477, OA24477 +24478, OA24478 +24479, OA24479 +24480, OA24480 +24481, OA24481 +24482, OA24482 +24483, OA24483 +24484, OA24484 +24485, OA24485 +24486, OA24486 +24487, OA24487 +24488, OA24488 +24489, OA24489 +24490, OA24490 +24491, OA24491 +24492, OA24492 +24493, OA24493 +24494, OA24494 +24495, OA24495 +24496, OA24496 +24497, OA24497 +24498, OA24498 +24499, OA24499 +24500, OA24500 +24501, OA24501 +24502, OA24502 +24503, OA24503 +24504, OA24504 +24505, OA24505 +24506, OA24506 +24507, OA24507 +24508, OA24508 +24509, OA24509 +24510, OA24510 +24511, OA24511 +24512, OA24512 +24513, OA24513 +24514, OA24514 +24515, OA24515 +24516, OA24516 +24517, OA24517 +24518, OA24518 +24519, OA24519 +24520, OA24520 +24521, OA24521 +24522, OA24522 +24523, OA24523 +24524, OA24524 +24525, OA24525 +24526, OA24526 +24527, OA24527 +24528, OA24528 +24529, OA24529 +24530, OA24530 +24531, OA24531 +24532, OA24532 +24533, OA24533 +24534, OA24534 +24535, OA24535 +24536, OA24536 +24537, OA24537 +24538, OA24538 +24539, OA24539 +24540, OA24540 +24541, OA24541 +24542, OA24542 +24543, OA24543 +24544, OA24544 +24545, OA24545 +24546, OA24546 +24547, OA24547 +24548, OA24548 +24549, OA24549 +24550, OA24550 +24551, OA24551 +24552, OA24552 +24553, OA24553 +24554, OA24554 +24555, OA24555 +24556, OA24556 +24557, OA24557 +24558, OA24558 +24559, OA24559 +24560, OA24560 +24561, OA24561 +24562, OA24562 +24563, OA24563 +24564, OA24564 +24565, OA24565 +24566, OA24566 +24567, OA24567 +24568, OA24568 +24569, OA24569 +24570, OA24570 +24571, OA24571 +24572, OA24572 +24573, OA24573 +24574, OA24574 +24575, OA24575 +24576, OA24576 +24577, OA24577 +24578, OA24578 +24579, OA24579 +24580, OA24580 +24581, OA24581 +24582, OA24582 +24583, OA24583 +24584, OA24584 +24585, OA24585 +24586, OA24586 +24587, OA24587 +24588, OA24588 +24589, OA24589 +24590, OA24590 +24591, OA24591 +24592, OA24592 +24593, OA24593 +24594, OA24594 +24595, OA24595 +24596, OA24596 +24597, OA24597 +24598, OA24598 +24599, OA24599 +24600, OA24600 +24601, OA24601 +24602, OA24602 +24603, OA24603 +24604, OA24604 +24605, OA24605 +24606, OA24606 +24607, OA24607 +24608, OA24608 +24609, OA24609 +24610, OA24610 +24611, OA24611 +24612, OA24612 +24613, OA24613 +24614, OA24614 +24615, OA24615 +24616, OA24616 +24617, OA24617 +24618, OA24618 +24619, OA24619 +24620, OA24620 +24621, OA24621 +24622, OA24622 +24623, OA24623 +24624, OA24624 +24625, OA24625 +24626, OA24626 +24627, OA24627 +24628, OA24628 +24629, OA24629 +24630, OA24630 +24631, OA24631 +24632, OA24632 +24633, OA24633 +24634, OA24634 +24635, OA24635 +24636, OA24636 +24637, OA24637 +24638, OA24638 +24639, OA24639 +24640, OA24640 +24641, OA24641 +24642, OA24642 +24643, OA24643 +24644, OA24644 +24645, OA24645 +24646, OA24646 +24647, OA24647 +24648, OA24648 +24649, OA24649 +24650, OA24650 +24651, OA24651 +24652, OA24652 +24653, OA24653 +24654, OA24654 +24655, OA24655 +24656, OA24656 +24657, OA24657 +24658, OA24658 +24659, OA24659 +24660, OA24660 +24661, OA24661 +24662, OA24662 +24663, OA24663 +24664, OA24664 +24665, OA24665 +24666, OA24666 +24667, OA24667 +24668, OA24668 +24669, OA24669 +24670, OA24670 +24671, OA24671 +24672, OA24672 +24673, OA24673 +24674, OA24674 +24675, OA24675 +24676, OA24676 +24677, OA24677 +24678, OA24678 +24679, OA24679 +24680, OA24680 +24681, OA24681 +24682, OA24682 +24683, OA24683 +24684, OA24684 +24685, OA24685 +24686, OA24686 +24687, OA24687 +24688, OA24688 +24689, OA24689 +24690, OA24690 +24691, OA24691 +24692, OA24692 +24693, OA24693 +24694, OA24694 +24695, OA24695 +24696, OA24696 +24697, OA24697 +24698, OA24698 +24699, OA24699 +24700, OA24700 +24701, OA24701 +24702, OA24702 +24703, OA24703 +24704, OA24704 +24705, OA24705 +24706, OA24706 +24707, OA24707 +24708, OA24708 +24709, OA24709 +24710, OA24710 +24711, OA24711 +24712, OA24712 +24713, OA24713 +24714, OA24714 +24715, OA24715 +24716, OA24716 +24717, OA24717 +24718, OA24718 +24719, OA24719 +24720, OA24720 +24721, OA24721 +24722, OA24722 +24723, OA24723 +24724, OA24724 +24725, OA24725 +24726, OA24726 +24727, OA24727 +24728, OA24728 +24729, OA24729 +24730, OA24730 +24731, OA24731 +24732, OA24732 +24733, OA24733 +24734, OA24734 +24735, OA24735 +24736, OA24736 +24737, OA24737 +24738, OA24738 +24739, OA24739 +24740, OA24740 +24741, OA24741 +24742, OA24742 +24743, OA24743 +24744, OA24744 +24745, OA24745 +24746, OA24746 +24747, OA24747 +24748, OA24748 +24749, OA24749 +24750, OA24750 +24751, OA24751 +24752, OA24752 +24753, OA24753 +24754, OA24754 +24755, OA24755 +24756, OA24756 +24757, OA24757 +24758, OA24758 +24759, OA24759 +24760, OA24760 +24761, OA24761 +24762, OA24762 +24763, OA24763 +24764, OA24764 +24765, OA24765 +24766, OA24766 +24767, OA24767 +24768, OA24768 +24769, OA24769 +24770, OA24770 +24771, OA24771 +24772, OA24772 +24773, OA24773 +24774, OA24774 +24775, OA24775 +24776, OA24776 +24777, OA24777 +24778, OA24778 +24779, OA24779 +24780, OA24780 +24781, OA24781 +24782, OA24782 +24783, OA24783 +24784, OA24784 +24785, OA24785 +24786, OA24786 +24787, OA24787 +24788, OA24788 +24789, OA24789 +24790, OA24790 +24791, OA24791 +24792, OA24792 +24793, OA24793 +24794, OA24794 +24795, OA24795 +24796, OA24796 +24797, OA24797 +24798, OA24798 +24799, OA24799 +24800, OA24800 +24801, OA24801 +24802, OA24802 +24803, OA24803 +24804, OA24804 +24805, OA24805 +24806, OA24806 +24807, OA24807 +24808, OA24808 +24809, OA24809 +24810, OA24810 +24811, OA24811 +24812, OA24812 +24813, OA24813 +24814, OA24814 +24815, OA24815 +24816, OA24816 +24817, OA24817 +24818, OA24818 +24819, OA24819 +24820, OA24820 +24821, OA24821 +24822, OA24822 +24823, OA24823 +24824, OA24824 +24825, OA24825 +24826, OA24826 +24827, OA24827 +24828, OA24828 +24829, OA24829 +24830, OA24830 +24831, OA24831 +24832, OA24832 +24833, OA24833 +24834, OA24834 +24835, OA24835 +24836, OA24836 +24837, OA24837 +24838, OA24838 +24839, OA24839 +24840, OA24840 +24841, OA24841 +24842, OA24842 +24843, OA24843 +24844, OA24844 +24845, OA24845 +24846, OA24846 +24847, OA24847 +24848, OA24848 +24849, OA24849 +24850, OA24850 +24851, OA24851 +24852, OA24852 +24853, OA24853 +24854, OA24854 +24855, OA24855 +24856, OA24856 +24857, OA24857 +24858, OA24858 +24859, OA24859 +24860, OA24860 +24861, OA24861 +24862, OA24862 +24863, OA24863 +24864, OA24864 +24865, OA24865 +24866, OA24866 +24867, OA24867 +24868, OA24868 +24869, OA24869 +24870, OA24870 +24871, OA24871 +24872, OA24872 +24873, OA24873 +24874, OA24874 +24875, OA24875 +24876, OA24876 +24877, OA24877 +24878, OA24878 +24879, OA24879 +24880, OA24880 +24881, OA24881 +24882, OA24882 +24883, OA24883 +24884, OA24884 +24885, OA24885 +24886, OA24886 +24887, OA24887 +24888, OA24888 +24889, OA24889 +24890, OA24890 +24891, OA24891 +24892, OA24892 +24893, OA24893 +24894, OA24894 +24895, OA24895 +24896, OA24896 +24897, OA24897 +24898, OA24898 +24899, OA24899 +24900, OA24900 +24901, OA24901 +24902, OA24902 +24903, OA24903 +24904, OA24904 +24905, OA24905 +24906, OA24906 +24907, OA24907 +24908, OA24908 +24909, OA24909 +24910, OA24910 +24911, OA24911 +24912, OA24912 +24913, OA24913 +24914, OA24914 +24915, OA24915 +24916, OA24916 +24917, OA24917 +24918, OA24918 +24919, OA24919 +24920, OA24920 +24921, OA24921 +24922, OA24922 +24923, OA24923 +24924, OA24924 +24925, OA24925 +24926, OA24926 +24927, OA24927 +24928, OA24928 +24929, OA24929 +24930, OA24930 +24931, OA24931 +24932, OA24932 +24933, OA24933 +24934, OA24934 +24935, OA24935 +24936, OA24936 +24937, OA24937 +24938, OA24938 +24939, OA24939 +24940, OA24940 +24941, OA24941 +24942, OA24942 +24943, OA24943 +24944, OA24944 +24945, OA24945 +24946, OA24946 +24947, OA24947 +24948, OA24948 +24949, OA24949 +24950, OA24950 +24951, OA24951 +24952, OA24952 +24953, OA24953 +24954, OA24954 +24955, OA24955 +24956, OA24956 +24957, OA24957 +24958, OA24958 +24959, OA24959 +24960, OA24960 +24961, OA24961 +24962, OA24962 +24963, OA24963 +24964, OA24964 +24965, OA24965 +24966, OA24966 +24967, OA24967 +24968, OA24968 +24969, OA24969 +24970, OA24970 +24971, OA24971 +24972, OA24972 +24973, OA24973 +24974, OA24974 +24975, OA24975 +24976, OA24976 +24977, OA24977 +24978, OA24978 +24979, OA24979 +24980, OA24980 +24981, OA24981 +24982, OA24982 +24983, OA24983 +24984, OA24984 +24985, OA24985 +24986, OA24986 +24987, OA24987 +24988, OA24988 +24989, OA24989 +24990, OA24990 +24991, OA24991 +24992, OA24992 +24993, OA24993 +24994, OA24994 +24995, OA24995 +24996, OA24996 +24997, OA24997 +24998, OA24998 +24999, OA24999 +25000, OA25000 +25001, OA25001 +25002, OA25002 +25003, OA25003 +25004, OA25004 +25005, OA25005 +25006, OA25006 +25007, OA25007 +25008, OA25008 +25009, OA25009 +25010, OA25010 +25011, OA25011 +25012, OA25012 +25013, OA25013 +25014, OA25014 +25015, OA25015 +25016, OA25016 +25017, OA25017 +25018, OA25018 +25019, OA25019 +25020, OA25020 +25021, OA25021 +25022, OA25022 +25023, OA25023 +25024, OA25024 +25025, OA25025 +25026, OA25026 +25027, OA25027 +25028, OA25028 +25029, OA25029 +25030, OA25030 +25031, OA25031 +25032, OA25032 +25033, OA25033 +25034, OA25034 +25035, OA25035 +25036, OA25036 +25037, OA25037 +25038, OA25038 +25039, OA25039 +25040, OA25040 +25041, OA25041 +25042, OA25042 +25043, OA25043 +25044, OA25044 +25045, OA25045 +25046, OA25046 +25047, OA25047 +25048, OA25048 +25049, OA25049 +25050, OA25050 +25051, OA25051 +25052, OA25052 +25053, OA25053 +25054, OA25054 +25055, OA25055 +25056, OA25056 +25057, OA25057 +25058, OA25058 +25059, OA25059 +25060, OA25060 +25061, OA25061 +25062, OA25062 +25063, OA25063 +25064, OA25064 +25065, OA25065 +25066, OA25066 +25067, OA25067 +25068, OA25068 +25069, OA25069 +25070, OA25070 +25071, OA25071 +25072, OA25072 +25073, OA25073 +25074, OA25074 +25075, OA25075 +25076, OA25076 +25077, OA25077 +25078, OA25078 +25079, OA25079 +25080, OA25080 +25081, OA25081 +25082, OA25082 +25083, OA25083 +25084, OA25084 +25085, OA25085 +25086, OA25086 +25087, OA25087 +25088, OA25088 +25089, OA25089 +25090, OA25090 +25091, OA25091 +25092, OA25092 +25093, OA25093 +25094, OA25094 +25095, OA25095 +25096, OA25096 +25097, OA25097 +25098, OA25098 +25099, OA25099 +25100, OA25100 +25101, OA25101 +25102, OA25102 +25103, OA25103 +25104, OA25104 +25105, OA25105 +25106, OA25106 +25107, OA25107 +25108, OA25108 +25109, OA25109 +25110, OA25110 +25111, OA25111 +25112, OA25112 +25113, OA25113 +25114, OA25114 +25115, OA25115 +25116, OA25116 +25117, OA25117 +25118, OA25118 +25119, OA25119 +25120, OA25120 +25121, OA25121 +25122, OA25122 +25123, OA25123 +25124, OA25124 +25125, OA25125 +25126, OA25126 +25127, OA25127 +25128, OA25128 +25129, OA25129 +25130, OA25130 +25131, OA25131 +25132, OA25132 +25133, OA25133 +25134, OA25134 +25135, OA25135 +25136, OA25136 +25137, OA25137 +25138, OA25138 +25139, OA25139 +25140, OA25140 +25141, OA25141 +25142, OA25142 +25143, OA25143 +25144, OA25144 +25145, OA25145 +25146, OA25146 +25147, OA25147 +25148, OA25148 +25149, OA25149 +25150, OA25150 +25151, OA25151 +25152, OA25152 +25153, OA25153 +25154, OA25154 +25155, OA25155 +25156, OA25156 +25157, OA25157 +25158, OA25158 +25159, OA25159 +25160, OA25160 +25161, OA25161 +25162, OA25162 +25163, OA25163 +25164, OA25164 +25165, OA25165 +25166, OA25166 +25167, OA25167 +25168, OA25168 +25169, OA25169 +25170, OA25170 +25171, OA25171 +25172, OA25172 +25173, OA25173 +25174, OA25174 +25175, OA25175 +25176, OA25176 +25177, OA25177 +25178, OA25178 +25179, OA25179 +25180, OA25180 +25181, OA25181 +25182, OA25182 +25183, OA25183 +25184, OA25184 +25185, OA25185 +25186, OA25186 +25187, OA25187 +25188, OA25188 +25189, OA25189 +25190, OA25190 +25191, OA25191 +25192, OA25192 +25193, OA25193 +25194, OA25194 +25195, OA25195 +25196, OA25196 +25197, OA25197 +25198, OA25198 +25199, OA25199 +25200, OA25200 +25201, OA25201 +25202, OA25202 +25203, OA25203 +25204, OA25204 +25205, OA25205 +25206, OA25206 +25207, OA25207 +25208, OA25208 +25209, OA25209 +25210, OA25210 +25211, OA25211 +25212, OA25212 +25213, OA25213 +25214, OA25214 +25215, OA25215 +25216, OA25216 +25217, OA25217 +25218, OA25218 +25219, OA25219 +25220, OA25220 +25221, OA25221 +25222, OA25222 +25223, OA25223 +25224, OA25224 +25225, OA25225 +25226, OA25226 +25227, OA25227 +25228, OA25228 +25229, OA25229 +25230, OA25230 +25231, OA25231 +25232, OA25232 +25233, OA25233 +25234, OA25234 +25235, OA25235 +25236, OA25236 +25237, OA25237 +25238, OA25238 +25239, OA25239 +25240, OA25240 +25241, OA25241 +25242, OA25242 +25243, OA25243 +25244, OA25244 +25245, OA25245 +25246, OA25246 +25247, OA25247 +25248, OA25248 +25249, OA25249 +25250, OA25250 +25251, OA25251 +25252, OA25252 +25253, OA25253 +25254, OA25254 +25255, OA25255 +25256, OA25256 +25257, OA25257 +25258, OA25258 +25259, OA25259 +25260, OA25260 +25261, OA25261 +25262, OA25262 +25263, OA25263 +25264, OA25264 +25265, OA25265 +25266, OA25266 +25267, OA25267 +25268, OA25268 +25269, OA25269 +25270, OA25270 +25271, OA25271 +25272, OA25272 +25273, OA25273 +25274, OA25274 +25275, OA25275 +25276, OA25276 +25277, OA25277 +25278, OA25278 +25279, OA25279 +25280, OA25280 +25281, OA25281 +25282, OA25282 +25283, OA25283 +25284, OA25284 +25285, OA25285 +25286, OA25286 +25287, OA25287 +25288, OA25288 +25289, OA25289 +25290, OA25290 +25291, OA25291 +25292, OA25292 +25293, OA25293 +25294, OA25294 +25295, OA25295 +25296, OA25296 +25297, OA25297 +25298, OA25298 +25299, OA25299 +25300, OA25300 +25301, OA25301 +25302, OA25302 +25303, OA25303 +25304, OA25304 +25305, OA25305 +25306, OA25306 +25307, OA25307 +25308, OA25308 +25309, OA25309 +25310, OA25310 +25311, OA25311 +25312, OA25312 +25313, OA25313 +25314, OA25314 +25315, OA25315 +25316, OA25316 +25317, OA25317 +25318, OA25318 +25319, OA25319 +25320, OA25320 +25321, OA25321 +25322, OA25322 +25323, OA25323 +25324, OA25324 +25325, OA25325 +25326, OA25326 +25327, OA25327 +25328, OA25328 +25329, OA25329 +25330, OA25330 +25331, OA25331 +25332, OA25332 +25333, OA25333 +25334, OA25334 +25335, OA25335 +25336, OA25336 +25337, OA25337 +25338, OA25338 +25339, OA25339 +25340, OA25340 +25341, OA25341 +25342, OA25342 +25343, OA25343 +25344, OA25344 +25345, OA25345 +25346, OA25346 +25347, OA25347 +25348, OA25348 +25349, OA25349 +25350, OA25350 +25351, OA25351 +25352, OA25352 +25353, OA25353 +25354, OA25354 +25355, OA25355 +25356, OA25356 +25357, OA25357 +25358, OA25358 +25359, OA25359 +25360, OA25360 +25361, OA25361 +25362, OA25362 +25363, OA25363 +25364, OA25364 +25365, OA25365 +25366, OA25366 +25367, OA25367 +25368, OA25368 +25369, OA25369 +25370, OA25370 +25371, OA25371 +25372, OA25372 +25373, OA25373 +25374, OA25374 +25375, OA25375 +25376, OA25376 +25377, OA25377 +25378, OA25378 +25379, OA25379 +25380, OA25380 +25381, OA25381 +25382, OA25382 +25383, OA25383 +25384, OA25384 +25385, OA25385 +25386, OA25386 +25387, OA25387 +25388, OA25388 +25389, OA25389 +25390, OA25390 +25391, OA25391 +25392, OA25392 +25393, OA25393 +25394, OA25394 +25395, OA25395 +25396, OA25396 +25397, OA25397 +25398, OA25398 +25399, OA25399 +25400, OA25400 +25401, OA25401 +25402, OA25402 +25403, OA25403 +25404, OA25404 +25405, OA25405 +25406, OA25406 +25407, OA25407 +25408, OA25408 +25409, OA25409 +25410, OA25410 +25411, OA25411 +25412, OA25412 +25413, OA25413 +25414, OA25414 +25415, OA25415 +25416, OA25416 +25417, OA25417 +25418, OA25418 +25419, OA25419 +25420, OA25420 +25421, OA25421 +25422, OA25422 +25423, OA25423 +25424, OA25424 +25425, OA25425 +25426, OA25426 +25427, OA25427 +25428, OA25428 +25429, OA25429 +25430, OA25430 +25431, OA25431 +25432, OA25432 +25433, OA25433 +25434, OA25434 +25435, OA25435 +25436, OA25436 +25437, OA25437 +25438, OA25438 +25439, OA25439 +25440, OA25440 +25441, OA25441 +25442, OA25442 +25443, OA25443 +25444, OA25444 +25445, OA25445 +25446, OA25446 +25447, OA25447 +25448, OA25448 +25449, OA25449 +25450, OA25450 +25451, OA25451 +25452, OA25452 +25453, OA25453 +25454, OA25454 +25455, OA25455 +25456, OA25456 +25457, OA25457 +25458, OA25458 +25459, OA25459 +25460, OA25460 +25461, OA25461 +25462, OA25462 +25463, OA25463 +25464, OA25464 +25465, OA25465 +25466, OA25466 +25467, OA25467 +25468, OA25468 +25469, OA25469 +25470, OA25470 +25471, OA25471 +25472, OA25472 +25473, OA25473 +25474, OA25474 +25475, OA25475 +25476, OA25476 +25477, OA25477 +25478, OA25478 +25479, OA25479 +25480, OA25480 +25481, OA25481 +25482, OA25482 +25483, OA25483 +25484, OA25484 +25485, OA25485 +25486, OA25486 +25487, OA25487 +25488, OA25488 +25489, OA25489 +25490, OA25490 +25491, OA25491 +25492, OA25492 +25493, OA25493 +25494, OA25494 +25495, OA25495 +25496, OA25496 +25497, OA25497 +25498, OA25498 +25499, OA25499 +25500, OA25500 +25501, OA25501 +25502, OA25502 +25503, OA25503 +25504, OA25504 +25505, OA25505 +25506, OA25506 +25507, OA25507 +25508, OA25508 +25509, OA25509 +25510, OA25510 +25511, OA25511 +25512, OA25512 +25513, OA25513 +25514, OA25514 +25515, OA25515 +25516, OA25516 +25517, OA25517 +25518, OA25518 +25519, OA25519 +25520, OA25520 +25521, OA25521 +25522, OA25522 +25523, OA25523 +25524, OA25524 +25525, OA25525 +25526, OA25526 +25527, OA25527 +25528, OA25528 +25529, OA25529 +25530, OA25530 +25531, OA25531 +25532, OA25532 +25533, OA25533 +25534, OA25534 +25535, OA25535 +25536, OA25536 +25537, OA25537 +25538, OA25538 +25539, OA25539 +25540, OA25540 +25541, OA25541 +25542, OA25542 +25543, OA25543 +25544, OA25544 +25545, OA25545 +25546, OA25546 +25547, OA25547 +25548, OA25548 +25549, OA25549 +25550, OA25550 +25551, OA25551 +25552, OA25552 +25553, OA25553 +25554, OA25554 +25555, OA25555 +25556, OA25556 +25557, OA25557 +25558, OA25558 +25559, OA25559 +25560, OA25560 +25561, OA25561 +25562, OA25562 +25563, OA25563 +25564, OA25564 +25565, OA25565 +25566, OA25566 +25567, OA25567 +25568, OA25568 +25569, OA25569 +25570, OA25570 +25571, OA25571 +25572, OA25572 +25573, OA25573 +25574, OA25574 +25575, OA25575 +25576, OA25576 +25577, OA25577 +25578, OA25578 +25579, OA25579 +25580, OA25580 +25581, OA25581 +25582, OA25582 +25583, OA25583 +25584, OA25584 +25585, OA25585 +25586, OA25586 +25587, OA25587 +25588, OA25588 +25589, OA25589 +25590, OA25590 +25591, OA25591 +25592, OA25592 +25593, OA25593 +25594, OA25594 +25595, OA25595 +25596, OA25596 +25597, OA25597 +25598, OA25598 +25599, OA25599 +25600, OA25600 +25601, OA25601 +25602, OA25602 +25603, OA25603 +25604, OA25604 +25605, OA25605 +25606, OA25606 +25607, OA25607 +25608, OA25608 +25609, OA25609 +25610, OA25610 +25611, OA25611 +25612, OA25612 +25613, OA25613 +25614, OA25614 +25615, OA25615 +25616, OA25616 +25617, OA25617 +25618, OA25618 +25619, OA25619 +25620, OA25620 +25621, OA25621 +25622, OA25622 +25623, OA25623 +25624, OA25624 +25625, OA25625 +25626, OA25626 +25627, OA25627 +25628, OA25628 +25629, OA25629 +25630, OA25630 +25631, OA25631 +25632, OA25632 +25633, OA25633 +25634, OA25634 +25635, OA25635 +25636, OA25636 +25637, OA25637 +25638, OA25638 +25639, OA25639 +25640, OA25640 +25641, OA25641 +25642, OA25642 +25643, OA25643 +25644, OA25644 +25645, OA25645 +25646, OA25646 +25647, OA25647 +25648, OA25648 +25649, OA25649 +25650, OA25650 +25651, OA25651 +25652, OA25652 +25653, OA25653 +25654, OA25654 +25655, OA25655 +25656, OA25656 +25657, OA25657 +25658, OA25658 +25659, OA25659 +25660, OA25660 +25661, OA25661 +25662, OA25662 +25663, OA25663 +25664, OA25664 +25665, OA25665 +25666, OA25666 +25667, OA25667 +25668, OA25668 +25669, OA25669 +25670, OA25670 +25671, OA25671 +25672, OA25672 +25673, OA25673 +25674, OA25674 +25675, OA25675 +25676, OA25676 +25677, OA25677 +25678, OA25678 +25679, OA25679 +25680, OA25680 +25681, OA25681 +25682, OA25682 +25683, OA25683 +25684, OA25684 +25685, OA25685 +25686, OA25686 +25687, OA25687 +25688, OA25688 +25689, OA25689 +25690, OA25690 +25691, OA25691 +25692, OA25692 +25693, OA25693 +25694, OA25694 +25695, OA25695 +25696, OA25696 +25697, OA25697 +25698, OA25698 +25699, OA25699 +25700, OA25700 +25701, OA25701 +25702, OA25702 +25703, OA25703 +25704, OA25704 +25705, OA25705 +25706, OA25706 +25707, OA25707 +25708, OA25708 +25709, OA25709 +25710, OA25710 +25711, OA25711 +25712, OA25712 +25713, OA25713 +25714, OA25714 +25715, OA25715 +25716, OA25716 +25717, OA25717 +25718, OA25718 +25719, OA25719 +25720, OA25720 +25721, OA25721 +25722, OA25722 +25723, OA25723 +25724, OA25724 +25725, OA25725 +25726, OA25726 +25727, OA25727 +25728, OA25728 +25729, OA25729 +25730, OA25730 +25731, OA25731 +25732, OA25732 +25733, OA25733 +25734, OA25734 +25735, OA25735 +25736, OA25736 +25737, OA25737 +25738, OA25738 +25739, OA25739 +25740, OA25740 +25741, OA25741 +25742, OA25742 +25743, OA25743 +25744, OA25744 +25745, OA25745 +25746, OA25746 +25747, OA25747 +25748, OA25748 +25749, OA25749 +25750, OA25750 +25751, OA25751 +25752, OA25752 +25753, OA25753 +25754, OA25754 +25755, OA25755 +25756, OA25756 +25757, OA25757 +25758, OA25758 +25759, OA25759 +25760, OA25760 +25761, OA25761 +25762, OA25762 +25763, OA25763 +25764, OA25764 +25765, OA25765 +25766, OA25766 +25767, OA25767 +25768, OA25768 +25769, OA25769 +25770, OA25770 +25771, OA25771 +25772, OA25772 +25773, OA25773 +25774, OA25774 +25775, OA25775 +25776, OA25776 +25777, OA25777 +25778, OA25778 +25779, OA25779 +25780, OA25780 +25781, OA25781 +25782, OA25782 +25783, OA25783 +25784, OA25784 +25785, OA25785 +25786, OA25786 +25787, OA25787 +25788, OA25788 +25789, OA25789 +25790, OA25790 +25791, OA25791 +25792, OA25792 +25793, OA25793 +25794, OA25794 +25795, OA25795 +25796, OA25796 +25797, OA25797 +25798, OA25798 +25799, OA25799 +25800, OA25800 +25801, OA25801 +25802, OA25802 +25803, OA25803 +25804, OA25804 +25805, OA25805 +25806, OA25806 +25807, OA25807 +25808, OA25808 +25809, OA25809 +25810, OA25810 +25811, OA25811 +25812, OA25812 +25813, OA25813 +25814, OA25814 +25815, OA25815 +25816, OA25816 +25817, OA25817 +25818, OA25818 +25819, OA25819 +25820, OA25820 +25821, OA25821 +25822, OA25822 +25823, OA25823 +25824, OA25824 +25825, OA25825 +25826, OA25826 +25827, OA25827 +25828, OA25828 +25829, OA25829 +25830, OA25830 +25831, OA25831 +25832, OA25832 +25833, OA25833 +25834, OA25834 +25835, OA25835 +25836, OA25836 +25837, OA25837 +25838, OA25838 +25839, OA25839 +25840, OA25840 +25841, OA25841 +25842, OA25842 +25843, OA25843 +25844, OA25844 +25845, OA25845 +25846, OA25846 +25847, OA25847 +25848, OA25848 +25849, OA25849 +25850, OA25850 +25851, OA25851 +25852, OA25852 +25853, OA25853 +25854, OA25854 +25855, OA25855 +25856, OA25856 +25857, OA25857 +25858, OA25858 +25859, OA25859 +25860, OA25860 +25861, OA25861 +25862, OA25862 +25863, OA25863 +25864, OA25864 +25865, OA25865 +25866, OA25866 +25867, OA25867 +25868, OA25868 +25869, OA25869 +25870, OA25870 +25871, OA25871 +25872, OA25872 +25873, OA25873 +25874, OA25874 +25875, OA25875 +25876, OA25876 +25877, OA25877 +25878, OA25878 +25879, OA25879 +25880, OA25880 +25881, OA25881 +25882, OA25882 +25883, OA25883 +25884, OA25884 +25885, OA25885 +25886, OA25886 +25887, OA25887 +25888, OA25888 +25889, OA25889 +25890, OA25890 +25891, OA25891 +25892, OA25892 +25893, OA25893 +25894, OA25894 +25895, OA25895 +25896, OA25896 +25897, OA25897 +25898, OA25898 +25899, OA25899 +25900, OA25900 +25901, OA25901 +25902, OA25902 +25903, OA25903 +25904, OA25904 +25905, OA25905 +25906, OA25906 +25907, OA25907 +25908, OA25908 +25909, OA25909 +25910, OA25910 +25911, OA25911 +25912, OA25912 +25913, OA25913 +25914, OA25914 +25915, OA25915 +25916, OA25916 +25917, OA25917 +25918, OA25918 +25919, OA25919 +25920, OA25920 +25921, OA25921 +25922, OA25922 +25923, OA25923 +25924, OA25924 +25925, OA25925 +25926, OA25926 +25927, OA25927 +25928, OA25928 +25929, OA25929 +25930, OA25930 +25931, OA25931 +25932, OA25932 +25933, OA25933 +25934, OA25934 +25935, OA25935 +25936, OA25936 +25937, OA25937 +25938, OA25938 +25939, OA25939 +25940, OA25940 +25941, OA25941 +25942, OA25942 +25943, OA25943 +25944, OA25944 +25945, OA25945 +25946, OA25946 +25947, OA25947 +25948, OA25948 +25949, OA25949 +25950, OA25950 +25951, OA25951 +25952, OA25952 +25953, OA25953 +25954, OA25954 +25955, OA25955 +25956, OA25956 +25957, OA25957 +25958, OA25958 +25959, OA25959 +25960, OA25960 +25961, OA25961 +25962, OA25962 +25963, OA25963 +25964, OA25964 +25965, OA25965 +25966, OA25966 +25967, OA25967 +25968, OA25968 +25969, OA25969 +25970, OA25970 +25971, OA25971 +25972, OA25972 +25973, OA25973 +25974, OA25974 +25975, OA25975 +25976, OA25976 +25977, OA25977 +25978, OA25978 +25979, OA25979 +25980, OA25980 +25981, OA25981 +25982, OA25982 +25983, OA25983 +25984, OA25984 +25985, OA25985 +25986, OA25986 +25987, OA25987 +25988, OA25988 +25989, OA25989 +25990, OA25990 +25991, OA25991 +25992, OA25992 +25993, OA25993 +25994, OA25994 +25995, OA25995 +25996, OA25996 +25997, OA25997 +25998, OA25998 +25999, OA25999 +26000, OA26000 +26001, OA26001 +26002, OA26002 +26003, OA26003 +26004, OA26004 +26005, OA26005 +26006, OA26006 +26007, OA26007 +26008, OA26008 +26009, OA26009 +26010, OA26010 +26011, OA26011 +26012, OA26012 +26013, OA26013 +26014, OA26014 +26015, OA26015 +26016, OA26016 +26017, OA26017 +26018, OA26018 +26019, OA26019 +26020, OA26020 +26021, OA26021 +26022, OA26022 +26023, OA26023 +26024, OA26024 +26025, OA26025 +26026, OA26026 +26027, OA26027 +26028, OA26028 +26029, OA26029 +26030, OA26030 +26031, OA26031 +26032, OA26032 +26033, OA26033 +26034, OA26034 +26035, OA26035 +26036, OA26036 +26037, OA26037 +26038, OA26038 +26039, OA26039 +26040, OA26040 +26041, OA26041 +26042, OA26042 +26043, OA26043 +26044, OA26044 +26045, OA26045 +26046, OA26046 +26047, OA26047 +26048, OA26048 +26049, OA26049 +26050, OA26050 +26051, OA26051 +26052, OA26052 +26053, OA26053 +26054, OA26054 +26055, OA26055 +26056, OA26056 +26057, OA26057 +26058, OA26058 +26059, OA26059 +26060, OA26060 +26061, OA26061 +26062, OA26062 +26063, OA26063 +26064, OA26064 +26065, OA26065 +26066, OA26066 +26067, OA26067 +26068, OA26068 +26069, OA26069 +26070, OA26070 +26071, OA26071 +26072, OA26072 +26073, OA26073 +26074, OA26074 +26075, OA26075 +26076, OA26076 +26077, OA26077 +26078, OA26078 +26079, OA26079 +26080, OA26080 +26081, OA26081 +26082, OA26082 +26083, OA26083 +26084, OA26084 +26085, OA26085 +26086, OA26086 +26087, OA26087 +26088, OA26088 +26089, OA26089 +26090, OA26090 +26091, OA26091 +26092, OA26092 +26093, OA26093 +26094, OA26094 +26095, OA26095 +26096, OA26096 +26097, OA26097 +26098, OA26098 +26099, OA26099 +26100, OA26100 +26101, OA26101 +26102, OA26102 +26103, OA26103 +26104, OA26104 +26105, OA26105 +26106, OA26106 +26107, OA26107 +26108, OA26108 +26109, OA26109 +26110, OA26110 +26111, OA26111 +26112, OA26112 +26113, OA26113 +26114, OA26114 +26115, OA26115 +26116, OA26116 +26117, OA26117 +26118, OA26118 +26119, OA26119 +26120, OA26120 +26121, OA26121 +26122, OA26122 +26123, OA26123 +26124, OA26124 +26125, OA26125 +26126, OA26126 +26127, OA26127 +26128, OA26128 +26129, OA26129 +26130, OA26130 +26131, OA26131 +26132, OA26132 +26133, OA26133 +26134, OA26134 +26135, OA26135 +26136, OA26136 +26137, OA26137 +26138, OA26138 +26139, OA26139 +26140, OA26140 +26141, OA26141 +26142, OA26142 +26143, OA26143 +26144, OA26144 +26145, OA26145 +26146, OA26146 +26147, OA26147 +26148, OA26148 +26149, OA26149 +26150, OA26150 +26151, OA26151 +26152, OA26152 +26153, OA26153 +26154, OA26154 +26155, OA26155 +26156, OA26156 +26157, OA26157 +26158, OA26158 +26159, OA26159 +26160, OA26160 +26161, OA26161 +26162, OA26162 +26163, OA26163 +26164, OA26164 +26165, OA26165 +26166, OA26166 +26167, OA26167 +26168, OA26168 +26169, OA26169 +26170, OA26170 +26171, OA26171 +26172, OA26172 +26173, OA26173 +26174, OA26174 +26175, OA26175 +26176, OA26176 +26177, OA26177 +26178, OA26178 +26179, OA26179 +26180, OA26180 +26181, OA26181 +26182, OA26182 +26183, OA26183 +26184, OA26184 +26185, OA26185 +26186, OA26186 +26187, OA26187 +26188, OA26188 +26189, OA26189 +26190, OA26190 +26191, OA26191 +26192, OA26192 +26193, OA26193 +26194, OA26194 +26195, OA26195 +26196, OA26196 +26197, OA26197 +26198, OA26198 +26199, OA26199 +26200, OA26200 +26201, OA26201 +26202, OA26202 +26203, OA26203 +26204, OA26204 +26205, OA26205 +26206, OA26206 +26207, OA26207 +26208, OA26208 +26209, OA26209 +26210, OA26210 +26211, OA26211 +26212, OA26212 +26213, OA26213 +26214, OA26214 +26215, OA26215 +26216, OA26216 +26217, OA26217 +26218, OA26218 +26219, OA26219 +26220, OA26220 +26221, OA26221 +26222, OA26222 +26223, OA26223 +26224, OA26224 +26225, OA26225 +26226, OA26226 +26227, OA26227 +26228, OA26228 +26229, OA26229 +26230, OA26230 +26231, OA26231 +26232, OA26232 +26233, OA26233 +26234, OA26234 +26235, OA26235 +26236, OA26236 +26237, OA26237 +26238, OA26238 +26239, OA26239 +26240, OA26240 +26241, OA26241 +26242, OA26242 +26243, OA26243 +26244, OA26244 +26245, OA26245 +26246, OA26246 +26247, OA26247 +26248, OA26248 +26249, OA26249 +26250, OA26250 +26251, OA26251 +26252, OA26252 +26253, OA26253 +26254, OA26254 +26255, OA26255 +26256, OA26256 +26257, OA26257 +26258, OA26258 +26259, OA26259 +26260, OA26260 +26261, OA26261 +26262, OA26262 +26263, OA26263 +26264, OA26264 +26265, OA26265 +26266, OA26266 +26267, OA26267 +26268, OA26268 +26269, OA26269 +26270, OA26270 +26271, OA26271 +26272, OA26272 +26273, OA26273 +26274, OA26274 +26275, OA26275 +26276, OA26276 +26277, OA26277 +26278, OA26278 +26279, OA26279 +26280, OA26280 +26281, OA26281 +26282, OA26282 +26283, OA26283 +26284, OA26284 +26285, OA26285 +26286, OA26286 +26287, OA26287 +26288, OA26288 +26289, OA26289 +26290, OA26290 +26291, OA26291 +26292, OA26292 +26293, OA26293 +26294, OA26294 +26295, OA26295 +26296, OA26296 +26297, OA26297 +26298, OA26298 +26299, OA26299 +26300, OA26300 +26301, OA26301 +26302, OA26302 +26303, OA26303 +26304, OA26304 +26305, OA26305 +26306, OA26306 +26307, OA26307 +26308, OA26308 +26309, OA26309 +26310, OA26310 +26311, OA26311 +26312, OA26312 +26313, OA26313 +26314, OA26314 +26315, OA26315 +26316, OA26316 +26317, OA26317 +26318, OA26318 +26319, OA26319 +26320, OA26320 +26321, OA26321 +26322, OA26322 +26323, OA26323 +26324, OA26324 +26325, OA26325 +26326, OA26326 +26327, OA26327 +26328, OA26328 +26329, OA26329 +26330, OA26330 +26331, OA26331 +26332, OA26332 +26333, OA26333 +26334, OA26334 +26335, OA26335 +26336, OA26336 +26337, OA26337 +26338, OA26338 +26339, OA26339 +26340, OA26340 +26341, OA26341 +26342, OA26342 +26343, OA26343 +26344, OA26344 +26345, OA26345 +26346, OA26346 +26347, OA26347 +26348, OA26348 +26349, OA26349 +26350, OA26350 +26351, OA26351 +26352, OA26352 +26353, OA26353 +26354, OA26354 +26355, OA26355 +26356, OA26356 +26357, OA26357 +26358, OA26358 +26359, OA26359 +26360, OA26360 +26361, OA26361 +26362, OA26362 +26363, OA26363 +26364, OA26364 +26365, OA26365 +26366, OA26366 +26367, OA26367 +26368, OA26368 +26369, OA26369 +26370, OA26370 +26371, OA26371 +26372, OA26372 +26373, OA26373 +26374, OA26374 +26375, OA26375 +26376, OA26376 +26377, OA26377 +26378, OA26378 +26379, OA26379 +26380, OA26380 +26381, OA26381 +26382, OA26382 +26383, OA26383 +26384, OA26384 +26385, OA26385 +26386, OA26386 +26387, OA26387 +26388, OA26388 +26389, OA26389 +26390, OA26390 +26391, OA26391 +26392, OA26392 +26393, OA26393 +26394, OA26394 +26395, OA26395 +26396, OA26396 +26397, OA26397 +26398, OA26398 +26399, OA26399 +26400, OA26400 +26401, OA26401 +26402, OA26402 +26403, OA26403 +26404, OA26404 +26405, OA26405 +26406, OA26406 +26407, OA26407 +26408, OA26408 +26409, OA26409 +26410, OA26410 +26411, OA26411 +26412, OA26412 +26413, OA26413 +26414, OA26414 +26415, OA26415 +26416, OA26416 +26417, OA26417 +26418, OA26418 +26419, OA26419 +26420, OA26420 +26421, OA26421 +26422, OA26422 +26423, OA26423 +26424, OA26424 +26425, OA26425 +26426, OA26426 +26427, OA26427 +26428, OA26428 +26429, OA26429 +26430, OA26430 +26431, OA26431 +26432, OA26432 +26433, OA26433 +26434, OA26434 +26435, OA26435 +26436, OA26436 +26437, OA26437 +26438, OA26438 +26439, OA26439 +26440, OA26440 +26441, OA26441 +26442, OA26442 +26443, OA26443 +26444, OA26444 +26445, OA26445 +26446, OA26446 +26447, OA26447 +26448, OA26448 +26449, OA26449 +26450, OA26450 +26451, OA26451 +26452, OA26452 +26453, OA26453 +26454, OA26454 +26455, OA26455 +26456, OA26456 +26457, OA26457 +26458, OA26458 +26459, OA26459 +26460, OA26460 +26461, OA26461 +26462, OA26462 +26463, OA26463 +26464, OA26464 +26465, OA26465 +26466, OA26466 +26467, OA26467 +26468, OA26468 +26469, OA26469 +26470, OA26470 +26471, OA26471 +26472, OA26472 +26473, OA26473 +26474, OA26474 +26475, OA26475 +26476, OA26476 +26477, OA26477 +26478, OA26478 +26479, OA26479 +26480, OA26480 +26481, OA26481 +26482, OA26482 +26483, OA26483 +26484, OA26484 +26485, OA26485 +26486, OA26486 +26487, OA26487 +26488, OA26488 +26489, OA26489 +26490, OA26490 +26491, OA26491 +26492, OA26492 +26493, OA26493 +26494, OA26494 +26495, OA26495 +26496, OA26496 +26497, OA26497 +26498, OA26498 +26499, OA26499 +26500, OA26500 +26501, OA26501 +26502, OA26502 +26503, OA26503 +26504, OA26504 +26505, OA26505 +26506, OA26506 +26507, OA26507 +26508, OA26508 +26509, OA26509 +26510, OA26510 +26511, OA26511 +26512, OA26512 +26513, OA26513 +26514, OA26514 +26515, OA26515 +26516, OA26516 +26517, OA26517 +26518, OA26518 +26519, OA26519 +26520, OA26520 +26521, OA26521 +26522, OA26522 +26523, OA26523 +26524, OA26524 +26525, OA26525 +26526, OA26526 +26527, OA26527 +26528, OA26528 +26529, OA26529 +26530, OA26530 +26531, OA26531 +26532, OA26532 +26533, OA26533 +26534, OA26534 +26535, OA26535 +26536, OA26536 +26537, OA26537 +26538, OA26538 +26539, OA26539 +26540, OA26540 +26541, OA26541 +26542, OA26542 +26543, OA26543 +26544, OA26544 +26545, OA26545 +26546, OA26546 +26547, OA26547 +26548, OA26548 +26549, OA26549 +26550, OA26550 +26551, OA26551 +26552, OA26552 +26553, OA26553 +26554, OA26554 +26555, OA26555 +26556, OA26556 +26557, OA26557 +26558, OA26558 +26559, OA26559 +26560, OA26560 +26561, OA26561 +26562, OA26562 +26563, OA26563 +26564, OA26564 +26565, OA26565 +26566, OA26566 +26567, OA26567 +26568, OA26568 +26569, OA26569 +26570, OA26570 +26571, OA26571 +26572, OA26572 +26573, OA26573 +26574, OA26574 +26575, OA26575 +26576, OA26576 +26577, OA26577 +26578, OA26578 +26579, OA26579 +26580, OA26580 +26581, OA26581 +26582, OA26582 +26583, OA26583 +26584, OA26584 +26585, OA26585 +26586, OA26586 +26587, OA26587 +26588, OA26588 +26589, OA26589 +26590, OA26590 +26591, OA26591 +26592, OA26592 +26593, OA26593 +26594, OA26594 +26595, OA26595 +26596, OA26596 +26597, OA26597 +26598, OA26598 +26599, OA26599 +26600, OA26600 +26601, OA26601 +26602, OA26602 +26603, OA26603 +26604, OA26604 +26605, OA26605 +26606, OA26606 +26607, OA26607 +26608, OA26608 +26609, OA26609 +26610, OA26610 +26611, OA26611 +26612, OA26612 +26613, OA26613 +26614, OA26614 +26615, OA26615 +26616, OA26616 +26617, OA26617 +26618, OA26618 +26619, OA26619 +26620, OA26620 +26621, OA26621 +26622, OA26622 +26623, OA26623 +26624, OA26624 +26625, OA26625 +26626, OA26626 +26627, OA26627 +26628, OA26628 +26629, OA26629 +26630, OA26630 +26631, OA26631 +26632, OA26632 +26633, OA26633 +26634, OA26634 +26635, OA26635 +26636, OA26636 +26637, OA26637 +26638, OA26638 +26639, OA26639 +26640, OA26640 +26641, OA26641 +26642, OA26642 +26643, OA26643 +26644, OA26644 +26645, OA26645 +26646, OA26646 +26647, OA26647 +26648, OA26648 +26649, OA26649 +26650, OA26650 +26651, OA26651 +26652, OA26652 +26653, OA26653 +26654, OA26654 +26655, OA26655 +26656, OA26656 +26657, OA26657 +26658, OA26658 +26659, OA26659 +26660, OA26660 +26661, OA26661 +26662, OA26662 +26663, OA26663 +26664, OA26664 +26665, OA26665 +26666, OA26666 +26667, OA26667 +26668, OA26668 +26669, OA26669 +26670, OA26670 +26671, OA26671 +26672, OA26672 +26673, OA26673 +26674, OA26674 +26675, OA26675 +26676, OA26676 +26677, OA26677 +26678, OA26678 +26679, OA26679 +26680, OA26680 +26681, OA26681 +26682, OA26682 +26683, OA26683 +26684, OA26684 +26685, OA26685 +26686, OA26686 +26687, OA26687 +26688, OA26688 +26689, OA26689 +26690, OA26690 +26691, OA26691 +26692, OA26692 +26693, OA26693 +26694, OA26694 +26695, OA26695 +26696, OA26696 +26697, OA26697 +26698, OA26698 +26699, OA26699 +26700, OA26700 +26701, OA26701 +26702, OA26702 +26703, OA26703 +26704, OA26704 +26705, OA26705 +26706, OA26706 +26707, OA26707 +26708, OA26708 +26709, OA26709 +26710, OA26710 +26711, OA26711 +26712, OA26712 +26713, OA26713 +26714, OA26714 +26715, OA26715 +26716, OA26716 +26717, OA26717 +26718, OA26718 +26719, OA26719 +26720, OA26720 +26721, OA26721 +26722, OA26722 +26723, OA26723 +26724, OA26724 +26725, OA26725 +26726, OA26726 +26727, OA26727 +26728, OA26728 +26729, OA26729 +26730, OA26730 +26731, OA26731 +26732, OA26732 +26733, OA26733 +26734, OA26734 +26735, OA26735 +26736, OA26736 +26737, OA26737 +26738, OA26738 +26739, OA26739 +26740, OA26740 +26741, OA26741 +26742, OA26742 +26743, OA26743 +26744, OA26744 +26745, OA26745 +26746, OA26746 +26747, OA26747 +26748, OA26748 +26749, OA26749 +26750, OA26750 +26751, OA26751 +26752, OA26752 +26753, OA26753 +26754, OA26754 +26755, OA26755 +26756, OA26756 +26757, OA26757 +26758, OA26758 +26759, OA26759 +26760, OA26760 +26761, OA26761 +26762, OA26762 +26763, OA26763 +26764, OA26764 +26765, OA26765 +26766, OA26766 +26767, OA26767 +26768, OA26768 +26769, OA26769 +26770, OA26770 +26771, OA26771 +26772, OA26772 +26773, OA26773 +26774, OA26774 +26775, OA26775 +26776, OA26776 +26777, OA26777 +26778, OA26778 +26779, OA26779 +26780, OA26780 +26781, OA26781 +26782, OA26782 +26783, OA26783 +26784, OA26784 +26785, OA26785 +26786, OA26786 +26787, OA26787 +26788, OA26788 +26789, OA26789 +26790, OA26790 +26791, OA26791 +26792, OA26792 +26793, OA26793 +26794, OA26794 +26795, OA26795 +26796, OA26796 +26797, OA26797 +26798, OA26798 +26799, OA26799 +26800, OA26800 +26801, OA26801 +26802, OA26802 +26803, OA26803 +26804, OA26804 +26805, OA26805 +26806, OA26806 +26807, OA26807 +26808, OA26808 +26809, OA26809 +26810, OA26810 +26811, OA26811 +26812, OA26812 +26813, OA26813 +26814, OA26814 +26815, OA26815 +26816, OA26816 +26817, OA26817 +26818, OA26818 +26819, OA26819 +26820, OA26820 +26821, OA26821 +26822, OA26822 +26823, OA26823 +26824, OA26824 +26825, OA26825 +26826, OA26826 +26827, OA26827 +26828, OA26828 +26829, OA26829 +26830, OA26830 +26831, OA26831 +26832, OA26832 +26833, OA26833 +26834, OA26834 +26835, OA26835 +26836, OA26836 +26837, OA26837 +26838, OA26838 +26839, OA26839 +26840, OA26840 +26841, OA26841 +26842, OA26842 +26843, OA26843 +26844, OA26844 +26845, OA26845 +26846, OA26846 +26847, OA26847 +26848, OA26848 +26849, OA26849 +26850, OA26850 +26851, OA26851 +26852, OA26852 +26853, OA26853 +26854, OA26854 +26855, OA26855 +26856, OA26856 +26857, OA26857 +26858, OA26858 +26859, OA26859 +26860, OA26860 +26861, OA26861 +26862, OA26862 +26863, OA26863 +26864, OA26864 +26865, OA26865 +26866, OA26866 +26867, OA26867 +26868, OA26868 +26869, OA26869 +26870, OA26870 +26871, OA26871 +26872, OA26872 +26873, OA26873 +26874, OA26874 +26875, OA26875 +26876, OA26876 +26877, OA26877 +26878, OA26878 +26879, OA26879 +26880, OA26880 +26881, OA26881 +26882, OA26882 +26883, OA26883 +26884, OA26884 +26885, OA26885 +26886, OA26886 +26887, OA26887 +26888, OA26888 +26889, OA26889 +26890, OA26890 +26891, OA26891 +26892, OA26892 +26893, OA26893 +26894, OA26894 +26895, OA26895 +26896, OA26896 +26897, OA26897 +26898, OA26898 +26899, OA26899 +26900, OA26900 +26901, OA26901 +26902, OA26902 +26903, OA26903 +26904, OA26904 +26905, OA26905 +26906, OA26906 +26907, OA26907 +26908, OA26908 +26909, OA26909 +26910, OA26910 +26911, OA26911 +26912, OA26912 +26913, OA26913 +26914, OA26914 +26915, OA26915 +26916, OA26916 +26917, OA26917 +26918, OA26918 +26919, OA26919 +26920, OA26920 +26921, OA26921 +26922, OA26922 +26923, OA26923 +26924, OA26924 +26925, OA26925 +26926, OA26926 +26927, OA26927 +26928, OA26928 +26929, OA26929 +26930, OA26930 +26931, OA26931 +26932, OA26932 +26933, OA26933 +26934, OA26934 +26935, OA26935 +26936, OA26936 +26937, OA26937 +26938, OA26938 +26939, OA26939 +26940, OA26940 +26941, OA26941 +26942, OA26942 +26943, OA26943 +26944, OA26944 +26945, OA26945 +26946, OA26946 +26947, OA26947 +26948, OA26948 +26949, OA26949 +26950, OA26950 +26951, OA26951 +26952, OA26952 +26953, OA26953 +26954, OA26954 +26955, OA26955 +26956, OA26956 +26957, OA26957 +26958, OA26958 +26959, OA26959 +26960, OA26960 +26961, OA26961 +26962, OA26962 +26963, OA26963 +26964, OA26964 +26965, OA26965 +26966, OA26966 +26967, OA26967 +26968, OA26968 +26969, OA26969 +26970, OA26970 +26971, OA26971 +26972, OA26972 +26973, OA26973 +26974, OA26974 +26975, OA26975 +26976, OA26976 +26977, OA26977 +26978, OA26978 +26979, OA26979 +26980, OA26980 +26981, OA26981 +26982, OA26982 +26983, OA26983 +26984, OA26984 +26985, OA26985 +26986, OA26986 +26987, OA26987 +26988, OA26988 +26989, OA26989 +26990, OA26990 +26991, OA26991 +26992, OA26992 +26993, OA26993 +26994, OA26994 +26995, OA26995 +26996, OA26996 +26997, OA26997 +26998, OA26998 +26999, OA26999 +27000, OA27000 +27001, OA27001 +27002, OA27002 +27003, OA27003 +27004, OA27004 +27005, OA27005 +27006, OA27006 +27007, OA27007 +27008, OA27008 +27009, OA27009 +27010, OA27010 +27011, OA27011 +27012, OA27012 +27013, OA27013 +27014, OA27014 +27015, OA27015 +27016, OA27016 +27017, OA27017 +27018, OA27018 +27019, OA27019 +27020, OA27020 +27021, OA27021 +27022, OA27022 +27023, OA27023 +27024, OA27024 +27025, OA27025 +27026, OA27026 +27027, OA27027 +27028, OA27028 +27029, OA27029 +27030, OA27030 +27031, OA27031 +27032, OA27032 +27033, OA27033 +27034, OA27034 +27035, OA27035 +27036, OA27036 +27037, OA27037 +27038, OA27038 +27039, OA27039 +27040, OA27040 +27041, OA27041 +27042, OA27042 +27043, OA27043 +27044, OA27044 +27045, OA27045 +27046, OA27046 +27047, OA27047 +27048, OA27048 +27049, OA27049 +27050, OA27050 +27051, OA27051 +27052, OA27052 +27053, OA27053 +27054, OA27054 +27055, OA27055 +27056, OA27056 +27057, OA27057 +27058, OA27058 +27059, OA27059 +27060, OA27060 +27061, OA27061 +27062, OA27062 +27063, OA27063 +27064, OA27064 +27065, OA27065 +27066, OA27066 +27067, OA27067 +27068, OA27068 +27069, OA27069 +27070, OA27070 +27071, OA27071 +27072, OA27072 +27073, OA27073 +27074, OA27074 +27075, OA27075 +27076, OA27076 +27077, OA27077 +27078, OA27078 +27079, OA27079 +27080, OA27080 +27081, OA27081 +27082, OA27082 +27083, OA27083 +27084, OA27084 +27085, OA27085 +27086, OA27086 +27087, OA27087 +27088, OA27088 +27089, OA27089 +27090, OA27090 +27091, OA27091 +27092, OA27092 +27093, OA27093 +27094, OA27094 +27095, OA27095 +27096, OA27096 +27097, OA27097 +27098, OA27098 +27099, OA27099 +27100, OA27100 +27101, OA27101 +27102, OA27102 +27103, OA27103 +27104, OA27104 +27105, OA27105 +27106, OA27106 +27107, OA27107 +27108, OA27108 +27109, OA27109 +27110, OA27110 +27111, OA27111 +27112, OA27112 +27113, OA27113 +27114, OA27114 +27115, OA27115 +27116, OA27116 +27117, OA27117 +27118, OA27118 +27119, OA27119 +27120, OA27120 +27121, OA27121 +27122, OA27122 +27123, OA27123 +27124, OA27124 +27125, OA27125 +27126, OA27126 +27127, OA27127 +27128, OA27128 +27129, OA27129 +27130, OA27130 +27131, OA27131 +27132, OA27132 +27133, OA27133 +27134, OA27134 +27135, OA27135 +27136, OA27136 +27137, OA27137 +27138, OA27138 +27139, OA27139 +27140, OA27140 +27141, OA27141 +27142, OA27142 +27143, OA27143 +27144, OA27144 +27145, OA27145 +27146, OA27146 +27147, OA27147 +27148, OA27148 +27149, OA27149 +27150, OA27150 +27151, OA27151 +27152, OA27152 +27153, OA27153 +27154, OA27154 +27155, OA27155 +27156, OA27156 +27157, OA27157 +27158, OA27158 +27159, OA27159 +27160, OA27160 +27161, OA27161 +27162, OA27162 +27163, OA27163 +27164, OA27164 +27165, OA27165 +27166, OA27166 +27167, OA27167 +27168, OA27168 +27169, OA27169 +27170, OA27170 +27171, OA27171 +27172, OA27172 +27173, OA27173 +27174, OA27174 +27175, OA27175 +27176, OA27176 +27177, OA27177 +27178, OA27178 +27179, OA27179 +27180, OA27180 +27181, OA27181 +27182, OA27182 +27183, OA27183 +27184, OA27184 +27185, OA27185 +27186, OA27186 +27187, OA27187 +27188, OA27188 +27189, OA27189 +27190, OA27190 +27191, OA27191 +27192, OA27192 +27193, OA27193 +27194, OA27194 +27195, OA27195 +27196, OA27196 +27197, OA27197 +27198, OA27198 +27199, OA27199 +27200, OA27200 +27201, OA27201 +27202, OA27202 +27203, OA27203 +27204, OA27204 +27205, OA27205 +27206, OA27206 +27207, OA27207 +27208, OA27208 +27209, OA27209 +27210, OA27210 +27211, OA27211 +27212, OA27212 +27213, OA27213 +27214, OA27214 +27215, OA27215 +27216, OA27216 +27217, OA27217 +27218, OA27218 +27219, OA27219 +27220, OA27220 +27221, OA27221 +27222, OA27222 +27223, OA27223 +27224, OA27224 +27225, OA27225 +27226, OA27226 +27227, OA27227 +27228, OA27228 +27229, OA27229 +27230, OA27230 +27231, OA27231 +27232, OA27232 +27233, OA27233 +27234, OA27234 +27235, OA27235 +27236, OA27236 +27237, OA27237 +27238, OA27238 +27239, OA27239 +27240, OA27240 +27241, OA27241 +27242, OA27242 +27243, OA27243 +27244, OA27244 +27245, OA27245 +27246, OA27246 +27247, OA27247 +27248, OA27248 +27249, OA27249 +27250, OA27250 +27251, OA27251 +27252, OA27252 +27253, OA27253 +27254, OA27254 +27255, OA27255 +27256, OA27256 +27257, OA27257 +27258, OA27258 +27259, OA27259 +27260, OA27260 +27261, OA27261 +27262, OA27262 +27263, OA27263 +27264, OA27264 +27265, OA27265 +27266, OA27266 +27267, OA27267 +27268, OA27268 +27269, OA27269 +27270, OA27270 +27271, OA27271 +27272, OA27272 +27273, OA27273 +27274, OA27274 +27275, OA27275 +27276, OA27276 +27277, OA27277 +27278, OA27278 +27279, OA27279 +27280, OA27280 +27281, OA27281 +27282, OA27282 +27283, OA27283 +27284, OA27284 +27285, OA27285 +27286, OA27286 +27287, OA27287 +27288, OA27288 +27289, OA27289 +27290, OA27290 +27291, OA27291 +27292, OA27292 +27293, OA27293 +27294, OA27294 +27295, OA27295 +27296, OA27296 +27297, OA27297 +27298, OA27298 +27299, OA27299 +27300, OA27300 +27301, OA27301 +27302, OA27302 +27303, OA27303 +27304, OA27304 +27305, OA27305 +27306, OA27306 +27307, OA27307 +27308, OA27308 +27309, OA27309 +27310, OA27310 +27311, OA27311 +27312, OA27312 +27313, OA27313 +27314, OA27314 +27315, OA27315 +27316, OA27316 +27317, OA27317 +27318, OA27318 +27319, OA27319 +27320, OA27320 +27321, OA27321 +27322, OA27322 +27323, OA27323 +27324, OA27324 +27325, OA27325 +27326, OA27326 +27327, OA27327 +27328, OA27328 +27329, OA27329 +27330, OA27330 +27331, OA27331 +27332, OA27332 +27333, OA27333 +27334, OA27334 +27335, OA27335 +27336, OA27336 +27337, OA27337 +27338, OA27338 +27339, OA27339 +27340, OA27340 +27341, OA27341 +27342, OA27342 +27343, OA27343 +27344, OA27344 +27345, OA27345 +27346, OA27346 +27347, OA27347 +27348, OA27348 +27349, OA27349 +27350, OA27350 +27351, OA27351 +27352, OA27352 +27353, OA27353 +27354, OA27354 +27355, OA27355 +27356, OA27356 +27357, OA27357 +27358, OA27358 +27359, OA27359 +27360, OA27360 +27361, OA27361 +27362, OA27362 +27363, OA27363 +27364, OA27364 +27365, OA27365 +27366, OA27366 +27367, OA27367 +27368, OA27368 +27369, OA27369 +27370, OA27370 +27371, OA27371 +27372, OA27372 +27373, OA27373 +27374, OA27374 +27375, OA27375 +27376, OA27376 +27377, OA27377 +27378, OA27378 +27379, OA27379 +27380, OA27380 +27381, OA27381 +27382, OA27382 +27383, OA27383 +27384, OA27384 +27385, OA27385 +27386, OA27386 +27387, OA27387 +27388, OA27388 +27389, OA27389 +27390, OA27390 +27391, OA27391 +27392, OA27392 +27393, OA27393 +27394, OA27394 +27395, OA27395 +27396, OA27396 +27397, OA27397 +27398, OA27398 +27399, OA27399 +27400, OA27400 +27401, OA27401 +27402, OA27402 +27403, OA27403 +27404, OA27404 +27405, OA27405 +27406, OA27406 +27407, OA27407 +27408, OA27408 +27409, OA27409 +27410, OA27410 +27411, OA27411 +27412, OA27412 +27413, OA27413 +27414, OA27414 +27415, OA27415 +27416, OA27416 +27417, OA27417 +27418, OA27418 +27419, OA27419 +27420, OA27420 +27421, OA27421 +27422, OA27422 +27423, OA27423 +27424, OA27424 +27425, OA27425 +27426, OA27426 +27427, OA27427 +27428, OA27428 +27429, OA27429 +27430, OA27430 +27431, OA27431 +27432, OA27432 +27433, OA27433 +27434, OA27434 +27435, OA27435 +27436, OA27436 +27437, OA27437 +27438, OA27438 +27439, OA27439 +27440, OA27440 +27441, OA27441 +27442, OA27442 +27443, OA27443 +27444, OA27444 +27445, OA27445 +27446, OA27446 +27447, OA27447 +27448, OA27448 +27449, OA27449 +27450, OA27450 +27451, OA27451 +27452, OA27452 +27453, OA27453 +27454, OA27454 +27455, OA27455 +27456, OA27456 +27457, OA27457 +27458, OA27458 +27459, OA27459 +27460, OA27460 +27461, OA27461 +27462, OA27462 +27463, OA27463 +27464, OA27464 +27465, OA27465 +27466, OA27466 +27467, OA27467 +27468, OA27468 +27469, OA27469 +27470, OA27470 +27471, OA27471 +27472, OA27472 +27473, OA27473 +27474, OA27474 +27475, OA27475 +27476, OA27476 +27477, OA27477 +27478, OA27478 +27479, OA27479 +27480, OA27480 +27481, OA27481 +27482, OA27482 +27483, OA27483 +27484, OA27484 +27485, OA27485 +27486, OA27486 +27487, OA27487 +27488, OA27488 +27489, OA27489 +27490, OA27490 +27491, OA27491 +27492, OA27492 +27493, OA27493 +27494, OA27494 +27495, OA27495 +27496, OA27496 +27497, OA27497 +27498, OA27498 +27499, OA27499 +27500, OA27500 +27501, OA27501 +27502, OA27502 +27503, OA27503 +27504, OA27504 +27505, OA27505 +27506, OA27506 +27507, OA27507 +27508, OA27508 +27509, OA27509 +27510, OA27510 +27511, OA27511 +27512, OA27512 +27513, OA27513 +27514, OA27514 +27515, OA27515 +27516, OA27516 +27517, OA27517 +27518, OA27518 +27519, OA27519 +27520, OA27520 +27521, OA27521 +27522, OA27522 +27523, OA27523 +27524, OA27524 +27525, OA27525 +27526, OA27526 +27527, OA27527 +27528, OA27528 +27529, OA27529 +27530, OA27530 +27531, OA27531 +27532, OA27532 +27533, OA27533 +27534, OA27534 +27535, OA27535 +27536, OA27536 +27537, OA27537 +27538, OA27538 +27539, OA27539 +27540, OA27540 +27541, OA27541 +27542, OA27542 +27543, OA27543 +27544, OA27544 +27545, OA27545 +27546, OA27546 +27547, OA27547 +27548, OA27548 +27549, OA27549 +27550, OA27550 +27551, OA27551 +27552, OA27552 +27553, OA27553 +27554, OA27554 +27555, OA27555 +27556, OA27556 +27557, OA27557 +27558, OA27558 +27559, OA27559 +27560, OA27560 +27561, OA27561 +27562, OA27562 +27563, OA27563 +27564, OA27564 +27565, OA27565 +27566, OA27566 +27567, OA27567 +27568, OA27568 +27569, OA27569 +27570, OA27570 +27571, OA27571 +27572, OA27572 +27573, OA27573 +27574, OA27574 +27575, OA27575 +27576, OA27576 +27577, OA27577 +27578, OA27578 +27579, OA27579 +27580, OA27580 +27581, OA27581 +27582, OA27582 +27583, OA27583 +27584, OA27584 +27585, OA27585 +27586, OA27586 +27587, OA27587 +27588, OA27588 +27589, OA27589 +27590, OA27590 +27591, OA27591 +27592, OA27592 +27593, OA27593 +27594, OA27594 +27595, OA27595 +27596, OA27596 +27597, OA27597 +27598, OA27598 +27599, OA27599 +27600, OA27600 +27601, OA27601 +27602, OA27602 +27603, OA27603 +27604, OA27604 +27605, OA27605 +27606, OA27606 +27607, OA27607 +27608, OA27608 +27609, OA27609 +27610, OA27610 +27611, OA27611 +27612, OA27612 +27613, OA27613 +27614, OA27614 +27615, OA27615 +27616, OA27616 +27617, OA27617 +27618, OA27618 +27619, OA27619 +27620, OA27620 +27621, OA27621 +27622, OA27622 +27623, OA27623 +27624, OA27624 +27625, OA27625 +27626, OA27626 +27627, OA27627 +27628, OA27628 +27629, OA27629 +27630, OA27630 +27631, OA27631 +27632, OA27632 +27633, OA27633 +27634, OA27634 +27635, OA27635 +27636, OA27636 +27637, OA27637 +27638, OA27638 +27639, OA27639 +27640, OA27640 +27641, OA27641 +27642, OA27642 +27643, OA27643 +27644, OA27644 +27645, OA27645 +27646, OA27646 +27647, OA27647 +27648, OA27648 +27649, OA27649 +27650, OA27650 +27651, OA27651 +27652, OA27652 +27653, OA27653 +27654, OA27654 +27655, OA27655 +27656, OA27656 +27657, OA27657 +27658, OA27658 +27659, OA27659 +27660, OA27660 +27661, OA27661 +27662, OA27662 +27663, OA27663 +27664, OA27664 +27665, OA27665 +27666, OA27666 +27667, OA27667 +27668, OA27668 +27669, OA27669 +27670, OA27670 +27671, OA27671 +27672, OA27672 +27673, OA27673 +27674, OA27674 +27675, OA27675 +27676, OA27676 +27677, OA27677 +27678, OA27678 +27679, OA27679 +27680, OA27680 +27681, OA27681 +27682, OA27682 +27683, OA27683 +27684, OA27684 +27685, OA27685 +27686, OA27686 +27687, OA27687 +27688, OA27688 +27689, OA27689 +27690, OA27690 +27691, OA27691 +27692, OA27692 +27693, OA27693 +27694, OA27694 +27695, OA27695 +27696, OA27696 +27697, OA27697 +27698, OA27698 +27699, OA27699 +27700, OA27700 +27701, OA27701 +27702, OA27702 +27703, OA27703 +27704, OA27704 +27705, OA27705 +27706, OA27706 +27707, OA27707 +27708, OA27708 +27709, OA27709 +27710, OA27710 +27711, OA27711 +27712, OA27712 +27713, OA27713 +27714, OA27714 +27715, OA27715 +27716, OA27716 +27717, OA27717 +27718, OA27718 +27719, OA27719 +27720, OA27720 +27721, OA27721 +27722, OA27722 +27723, OA27723 +27724, OA27724 +27725, OA27725 +27726, OA27726 +27727, OA27727 +27728, OA27728 +27729, OA27729 +27730, OA27730 +27731, OA27731 +27732, OA27732 +27733, OA27733 +27734, OA27734 +27735, OA27735 +27736, OA27736 +27737, OA27737 +27738, OA27738 +27739, OA27739 +27740, OA27740 +27741, OA27741 +27742, OA27742 +27743, OA27743 +27744, OA27744 +27745, OA27745 +27746, OA27746 +27747, OA27747 +27748, OA27748 +27749, OA27749 +27750, OA27750 +27751, OA27751 +27752, OA27752 +27753, OA27753 +27754, OA27754 +27755, OA27755 +27756, OA27756 +27757, OA27757 +27758, OA27758 +27759, OA27759 +27760, OA27760 +27761, OA27761 +27762, OA27762 +27763, OA27763 +27764, OA27764 +27765, OA27765 +27766, OA27766 +27767, OA27767 +27768, OA27768 +27769, OA27769 +27770, OA27770 +27771, OA27771 +27772, OA27772 +27773, OA27773 +27774, OA27774 +27775, OA27775 +27776, OA27776 +27777, OA27777 +27778, OA27778 +27779, OA27779 +27780, OA27780 +27781, OA27781 +27782, OA27782 +27783, OA27783 +27784, OA27784 +27785, OA27785 +27786, OA27786 +27787, OA27787 +27788, OA27788 +27789, OA27789 +27790, OA27790 +27791, OA27791 +27792, OA27792 +27793, OA27793 +27794, OA27794 +27795, OA27795 +27796, OA27796 +27797, OA27797 +27798, OA27798 +27799, OA27799 +27800, OA27800 +27801, OA27801 +27802, OA27802 +27803, OA27803 +27804, OA27804 +27805, OA27805 +27806, OA27806 +27807, OA27807 +27808, OA27808 +27809, OA27809 +27810, OA27810 +27811, OA27811 +27812, OA27812 +27813, OA27813 +27814, OA27814 +27815, OA27815 +27816, OA27816 +27817, OA27817 +27818, OA27818 +27819, OA27819 +27820, OA27820 +27821, OA27821 +27822, OA27822 +27823, OA27823 +27824, OA27824 +27825, OA27825 +27826, OA27826 +27827, OA27827 +27828, OA27828 +27829, OA27829 +27830, OA27830 +27831, OA27831 +27832, OA27832 +27833, OA27833 +27834, OA27834 +27835, OA27835 +27836, OA27836 +27837, OA27837 +27838, OA27838 +27839, OA27839 +27840, OA27840 +27841, OA27841 +27842, OA27842 +27843, OA27843 +27844, OA27844 +27845, OA27845 +27846, OA27846 +27847, OA27847 +27848, OA27848 +27849, OA27849 +27850, OA27850 +27851, OA27851 +27852, OA27852 +27853, OA27853 +27854, OA27854 +27855, OA27855 +27856, OA27856 +27857, OA27857 +27858, OA27858 +27859, OA27859 +27860, OA27860 +27861, OA27861 +27862, OA27862 +27863, OA27863 +27864, OA27864 +27865, OA27865 +27866, OA27866 +27867, OA27867 +27868, OA27868 +27869, OA27869 +27870, OA27870 +27871, OA27871 +27872, OA27872 +27873, OA27873 +27874, OA27874 +27875, OA27875 +27876, OA27876 +27877, OA27877 +27878, OA27878 +27879, OA27879 +27880, OA27880 +27881, OA27881 +27882, OA27882 +27883, OA27883 +27884, OA27884 +27885, OA27885 +27886, OA27886 +27887, OA27887 +27888, OA27888 +27889, OA27889 +27890, OA27890 +27891, OA27891 +27892, OA27892 +27893, OA27893 +27894, OA27894 +27895, OA27895 +27896, OA27896 +27897, OA27897 +27898, OA27898 +27899, OA27899 +27900, OA27900 +27901, OA27901 +27902, OA27902 +27903, OA27903 +27904, OA27904 +27905, OA27905 +27906, OA27906 +27907, OA27907 +27908, OA27908 +27909, OA27909 +27910, OA27910 +27911, OA27911 +27912, OA27912 +27913, OA27913 +27914, OA27914 +27915, OA27915 +27916, OA27916 +27917, OA27917 +27918, OA27918 +27919, OA27919 +27920, OA27920 +27921, OA27921 +27922, OA27922 +27923, OA27923 +27924, OA27924 +27925, OA27925 +27926, OA27926 +27927, OA27927 +27928, OA27928 +27929, OA27929 +27930, OA27930 +27931, OA27931 +27932, OA27932 +27933, OA27933 +27934, OA27934 +27935, OA27935 +27936, OA27936 +27937, OA27937 +27938, OA27938 +27939, OA27939 +27940, OA27940 +27941, OA27941 +27942, OA27942 +27943, OA27943 +27944, OA27944 +27945, OA27945 +27946, OA27946 +27947, OA27947 +27948, OA27948 +27949, OA27949 +27950, OA27950 +27951, OA27951 +27952, OA27952 +27953, OA27953 +27954, OA27954 +27955, OA27955 +27956, OA27956 +27957, OA27957 +27958, OA27958 +27959, OA27959 +27960, OA27960 +27961, OA27961 +27962, OA27962 +27963, OA27963 +27964, OA27964 +27965, OA27965 +27966, OA27966 +27967, OA27967 +27968, OA27968 +27969, OA27969 +27970, OA27970 +27971, OA27971 +27972, OA27972 +27973, OA27973 +27974, OA27974 +27975, OA27975 +27976, OA27976 +27977, OA27977 +27978, OA27978 +27979, OA27979 +27980, OA27980 +27981, OA27981 +27982, OA27982 +27983, OA27983 +27984, OA27984 +27985, OA27985 +27986, OA27986 +27987, OA27987 +27988, OA27988 +27989, OA27989 +27990, OA27990 +27991, OA27991 +27992, OA27992 +27993, OA27993 +27994, OA27994 +27995, OA27995 +27996, OA27996 +27997, OA27997 +27998, OA27998 +27999, OA27999 +28000, OA28000 +28001, OA28001 +28002, OA28002 +28003, OA28003 +28004, OA28004 +28005, OA28005 +28006, OA28006 +28007, OA28007 +28008, OA28008 +28009, OA28009 +28010, OA28010 +28011, OA28011 +28012, OA28012 +28013, OA28013 +28014, OA28014 +28015, OA28015 +28016, OA28016 +28017, OA28017 +28018, OA28018 +28019, OA28019 +28020, OA28020 +28021, OA28021 +28022, OA28022 +28023, OA28023 +28024, OA28024 +28025, OA28025 +28026, OA28026 +28027, OA28027 +28028, OA28028 +28029, OA28029 +28030, OA28030 +28031, OA28031 +28032, OA28032 +28033, OA28033 +28034, OA28034 +28035, OA28035 +28036, OA28036 +28037, OA28037 +28038, OA28038 +28039, OA28039 +28040, OA28040 +28041, OA28041 +28042, OA28042 +28043, OA28043 +28044, OA28044 +28045, OA28045 +28046, OA28046 +28047, OA28047 +28048, OA28048 +28049, OA28049 +28050, OA28050 +28051, OA28051 +28052, OA28052 +28053, OA28053 +28054, OA28054 +28055, OA28055 +28056, OA28056 +28057, OA28057 +28058, OA28058 +28059, OA28059 +28060, OA28060 +28061, OA28061 +28062, OA28062 +28063, OA28063 +28064, OA28064 +28065, OA28065 +28066, OA28066 +28067, OA28067 +28068, OA28068 +28069, OA28069 +28070, OA28070 +28071, OA28071 +28072, OA28072 +28073, OA28073 +28074, OA28074 +28075, OA28075 +28076, OA28076 +28077, OA28077 +28078, OA28078 +28079, OA28079 +28080, OA28080 +28081, OA28081 +28082, OA28082 +28083, OA28083 +28084, OA28084 +28085, OA28085 +28086, OA28086 +28087, OA28087 +28088, OA28088 +28089, OA28089 +28090, OA28090 +28091, OA28091 +28092, OA28092 +28093, OA28093 +28094, OA28094 +28095, OA28095 +28096, OA28096 +28097, OA28097 +28098, OA28098 +28099, OA28099 +28100, OA28100 +28101, OA28101 +28102, OA28102 +28103, OA28103 +28104, OA28104 +28105, OA28105 +28106, OA28106 +28107, OA28107 +28108, OA28108 +28109, OA28109 +28110, OA28110 +28111, OA28111 +28112, OA28112 +28113, OA28113 +28114, OA28114 +28115, OA28115 +28116, OA28116 +28117, OA28117 +28118, OA28118 +28119, OA28119 +28120, OA28120 +28121, OA28121 +28122, OA28122 +28123, OA28123 +28124, OA28124 +28125, OA28125 +28126, OA28126 +28127, OA28127 +28128, OA28128 +28129, OA28129 +28130, OA28130 +28131, OA28131 +28132, OA28132 +28133, OA28133 +28134, OA28134 +28135, OA28135 +28136, OA28136 +28137, OA28137 +28138, OA28138 +28139, OA28139 +28140, OA28140 +28141, OA28141 +28142, OA28142 +28143, OA28143 +28144, OA28144 +28145, OA28145 +28146, OA28146 +28147, OA28147 +28148, OA28148 +28149, OA28149 +28150, OA28150 +28151, OA28151 +28152, OA28152 +28153, OA28153 +28154, OA28154 +28155, OA28155 +28156, OA28156 +28157, OA28157 +28158, OA28158 +28159, OA28159 +28160, OA28160 +28161, OA28161 +28162, OA28162 +28163, OA28163 +28164, OA28164 +28165, OA28165 +28166, OA28166 +28167, OA28167 +28168, OA28168 +28169, OA28169 +28170, OA28170 +28171, OA28171 +28172, OA28172 +28173, OA28173 +28174, OA28174 +28175, OA28175 +28176, OA28176 +28177, OA28177 +28178, OA28178 +28179, OA28179 +28180, OA28180 +28181, OA28181 +28182, OA28182 +28183, OA28183 +28184, OA28184 +28185, OA28185 +28186, OA28186 +28187, OA28187 +28188, OA28188 +28189, OA28189 +28190, OA28190 +28191, OA28191 +28192, OA28192 +28193, OA28193 +28194, OA28194 +28195, OA28195 +28196, OA28196 +28197, OA28197 +28198, OA28198 +28199, OA28199 +28200, OA28200 +28201, OA28201 +28202, OA28202 +28203, OA28203 +28204, OA28204 +28205, OA28205 +28206, OA28206 +28207, OA28207 +28208, OA28208 +28209, OA28209 +28210, OA28210 +28211, OA28211 +28212, OA28212 +28213, OA28213 +28214, OA28214 +28215, OA28215 +28216, OA28216 +28217, OA28217 +28218, OA28218 +28219, OA28219 +28220, OA28220 +28221, OA28221 +28222, OA28222 +28223, OA28223 +28224, OA28224 +28225, OA28225 +28226, OA28226 +28227, OA28227 +28228, OA28228 +28229, OA28229 +28230, OA28230 +28231, OA28231 +28232, OA28232 +28233, OA28233 +28234, OA28234 +28235, OA28235 +28236, OA28236 +28237, OA28237 +28238, OA28238 +28239, OA28239 +28240, OA28240 +28241, OA28241 +28242, OA28242 +28243, OA28243 +28244, OA28244 +28245, OA28245 +28246, OA28246 +28247, OA28247 +28248, OA28248 +28249, OA28249 +28250, OA28250 +28251, OA28251 +28252, OA28252 +28253, OA28253 +28254, OA28254 +28255, OA28255 +28256, OA28256 +28257, OA28257 +28258, OA28258 +28259, OA28259 +28260, OA28260 +28261, OA28261 +28262, OA28262 +28263, OA28263 +28264, OA28264 +28265, OA28265 +28266, OA28266 +28267, OA28267 +28268, OA28268 +28269, OA28269 +28270, OA28270 +28271, OA28271 +28272, OA28272 +28273, OA28273 +28274, OA28274 +28275, OA28275 +28276, OA28276 +28277, OA28277 +28278, OA28278 +28279, OA28279 +28280, OA28280 +28281, OA28281 +28282, OA28282 +28283, OA28283 +28284, OA28284 +28285, OA28285 +28286, OA28286 +28287, OA28287 +28288, OA28288 +28289, OA28289 +28290, OA28290 +28291, OA28291 +28292, OA28292 +28293, OA28293 +28294, OA28294 +28295, OA28295 +28296, OA28296 +28297, OA28297 +28298, OA28298 +28299, OA28299 +28300, OA28300 +28301, OA28301 +28302, OA28302 +28303, OA28303 +28304, OA28304 +28305, OA28305 +28306, OA28306 +28307, OA28307 +28308, OA28308 +28309, OA28309 +28310, OA28310 +28311, OA28311 +28312, OA28312 +28313, OA28313 +28314, OA28314 +28315, OA28315 +28316, OA28316 +28317, OA28317 +28318, OA28318 +28319, OA28319 +28320, OA28320 +28321, OA28321 +28322, OA28322 +28323, OA28323 +28324, OA28324 +28325, OA28325 +28326, OA28326 +28327, OA28327 +28328, OA28328 +28329, OA28329 +28330, OA28330 +28331, OA28331 +28332, OA28332 +28333, OA28333 +28334, OA28334 +28335, OA28335 +28336, OA28336 +28337, OA28337 +28338, OA28338 +28339, OA28339 +28340, OA28340 +28341, OA28341 +28342, OA28342 +28343, OA28343 +28344, OA28344 +28345, OA28345 +28346, OA28346 +28347, OA28347 +28348, OA28348 +28349, OA28349 +28350, OA28350 +28351, OA28351 +28352, OA28352 +28353, OA28353 +28354, OA28354 +28355, OA28355 +28356, OA28356 +28357, OA28357 +28358, OA28358 +28359, OA28359 +28360, OA28360 +28361, OA28361 +28362, OA28362 +28363, OA28363 +28364, OA28364 +28365, OA28365 +28366, OA28366 +28367, OA28367 +28368, OA28368 +28369, OA28369 +28370, OA28370 +28371, OA28371 +28372, OA28372 +28373, OA28373 +28374, OA28374 +28375, OA28375 +28376, OA28376 +28377, OA28377 +28378, OA28378 +28379, OA28379 +28380, OA28380 +28381, OA28381 +28382, OA28382 +28383, OA28383 +28384, OA28384 +28385, OA28385 +28386, OA28386 +28387, OA28387 +28388, OA28388 +28389, OA28389 +28390, OA28390 +28391, OA28391 +28392, OA28392 +28393, OA28393 +28394, OA28394 +28395, OA28395 +28396, OA28396 +28397, OA28397 +28398, OA28398 +28399, OA28399 +28400, OA28400 +28401, OA28401 +28402, OA28402 +28403, OA28403 +28404, OA28404 +28405, OA28405 +28406, OA28406 +28407, OA28407 +28408, OA28408 +28409, OA28409 +28410, OA28410 +28411, OA28411 +28412, OA28412 +28413, OA28413 +28414, OA28414 +28415, OA28415 +28416, OA28416 +28417, OA28417 +28418, OA28418 +28419, OA28419 +28420, OA28420 +28421, OA28421 +28422, OA28422 +28423, OA28423 +28424, OA28424 +28425, OA28425 +28426, OA28426 +28427, OA28427 +28428, OA28428 +28429, OA28429 +28430, OA28430 +28431, OA28431 +28432, OA28432 +28433, OA28433 +28434, OA28434 +28435, OA28435 +28436, OA28436 +28437, OA28437 +28438, OA28438 +28439, OA28439 +28440, OA28440 +28441, OA28441 +28442, OA28442 +28443, OA28443 +28444, OA28444 +28445, OA28445 +28446, OA28446 +28447, OA28447 +28448, OA28448 +28449, OA28449 +28450, OA28450 +28451, OA28451 +28452, OA28452 +28453, OA28453 +28454, OA28454 +28455, OA28455 +28456, OA28456 +28457, OA28457 +28458, OA28458 +28459, OA28459 +28460, OA28460 +28461, OA28461 +28462, OA28462 +28463, OA28463 +28464, OA28464 +28465, OA28465 +28466, OA28466 +28467, OA28467 +28468, OA28468 +28469, OA28469 +28470, OA28470 +28471, OA28471 +28472, OA28472 +28473, OA28473 +28474, OA28474 +28475, OA28475 +28476, OA28476 +28477, OA28477 +28478, OA28478 +28479, OA28479 +28480, OA28480 +28481, OA28481 +28482, OA28482 +28483, OA28483 +28484, OA28484 +28485, OA28485 +28486, OA28486 +28487, OA28487 +28488, OA28488 +28489, OA28489 +28490, OA28490 +28491, OA28491 +28492, OA28492 +28493, OA28493 +28494, OA28494 +28495, OA28495 +28496, OA28496 +28497, OA28497 +28498, OA28498 +28499, OA28499 +28500, OA28500 +28501, OA28501 +28502, OA28502 +28503, OA28503 +28504, OA28504 +28505, OA28505 +28506, OA28506 +28507, OA28507 +28508, OA28508 +28509, OA28509 +28510, OA28510 +28511, OA28511 +28512, OA28512 +28513, OA28513 +28514, OA28514 +28515, OA28515 +28516, OA28516 +28517, OA28517 +28518, OA28518 +28519, OA28519 +28520, OA28520 +28521, OA28521 +28522, OA28522 +28523, OA28523 +28524, OA28524 +28525, OA28525 +28526, OA28526 +28527, OA28527 +28528, OA28528 +28529, OA28529 +28530, OA28530 +28531, OA28531 +28532, OA28532 +28533, OA28533 +28534, OA28534 +28535, OA28535 +28536, OA28536 +28537, OA28537 +28538, OA28538 +28539, OA28539 +28540, OA28540 +28541, OA28541 +28542, OA28542 +28543, OA28543 +28544, OA28544 +28545, OA28545 +28546, OA28546 +28547, OA28547 +28548, OA28548 +28549, OA28549 +28550, OA28550 +28551, OA28551 +28552, OA28552 +28553, OA28553 +28554, OA28554 +28555, OA28555 +28556, OA28556 +28557, OA28557 +28558, OA28558 +28559, OA28559 +28560, OA28560 +28561, OA28561 +28562, OA28562 +28563, OA28563 +28564, OA28564 +28565, OA28565 +28566, OA28566 +28567, OA28567 +28568, OA28568 +28569, OA28569 +28570, OA28570 +28571, OA28571 +28572, OA28572 +28573, OA28573 +28574, OA28574 +28575, OA28575 +28576, OA28576 +28577, OA28577 +28578, OA28578 +28579, OA28579 +28580, OA28580 +28581, OA28581 +28582, OA28582 +28583, OA28583 +28584, OA28584 +28585, OA28585 +28586, OA28586 +28587, OA28587 +28588, OA28588 +28589, OA28589 +28590, OA28590 +28591, OA28591 +28592, OA28592 +28593, OA28593 +28594, OA28594 +28595, OA28595 +28596, OA28596 +28597, OA28597 +28598, OA28598 +28599, OA28599 +28600, OA28600 +28601, OA28601 +28602, OA28602 +28603, OA28603 +28604, OA28604 +28605, OA28605 +28606, OA28606 +28607, OA28607 +28608, OA28608 +28609, OA28609 +28610, OA28610 +28611, OA28611 +28612, OA28612 +28613, OA28613 +28614, OA28614 +28615, OA28615 +28616, OA28616 +28617, OA28617 +28618, OA28618 +28619, OA28619 +28620, OA28620 +28621, OA28621 +28622, OA28622 +28623, OA28623 +28624, OA28624 +28625, OA28625 +28626, OA28626 +28627, OA28627 +28628, OA28628 +28629, OA28629 +28630, OA28630 +28631, OA28631 +28632, OA28632 +28633, OA28633 +28634, OA28634 +28635, OA28635 +28636, OA28636 +28637, OA28637 +28638, OA28638 +28639, OA28639 +28640, OA28640 +28641, OA28641 +28642, OA28642 +28643, OA28643 +28644, OA28644 +28645, OA28645 +28646, OA28646 +28647, OA28647 +28648, OA28648 +28649, OA28649 +28650, OA28650 +28651, OA28651 +28652, OA28652 +28653, OA28653 +28654, OA28654 +28655, OA28655 +28656, OA28656 +28657, OA28657 +28658, OA28658 +28659, OA28659 +28660, OA28660 +28661, OA28661 +28662, OA28662 +28663, OA28663 +28664, OA28664 +28665, OA28665 +28666, OA28666 +28667, OA28667 +28668, OA28668 +28669, OA28669 +28670, OA28670 +28671, OA28671 +28672, OA28672 +28673, OA28673 +28674, OA28674 +28675, OA28675 +28676, OA28676 +28677, OA28677 +28678, OA28678 +28679, OA28679 +28680, OA28680 +28681, OA28681 +28682, OA28682 +28683, OA28683 +28684, OA28684 +28685, OA28685 +28686, OA28686 +28687, OA28687 +28688, OA28688 +28689, OA28689 +28690, OA28690 +28691, OA28691 +28692, OA28692 +28693, OA28693 +28694, OA28694 +28695, OA28695 +28696, OA28696 +28697, OA28697 +28698, OA28698 +28699, OA28699 +28700, OA28700 +28701, OA28701 +28702, OA28702 +28703, OA28703 +28704, OA28704 +28705, OA28705 +28706, OA28706 +28707, OA28707 +28708, OA28708 +28709, OA28709 +28710, OA28710 +28711, OA28711 +28712, OA28712 +28713, OA28713 +28714, OA28714 +28715, OA28715 +28716, OA28716 +28717, OA28717 +28718, OA28718 +28719, OA28719 +28720, OA28720 +28721, OA28721 +28722, OA28722 +28723, OA28723 +28724, OA28724 +28725, OA28725 +28726, OA28726 +28727, OA28727 +28728, OA28728 +28729, OA28729 +28730, OA28730 +28731, OA28731 +28732, OA28732 +28733, OA28733 +28734, OA28734 +28735, OA28735 +28736, OA28736 +28737, OA28737 +28738, OA28738 +28739, OA28739 +28740, OA28740 +28741, OA28741 +28742, OA28742 +28743, OA28743 +28744, OA28744 +28745, OA28745 +28746, OA28746 +28747, OA28747 +28748, OA28748 +28749, OA28749 +28750, OA28750 +28751, OA28751 +28752, OA28752 +28753, OA28753 +28754, OA28754 +28755, OA28755 +28756, OA28756 +28757, OA28757 +28758, OA28758 +28759, OA28759 +28760, OA28760 +28761, OA28761 +28762, OA28762 +28763, OA28763 +28764, OA28764 +28765, OA28765 +28766, OA28766 +28767, OA28767 +28768, OA28768 +28769, OA28769 +28770, OA28770 +28771, OA28771 +28772, OA28772 +28773, OA28773 +28774, OA28774 +28775, OA28775 +28776, OA28776 +28777, OA28777 +28778, OA28778 +28779, OA28779 +28780, OA28780 +28781, OA28781 +28782, OA28782 +28783, OA28783 +28784, OA28784 +28785, OA28785 +28786, OA28786 +28787, OA28787 +28788, OA28788 +28789, OA28789 +28790, OA28790 +28791, OA28791 +28792, OA28792 +28793, OA28793 +28794, OA28794 +28795, OA28795 +28796, OA28796 +28797, OA28797 +28798, OA28798 +28799, OA28799 +28800, OA28800 +28801, OA28801 +28802, OA28802 +28803, OA28803 +28804, OA28804 +28805, OA28805 +28806, OA28806 +28807, OA28807 +28808, OA28808 +28809, OA28809 +28810, OA28810 +28811, OA28811 +28812, OA28812 +28813, OA28813 +28814, OA28814 +28815, OA28815 +28816, OA28816 +28817, OA28817 +28818, OA28818 +28819, OA28819 +28820, OA28820 +28821, OA28821 +28822, OA28822 +28823, OA28823 +28824, OA28824 +28825, OA28825 +28826, OA28826 +28827, OA28827 +28828, OA28828 +28829, OA28829 +28830, OA28830 +28831, OA28831 +28832, OA28832 +28833, OA28833 +28834, OA28834 +28835, OA28835 +28836, OA28836 +28837, OA28837 +28838, OA28838 +28839, OA28839 +28840, OA28840 +28841, OA28841 +28842, OA28842 +28843, OA28843 +28844, OA28844 +28845, OA28845 +28846, OA28846 +28847, OA28847 +28848, OA28848 +28849, OA28849 +28850, OA28850 +28851, OA28851 +28852, OA28852 +28853, OA28853 +28854, OA28854 +28855, OA28855 +28856, OA28856 +28857, OA28857 +28858, OA28858 +28859, OA28859 +28860, OA28860 +28861, OA28861 +28862, OA28862 +28863, OA28863 +28864, OA28864 +28865, OA28865 +28866, OA28866 +28867, OA28867 +28868, OA28868 +28869, OA28869 +28870, OA28870 +28871, OA28871 +28872, OA28872 +28873, OA28873 +28874, OA28874 +28875, OA28875 +28876, OA28876 +28877, OA28877 +28878, OA28878 +28879, OA28879 +28880, OA28880 +28881, OA28881 +28882, OA28882 +28883, OA28883 +28884, OA28884 +28885, OA28885 +28886, OA28886 +28887, OA28887 +28888, OA28888 +28889, OA28889 +28890, OA28890 +28891, OA28891 +28892, OA28892 +28893, OA28893 +28894, OA28894 +28895, OA28895 +28896, OA28896 +28897, OA28897 +28898, OA28898 +28899, OA28899 +28900, OA28900 +28901, OA28901 +28902, OA28902 +28903, OA28903 +28904, OA28904 +28905, OA28905 +28906, OA28906 +28907, OA28907 +28908, OA28908 +28909, OA28909 +28910, OA28910 +28911, OA28911 +28912, OA28912 +28913, OA28913 +28914, OA28914 +28915, OA28915 +28916, OA28916 +28917, OA28917 +28918, OA28918 +28919, OA28919 +28920, OA28920 +28921, OA28921 +28922, OA28922 +28923, OA28923 +28924, OA28924 +28925, OA28925 +28926, OA28926 +28927, OA28927 +28928, OA28928 +28929, OA28929 +28930, OA28930 +28931, OA28931 +28932, OA28932 +28933, OA28933 +28934, OA28934 +28935, OA28935 +28936, OA28936 +28937, OA28937 +28938, OA28938 +28939, OA28939 +28940, OA28940 +28941, OA28941 +28942, OA28942 +28943, OA28943 +28944, OA28944 +28945, OA28945 +28946, OA28946 +28947, OA28947 +28948, OA28948 +28949, OA28949 +28950, OA28950 +28951, OA28951 +28952, OA28952 +28953, OA28953 +28954, OA28954 +28955, OA28955 +28956, OA28956 +28957, OA28957 +28958, OA28958 +28959, OA28959 +28960, OA28960 +28961, OA28961 +28962, OA28962 +28963, OA28963 +28964, OA28964 +28965, OA28965 +28966, OA28966 +28967, OA28967 +28968, OA28968 +28969, OA28969 +28970, OA28970 +28971, OA28971 +28972, OA28972 +28973, OA28973 +28974, OA28974 +28975, OA28975 +28976, OA28976 +28977, OA28977 +28978, OA28978 +28979, OA28979 +28980, OA28980 +28981, OA28981 +28982, OA28982 +28983, OA28983 +28984, OA28984 +28985, OA28985 +28986, OA28986 +28987, OA28987 +28988, OA28988 +28989, OA28989 +28990, OA28990 +28991, OA28991 +28992, OA28992 +28993, OA28993 +28994, OA28994 +28995, OA28995 +28996, OA28996 +28997, OA28997 +28998, OA28998 +28999, OA28999 +29000, OA29000 +29001, OA29001 +29002, OA29002 +29003, OA29003 +29004, OA29004 +29005, OA29005 +29006, OA29006 +29007, OA29007 +29008, OA29008 +29009, OA29009 +29010, OA29010 +29011, OA29011 +29012, OA29012 +29013, OA29013 +29014, OA29014 +29015, OA29015 +29016, OA29016 +29017, OA29017 +29018, OA29018 +29019, OA29019 +29020, OA29020 +29021, OA29021 +29022, OA29022 +29023, OA29023 +29024, OA29024 +29025, OA29025 +29026, OA29026 +29027, OA29027 +29028, OA29028 +29029, OA29029 +29030, OA29030 +29031, OA29031 +29032, OA29032 +29033, OA29033 +29034, OA29034 +29035, OA29035 +29036, OA29036 +29037, OA29037 +29038, OA29038 +29039, OA29039 +29040, OA29040 +29041, OA29041 +29042, OA29042 +29043, OA29043 +29044, OA29044 +29045, OA29045 +29046, OA29046 +29047, OA29047 +29048, OA29048 +29049, OA29049 +29050, OA29050 +29051, OA29051 +29052, OA29052 +29053, OA29053 +29054, OA29054 +29055, OA29055 +29056, OA29056 +29057, OA29057 +29058, OA29058 +29059, OA29059 +29060, OA29060 +29061, OA29061 +29062, OA29062 +29063, OA29063 +29064, OA29064 +29065, OA29065 +29066, OA29066 +29067, OA29067 +29068, OA29068 +29069, OA29069 +29070, OA29070 +29071, OA29071 +29072, OA29072 +29073, OA29073 +29074, OA29074 +29075, OA29075 +29076, OA29076 +29077, OA29077 +29078, OA29078 +29079, OA29079 +29080, OA29080 +29081, OA29081 +29082, OA29082 +29083, OA29083 +29084, OA29084 +29085, OA29085 +29086, OA29086 +29087, OA29087 +29088, OA29088 +29089, OA29089 +29090, OA29090 +29091, OA29091 +29092, OA29092 +29093, OA29093 +29094, OA29094 +29095, OA29095 +29096, OA29096 +29097, OA29097 +29098, OA29098 +29099, OA29099 +29100, OA29100 +29101, OA29101 +29102, OA29102 +29103, OA29103 +29104, OA29104 +29105, OA29105 +29106, OA29106 +29107, OA29107 +29108, OA29108 +29109, OA29109 +29110, OA29110 +29111, OA29111 +29112, OA29112 +29113, OA29113 +29114, OA29114 +29115, OA29115 +29116, OA29116 +29117, OA29117 +29118, OA29118 +29119, OA29119 +29120, OA29120 +29121, OA29121 +29122, OA29122 +29123, OA29123 +29124, OA29124 +29125, OA29125 +29126, OA29126 +29127, OA29127 +29128, OA29128 +29129, OA29129 +29130, OA29130 +29131, OA29131 +29132, OA29132 +29133, OA29133 +29134, OA29134 +29135, OA29135 +29136, OA29136 +29137, OA29137 +29138, OA29138 +29139, OA29139 +29140, OA29140 +29141, OA29141 +29142, OA29142 +29143, OA29143 +29144, OA29144 +29145, OA29145 +29146, OA29146 +29147, OA29147 +29148, OA29148 +29149, OA29149 +29150, OA29150 +29151, OA29151 +29152, OA29152 +29153, OA29153 +29154, OA29154 +29155, OA29155 +29156, OA29156 +29157, OA29157 +29158, OA29158 +29159, OA29159 +29160, OA29160 +29161, OA29161 +29162, OA29162 +29163, OA29163 +29164, OA29164 +29165, OA29165 +29166, OA29166 +29167, OA29167 +29168, OA29168 +29169, OA29169 +29170, OA29170 +29171, OA29171 +29172, OA29172 +29173, OA29173 +29174, OA29174 +29175, OA29175 +29176, OA29176 +29177, OA29177 +29178, OA29178 +29179, OA29179 +29180, OA29180 +29181, OA29181 +29182, OA29182 +29183, OA29183 +29184, OA29184 +29185, OA29185 +29186, OA29186 +29187, OA29187 +29188, OA29188 +29189, OA29189 +29190, OA29190 +29191, OA29191 +29192, OA29192 +29193, OA29193 +29194, OA29194 +29195, OA29195 +29196, OA29196 +29197, OA29197 +29198, OA29198 +29199, OA29199 +29200, OA29200 +29201, OA29201 +29202, OA29202 +29203, OA29203 +29204, OA29204 +29205, OA29205 +29206, OA29206 +29207, OA29207 +29208, OA29208 +29209, OA29209 +29210, OA29210 +29211, OA29211 +29212, OA29212 +29213, OA29213 +29214, OA29214 +29215, OA29215 +29216, OA29216 +29217, OA29217 +29218, OA29218 +29219, OA29219 +29220, OA29220 +29221, OA29221 +29222, OA29222 +29223, OA29223 +29224, OA29224 +29225, OA29225 +29226, OA29226 +29227, OA29227 +29228, OA29228 +29229, OA29229 +29230, OA29230 +29231, OA29231 +29232, OA29232 +29233, OA29233 +29234, OA29234 +29235, OA29235 +29236, OA29236 +29237, OA29237 +29238, OA29238 +29239, OA29239 +29240, OA29240 +29241, OA29241 +29242, OA29242 +29243, OA29243 +29244, OA29244 +29245, OA29245 +29246, OA29246 +29247, OA29247 +29248, OA29248 +29249, OA29249 +29250, OA29250 +29251, OA29251 +29252, OA29252 +29253, OA29253 +29254, OA29254 +29255, OA29255 +29256, OA29256 +29257, OA29257 +29258, OA29258 +29259, OA29259 +29260, OA29260 +29261, OA29261 +29262, OA29262 +29263, OA29263 +29264, OA29264 +29265, OA29265 +29266, OA29266 +29267, OA29267 +29268, OA29268 +29269, OA29269 +29270, OA29270 +29271, OA29271 +29272, OA29272 +29273, OA29273 +29274, OA29274 +29275, OA29275 +29276, OA29276 +29277, OA29277 +29278, OA29278 +29279, OA29279 +29280, OA29280 +29281, OA29281 +29282, OA29282 +29283, OA29283 +29284, OA29284 +29285, OA29285 +29286, OA29286 +29287, OA29287 +29288, OA29288 +29289, OA29289 +29290, OA29290 +29291, OA29291 +29292, OA29292 +29293, OA29293 +29294, OA29294 +29295, OA29295 +29296, OA29296 +29297, OA29297 +29298, OA29298 +29299, OA29299 +29300, OA29300 +29301, OA29301 +29302, OA29302 +29303, OA29303 +29304, OA29304 +29305, OA29305 +29306, OA29306 +29307, OA29307 +29308, OA29308 +29309, OA29309 +29310, OA29310 +29311, OA29311 +29312, OA29312 +29313, OA29313 +29314, OA29314 +29315, OA29315 +29316, OA29316 +29317, OA29317 +29318, OA29318 +29319, OA29319 +29320, OA29320 +29321, OA29321 +29322, OA29322 +29323, OA29323 +29324, OA29324 +29325, OA29325 +29326, OA29326 +29327, OA29327 +29328, OA29328 +29329, OA29329 +29330, OA29330 +29331, OA29331 +29332, OA29332 +29333, OA29333 +29334, OA29334 +29335, OA29335 +29336, OA29336 +29337, OA29337 +29338, OA29338 +29339, OA29339 +29340, OA29340 +29341, OA29341 +29342, OA29342 +29343, OA29343 +29344, OA29344 +29345, OA29345 +29346, OA29346 +29347, OA29347 +29348, OA29348 +29349, OA29349 +29350, OA29350 +29351, OA29351 +29352, OA29352 +29353, OA29353 +29354, OA29354 +29355, OA29355 +29356, OA29356 +29357, OA29357 +29358, OA29358 +29359, OA29359 +29360, OA29360 +29361, OA29361 +29362, OA29362 +29363, OA29363 +29364, OA29364 +29365, OA29365 +29366, OA29366 +29367, OA29367 +29368, OA29368 +29369, OA29369 +29370, OA29370 +29371, OA29371 +29372, OA29372 +29373, OA29373 +29374, OA29374 +29375, OA29375 +29376, OA29376 +29377, OA29377 +29378, OA29378 +29379, OA29379 +29380, OA29380 +29381, OA29381 +29382, OA29382 +29383, OA29383 +29384, OA29384 +29385, OA29385 +29386, OA29386 +29387, OA29387 +29388, OA29388 +29389, OA29389 +29390, OA29390 +29391, OA29391 +29392, OA29392 +29393, OA29393 +29394, OA29394 +29395, OA29395 +29396, OA29396 +29397, OA29397 +29398, OA29398 +29399, OA29399 +29400, OA29400 +29401, OA29401 +29402, OA29402 +29403, OA29403 +29404, OA29404 +29405, OA29405 +29406, OA29406 +29407, OA29407 +29408, OA29408 +29409, OA29409 +29410, OA29410 +29411, OA29411 +29412, OA29412 +29413, OA29413 +29414, OA29414 +29415, OA29415 +29416, OA29416 +29417, OA29417 +29418, OA29418 +29419, OA29419 +29420, OA29420 +29421, OA29421 +29422, OA29422 +29423, OA29423 +29424, OA29424 +29425, OA29425 +29426, OA29426 +29427, OA29427 +29428, OA29428 +29429, OA29429 +29430, OA29430 +29431, OA29431 +29432, OA29432 +29433, OA29433 +29434, OA29434 +29435, OA29435 +29436, OA29436 +29437, OA29437 +29438, OA29438 +29439, OA29439 +29440, OA29440 +29441, OA29441 +29442, OA29442 +29443, OA29443 +29444, OA29444 +29445, OA29445 +29446, OA29446 +29447, OA29447 +29448, OA29448 +29449, OA29449 +29450, OA29450 +29451, OA29451 +29452, OA29452 +29453, OA29453 +29454, OA29454 +29455, OA29455 +29456, OA29456 +29457, OA29457 +29458, OA29458 +29459, OA29459 +29460, OA29460 +29461, OA29461 +29462, OA29462 +29463, OA29463 +29464, OA29464 +29465, OA29465 +29466, OA29466 +29467, OA29467 +29468, OA29468 +29469, OA29469 +29470, OA29470 +29471, OA29471 +29472, OA29472 +29473, OA29473 +29474, OA29474 +29475, OA29475 +29476, OA29476 +29477, OA29477 +29478, OA29478 +29479, OA29479 +29480, OA29480 +29481, OA29481 +29482, OA29482 +29483, OA29483 +29484, OA29484 +29485, OA29485 +29486, OA29486 +29487, OA29487 +29488, OA29488 +29489, OA29489 +29490, OA29490 +29491, OA29491 +29492, OA29492 +29493, OA29493 +29494, OA29494 +29495, OA29495 +29496, OA29496 +29497, OA29497 +29498, OA29498 +29499, OA29499 +29500, OA29500 +29501, OA29501 +29502, OA29502 +29503, OA29503 +29504, OA29504 +29505, OA29505 +29506, OA29506 +29507, OA29507 +29508, OA29508 +29509, OA29509 +29510, OA29510 +29511, OA29511 +29512, OA29512 +29513, OA29513 +29514, OA29514 +29515, OA29515 +29516, OA29516 +29517, OA29517 +29518, OA29518 +29519, OA29519 +29520, OA29520 +29521, OA29521 +29522, OA29522 +29523, OA29523 +29524, OA29524 +29525, OA29525 +29526, OA29526 +29527, OA29527 +29528, OA29528 +29529, OA29529 +29530, OA29530 +29531, OA29531 +29532, OA29532 +29533, OA29533 +29534, OA29534 +29535, OA29535 +29536, OA29536 +29537, OA29537 +29538, OA29538 +29539, OA29539 +29540, OA29540 +29541, OA29541 +29542, OA29542 +29543, OA29543 +29544, OA29544 +29545, OA29545 +29546, OA29546 +29547, OA29547 +29548, OA29548 +29549, OA29549 +29550, OA29550 +29551, OA29551 +29552, OA29552 +29553, OA29553 +29554, OA29554 +29555, OA29555 +29556, OA29556 +29557, OA29557 +29558, OA29558 +29559, OA29559 +29560, OA29560 +29561, OA29561 +29562, OA29562 +29563, OA29563 +29564, OA29564 +29565, OA29565 +29566, OA29566 +29567, OA29567 +29568, OA29568 +29569, OA29569 +29570, OA29570 +29571, OA29571 +29572, OA29572 +29573, OA29573 +29574, OA29574 +29575, OA29575 +29576, OA29576 +29577, OA29577 +29578, OA29578 +29579, OA29579 +29580, OA29580 +29581, OA29581 +29582, OA29582 +29583, OA29583 +29584, OA29584 +29585, OA29585 +29586, OA29586 +29587, OA29587 +29588, OA29588 +29589, OA29589 +29590, OA29590 +29591, OA29591 +29592, OA29592 +29593, OA29593 +29594, OA29594 +29595, OA29595 +29596, OA29596 +29597, OA29597 +29598, OA29598 +29599, OA29599 +29600, OA29600 +29601, OA29601 +29602, OA29602 +29603, OA29603 +29604, OA29604 +29605, OA29605 +29606, OA29606 +29607, OA29607 +29608, OA29608 +29609, OA29609 +29610, OA29610 +29611, OA29611 +29612, OA29612 +29613, OA29613 +29614, OA29614 +29615, OA29615 +29616, OA29616 +29617, OA29617 +29618, OA29618 +29619, OA29619 +29620, OA29620 +29621, OA29621 +29622, OA29622 +29623, OA29623 +29624, OA29624 +29625, OA29625 +29626, OA29626 +29627, OA29627 +29628, OA29628 +29629, OA29629 +29630, OA29630 +29631, OA29631 +29632, OA29632 +29633, OA29633 +29634, OA29634 +29635, OA29635 +29636, OA29636 +29637, OA29637 +29638, OA29638 +29639, OA29639 +29640, OA29640 +29641, OA29641 +29642, OA29642 +29643, OA29643 +29644, OA29644 +29645, OA29645 +29646, OA29646 +29647, OA29647 +29648, OA29648 +29649, OA29649 +29650, OA29650 +29651, OA29651 +29652, OA29652 +29653, OA29653 +29654, OA29654 +29655, OA29655 +29656, OA29656 +29657, OA29657 +29658, OA29658 +29659, OA29659 +29660, OA29660 +29661, OA29661 +29662, OA29662 +29663, OA29663 +29664, OA29664 +29665, OA29665 +29666, OA29666 +29667, OA29667 +29668, OA29668 +29669, OA29669 +29670, OA29670 +29671, OA29671 +29672, OA29672 +29673, OA29673 +29674, OA29674 +29675, OA29675 +29676, OA29676 +29677, OA29677 +29678, OA29678 +29679, OA29679 +29680, OA29680 +29681, OA29681 +29682, OA29682 +29683, OA29683 +29684, OA29684 +29685, OA29685 +29686, OA29686 +29687, OA29687 +29688, OA29688 +29689, OA29689 +29690, OA29690 +29691, OA29691 +29692, OA29692 +29693, OA29693 +29694, OA29694 +29695, OA29695 +29696, OA29696 +29697, OA29697 +29698, OA29698 +29699, OA29699 +29700, OA29700 +29701, OA29701 +29702, OA29702 +29703, OA29703 +29704, OA29704 +29705, OA29705 +29706, OA29706 +29707, OA29707 +29708, OA29708 +29709, OA29709 +29710, OA29710 +29711, OA29711 +29712, OA29712 +29713, OA29713 +29714, OA29714 +29715, OA29715 +29716, OA29716 +29717, OA29717 +29718, OA29718 +29719, OA29719 +29720, OA29720 +29721, OA29721 +29722, OA29722 +29723, OA29723 +29724, OA29724 +29725, OA29725 +29726, OA29726 +29727, OA29727 +29728, OA29728 +29729, OA29729 +29730, OA29730 +29731, OA29731 +29732, OA29732 +29733, OA29733 +29734, OA29734 +29735, OA29735 +29736, OA29736 +29737, OA29737 +29738, OA29738 +29739, OA29739 +29740, OA29740 +29741, OA29741 +29742, OA29742 +29743, OA29743 +29744, OA29744 +29745, OA29745 +29746, OA29746 +29747, OA29747 +29748, OA29748 +29749, OA29749 +29750, OA29750 +29751, OA29751 +29752, OA29752 +29753, OA29753 +29754, OA29754 +29755, OA29755 +29756, OA29756 +29757, OA29757 +29758, OA29758 +29759, OA29759 +29760, OA29760 +29761, OA29761 +29762, OA29762 +29763, OA29763 +29764, OA29764 +29765, OA29765 +29766, OA29766 +29767, OA29767 +29768, OA29768 +29769, OA29769 +29770, OA29770 +29771, OA29771 +29772, OA29772 +29773, OA29773 +29774, OA29774 +29775, OA29775 +29776, OA29776 +29777, OA29777 +29778, OA29778 +29779, OA29779 +29780, OA29780 +29781, OA29781 +29782, OA29782 +29783, OA29783 +29784, OA29784 +29785, OA29785 +29786, OA29786 +29787, OA29787 +29788, OA29788 +29789, OA29789 +29790, OA29790 +29791, OA29791 +29792, OA29792 +29793, OA29793 +29794, OA29794 +29795, OA29795 +29796, OA29796 +29797, OA29797 +29798, OA29798 +29799, OA29799 +29800, OA29800 +29801, OA29801 +29802, OA29802 +29803, OA29803 +29804, OA29804 +29805, OA29805 +29806, OA29806 +29807, OA29807 +29808, OA29808 +29809, OA29809 +29810, OA29810 +29811, OA29811 +29812, OA29812 +29813, OA29813 +29814, OA29814 +29815, OA29815 +29816, OA29816 +29817, OA29817 +29818, OA29818 +29819, OA29819 +29820, OA29820 +29821, OA29821 +29822, OA29822 +29823, OA29823 +29824, OA29824 +29825, OA29825 +29826, OA29826 +29827, OA29827 +29828, OA29828 +29829, OA29829 +29830, OA29830 +29831, OA29831 +29832, OA29832 +29833, OA29833 +29834, OA29834 +29835, OA29835 +29836, OA29836 +29837, OA29837 +29838, OA29838 +29839, OA29839 +29840, OA29840 +29841, OA29841 +29842, OA29842 +29843, OA29843 +29844, OA29844 +29845, OA29845 +29846, OA29846 +29847, OA29847 +29848, OA29848 +29849, OA29849 +29850, OA29850 +29851, OA29851 +29852, OA29852 +29853, OA29853 +29854, OA29854 +29855, OA29855 +29856, OA29856 +29857, OA29857 +29858, OA29858 +29859, OA29859 +29860, OA29860 +29861, OA29861 +29862, OA29862 +29863, OA29863 +29864, OA29864 +29865, OA29865 +29866, OA29866 +29867, OA29867 +29868, OA29868 +29869, OA29869 +29870, OA29870 +29871, OA29871 +29872, OA29872 +29873, OA29873 +29874, OA29874 +29875, OA29875 +29876, OA29876 +29877, OA29877 +29878, OA29878 +29879, OA29879 +29880, OA29880 +29881, OA29881 +29882, OA29882 +29883, OA29883 +29884, OA29884 +29885, OA29885 +29886, OA29886 +29887, OA29887 +29888, OA29888 +29889, OA29889 +29890, OA29890 +29891, OA29891 +29892, OA29892 +29893, OA29893 +29894, OA29894 +29895, OA29895 +29896, OA29896 +29897, OA29897 +29898, OA29898 +29899, OA29899 +29900, OA29900 +29901, OA29901 +29902, OA29902 +29903, OA29903 +29904, OA29904 +29905, OA29905 +29906, OA29906 +29907, OA29907 +29908, OA29908 +29909, OA29909 +29910, OA29910 +29911, OA29911 +29912, OA29912 +29913, OA29913 +29914, OA29914 +29915, OA29915 +29916, OA29916 +29917, OA29917 +29918, OA29918 +29919, OA29919 +29920, OA29920 +29921, OA29921 +29922, OA29922 +29923, OA29923 +29924, OA29924 +29925, OA29925 +29926, OA29926 +29927, OA29927 +29928, OA29928 +29929, OA29929 +29930, OA29930 +29931, OA29931 +29932, OA29932 +29933, OA29933 +29934, OA29934 +29935, OA29935 +29936, OA29936 +29937, OA29937 +29938, OA29938 +29939, OA29939 +29940, OA29940 +29941, OA29941 +29942, OA29942 +29943, OA29943 +29944, OA29944 +29945, OA29945 +29946, OA29946 +29947, OA29947 +29948, OA29948 +29949, OA29949 +29950, OA29950 +29951, OA29951 +29952, OA29952 +29953, OA29953 +29954, OA29954 +29955, OA29955 +29956, OA29956 +29957, OA29957 +29958, OA29958 +29959, OA29959 +29960, OA29960 +29961, OA29961 +29962, OA29962 +29963, OA29963 +29964, OA29964 +29965, OA29965 +29966, OA29966 +29967, OA29967 +29968, OA29968 +29969, OA29969 +29970, OA29970 +29971, OA29971 +29972, OA29972 +29973, OA29973 +29974, OA29974 +29975, OA29975 +29976, OA29976 +29977, OA29977 +29978, OA29978 +29979, OA29979 +29980, OA29980 +29981, OA29981 +29982, OA29982 +29983, OA29983 +29984, OA29984 +29985, OA29985 +29986, OA29986 +29987, OA29987 +29988, OA29988 +29989, OA29989 +29990, OA29990 +29991, OA29991 +29992, OA29992 +29993, OA29993 +29994, OA29994 +29995, OA29995 +29996, OA29996 +29997, OA29997 +29998, OA29998 +29999, OA29999 +30000, OA30000 diff --git a/testdb/csv/PC.csv b/testdb/csv/PC.csv new file mode 100644 index 000000000..67e735908 --- /dev/null +++ b/testdb/csv/PC.csv @@ -0,0 +1,3 @@ +1, PC1 +2, PC2 +3, PC3 diff --git a/testdb/csv/U.csv b/testdb/csv/U.csv new file mode 100644 index 000000000..48915686f --- /dev/null +++ b/testdb/csv/U.csv @@ -0,0 +1,10000 @@ +1, U1 +2, U2 +3, U3 +4, U4 +5, U5 +6, U6 +7, U7 +8, U8 +9, U9 +10, U10 +11, U11 +12, U12 +13, U13 +14, U14 +15, U15 +16, U16 +17, U17 +18, U18 +19, U19 +20, U20 +21, U21 +22, U22 +23, U23 +24, U24 +25, U25 +26, U26 +27, U27 +28, U28 +29, U29 +30, U30 +31, U31 +32, U32 +33, U33 +34, U34 +35, U35 +36, U36 +37, U37 +38, U38 +39, U39 +40, U40 +41, U41 +42, U42 +43, U43 +44, U44 +45, U45 +46, U46 +47, U47 +48, U48 +49, U49 +50, U50 +51, U51 +52, U52 +53, U53 +54, U54 +55, U55 +56, U56 +57, U57 +58, U58 +59, U59 +60, U60 +61, U61 +62, U62 +63, U63 +64, U64 +65, U65 +66, U66 +67, U67 +68, U68 +69, U69 +70, U70 +71, U71 +72, U72 +73, U73 +74, U74 +75, U75 +76, U76 +77, U77 +78, U78 +79, U79 +80, U80 +81, U81 +82, U82 +83, U83 +84, U84 +85, U85 +86, U86 +87, U87 +88, U88 +89, U89 +90, U90 +91, U91 +92, U92 +93, U93 +94, U94 +95, U95 +96, U96 +97, U97 +98, U98 +99, U99 +100, U100 +101, U101 +102, U102 +103, U103 +104, U104 +105, U105 +106, U106 +107, U107 +108, U108 +109, U109 +110, U110 +111, U111 +112, U112 +113, U113 +114, U114 +115, U115 +116, U116 +117, U117 +118, U118 +119, U119 +120, U120 +121, U121 +122, U122 +123, U123 +124, U124 +125, U125 +126, U126 +127, U127 +128, U128 +129, U129 +130, U130 +131, U131 +132, U132 +133, U133 +134, U134 +135, U135 +136, U136 +137, U137 +138, U138 +139, U139 +140, U140 +141, U141 +142, U142 +143, U143 +144, U144 +145, U145 +146, U146 +147, U147 +148, U148 +149, U149 +150, U150 +151, U151 +152, U152 +153, U153 +154, U154 +155, U155 +156, U156 +157, U157 +158, U158 +159, U159 +160, U160 +161, U161 +162, U162 +163, U163 +164, U164 +165, U165 +166, U166 +167, U167 +168, U168 +169, U169 +170, U170 +171, U171 +172, U172 +173, U173 +174, U174 +175, U175 +176, U176 +177, U177 +178, U178 +179, U179 +180, U180 +181, U181 +182, U182 +183, U183 +184, U184 +185, U185 +186, U186 +187, U187 +188, U188 +189, U189 +190, U190 +191, U191 +192, U192 +193, U193 +194, U194 +195, U195 +196, U196 +197, U197 +198, U198 +199, U199 +200, U200 +201, U201 +202, U202 +203, U203 +204, U204 +205, U205 +206, U206 +207, U207 +208, U208 +209, U209 +210, U210 +211, U211 +212, U212 +213, U213 +214, U214 +215, U215 +216, U216 +217, U217 +218, U218 +219, U219 +220, U220 +221, U221 +222, U222 +223, U223 +224, U224 +225, U225 +226, U226 +227, U227 +228, U228 +229, U229 +230, U230 +231, U231 +232, U232 +233, U233 +234, U234 +235, U235 +236, U236 +237, U237 +238, U238 +239, U239 +240, U240 +241, U241 +242, U242 +243, U243 +244, U244 +245, U245 +246, U246 +247, U247 +248, U248 +249, U249 +250, U250 +251, U251 +252, U252 +253, U253 +254, U254 +255, U255 +256, U256 +257, U257 +258, U258 +259, U259 +260, U260 +261, U261 +262, U262 +263, U263 +264, U264 +265, U265 +266, U266 +267, U267 +268, U268 +269, U269 +270, U270 +271, U271 +272, U272 +273, U273 +274, U274 +275, U275 +276, U276 +277, U277 +278, U278 +279, U279 +280, U280 +281, U281 +282, U282 +283, U283 +284, U284 +285, U285 +286, U286 +287, U287 +288, U288 +289, U289 +290, U290 +291, U291 +292, U292 +293, U293 +294, U294 +295, U295 +296, U296 +297, U297 +298, U298 +299, U299 +300, U300 +301, U301 +302, U302 +303, U303 +304, U304 +305, U305 +306, U306 +307, U307 +308, U308 +309, U309 +310, U310 +311, U311 +312, U312 +313, U313 +314, U314 +315, U315 +316, U316 +317, U317 +318, U318 +319, U319 +320, U320 +321, U321 +322, U322 +323, U323 +324, U324 +325, U325 +326, U326 +327, U327 +328, U328 +329, U329 +330, U330 +331, U331 +332, U332 +333, U333 +334, U334 +335, U335 +336, U336 +337, U337 +338, U338 +339, U339 +340, U340 +341, U341 +342, U342 +343, U343 +344, U344 +345, U345 +346, U346 +347, U347 +348, U348 +349, U349 +350, U350 +351, U351 +352, U352 +353, U353 +354, U354 +355, U355 +356, U356 +357, U357 +358, U358 +359, U359 +360, U360 +361, U361 +362, U362 +363, U363 +364, U364 +365, U365 +366, U366 +367, U367 +368, U368 +369, U369 +370, U370 +371, U371 +372, U372 +373, U373 +374, U374 +375, U375 +376, U376 +377, U377 +378, U378 +379, U379 +380, U380 +381, U381 +382, U382 +383, U383 +384, U384 +385, U385 +386, U386 +387, U387 +388, U388 +389, U389 +390, U390 +391, U391 +392, U392 +393, U393 +394, U394 +395, U395 +396, U396 +397, U397 +398, U398 +399, U399 +400, U400 +401, U401 +402, U402 +403, U403 +404, U404 +405, U405 +406, U406 +407, U407 +408, U408 +409, U409 +410, U410 +411, U411 +412, U412 +413, U413 +414, U414 +415, U415 +416, U416 +417, U417 +418, U418 +419, U419 +420, U420 +421, U421 +422, U422 +423, U423 +424, U424 +425, U425 +426, U426 +427, U427 +428, U428 +429, U429 +430, U430 +431, U431 +432, U432 +433, U433 +434, U434 +435, U435 +436, U436 +437, U437 +438, U438 +439, U439 +440, U440 +441, U441 +442, U442 +443, U443 +444, U444 +445, U445 +446, U446 +447, U447 +448, U448 +449, U449 +450, U450 +451, U451 +452, U452 +453, U453 +454, U454 +455, U455 +456, U456 +457, U457 +458, U458 +459, U459 +460, U460 +461, U461 +462, U462 +463, U463 +464, U464 +465, U465 +466, U466 +467, U467 +468, U468 +469, U469 +470, U470 +471, U471 +472, U472 +473, U473 +474, U474 +475, U475 +476, U476 +477, U477 +478, U478 +479, U479 +480, U480 +481, U481 +482, U482 +483, U483 +484, U484 +485, U485 +486, U486 +487, U487 +488, U488 +489, U489 +490, U490 +491, U491 +492, U492 +493, U493 +494, U494 +495, U495 +496, U496 +497, U497 +498, U498 +499, U499 +500, U500 +501, U501 +502, U502 +503, U503 +504, U504 +505, U505 +506, U506 +507, U507 +508, U508 +509, U509 +510, U510 +511, U511 +512, U512 +513, U513 +514, U514 +515, U515 +516, U516 +517, U517 +518, U518 +519, U519 +520, U520 +521, U521 +522, U522 +523, U523 +524, U524 +525, U525 +526, U526 +527, U527 +528, U528 +529, U529 +530, U530 +531, U531 +532, U532 +533, U533 +534, U534 +535, U535 +536, U536 +537, U537 +538, U538 +539, U539 +540, U540 +541, U541 +542, U542 +543, U543 +544, U544 +545, U545 +546, U546 +547, U547 +548, U548 +549, U549 +550, U550 +551, U551 +552, U552 +553, U553 +554, U554 +555, U555 +556, U556 +557, U557 +558, U558 +559, U559 +560, U560 +561, U561 +562, U562 +563, U563 +564, U564 +565, U565 +566, U566 +567, U567 +568, U568 +569, U569 +570, U570 +571, U571 +572, U572 +573, U573 +574, U574 +575, U575 +576, U576 +577, U577 +578, U578 +579, U579 +580, U580 +581, U581 +582, U582 +583, U583 +584, U584 +585, U585 +586, U586 +587, U587 +588, U588 +589, U589 +590, U590 +591, U591 +592, U592 +593, U593 +594, U594 +595, U595 +596, U596 +597, U597 +598, U598 +599, U599 +600, U600 +601, U601 +602, U602 +603, U603 +604, U604 +605, U605 +606, U606 +607, U607 +608, U608 +609, U609 +610, U610 +611, U611 +612, U612 +613, U613 +614, U614 +615, U615 +616, U616 +617, U617 +618, U618 +619, U619 +620, U620 +621, U621 +622, U622 +623, U623 +624, U624 +625, U625 +626, U626 +627, U627 +628, U628 +629, U629 +630, U630 +631, U631 +632, U632 +633, U633 +634, U634 +635, U635 +636, U636 +637, U637 +638, U638 +639, U639 +640, U640 +641, U641 +642, U642 +643, U643 +644, U644 +645, U645 +646, U646 +647, U647 +648, U648 +649, U649 +650, U650 +651, U651 +652, U652 +653, U653 +654, U654 +655, U655 +656, U656 +657, U657 +658, U658 +659, U659 +660, U660 +661, U661 +662, U662 +663, U663 +664, U664 +665, U665 +666, U666 +667, U667 +668, U668 +669, U669 +670, U670 +671, U671 +672, U672 +673, U673 +674, U674 +675, U675 +676, U676 +677, U677 +678, U678 +679, U679 +680, U680 +681, U681 +682, U682 +683, U683 +684, U684 +685, U685 +686, U686 +687, U687 +688, U688 +689, U689 +690, U690 +691, U691 +692, U692 +693, U693 +694, U694 +695, U695 +696, U696 +697, U697 +698, U698 +699, U699 +700, U700 +701, U701 +702, U702 +703, U703 +704, U704 +705, U705 +706, U706 +707, U707 +708, U708 +709, U709 +710, U710 +711, U711 +712, U712 +713, U713 +714, U714 +715, U715 +716, U716 +717, U717 +718, U718 +719, U719 +720, U720 +721, U721 +722, U722 +723, U723 +724, U724 +725, U725 +726, U726 +727, U727 +728, U728 +729, U729 +730, U730 +731, U731 +732, U732 +733, U733 +734, U734 +735, U735 +736, U736 +737, U737 +738, U738 +739, U739 +740, U740 +741, U741 +742, U742 +743, U743 +744, U744 +745, U745 +746, U746 +747, U747 +748, U748 +749, U749 +750, U750 +751, U751 +752, U752 +753, U753 +754, U754 +755, U755 +756, U756 +757, U757 +758, U758 +759, U759 +760, U760 +761, U761 +762, U762 +763, U763 +764, U764 +765, U765 +766, U766 +767, U767 +768, U768 +769, U769 +770, U770 +771, U771 +772, U772 +773, U773 +774, U774 +775, U775 +776, U776 +777, U777 +778, U778 +779, U779 +780, U780 +781, U781 +782, U782 +783, U783 +784, U784 +785, U785 +786, U786 +787, U787 +788, U788 +789, U789 +790, U790 +791, U791 +792, U792 +793, U793 +794, U794 +795, U795 +796, U796 +797, U797 +798, U798 +799, U799 +800, U800 +801, U801 +802, U802 +803, U803 +804, U804 +805, U805 +806, U806 +807, U807 +808, U808 +809, U809 +810, U810 +811, U811 +812, U812 +813, U813 +814, U814 +815, U815 +816, U816 +817, U817 +818, U818 +819, U819 +820, U820 +821, U821 +822, U822 +823, U823 +824, U824 +825, U825 +826, U826 +827, U827 +828, U828 +829, U829 +830, U830 +831, U831 +832, U832 +833, U833 +834, U834 +835, U835 +836, U836 +837, U837 +838, U838 +839, U839 +840, U840 +841, U841 +842, U842 +843, U843 +844, U844 +845, U845 +846, U846 +847, U847 +848, U848 +849, U849 +850, U850 +851, U851 +852, U852 +853, U853 +854, U854 +855, U855 +856, U856 +857, U857 +858, U858 +859, U859 +860, U860 +861, U861 +862, U862 +863, U863 +864, U864 +865, U865 +866, U866 +867, U867 +868, U868 +869, U869 +870, U870 +871, U871 +872, U872 +873, U873 +874, U874 +875, U875 +876, U876 +877, U877 +878, U878 +879, U879 +880, U880 +881, U881 +882, U882 +883, U883 +884, U884 +885, U885 +886, U886 +887, U887 +888, U888 +889, U889 +890, U890 +891, U891 +892, U892 +893, U893 +894, U894 +895, U895 +896, U896 +897, U897 +898, U898 +899, U899 +900, U900 +901, U901 +902, U902 +903, U903 +904, U904 +905, U905 +906, U906 +907, U907 +908, U908 +909, U909 +910, U910 +911, U911 +912, U912 +913, U913 +914, U914 +915, U915 +916, U916 +917, U917 +918, U918 +919, U919 +920, U920 +921, U921 +922, U922 +923, U923 +924, U924 +925, U925 +926, U926 +927, U927 +928, U928 +929, U929 +930, U930 +931, U931 +932, U932 +933, U933 +934, U934 +935, U935 +936, U936 +937, U937 +938, U938 +939, U939 +940, U940 +941, U941 +942, U942 +943, U943 +944, U944 +945, U945 +946, U946 +947, U947 +948, U948 +949, U949 +950, U950 +951, U951 +952, U952 +953, U953 +954, U954 +955, U955 +956, U956 +957, U957 +958, U958 +959, U959 +960, U960 +961, U961 +962, U962 +963, U963 +964, U964 +965, U965 +966, U966 +967, U967 +968, U968 +969, U969 +970, U970 +971, U971 +972, U972 +973, U973 +974, U974 +975, U975 +976, U976 +977, U977 +978, U978 +979, U979 +980, U980 +981, U981 +982, U982 +983, U983 +984, U984 +985, U985 +986, U986 +987, U987 +988, U988 +989, U989 +990, U990 +991, U991 +992, U992 +993, U993 +994, U994 +995, U995 +996, U996 +997, U997 +998, U998 +999, U999 +1000, U1000 +1001, U1001 +1002, U1002 +1003, U1003 +1004, U1004 +1005, U1005 +1006, U1006 +1007, U1007 +1008, U1008 +1009, U1009 +1010, U1010 +1011, U1011 +1012, U1012 +1013, U1013 +1014, U1014 +1015, U1015 +1016, U1016 +1017, U1017 +1018, U1018 +1019, U1019 +1020, U1020 +1021, U1021 +1022, U1022 +1023, U1023 +1024, U1024 +1025, U1025 +1026, U1026 +1027, U1027 +1028, U1028 +1029, U1029 +1030, U1030 +1031, U1031 +1032, U1032 +1033, U1033 +1034, U1034 +1035, U1035 +1036, U1036 +1037, U1037 +1038, U1038 +1039, U1039 +1040, U1040 +1041, U1041 +1042, U1042 +1043, U1043 +1044, U1044 +1045, U1045 +1046, U1046 +1047, U1047 +1048, U1048 +1049, U1049 +1050, U1050 +1051, U1051 +1052, U1052 +1053, U1053 +1054, U1054 +1055, U1055 +1056, U1056 +1057, U1057 +1058, U1058 +1059, U1059 +1060, U1060 +1061, U1061 +1062, U1062 +1063, U1063 +1064, U1064 +1065, U1065 +1066, U1066 +1067, U1067 +1068, U1068 +1069, U1069 +1070, U1070 +1071, U1071 +1072, U1072 +1073, U1073 +1074, U1074 +1075, U1075 +1076, U1076 +1077, U1077 +1078, U1078 +1079, U1079 +1080, U1080 +1081, U1081 +1082, U1082 +1083, U1083 +1084, U1084 +1085, U1085 +1086, U1086 +1087, U1087 +1088, U1088 +1089, U1089 +1090, U1090 +1091, U1091 +1092, U1092 +1093, U1093 +1094, U1094 +1095, U1095 +1096, U1096 +1097, U1097 +1098, U1098 +1099, U1099 +1100, U1100 +1101, U1101 +1102, U1102 +1103, U1103 +1104, U1104 +1105, U1105 +1106, U1106 +1107, U1107 +1108, U1108 +1109, U1109 +1110, U1110 +1111, U1111 +1112, U1112 +1113, U1113 +1114, U1114 +1115, U1115 +1116, U1116 +1117, U1117 +1118, U1118 +1119, U1119 +1120, U1120 +1121, U1121 +1122, U1122 +1123, U1123 +1124, U1124 +1125, U1125 +1126, U1126 +1127, U1127 +1128, U1128 +1129, U1129 +1130, U1130 +1131, U1131 +1132, U1132 +1133, U1133 +1134, U1134 +1135, U1135 +1136, U1136 +1137, U1137 +1138, U1138 +1139, U1139 +1140, U1140 +1141, U1141 +1142, U1142 +1143, U1143 +1144, U1144 +1145, U1145 +1146, U1146 +1147, U1147 +1148, U1148 +1149, U1149 +1150, U1150 +1151, U1151 +1152, U1152 +1153, U1153 +1154, U1154 +1155, U1155 +1156, U1156 +1157, U1157 +1158, U1158 +1159, U1159 +1160, U1160 +1161, U1161 +1162, U1162 +1163, U1163 +1164, U1164 +1165, U1165 +1166, U1166 +1167, U1167 +1168, U1168 +1169, U1169 +1170, U1170 +1171, U1171 +1172, U1172 +1173, U1173 +1174, U1174 +1175, U1175 +1176, U1176 +1177, U1177 +1178, U1178 +1179, U1179 +1180, U1180 +1181, U1181 +1182, U1182 +1183, U1183 +1184, U1184 +1185, U1185 +1186, U1186 +1187, U1187 +1188, U1188 +1189, U1189 +1190, U1190 +1191, U1191 +1192, U1192 +1193, U1193 +1194, U1194 +1195, U1195 +1196, U1196 +1197, U1197 +1198, U1198 +1199, U1199 +1200, U1200 +1201, U1201 +1202, U1202 +1203, U1203 +1204, U1204 +1205, U1205 +1206, U1206 +1207, U1207 +1208, U1208 +1209, U1209 +1210, U1210 +1211, U1211 +1212, U1212 +1213, U1213 +1214, U1214 +1215, U1215 +1216, U1216 +1217, U1217 +1218, U1218 +1219, U1219 +1220, U1220 +1221, U1221 +1222, U1222 +1223, U1223 +1224, U1224 +1225, U1225 +1226, U1226 +1227, U1227 +1228, U1228 +1229, U1229 +1230, U1230 +1231, U1231 +1232, U1232 +1233, U1233 +1234, U1234 +1235, U1235 +1236, U1236 +1237, U1237 +1238, U1238 +1239, U1239 +1240, U1240 +1241, U1241 +1242, U1242 +1243, U1243 +1244, U1244 +1245, U1245 +1246, U1246 +1247, U1247 +1248, U1248 +1249, U1249 +1250, U1250 +1251, U1251 +1252, U1252 +1253, U1253 +1254, U1254 +1255, U1255 +1256, U1256 +1257, U1257 +1258, U1258 +1259, U1259 +1260, U1260 +1261, U1261 +1262, U1262 +1263, U1263 +1264, U1264 +1265, U1265 +1266, U1266 +1267, U1267 +1268, U1268 +1269, U1269 +1270, U1270 +1271, U1271 +1272, U1272 +1273, U1273 +1274, U1274 +1275, U1275 +1276, U1276 +1277, U1277 +1278, U1278 +1279, U1279 +1280, U1280 +1281, U1281 +1282, U1282 +1283, U1283 +1284, U1284 +1285, U1285 +1286, U1286 +1287, U1287 +1288, U1288 +1289, U1289 +1290, U1290 +1291, U1291 +1292, U1292 +1293, U1293 +1294, U1294 +1295, U1295 +1296, U1296 +1297, U1297 +1298, U1298 +1299, U1299 +1300, U1300 +1301, U1301 +1302, U1302 +1303, U1303 +1304, U1304 +1305, U1305 +1306, U1306 +1307, U1307 +1308, U1308 +1309, U1309 +1310, U1310 +1311, U1311 +1312, U1312 +1313, U1313 +1314, U1314 +1315, U1315 +1316, U1316 +1317, U1317 +1318, U1318 +1319, U1319 +1320, U1320 +1321, U1321 +1322, U1322 +1323, U1323 +1324, U1324 +1325, U1325 +1326, U1326 +1327, U1327 +1328, U1328 +1329, U1329 +1330, U1330 +1331, U1331 +1332, U1332 +1333, U1333 +1334, U1334 +1335, U1335 +1336, U1336 +1337, U1337 +1338, U1338 +1339, U1339 +1340, U1340 +1341, U1341 +1342, U1342 +1343, U1343 +1344, U1344 +1345, U1345 +1346, U1346 +1347, U1347 +1348, U1348 +1349, U1349 +1350, U1350 +1351, U1351 +1352, U1352 +1353, U1353 +1354, U1354 +1355, U1355 +1356, U1356 +1357, U1357 +1358, U1358 +1359, U1359 +1360, U1360 +1361, U1361 +1362, U1362 +1363, U1363 +1364, U1364 +1365, U1365 +1366, U1366 +1367, U1367 +1368, U1368 +1369, U1369 +1370, U1370 +1371, U1371 +1372, U1372 +1373, U1373 +1374, U1374 +1375, U1375 +1376, U1376 +1377, U1377 +1378, U1378 +1379, U1379 +1380, U1380 +1381, U1381 +1382, U1382 +1383, U1383 +1384, U1384 +1385, U1385 +1386, U1386 +1387, U1387 +1388, U1388 +1389, U1389 +1390, U1390 +1391, U1391 +1392, U1392 +1393, U1393 +1394, U1394 +1395, U1395 +1396, U1396 +1397, U1397 +1398, U1398 +1399, U1399 +1400, U1400 +1401, U1401 +1402, U1402 +1403, U1403 +1404, U1404 +1405, U1405 +1406, U1406 +1407, U1407 +1408, U1408 +1409, U1409 +1410, U1410 +1411, U1411 +1412, U1412 +1413, U1413 +1414, U1414 +1415, U1415 +1416, U1416 +1417, U1417 +1418, U1418 +1419, U1419 +1420, U1420 +1421, U1421 +1422, U1422 +1423, U1423 +1424, U1424 +1425, U1425 +1426, U1426 +1427, U1427 +1428, U1428 +1429, U1429 +1430, U1430 +1431, U1431 +1432, U1432 +1433, U1433 +1434, U1434 +1435, U1435 +1436, U1436 +1437, U1437 +1438, U1438 +1439, U1439 +1440, U1440 +1441, U1441 +1442, U1442 +1443, U1443 +1444, U1444 +1445, U1445 +1446, U1446 +1447, U1447 +1448, U1448 +1449, U1449 +1450, U1450 +1451, U1451 +1452, U1452 +1453, U1453 +1454, U1454 +1455, U1455 +1456, U1456 +1457, U1457 +1458, U1458 +1459, U1459 +1460, U1460 +1461, U1461 +1462, U1462 +1463, U1463 +1464, U1464 +1465, U1465 +1466, U1466 +1467, U1467 +1468, U1468 +1469, U1469 +1470, U1470 +1471, U1471 +1472, U1472 +1473, U1473 +1474, U1474 +1475, U1475 +1476, U1476 +1477, U1477 +1478, U1478 +1479, U1479 +1480, U1480 +1481, U1481 +1482, U1482 +1483, U1483 +1484, U1484 +1485, U1485 +1486, U1486 +1487, U1487 +1488, U1488 +1489, U1489 +1490, U1490 +1491, U1491 +1492, U1492 +1493, U1493 +1494, U1494 +1495, U1495 +1496, U1496 +1497, U1497 +1498, U1498 +1499, U1499 +1500, U1500 +1501, U1501 +1502, U1502 +1503, U1503 +1504, U1504 +1505, U1505 +1506, U1506 +1507, U1507 +1508, U1508 +1509, U1509 +1510, U1510 +1511, U1511 +1512, U1512 +1513, U1513 +1514, U1514 +1515, U1515 +1516, U1516 +1517, U1517 +1518, U1518 +1519, U1519 +1520, U1520 +1521, U1521 +1522, U1522 +1523, U1523 +1524, U1524 +1525, U1525 +1526, U1526 +1527, U1527 +1528, U1528 +1529, U1529 +1530, U1530 +1531, U1531 +1532, U1532 +1533, U1533 +1534, U1534 +1535, U1535 +1536, U1536 +1537, U1537 +1538, U1538 +1539, U1539 +1540, U1540 +1541, U1541 +1542, U1542 +1543, U1543 +1544, U1544 +1545, U1545 +1546, U1546 +1547, U1547 +1548, U1548 +1549, U1549 +1550, U1550 +1551, U1551 +1552, U1552 +1553, U1553 +1554, U1554 +1555, U1555 +1556, U1556 +1557, U1557 +1558, U1558 +1559, U1559 +1560, U1560 +1561, U1561 +1562, U1562 +1563, U1563 +1564, U1564 +1565, U1565 +1566, U1566 +1567, U1567 +1568, U1568 +1569, U1569 +1570, U1570 +1571, U1571 +1572, U1572 +1573, U1573 +1574, U1574 +1575, U1575 +1576, U1576 +1577, U1577 +1578, U1578 +1579, U1579 +1580, U1580 +1581, U1581 +1582, U1582 +1583, U1583 +1584, U1584 +1585, U1585 +1586, U1586 +1587, U1587 +1588, U1588 +1589, U1589 +1590, U1590 +1591, U1591 +1592, U1592 +1593, U1593 +1594, U1594 +1595, U1595 +1596, U1596 +1597, U1597 +1598, U1598 +1599, U1599 +1600, U1600 +1601, U1601 +1602, U1602 +1603, U1603 +1604, U1604 +1605, U1605 +1606, U1606 +1607, U1607 +1608, U1608 +1609, U1609 +1610, U1610 +1611, U1611 +1612, U1612 +1613, U1613 +1614, U1614 +1615, U1615 +1616, U1616 +1617, U1617 +1618, U1618 +1619, U1619 +1620, U1620 +1621, U1621 +1622, U1622 +1623, U1623 +1624, U1624 +1625, U1625 +1626, U1626 +1627, U1627 +1628, U1628 +1629, U1629 +1630, U1630 +1631, U1631 +1632, U1632 +1633, U1633 +1634, U1634 +1635, U1635 +1636, U1636 +1637, U1637 +1638, U1638 +1639, U1639 +1640, U1640 +1641, U1641 +1642, U1642 +1643, U1643 +1644, U1644 +1645, U1645 +1646, U1646 +1647, U1647 +1648, U1648 +1649, U1649 +1650, U1650 +1651, U1651 +1652, U1652 +1653, U1653 +1654, U1654 +1655, U1655 +1656, U1656 +1657, U1657 +1658, U1658 +1659, U1659 +1660, U1660 +1661, U1661 +1662, U1662 +1663, U1663 +1664, U1664 +1665, U1665 +1666, U1666 +1667, U1667 +1668, U1668 +1669, U1669 +1670, U1670 +1671, U1671 +1672, U1672 +1673, U1673 +1674, U1674 +1675, U1675 +1676, U1676 +1677, U1677 +1678, U1678 +1679, U1679 +1680, U1680 +1681, U1681 +1682, U1682 +1683, U1683 +1684, U1684 +1685, U1685 +1686, U1686 +1687, U1687 +1688, U1688 +1689, U1689 +1690, U1690 +1691, U1691 +1692, U1692 +1693, U1693 +1694, U1694 +1695, U1695 +1696, U1696 +1697, U1697 +1698, U1698 +1699, U1699 +1700, U1700 +1701, U1701 +1702, U1702 +1703, U1703 +1704, U1704 +1705, U1705 +1706, U1706 +1707, U1707 +1708, U1708 +1709, U1709 +1710, U1710 +1711, U1711 +1712, U1712 +1713, U1713 +1714, U1714 +1715, U1715 +1716, U1716 +1717, U1717 +1718, U1718 +1719, U1719 +1720, U1720 +1721, U1721 +1722, U1722 +1723, U1723 +1724, U1724 +1725, U1725 +1726, U1726 +1727, U1727 +1728, U1728 +1729, U1729 +1730, U1730 +1731, U1731 +1732, U1732 +1733, U1733 +1734, U1734 +1735, U1735 +1736, U1736 +1737, U1737 +1738, U1738 +1739, U1739 +1740, U1740 +1741, U1741 +1742, U1742 +1743, U1743 +1744, U1744 +1745, U1745 +1746, U1746 +1747, U1747 +1748, U1748 +1749, U1749 +1750, U1750 +1751, U1751 +1752, U1752 +1753, U1753 +1754, U1754 +1755, U1755 +1756, U1756 +1757, U1757 +1758, U1758 +1759, U1759 +1760, U1760 +1761, U1761 +1762, U1762 +1763, U1763 +1764, U1764 +1765, U1765 +1766, U1766 +1767, U1767 +1768, U1768 +1769, U1769 +1770, U1770 +1771, U1771 +1772, U1772 +1773, U1773 +1774, U1774 +1775, U1775 +1776, U1776 +1777, U1777 +1778, U1778 +1779, U1779 +1780, U1780 +1781, U1781 +1782, U1782 +1783, U1783 +1784, U1784 +1785, U1785 +1786, U1786 +1787, U1787 +1788, U1788 +1789, U1789 +1790, U1790 +1791, U1791 +1792, U1792 +1793, U1793 +1794, U1794 +1795, U1795 +1796, U1796 +1797, U1797 +1798, U1798 +1799, U1799 +1800, U1800 +1801, U1801 +1802, U1802 +1803, U1803 +1804, U1804 +1805, U1805 +1806, U1806 +1807, U1807 +1808, U1808 +1809, U1809 +1810, U1810 +1811, U1811 +1812, U1812 +1813, U1813 +1814, U1814 +1815, U1815 +1816, U1816 +1817, U1817 +1818, U1818 +1819, U1819 +1820, U1820 +1821, U1821 +1822, U1822 +1823, U1823 +1824, U1824 +1825, U1825 +1826, U1826 +1827, U1827 +1828, U1828 +1829, U1829 +1830, U1830 +1831, U1831 +1832, U1832 +1833, U1833 +1834, U1834 +1835, U1835 +1836, U1836 +1837, U1837 +1838, U1838 +1839, U1839 +1840, U1840 +1841, U1841 +1842, U1842 +1843, U1843 +1844, U1844 +1845, U1845 +1846, U1846 +1847, U1847 +1848, U1848 +1849, U1849 +1850, U1850 +1851, U1851 +1852, U1852 +1853, U1853 +1854, U1854 +1855, U1855 +1856, U1856 +1857, U1857 +1858, U1858 +1859, U1859 +1860, U1860 +1861, U1861 +1862, U1862 +1863, U1863 +1864, U1864 +1865, U1865 +1866, U1866 +1867, U1867 +1868, U1868 +1869, U1869 +1870, U1870 +1871, U1871 +1872, U1872 +1873, U1873 +1874, U1874 +1875, U1875 +1876, U1876 +1877, U1877 +1878, U1878 +1879, U1879 +1880, U1880 +1881, U1881 +1882, U1882 +1883, U1883 +1884, U1884 +1885, U1885 +1886, U1886 +1887, U1887 +1888, U1888 +1889, U1889 +1890, U1890 +1891, U1891 +1892, U1892 +1893, U1893 +1894, U1894 +1895, U1895 +1896, U1896 +1897, U1897 +1898, U1898 +1899, U1899 +1900, U1900 +1901, U1901 +1902, U1902 +1903, U1903 +1904, U1904 +1905, U1905 +1906, U1906 +1907, U1907 +1908, U1908 +1909, U1909 +1910, U1910 +1911, U1911 +1912, U1912 +1913, U1913 +1914, U1914 +1915, U1915 +1916, U1916 +1917, U1917 +1918, U1918 +1919, U1919 +1920, U1920 +1921, U1921 +1922, U1922 +1923, U1923 +1924, U1924 +1925, U1925 +1926, U1926 +1927, U1927 +1928, U1928 +1929, U1929 +1930, U1930 +1931, U1931 +1932, U1932 +1933, U1933 +1934, U1934 +1935, U1935 +1936, U1936 +1937, U1937 +1938, U1938 +1939, U1939 +1940, U1940 +1941, U1941 +1942, U1942 +1943, U1943 +1944, U1944 +1945, U1945 +1946, U1946 +1947, U1947 +1948, U1948 +1949, U1949 +1950, U1950 +1951, U1951 +1952, U1952 +1953, U1953 +1954, U1954 +1955, U1955 +1956, U1956 +1957, U1957 +1958, U1958 +1959, U1959 +1960, U1960 +1961, U1961 +1962, U1962 +1963, U1963 +1964, U1964 +1965, U1965 +1966, U1966 +1967, U1967 +1968, U1968 +1969, U1969 +1970, U1970 +1971, U1971 +1972, U1972 +1973, U1973 +1974, U1974 +1975, U1975 +1976, U1976 +1977, U1977 +1978, U1978 +1979, U1979 +1980, U1980 +1981, U1981 +1982, U1982 +1983, U1983 +1984, U1984 +1985, U1985 +1986, U1986 +1987, U1987 +1988, U1988 +1989, U1989 +1990, U1990 +1991, U1991 +1992, U1992 +1993, U1993 +1994, U1994 +1995, U1995 +1996, U1996 +1997, U1997 +1998, U1998 +1999, U1999 +2000, U2000 +2001, U2001 +2002, U2002 +2003, U2003 +2004, U2004 +2005, U2005 +2006, U2006 +2007, U2007 +2008, U2008 +2009, U2009 +2010, U2010 +2011, U2011 +2012, U2012 +2013, U2013 +2014, U2014 +2015, U2015 +2016, U2016 +2017, U2017 +2018, U2018 +2019, U2019 +2020, U2020 +2021, U2021 +2022, U2022 +2023, U2023 +2024, U2024 +2025, U2025 +2026, U2026 +2027, U2027 +2028, U2028 +2029, U2029 +2030, U2030 +2031, U2031 +2032, U2032 +2033, U2033 +2034, U2034 +2035, U2035 +2036, U2036 +2037, U2037 +2038, U2038 +2039, U2039 +2040, U2040 +2041, U2041 +2042, U2042 +2043, U2043 +2044, U2044 +2045, U2045 +2046, U2046 +2047, U2047 +2048, U2048 +2049, U2049 +2050, U2050 +2051, U2051 +2052, U2052 +2053, U2053 +2054, U2054 +2055, U2055 +2056, U2056 +2057, U2057 +2058, U2058 +2059, U2059 +2060, U2060 +2061, U2061 +2062, U2062 +2063, U2063 +2064, U2064 +2065, U2065 +2066, U2066 +2067, U2067 +2068, U2068 +2069, U2069 +2070, U2070 +2071, U2071 +2072, U2072 +2073, U2073 +2074, U2074 +2075, U2075 +2076, U2076 +2077, U2077 +2078, U2078 +2079, U2079 +2080, U2080 +2081, U2081 +2082, U2082 +2083, U2083 +2084, U2084 +2085, U2085 +2086, U2086 +2087, U2087 +2088, U2088 +2089, U2089 +2090, U2090 +2091, U2091 +2092, U2092 +2093, U2093 +2094, U2094 +2095, U2095 +2096, U2096 +2097, U2097 +2098, U2098 +2099, U2099 +2100, U2100 +2101, U2101 +2102, U2102 +2103, U2103 +2104, U2104 +2105, U2105 +2106, U2106 +2107, U2107 +2108, U2108 +2109, U2109 +2110, U2110 +2111, U2111 +2112, U2112 +2113, U2113 +2114, U2114 +2115, U2115 +2116, U2116 +2117, U2117 +2118, U2118 +2119, U2119 +2120, U2120 +2121, U2121 +2122, U2122 +2123, U2123 +2124, U2124 +2125, U2125 +2126, U2126 +2127, U2127 +2128, U2128 +2129, U2129 +2130, U2130 +2131, U2131 +2132, U2132 +2133, U2133 +2134, U2134 +2135, U2135 +2136, U2136 +2137, U2137 +2138, U2138 +2139, U2139 +2140, U2140 +2141, U2141 +2142, U2142 +2143, U2143 +2144, U2144 +2145, U2145 +2146, U2146 +2147, U2147 +2148, U2148 +2149, U2149 +2150, U2150 +2151, U2151 +2152, U2152 +2153, U2153 +2154, U2154 +2155, U2155 +2156, U2156 +2157, U2157 +2158, U2158 +2159, U2159 +2160, U2160 +2161, U2161 +2162, U2162 +2163, U2163 +2164, U2164 +2165, U2165 +2166, U2166 +2167, U2167 +2168, U2168 +2169, U2169 +2170, U2170 +2171, U2171 +2172, U2172 +2173, U2173 +2174, U2174 +2175, U2175 +2176, U2176 +2177, U2177 +2178, U2178 +2179, U2179 +2180, U2180 +2181, U2181 +2182, U2182 +2183, U2183 +2184, U2184 +2185, U2185 +2186, U2186 +2187, U2187 +2188, U2188 +2189, U2189 +2190, U2190 +2191, U2191 +2192, U2192 +2193, U2193 +2194, U2194 +2195, U2195 +2196, U2196 +2197, U2197 +2198, U2198 +2199, U2199 +2200, U2200 +2201, U2201 +2202, U2202 +2203, U2203 +2204, U2204 +2205, U2205 +2206, U2206 +2207, U2207 +2208, U2208 +2209, U2209 +2210, U2210 +2211, U2211 +2212, U2212 +2213, U2213 +2214, U2214 +2215, U2215 +2216, U2216 +2217, U2217 +2218, U2218 +2219, U2219 +2220, U2220 +2221, U2221 +2222, U2222 +2223, U2223 +2224, U2224 +2225, U2225 +2226, U2226 +2227, U2227 +2228, U2228 +2229, U2229 +2230, U2230 +2231, U2231 +2232, U2232 +2233, U2233 +2234, U2234 +2235, U2235 +2236, U2236 +2237, U2237 +2238, U2238 +2239, U2239 +2240, U2240 +2241, U2241 +2242, U2242 +2243, U2243 +2244, U2244 +2245, U2245 +2246, U2246 +2247, U2247 +2248, U2248 +2249, U2249 +2250, U2250 +2251, U2251 +2252, U2252 +2253, U2253 +2254, U2254 +2255, U2255 +2256, U2256 +2257, U2257 +2258, U2258 +2259, U2259 +2260, U2260 +2261, U2261 +2262, U2262 +2263, U2263 +2264, U2264 +2265, U2265 +2266, U2266 +2267, U2267 +2268, U2268 +2269, U2269 +2270, U2270 +2271, U2271 +2272, U2272 +2273, U2273 +2274, U2274 +2275, U2275 +2276, U2276 +2277, U2277 +2278, U2278 +2279, U2279 +2280, U2280 +2281, U2281 +2282, U2282 +2283, U2283 +2284, U2284 +2285, U2285 +2286, U2286 +2287, U2287 +2288, U2288 +2289, U2289 +2290, U2290 +2291, U2291 +2292, U2292 +2293, U2293 +2294, U2294 +2295, U2295 +2296, U2296 +2297, U2297 +2298, U2298 +2299, U2299 +2300, U2300 +2301, U2301 +2302, U2302 +2303, U2303 +2304, U2304 +2305, U2305 +2306, U2306 +2307, U2307 +2308, U2308 +2309, U2309 +2310, U2310 +2311, U2311 +2312, U2312 +2313, U2313 +2314, U2314 +2315, U2315 +2316, U2316 +2317, U2317 +2318, U2318 +2319, U2319 +2320, U2320 +2321, U2321 +2322, U2322 +2323, U2323 +2324, U2324 +2325, U2325 +2326, U2326 +2327, U2327 +2328, U2328 +2329, U2329 +2330, U2330 +2331, U2331 +2332, U2332 +2333, U2333 +2334, U2334 +2335, U2335 +2336, U2336 +2337, U2337 +2338, U2338 +2339, U2339 +2340, U2340 +2341, U2341 +2342, U2342 +2343, U2343 +2344, U2344 +2345, U2345 +2346, U2346 +2347, U2347 +2348, U2348 +2349, U2349 +2350, U2350 +2351, U2351 +2352, U2352 +2353, U2353 +2354, U2354 +2355, U2355 +2356, U2356 +2357, U2357 +2358, U2358 +2359, U2359 +2360, U2360 +2361, U2361 +2362, U2362 +2363, U2363 +2364, U2364 +2365, U2365 +2366, U2366 +2367, U2367 +2368, U2368 +2369, U2369 +2370, U2370 +2371, U2371 +2372, U2372 +2373, U2373 +2374, U2374 +2375, U2375 +2376, U2376 +2377, U2377 +2378, U2378 +2379, U2379 +2380, U2380 +2381, U2381 +2382, U2382 +2383, U2383 +2384, U2384 +2385, U2385 +2386, U2386 +2387, U2387 +2388, U2388 +2389, U2389 +2390, U2390 +2391, U2391 +2392, U2392 +2393, U2393 +2394, U2394 +2395, U2395 +2396, U2396 +2397, U2397 +2398, U2398 +2399, U2399 +2400, U2400 +2401, U2401 +2402, U2402 +2403, U2403 +2404, U2404 +2405, U2405 +2406, U2406 +2407, U2407 +2408, U2408 +2409, U2409 +2410, U2410 +2411, U2411 +2412, U2412 +2413, U2413 +2414, U2414 +2415, U2415 +2416, U2416 +2417, U2417 +2418, U2418 +2419, U2419 +2420, U2420 +2421, U2421 +2422, U2422 +2423, U2423 +2424, U2424 +2425, U2425 +2426, U2426 +2427, U2427 +2428, U2428 +2429, U2429 +2430, U2430 +2431, U2431 +2432, U2432 +2433, U2433 +2434, U2434 +2435, U2435 +2436, U2436 +2437, U2437 +2438, U2438 +2439, U2439 +2440, U2440 +2441, U2441 +2442, U2442 +2443, U2443 +2444, U2444 +2445, U2445 +2446, U2446 +2447, U2447 +2448, U2448 +2449, U2449 +2450, U2450 +2451, U2451 +2452, U2452 +2453, U2453 +2454, U2454 +2455, U2455 +2456, U2456 +2457, U2457 +2458, U2458 +2459, U2459 +2460, U2460 +2461, U2461 +2462, U2462 +2463, U2463 +2464, U2464 +2465, U2465 +2466, U2466 +2467, U2467 +2468, U2468 +2469, U2469 +2470, U2470 +2471, U2471 +2472, U2472 +2473, U2473 +2474, U2474 +2475, U2475 +2476, U2476 +2477, U2477 +2478, U2478 +2479, U2479 +2480, U2480 +2481, U2481 +2482, U2482 +2483, U2483 +2484, U2484 +2485, U2485 +2486, U2486 +2487, U2487 +2488, U2488 +2489, U2489 +2490, U2490 +2491, U2491 +2492, U2492 +2493, U2493 +2494, U2494 +2495, U2495 +2496, U2496 +2497, U2497 +2498, U2498 +2499, U2499 +2500, U2500 +2501, U2501 +2502, U2502 +2503, U2503 +2504, U2504 +2505, U2505 +2506, U2506 +2507, U2507 +2508, U2508 +2509, U2509 +2510, U2510 +2511, U2511 +2512, U2512 +2513, U2513 +2514, U2514 +2515, U2515 +2516, U2516 +2517, U2517 +2518, U2518 +2519, U2519 +2520, U2520 +2521, U2521 +2522, U2522 +2523, U2523 +2524, U2524 +2525, U2525 +2526, U2526 +2527, U2527 +2528, U2528 +2529, U2529 +2530, U2530 +2531, U2531 +2532, U2532 +2533, U2533 +2534, U2534 +2535, U2535 +2536, U2536 +2537, U2537 +2538, U2538 +2539, U2539 +2540, U2540 +2541, U2541 +2542, U2542 +2543, U2543 +2544, U2544 +2545, U2545 +2546, U2546 +2547, U2547 +2548, U2548 +2549, U2549 +2550, U2550 +2551, U2551 +2552, U2552 +2553, U2553 +2554, U2554 +2555, U2555 +2556, U2556 +2557, U2557 +2558, U2558 +2559, U2559 +2560, U2560 +2561, U2561 +2562, U2562 +2563, U2563 +2564, U2564 +2565, U2565 +2566, U2566 +2567, U2567 +2568, U2568 +2569, U2569 +2570, U2570 +2571, U2571 +2572, U2572 +2573, U2573 +2574, U2574 +2575, U2575 +2576, U2576 +2577, U2577 +2578, U2578 +2579, U2579 +2580, U2580 +2581, U2581 +2582, U2582 +2583, U2583 +2584, U2584 +2585, U2585 +2586, U2586 +2587, U2587 +2588, U2588 +2589, U2589 +2590, U2590 +2591, U2591 +2592, U2592 +2593, U2593 +2594, U2594 +2595, U2595 +2596, U2596 +2597, U2597 +2598, U2598 +2599, U2599 +2600, U2600 +2601, U2601 +2602, U2602 +2603, U2603 +2604, U2604 +2605, U2605 +2606, U2606 +2607, U2607 +2608, U2608 +2609, U2609 +2610, U2610 +2611, U2611 +2612, U2612 +2613, U2613 +2614, U2614 +2615, U2615 +2616, U2616 +2617, U2617 +2618, U2618 +2619, U2619 +2620, U2620 +2621, U2621 +2622, U2622 +2623, U2623 +2624, U2624 +2625, U2625 +2626, U2626 +2627, U2627 +2628, U2628 +2629, U2629 +2630, U2630 +2631, U2631 +2632, U2632 +2633, U2633 +2634, U2634 +2635, U2635 +2636, U2636 +2637, U2637 +2638, U2638 +2639, U2639 +2640, U2640 +2641, U2641 +2642, U2642 +2643, U2643 +2644, U2644 +2645, U2645 +2646, U2646 +2647, U2647 +2648, U2648 +2649, U2649 +2650, U2650 +2651, U2651 +2652, U2652 +2653, U2653 +2654, U2654 +2655, U2655 +2656, U2656 +2657, U2657 +2658, U2658 +2659, U2659 +2660, U2660 +2661, U2661 +2662, U2662 +2663, U2663 +2664, U2664 +2665, U2665 +2666, U2666 +2667, U2667 +2668, U2668 +2669, U2669 +2670, U2670 +2671, U2671 +2672, U2672 +2673, U2673 +2674, U2674 +2675, U2675 +2676, U2676 +2677, U2677 +2678, U2678 +2679, U2679 +2680, U2680 +2681, U2681 +2682, U2682 +2683, U2683 +2684, U2684 +2685, U2685 +2686, U2686 +2687, U2687 +2688, U2688 +2689, U2689 +2690, U2690 +2691, U2691 +2692, U2692 +2693, U2693 +2694, U2694 +2695, U2695 +2696, U2696 +2697, U2697 +2698, U2698 +2699, U2699 +2700, U2700 +2701, U2701 +2702, U2702 +2703, U2703 +2704, U2704 +2705, U2705 +2706, U2706 +2707, U2707 +2708, U2708 +2709, U2709 +2710, U2710 +2711, U2711 +2712, U2712 +2713, U2713 +2714, U2714 +2715, U2715 +2716, U2716 +2717, U2717 +2718, U2718 +2719, U2719 +2720, U2720 +2721, U2721 +2722, U2722 +2723, U2723 +2724, U2724 +2725, U2725 +2726, U2726 +2727, U2727 +2728, U2728 +2729, U2729 +2730, U2730 +2731, U2731 +2732, U2732 +2733, U2733 +2734, U2734 +2735, U2735 +2736, U2736 +2737, U2737 +2738, U2738 +2739, U2739 +2740, U2740 +2741, U2741 +2742, U2742 +2743, U2743 +2744, U2744 +2745, U2745 +2746, U2746 +2747, U2747 +2748, U2748 +2749, U2749 +2750, U2750 +2751, U2751 +2752, U2752 +2753, U2753 +2754, U2754 +2755, U2755 +2756, U2756 +2757, U2757 +2758, U2758 +2759, U2759 +2760, U2760 +2761, U2761 +2762, U2762 +2763, U2763 +2764, U2764 +2765, U2765 +2766, U2766 +2767, U2767 +2768, U2768 +2769, U2769 +2770, U2770 +2771, U2771 +2772, U2772 +2773, U2773 +2774, U2774 +2775, U2775 +2776, U2776 +2777, U2777 +2778, U2778 +2779, U2779 +2780, U2780 +2781, U2781 +2782, U2782 +2783, U2783 +2784, U2784 +2785, U2785 +2786, U2786 +2787, U2787 +2788, U2788 +2789, U2789 +2790, U2790 +2791, U2791 +2792, U2792 +2793, U2793 +2794, U2794 +2795, U2795 +2796, U2796 +2797, U2797 +2798, U2798 +2799, U2799 +2800, U2800 +2801, U2801 +2802, U2802 +2803, U2803 +2804, U2804 +2805, U2805 +2806, U2806 +2807, U2807 +2808, U2808 +2809, U2809 +2810, U2810 +2811, U2811 +2812, U2812 +2813, U2813 +2814, U2814 +2815, U2815 +2816, U2816 +2817, U2817 +2818, U2818 +2819, U2819 +2820, U2820 +2821, U2821 +2822, U2822 +2823, U2823 +2824, U2824 +2825, U2825 +2826, U2826 +2827, U2827 +2828, U2828 +2829, U2829 +2830, U2830 +2831, U2831 +2832, U2832 +2833, U2833 +2834, U2834 +2835, U2835 +2836, U2836 +2837, U2837 +2838, U2838 +2839, U2839 +2840, U2840 +2841, U2841 +2842, U2842 +2843, U2843 +2844, U2844 +2845, U2845 +2846, U2846 +2847, U2847 +2848, U2848 +2849, U2849 +2850, U2850 +2851, U2851 +2852, U2852 +2853, U2853 +2854, U2854 +2855, U2855 +2856, U2856 +2857, U2857 +2858, U2858 +2859, U2859 +2860, U2860 +2861, U2861 +2862, U2862 +2863, U2863 +2864, U2864 +2865, U2865 +2866, U2866 +2867, U2867 +2868, U2868 +2869, U2869 +2870, U2870 +2871, U2871 +2872, U2872 +2873, U2873 +2874, U2874 +2875, U2875 +2876, U2876 +2877, U2877 +2878, U2878 +2879, U2879 +2880, U2880 +2881, U2881 +2882, U2882 +2883, U2883 +2884, U2884 +2885, U2885 +2886, U2886 +2887, U2887 +2888, U2888 +2889, U2889 +2890, U2890 +2891, U2891 +2892, U2892 +2893, U2893 +2894, U2894 +2895, U2895 +2896, U2896 +2897, U2897 +2898, U2898 +2899, U2899 +2900, U2900 +2901, U2901 +2902, U2902 +2903, U2903 +2904, U2904 +2905, U2905 +2906, U2906 +2907, U2907 +2908, U2908 +2909, U2909 +2910, U2910 +2911, U2911 +2912, U2912 +2913, U2913 +2914, U2914 +2915, U2915 +2916, U2916 +2917, U2917 +2918, U2918 +2919, U2919 +2920, U2920 +2921, U2921 +2922, U2922 +2923, U2923 +2924, U2924 +2925, U2925 +2926, U2926 +2927, U2927 +2928, U2928 +2929, U2929 +2930, U2930 +2931, U2931 +2932, U2932 +2933, U2933 +2934, U2934 +2935, U2935 +2936, U2936 +2937, U2937 +2938, U2938 +2939, U2939 +2940, U2940 +2941, U2941 +2942, U2942 +2943, U2943 +2944, U2944 +2945, U2945 +2946, U2946 +2947, U2947 +2948, U2948 +2949, U2949 +2950, U2950 +2951, U2951 +2952, U2952 +2953, U2953 +2954, U2954 +2955, U2955 +2956, U2956 +2957, U2957 +2958, U2958 +2959, U2959 +2960, U2960 +2961, U2961 +2962, U2962 +2963, U2963 +2964, U2964 +2965, U2965 +2966, U2966 +2967, U2967 +2968, U2968 +2969, U2969 +2970, U2970 +2971, U2971 +2972, U2972 +2973, U2973 +2974, U2974 +2975, U2975 +2976, U2976 +2977, U2977 +2978, U2978 +2979, U2979 +2980, U2980 +2981, U2981 +2982, U2982 +2983, U2983 +2984, U2984 +2985, U2985 +2986, U2986 +2987, U2987 +2988, U2988 +2989, U2989 +2990, U2990 +2991, U2991 +2992, U2992 +2993, U2993 +2994, U2994 +2995, U2995 +2996, U2996 +2997, U2997 +2998, U2998 +2999, U2999 +3000, U3000 +3001, U3001 +3002, U3002 +3003, U3003 +3004, U3004 +3005, U3005 +3006, U3006 +3007, U3007 +3008, U3008 +3009, U3009 +3010, U3010 +3011, U3011 +3012, U3012 +3013, U3013 +3014, U3014 +3015, U3015 +3016, U3016 +3017, U3017 +3018, U3018 +3019, U3019 +3020, U3020 +3021, U3021 +3022, U3022 +3023, U3023 +3024, U3024 +3025, U3025 +3026, U3026 +3027, U3027 +3028, U3028 +3029, U3029 +3030, U3030 +3031, U3031 +3032, U3032 +3033, U3033 +3034, U3034 +3035, U3035 +3036, U3036 +3037, U3037 +3038, U3038 +3039, U3039 +3040, U3040 +3041, U3041 +3042, U3042 +3043, U3043 +3044, U3044 +3045, U3045 +3046, U3046 +3047, U3047 +3048, U3048 +3049, U3049 +3050, U3050 +3051, U3051 +3052, U3052 +3053, U3053 +3054, U3054 +3055, U3055 +3056, U3056 +3057, U3057 +3058, U3058 +3059, U3059 +3060, U3060 +3061, U3061 +3062, U3062 +3063, U3063 +3064, U3064 +3065, U3065 +3066, U3066 +3067, U3067 +3068, U3068 +3069, U3069 +3070, U3070 +3071, U3071 +3072, U3072 +3073, U3073 +3074, U3074 +3075, U3075 +3076, U3076 +3077, U3077 +3078, U3078 +3079, U3079 +3080, U3080 +3081, U3081 +3082, U3082 +3083, U3083 +3084, U3084 +3085, U3085 +3086, U3086 +3087, U3087 +3088, U3088 +3089, U3089 +3090, U3090 +3091, U3091 +3092, U3092 +3093, U3093 +3094, U3094 +3095, U3095 +3096, U3096 +3097, U3097 +3098, U3098 +3099, U3099 +3100, U3100 +3101, U3101 +3102, U3102 +3103, U3103 +3104, U3104 +3105, U3105 +3106, U3106 +3107, U3107 +3108, U3108 +3109, U3109 +3110, U3110 +3111, U3111 +3112, U3112 +3113, U3113 +3114, U3114 +3115, U3115 +3116, U3116 +3117, U3117 +3118, U3118 +3119, U3119 +3120, U3120 +3121, U3121 +3122, U3122 +3123, U3123 +3124, U3124 +3125, U3125 +3126, U3126 +3127, U3127 +3128, U3128 +3129, U3129 +3130, U3130 +3131, U3131 +3132, U3132 +3133, U3133 +3134, U3134 +3135, U3135 +3136, U3136 +3137, U3137 +3138, U3138 +3139, U3139 +3140, U3140 +3141, U3141 +3142, U3142 +3143, U3143 +3144, U3144 +3145, U3145 +3146, U3146 +3147, U3147 +3148, U3148 +3149, U3149 +3150, U3150 +3151, U3151 +3152, U3152 +3153, U3153 +3154, U3154 +3155, U3155 +3156, U3156 +3157, U3157 +3158, U3158 +3159, U3159 +3160, U3160 +3161, U3161 +3162, U3162 +3163, U3163 +3164, U3164 +3165, U3165 +3166, U3166 +3167, U3167 +3168, U3168 +3169, U3169 +3170, U3170 +3171, U3171 +3172, U3172 +3173, U3173 +3174, U3174 +3175, U3175 +3176, U3176 +3177, U3177 +3178, U3178 +3179, U3179 +3180, U3180 +3181, U3181 +3182, U3182 +3183, U3183 +3184, U3184 +3185, U3185 +3186, U3186 +3187, U3187 +3188, U3188 +3189, U3189 +3190, U3190 +3191, U3191 +3192, U3192 +3193, U3193 +3194, U3194 +3195, U3195 +3196, U3196 +3197, U3197 +3198, U3198 +3199, U3199 +3200, U3200 +3201, U3201 +3202, U3202 +3203, U3203 +3204, U3204 +3205, U3205 +3206, U3206 +3207, U3207 +3208, U3208 +3209, U3209 +3210, U3210 +3211, U3211 +3212, U3212 +3213, U3213 +3214, U3214 +3215, U3215 +3216, U3216 +3217, U3217 +3218, U3218 +3219, U3219 +3220, U3220 +3221, U3221 +3222, U3222 +3223, U3223 +3224, U3224 +3225, U3225 +3226, U3226 +3227, U3227 +3228, U3228 +3229, U3229 +3230, U3230 +3231, U3231 +3232, U3232 +3233, U3233 +3234, U3234 +3235, U3235 +3236, U3236 +3237, U3237 +3238, U3238 +3239, U3239 +3240, U3240 +3241, U3241 +3242, U3242 +3243, U3243 +3244, U3244 +3245, U3245 +3246, U3246 +3247, U3247 +3248, U3248 +3249, U3249 +3250, U3250 +3251, U3251 +3252, U3252 +3253, U3253 +3254, U3254 +3255, U3255 +3256, U3256 +3257, U3257 +3258, U3258 +3259, U3259 +3260, U3260 +3261, U3261 +3262, U3262 +3263, U3263 +3264, U3264 +3265, U3265 +3266, U3266 +3267, U3267 +3268, U3268 +3269, U3269 +3270, U3270 +3271, U3271 +3272, U3272 +3273, U3273 +3274, U3274 +3275, U3275 +3276, U3276 +3277, U3277 +3278, U3278 +3279, U3279 +3280, U3280 +3281, U3281 +3282, U3282 +3283, U3283 +3284, U3284 +3285, U3285 +3286, U3286 +3287, U3287 +3288, U3288 +3289, U3289 +3290, U3290 +3291, U3291 +3292, U3292 +3293, U3293 +3294, U3294 +3295, U3295 +3296, U3296 +3297, U3297 +3298, U3298 +3299, U3299 +3300, U3300 +3301, U3301 +3302, U3302 +3303, U3303 +3304, U3304 +3305, U3305 +3306, U3306 +3307, U3307 +3308, U3308 +3309, U3309 +3310, U3310 +3311, U3311 +3312, U3312 +3313, U3313 +3314, U3314 +3315, U3315 +3316, U3316 +3317, U3317 +3318, U3318 +3319, U3319 +3320, U3320 +3321, U3321 +3322, U3322 +3323, U3323 +3324, U3324 +3325, U3325 +3326, U3326 +3327, U3327 +3328, U3328 +3329, U3329 +3330, U3330 +3331, U3331 +3332, U3332 +3333, U3333 +3334, U3334 +3335, U3335 +3336, U3336 +3337, U3337 +3338, U3338 +3339, U3339 +3340, U3340 +3341, U3341 +3342, U3342 +3343, U3343 +3344, U3344 +3345, U3345 +3346, U3346 +3347, U3347 +3348, U3348 +3349, U3349 +3350, U3350 +3351, U3351 +3352, U3352 +3353, U3353 +3354, U3354 +3355, U3355 +3356, U3356 +3357, U3357 +3358, U3358 +3359, U3359 +3360, U3360 +3361, U3361 +3362, U3362 +3363, U3363 +3364, U3364 +3365, U3365 +3366, U3366 +3367, U3367 +3368, U3368 +3369, U3369 +3370, U3370 +3371, U3371 +3372, U3372 +3373, U3373 +3374, U3374 +3375, U3375 +3376, U3376 +3377, U3377 +3378, U3378 +3379, U3379 +3380, U3380 +3381, U3381 +3382, U3382 +3383, U3383 +3384, U3384 +3385, U3385 +3386, U3386 +3387, U3387 +3388, U3388 +3389, U3389 +3390, U3390 +3391, U3391 +3392, U3392 +3393, U3393 +3394, U3394 +3395, U3395 +3396, U3396 +3397, U3397 +3398, U3398 +3399, U3399 +3400, U3400 +3401, U3401 +3402, U3402 +3403, U3403 +3404, U3404 +3405, U3405 +3406, U3406 +3407, U3407 +3408, U3408 +3409, U3409 +3410, U3410 +3411, U3411 +3412, U3412 +3413, U3413 +3414, U3414 +3415, U3415 +3416, U3416 +3417, U3417 +3418, U3418 +3419, U3419 +3420, U3420 +3421, U3421 +3422, U3422 +3423, U3423 +3424, U3424 +3425, U3425 +3426, U3426 +3427, U3427 +3428, U3428 +3429, U3429 +3430, U3430 +3431, U3431 +3432, U3432 +3433, U3433 +3434, U3434 +3435, U3435 +3436, U3436 +3437, U3437 +3438, U3438 +3439, U3439 +3440, U3440 +3441, U3441 +3442, U3442 +3443, U3443 +3444, U3444 +3445, U3445 +3446, U3446 +3447, U3447 +3448, U3448 +3449, U3449 +3450, U3450 +3451, U3451 +3452, U3452 +3453, U3453 +3454, U3454 +3455, U3455 +3456, U3456 +3457, U3457 +3458, U3458 +3459, U3459 +3460, U3460 +3461, U3461 +3462, U3462 +3463, U3463 +3464, U3464 +3465, U3465 +3466, U3466 +3467, U3467 +3468, U3468 +3469, U3469 +3470, U3470 +3471, U3471 +3472, U3472 +3473, U3473 +3474, U3474 +3475, U3475 +3476, U3476 +3477, U3477 +3478, U3478 +3479, U3479 +3480, U3480 +3481, U3481 +3482, U3482 +3483, U3483 +3484, U3484 +3485, U3485 +3486, U3486 +3487, U3487 +3488, U3488 +3489, U3489 +3490, U3490 +3491, U3491 +3492, U3492 +3493, U3493 +3494, U3494 +3495, U3495 +3496, U3496 +3497, U3497 +3498, U3498 +3499, U3499 +3500, U3500 +3501, U3501 +3502, U3502 +3503, U3503 +3504, U3504 +3505, U3505 +3506, U3506 +3507, U3507 +3508, U3508 +3509, U3509 +3510, U3510 +3511, U3511 +3512, U3512 +3513, U3513 +3514, U3514 +3515, U3515 +3516, U3516 +3517, U3517 +3518, U3518 +3519, U3519 +3520, U3520 +3521, U3521 +3522, U3522 +3523, U3523 +3524, U3524 +3525, U3525 +3526, U3526 +3527, U3527 +3528, U3528 +3529, U3529 +3530, U3530 +3531, U3531 +3532, U3532 +3533, U3533 +3534, U3534 +3535, U3535 +3536, U3536 +3537, U3537 +3538, U3538 +3539, U3539 +3540, U3540 +3541, U3541 +3542, U3542 +3543, U3543 +3544, U3544 +3545, U3545 +3546, U3546 +3547, U3547 +3548, U3548 +3549, U3549 +3550, U3550 +3551, U3551 +3552, U3552 +3553, U3553 +3554, U3554 +3555, U3555 +3556, U3556 +3557, U3557 +3558, U3558 +3559, U3559 +3560, U3560 +3561, U3561 +3562, U3562 +3563, U3563 +3564, U3564 +3565, U3565 +3566, U3566 +3567, U3567 +3568, U3568 +3569, U3569 +3570, U3570 +3571, U3571 +3572, U3572 +3573, U3573 +3574, U3574 +3575, U3575 +3576, U3576 +3577, U3577 +3578, U3578 +3579, U3579 +3580, U3580 +3581, U3581 +3582, U3582 +3583, U3583 +3584, U3584 +3585, U3585 +3586, U3586 +3587, U3587 +3588, U3588 +3589, U3589 +3590, U3590 +3591, U3591 +3592, U3592 +3593, U3593 +3594, U3594 +3595, U3595 +3596, U3596 +3597, U3597 +3598, U3598 +3599, U3599 +3600, U3600 +3601, U3601 +3602, U3602 +3603, U3603 +3604, U3604 +3605, U3605 +3606, U3606 +3607, U3607 +3608, U3608 +3609, U3609 +3610, U3610 +3611, U3611 +3612, U3612 +3613, U3613 +3614, U3614 +3615, U3615 +3616, U3616 +3617, U3617 +3618, U3618 +3619, U3619 +3620, U3620 +3621, U3621 +3622, U3622 +3623, U3623 +3624, U3624 +3625, U3625 +3626, U3626 +3627, U3627 +3628, U3628 +3629, U3629 +3630, U3630 +3631, U3631 +3632, U3632 +3633, U3633 +3634, U3634 +3635, U3635 +3636, U3636 +3637, U3637 +3638, U3638 +3639, U3639 +3640, U3640 +3641, U3641 +3642, U3642 +3643, U3643 +3644, U3644 +3645, U3645 +3646, U3646 +3647, U3647 +3648, U3648 +3649, U3649 +3650, U3650 +3651, U3651 +3652, U3652 +3653, U3653 +3654, U3654 +3655, U3655 +3656, U3656 +3657, U3657 +3658, U3658 +3659, U3659 +3660, U3660 +3661, U3661 +3662, U3662 +3663, U3663 +3664, U3664 +3665, U3665 +3666, U3666 +3667, U3667 +3668, U3668 +3669, U3669 +3670, U3670 +3671, U3671 +3672, U3672 +3673, U3673 +3674, U3674 +3675, U3675 +3676, U3676 +3677, U3677 +3678, U3678 +3679, U3679 +3680, U3680 +3681, U3681 +3682, U3682 +3683, U3683 +3684, U3684 +3685, U3685 +3686, U3686 +3687, U3687 +3688, U3688 +3689, U3689 +3690, U3690 +3691, U3691 +3692, U3692 +3693, U3693 +3694, U3694 +3695, U3695 +3696, U3696 +3697, U3697 +3698, U3698 +3699, U3699 +3700, U3700 +3701, U3701 +3702, U3702 +3703, U3703 +3704, U3704 +3705, U3705 +3706, U3706 +3707, U3707 +3708, U3708 +3709, U3709 +3710, U3710 +3711, U3711 +3712, U3712 +3713, U3713 +3714, U3714 +3715, U3715 +3716, U3716 +3717, U3717 +3718, U3718 +3719, U3719 +3720, U3720 +3721, U3721 +3722, U3722 +3723, U3723 +3724, U3724 +3725, U3725 +3726, U3726 +3727, U3727 +3728, U3728 +3729, U3729 +3730, U3730 +3731, U3731 +3732, U3732 +3733, U3733 +3734, U3734 +3735, U3735 +3736, U3736 +3737, U3737 +3738, U3738 +3739, U3739 +3740, U3740 +3741, U3741 +3742, U3742 +3743, U3743 +3744, U3744 +3745, U3745 +3746, U3746 +3747, U3747 +3748, U3748 +3749, U3749 +3750, U3750 +3751, U3751 +3752, U3752 +3753, U3753 +3754, U3754 +3755, U3755 +3756, U3756 +3757, U3757 +3758, U3758 +3759, U3759 +3760, U3760 +3761, U3761 +3762, U3762 +3763, U3763 +3764, U3764 +3765, U3765 +3766, U3766 +3767, U3767 +3768, U3768 +3769, U3769 +3770, U3770 +3771, U3771 +3772, U3772 +3773, U3773 +3774, U3774 +3775, U3775 +3776, U3776 +3777, U3777 +3778, U3778 +3779, U3779 +3780, U3780 +3781, U3781 +3782, U3782 +3783, U3783 +3784, U3784 +3785, U3785 +3786, U3786 +3787, U3787 +3788, U3788 +3789, U3789 +3790, U3790 +3791, U3791 +3792, U3792 +3793, U3793 +3794, U3794 +3795, U3795 +3796, U3796 +3797, U3797 +3798, U3798 +3799, U3799 +3800, U3800 +3801, U3801 +3802, U3802 +3803, U3803 +3804, U3804 +3805, U3805 +3806, U3806 +3807, U3807 +3808, U3808 +3809, U3809 +3810, U3810 +3811, U3811 +3812, U3812 +3813, U3813 +3814, U3814 +3815, U3815 +3816, U3816 +3817, U3817 +3818, U3818 +3819, U3819 +3820, U3820 +3821, U3821 +3822, U3822 +3823, U3823 +3824, U3824 +3825, U3825 +3826, U3826 +3827, U3827 +3828, U3828 +3829, U3829 +3830, U3830 +3831, U3831 +3832, U3832 +3833, U3833 +3834, U3834 +3835, U3835 +3836, U3836 +3837, U3837 +3838, U3838 +3839, U3839 +3840, U3840 +3841, U3841 +3842, U3842 +3843, U3843 +3844, U3844 +3845, U3845 +3846, U3846 +3847, U3847 +3848, U3848 +3849, U3849 +3850, U3850 +3851, U3851 +3852, U3852 +3853, U3853 +3854, U3854 +3855, U3855 +3856, U3856 +3857, U3857 +3858, U3858 +3859, U3859 +3860, U3860 +3861, U3861 +3862, U3862 +3863, U3863 +3864, U3864 +3865, U3865 +3866, U3866 +3867, U3867 +3868, U3868 +3869, U3869 +3870, U3870 +3871, U3871 +3872, U3872 +3873, U3873 +3874, U3874 +3875, U3875 +3876, U3876 +3877, U3877 +3878, U3878 +3879, U3879 +3880, U3880 +3881, U3881 +3882, U3882 +3883, U3883 +3884, U3884 +3885, U3885 +3886, U3886 +3887, U3887 +3888, U3888 +3889, U3889 +3890, U3890 +3891, U3891 +3892, U3892 +3893, U3893 +3894, U3894 +3895, U3895 +3896, U3896 +3897, U3897 +3898, U3898 +3899, U3899 +3900, U3900 +3901, U3901 +3902, U3902 +3903, U3903 +3904, U3904 +3905, U3905 +3906, U3906 +3907, U3907 +3908, U3908 +3909, U3909 +3910, U3910 +3911, U3911 +3912, U3912 +3913, U3913 +3914, U3914 +3915, U3915 +3916, U3916 +3917, U3917 +3918, U3918 +3919, U3919 +3920, U3920 +3921, U3921 +3922, U3922 +3923, U3923 +3924, U3924 +3925, U3925 +3926, U3926 +3927, U3927 +3928, U3928 +3929, U3929 +3930, U3930 +3931, U3931 +3932, U3932 +3933, U3933 +3934, U3934 +3935, U3935 +3936, U3936 +3937, U3937 +3938, U3938 +3939, U3939 +3940, U3940 +3941, U3941 +3942, U3942 +3943, U3943 +3944, U3944 +3945, U3945 +3946, U3946 +3947, U3947 +3948, U3948 +3949, U3949 +3950, U3950 +3951, U3951 +3952, U3952 +3953, U3953 +3954, U3954 +3955, U3955 +3956, U3956 +3957, U3957 +3958, U3958 +3959, U3959 +3960, U3960 +3961, U3961 +3962, U3962 +3963, U3963 +3964, U3964 +3965, U3965 +3966, U3966 +3967, U3967 +3968, U3968 +3969, U3969 +3970, U3970 +3971, U3971 +3972, U3972 +3973, U3973 +3974, U3974 +3975, U3975 +3976, U3976 +3977, U3977 +3978, U3978 +3979, U3979 +3980, U3980 +3981, U3981 +3982, U3982 +3983, U3983 +3984, U3984 +3985, U3985 +3986, U3986 +3987, U3987 +3988, U3988 +3989, U3989 +3990, U3990 +3991, U3991 +3992, U3992 +3993, U3993 +3994, U3994 +3995, U3995 +3996, U3996 +3997, U3997 +3998, U3998 +3999, U3999 +4000, U4000 +4001, U4001 +4002, U4002 +4003, U4003 +4004, U4004 +4005, U4005 +4006, U4006 +4007, U4007 +4008, U4008 +4009, U4009 +4010, U4010 +4011, U4011 +4012, U4012 +4013, U4013 +4014, U4014 +4015, U4015 +4016, U4016 +4017, U4017 +4018, U4018 +4019, U4019 +4020, U4020 +4021, U4021 +4022, U4022 +4023, U4023 +4024, U4024 +4025, U4025 +4026, U4026 +4027, U4027 +4028, U4028 +4029, U4029 +4030, U4030 +4031, U4031 +4032, U4032 +4033, U4033 +4034, U4034 +4035, U4035 +4036, U4036 +4037, U4037 +4038, U4038 +4039, U4039 +4040, U4040 +4041, U4041 +4042, U4042 +4043, U4043 +4044, U4044 +4045, U4045 +4046, U4046 +4047, U4047 +4048, U4048 +4049, U4049 +4050, U4050 +4051, U4051 +4052, U4052 +4053, U4053 +4054, U4054 +4055, U4055 +4056, U4056 +4057, U4057 +4058, U4058 +4059, U4059 +4060, U4060 +4061, U4061 +4062, U4062 +4063, U4063 +4064, U4064 +4065, U4065 +4066, U4066 +4067, U4067 +4068, U4068 +4069, U4069 +4070, U4070 +4071, U4071 +4072, U4072 +4073, U4073 +4074, U4074 +4075, U4075 +4076, U4076 +4077, U4077 +4078, U4078 +4079, U4079 +4080, U4080 +4081, U4081 +4082, U4082 +4083, U4083 +4084, U4084 +4085, U4085 +4086, U4086 +4087, U4087 +4088, U4088 +4089, U4089 +4090, U4090 +4091, U4091 +4092, U4092 +4093, U4093 +4094, U4094 +4095, U4095 +4096, U4096 +4097, U4097 +4098, U4098 +4099, U4099 +4100, U4100 +4101, U4101 +4102, U4102 +4103, U4103 +4104, U4104 +4105, U4105 +4106, U4106 +4107, U4107 +4108, U4108 +4109, U4109 +4110, U4110 +4111, U4111 +4112, U4112 +4113, U4113 +4114, U4114 +4115, U4115 +4116, U4116 +4117, U4117 +4118, U4118 +4119, U4119 +4120, U4120 +4121, U4121 +4122, U4122 +4123, U4123 +4124, U4124 +4125, U4125 +4126, U4126 +4127, U4127 +4128, U4128 +4129, U4129 +4130, U4130 +4131, U4131 +4132, U4132 +4133, U4133 +4134, U4134 +4135, U4135 +4136, U4136 +4137, U4137 +4138, U4138 +4139, U4139 +4140, U4140 +4141, U4141 +4142, U4142 +4143, U4143 +4144, U4144 +4145, U4145 +4146, U4146 +4147, U4147 +4148, U4148 +4149, U4149 +4150, U4150 +4151, U4151 +4152, U4152 +4153, U4153 +4154, U4154 +4155, U4155 +4156, U4156 +4157, U4157 +4158, U4158 +4159, U4159 +4160, U4160 +4161, U4161 +4162, U4162 +4163, U4163 +4164, U4164 +4165, U4165 +4166, U4166 +4167, U4167 +4168, U4168 +4169, U4169 +4170, U4170 +4171, U4171 +4172, U4172 +4173, U4173 +4174, U4174 +4175, U4175 +4176, U4176 +4177, U4177 +4178, U4178 +4179, U4179 +4180, U4180 +4181, U4181 +4182, U4182 +4183, U4183 +4184, U4184 +4185, U4185 +4186, U4186 +4187, U4187 +4188, U4188 +4189, U4189 +4190, U4190 +4191, U4191 +4192, U4192 +4193, U4193 +4194, U4194 +4195, U4195 +4196, U4196 +4197, U4197 +4198, U4198 +4199, U4199 +4200, U4200 +4201, U4201 +4202, U4202 +4203, U4203 +4204, U4204 +4205, U4205 +4206, U4206 +4207, U4207 +4208, U4208 +4209, U4209 +4210, U4210 +4211, U4211 +4212, U4212 +4213, U4213 +4214, U4214 +4215, U4215 +4216, U4216 +4217, U4217 +4218, U4218 +4219, U4219 +4220, U4220 +4221, U4221 +4222, U4222 +4223, U4223 +4224, U4224 +4225, U4225 +4226, U4226 +4227, U4227 +4228, U4228 +4229, U4229 +4230, U4230 +4231, U4231 +4232, U4232 +4233, U4233 +4234, U4234 +4235, U4235 +4236, U4236 +4237, U4237 +4238, U4238 +4239, U4239 +4240, U4240 +4241, U4241 +4242, U4242 +4243, U4243 +4244, U4244 +4245, U4245 +4246, U4246 +4247, U4247 +4248, U4248 +4249, U4249 +4250, U4250 +4251, U4251 +4252, U4252 +4253, U4253 +4254, U4254 +4255, U4255 +4256, U4256 +4257, U4257 +4258, U4258 +4259, U4259 +4260, U4260 +4261, U4261 +4262, U4262 +4263, U4263 +4264, U4264 +4265, U4265 +4266, U4266 +4267, U4267 +4268, U4268 +4269, U4269 +4270, U4270 +4271, U4271 +4272, U4272 +4273, U4273 +4274, U4274 +4275, U4275 +4276, U4276 +4277, U4277 +4278, U4278 +4279, U4279 +4280, U4280 +4281, U4281 +4282, U4282 +4283, U4283 +4284, U4284 +4285, U4285 +4286, U4286 +4287, U4287 +4288, U4288 +4289, U4289 +4290, U4290 +4291, U4291 +4292, U4292 +4293, U4293 +4294, U4294 +4295, U4295 +4296, U4296 +4297, U4297 +4298, U4298 +4299, U4299 +4300, U4300 +4301, U4301 +4302, U4302 +4303, U4303 +4304, U4304 +4305, U4305 +4306, U4306 +4307, U4307 +4308, U4308 +4309, U4309 +4310, U4310 +4311, U4311 +4312, U4312 +4313, U4313 +4314, U4314 +4315, U4315 +4316, U4316 +4317, U4317 +4318, U4318 +4319, U4319 +4320, U4320 +4321, U4321 +4322, U4322 +4323, U4323 +4324, U4324 +4325, U4325 +4326, U4326 +4327, U4327 +4328, U4328 +4329, U4329 +4330, U4330 +4331, U4331 +4332, U4332 +4333, U4333 +4334, U4334 +4335, U4335 +4336, U4336 +4337, U4337 +4338, U4338 +4339, U4339 +4340, U4340 +4341, U4341 +4342, U4342 +4343, U4343 +4344, U4344 +4345, U4345 +4346, U4346 +4347, U4347 +4348, U4348 +4349, U4349 +4350, U4350 +4351, U4351 +4352, U4352 +4353, U4353 +4354, U4354 +4355, U4355 +4356, U4356 +4357, U4357 +4358, U4358 +4359, U4359 +4360, U4360 +4361, U4361 +4362, U4362 +4363, U4363 +4364, U4364 +4365, U4365 +4366, U4366 +4367, U4367 +4368, U4368 +4369, U4369 +4370, U4370 +4371, U4371 +4372, U4372 +4373, U4373 +4374, U4374 +4375, U4375 +4376, U4376 +4377, U4377 +4378, U4378 +4379, U4379 +4380, U4380 +4381, U4381 +4382, U4382 +4383, U4383 +4384, U4384 +4385, U4385 +4386, U4386 +4387, U4387 +4388, U4388 +4389, U4389 +4390, U4390 +4391, U4391 +4392, U4392 +4393, U4393 +4394, U4394 +4395, U4395 +4396, U4396 +4397, U4397 +4398, U4398 +4399, U4399 +4400, U4400 +4401, U4401 +4402, U4402 +4403, U4403 +4404, U4404 +4405, U4405 +4406, U4406 +4407, U4407 +4408, U4408 +4409, U4409 +4410, U4410 +4411, U4411 +4412, U4412 +4413, U4413 +4414, U4414 +4415, U4415 +4416, U4416 +4417, U4417 +4418, U4418 +4419, U4419 +4420, U4420 +4421, U4421 +4422, U4422 +4423, U4423 +4424, U4424 +4425, U4425 +4426, U4426 +4427, U4427 +4428, U4428 +4429, U4429 +4430, U4430 +4431, U4431 +4432, U4432 +4433, U4433 +4434, U4434 +4435, U4435 +4436, U4436 +4437, U4437 +4438, U4438 +4439, U4439 +4440, U4440 +4441, U4441 +4442, U4442 +4443, U4443 +4444, U4444 +4445, U4445 +4446, U4446 +4447, U4447 +4448, U4448 +4449, U4449 +4450, U4450 +4451, U4451 +4452, U4452 +4453, U4453 +4454, U4454 +4455, U4455 +4456, U4456 +4457, U4457 +4458, U4458 +4459, U4459 +4460, U4460 +4461, U4461 +4462, U4462 +4463, U4463 +4464, U4464 +4465, U4465 +4466, U4466 +4467, U4467 +4468, U4468 +4469, U4469 +4470, U4470 +4471, U4471 +4472, U4472 +4473, U4473 +4474, U4474 +4475, U4475 +4476, U4476 +4477, U4477 +4478, U4478 +4479, U4479 +4480, U4480 +4481, U4481 +4482, U4482 +4483, U4483 +4484, U4484 +4485, U4485 +4486, U4486 +4487, U4487 +4488, U4488 +4489, U4489 +4490, U4490 +4491, U4491 +4492, U4492 +4493, U4493 +4494, U4494 +4495, U4495 +4496, U4496 +4497, U4497 +4498, U4498 +4499, U4499 +4500, U4500 +4501, U4501 +4502, U4502 +4503, U4503 +4504, U4504 +4505, U4505 +4506, U4506 +4507, U4507 +4508, U4508 +4509, U4509 +4510, U4510 +4511, U4511 +4512, U4512 +4513, U4513 +4514, U4514 +4515, U4515 +4516, U4516 +4517, U4517 +4518, U4518 +4519, U4519 +4520, U4520 +4521, U4521 +4522, U4522 +4523, U4523 +4524, U4524 +4525, U4525 +4526, U4526 +4527, U4527 +4528, U4528 +4529, U4529 +4530, U4530 +4531, U4531 +4532, U4532 +4533, U4533 +4534, U4534 +4535, U4535 +4536, U4536 +4537, U4537 +4538, U4538 +4539, U4539 +4540, U4540 +4541, U4541 +4542, U4542 +4543, U4543 +4544, U4544 +4545, U4545 +4546, U4546 +4547, U4547 +4548, U4548 +4549, U4549 +4550, U4550 +4551, U4551 +4552, U4552 +4553, U4553 +4554, U4554 +4555, U4555 +4556, U4556 +4557, U4557 +4558, U4558 +4559, U4559 +4560, U4560 +4561, U4561 +4562, U4562 +4563, U4563 +4564, U4564 +4565, U4565 +4566, U4566 +4567, U4567 +4568, U4568 +4569, U4569 +4570, U4570 +4571, U4571 +4572, U4572 +4573, U4573 +4574, U4574 +4575, U4575 +4576, U4576 +4577, U4577 +4578, U4578 +4579, U4579 +4580, U4580 +4581, U4581 +4582, U4582 +4583, U4583 +4584, U4584 +4585, U4585 +4586, U4586 +4587, U4587 +4588, U4588 +4589, U4589 +4590, U4590 +4591, U4591 +4592, U4592 +4593, U4593 +4594, U4594 +4595, U4595 +4596, U4596 +4597, U4597 +4598, U4598 +4599, U4599 +4600, U4600 +4601, U4601 +4602, U4602 +4603, U4603 +4604, U4604 +4605, U4605 +4606, U4606 +4607, U4607 +4608, U4608 +4609, U4609 +4610, U4610 +4611, U4611 +4612, U4612 +4613, U4613 +4614, U4614 +4615, U4615 +4616, U4616 +4617, U4617 +4618, U4618 +4619, U4619 +4620, U4620 +4621, U4621 +4622, U4622 +4623, U4623 +4624, U4624 +4625, U4625 +4626, U4626 +4627, U4627 +4628, U4628 +4629, U4629 +4630, U4630 +4631, U4631 +4632, U4632 +4633, U4633 +4634, U4634 +4635, U4635 +4636, U4636 +4637, U4637 +4638, U4638 +4639, U4639 +4640, U4640 +4641, U4641 +4642, U4642 +4643, U4643 +4644, U4644 +4645, U4645 +4646, U4646 +4647, U4647 +4648, U4648 +4649, U4649 +4650, U4650 +4651, U4651 +4652, U4652 +4653, U4653 +4654, U4654 +4655, U4655 +4656, U4656 +4657, U4657 +4658, U4658 +4659, U4659 +4660, U4660 +4661, U4661 +4662, U4662 +4663, U4663 +4664, U4664 +4665, U4665 +4666, U4666 +4667, U4667 +4668, U4668 +4669, U4669 +4670, U4670 +4671, U4671 +4672, U4672 +4673, U4673 +4674, U4674 +4675, U4675 +4676, U4676 +4677, U4677 +4678, U4678 +4679, U4679 +4680, U4680 +4681, U4681 +4682, U4682 +4683, U4683 +4684, U4684 +4685, U4685 +4686, U4686 +4687, U4687 +4688, U4688 +4689, U4689 +4690, U4690 +4691, U4691 +4692, U4692 +4693, U4693 +4694, U4694 +4695, U4695 +4696, U4696 +4697, U4697 +4698, U4698 +4699, U4699 +4700, U4700 +4701, U4701 +4702, U4702 +4703, U4703 +4704, U4704 +4705, U4705 +4706, U4706 +4707, U4707 +4708, U4708 +4709, U4709 +4710, U4710 +4711, U4711 +4712, U4712 +4713, U4713 +4714, U4714 +4715, U4715 +4716, U4716 +4717, U4717 +4718, U4718 +4719, U4719 +4720, U4720 +4721, U4721 +4722, U4722 +4723, U4723 +4724, U4724 +4725, U4725 +4726, U4726 +4727, U4727 +4728, U4728 +4729, U4729 +4730, U4730 +4731, U4731 +4732, U4732 +4733, U4733 +4734, U4734 +4735, U4735 +4736, U4736 +4737, U4737 +4738, U4738 +4739, U4739 +4740, U4740 +4741, U4741 +4742, U4742 +4743, U4743 +4744, U4744 +4745, U4745 +4746, U4746 +4747, U4747 +4748, U4748 +4749, U4749 +4750, U4750 +4751, U4751 +4752, U4752 +4753, U4753 +4754, U4754 +4755, U4755 +4756, U4756 +4757, U4757 +4758, U4758 +4759, U4759 +4760, U4760 +4761, U4761 +4762, U4762 +4763, U4763 +4764, U4764 +4765, U4765 +4766, U4766 +4767, U4767 +4768, U4768 +4769, U4769 +4770, U4770 +4771, U4771 +4772, U4772 +4773, U4773 +4774, U4774 +4775, U4775 +4776, U4776 +4777, U4777 +4778, U4778 +4779, U4779 +4780, U4780 +4781, U4781 +4782, U4782 +4783, U4783 +4784, U4784 +4785, U4785 +4786, U4786 +4787, U4787 +4788, U4788 +4789, U4789 +4790, U4790 +4791, U4791 +4792, U4792 +4793, U4793 +4794, U4794 +4795, U4795 +4796, U4796 +4797, U4797 +4798, U4798 +4799, U4799 +4800, U4800 +4801, U4801 +4802, U4802 +4803, U4803 +4804, U4804 +4805, U4805 +4806, U4806 +4807, U4807 +4808, U4808 +4809, U4809 +4810, U4810 +4811, U4811 +4812, U4812 +4813, U4813 +4814, U4814 +4815, U4815 +4816, U4816 +4817, U4817 +4818, U4818 +4819, U4819 +4820, U4820 +4821, U4821 +4822, U4822 +4823, U4823 +4824, U4824 +4825, U4825 +4826, U4826 +4827, U4827 +4828, U4828 +4829, U4829 +4830, U4830 +4831, U4831 +4832, U4832 +4833, U4833 +4834, U4834 +4835, U4835 +4836, U4836 +4837, U4837 +4838, U4838 +4839, U4839 +4840, U4840 +4841, U4841 +4842, U4842 +4843, U4843 +4844, U4844 +4845, U4845 +4846, U4846 +4847, U4847 +4848, U4848 +4849, U4849 +4850, U4850 +4851, U4851 +4852, U4852 +4853, U4853 +4854, U4854 +4855, U4855 +4856, U4856 +4857, U4857 +4858, U4858 +4859, U4859 +4860, U4860 +4861, U4861 +4862, U4862 +4863, U4863 +4864, U4864 +4865, U4865 +4866, U4866 +4867, U4867 +4868, U4868 +4869, U4869 +4870, U4870 +4871, U4871 +4872, U4872 +4873, U4873 +4874, U4874 +4875, U4875 +4876, U4876 +4877, U4877 +4878, U4878 +4879, U4879 +4880, U4880 +4881, U4881 +4882, U4882 +4883, U4883 +4884, U4884 +4885, U4885 +4886, U4886 +4887, U4887 +4888, U4888 +4889, U4889 +4890, U4890 +4891, U4891 +4892, U4892 +4893, U4893 +4894, U4894 +4895, U4895 +4896, U4896 +4897, U4897 +4898, U4898 +4899, U4899 +4900, U4900 +4901, U4901 +4902, U4902 +4903, U4903 +4904, U4904 +4905, U4905 +4906, U4906 +4907, U4907 +4908, U4908 +4909, U4909 +4910, U4910 +4911, U4911 +4912, U4912 +4913, U4913 +4914, U4914 +4915, U4915 +4916, U4916 +4917, U4917 +4918, U4918 +4919, U4919 +4920, U4920 +4921, U4921 +4922, U4922 +4923, U4923 +4924, U4924 +4925, U4925 +4926, U4926 +4927, U4927 +4928, U4928 +4929, U4929 +4930, U4930 +4931, U4931 +4932, U4932 +4933, U4933 +4934, U4934 +4935, U4935 +4936, U4936 +4937, U4937 +4938, U4938 +4939, U4939 +4940, U4940 +4941, U4941 +4942, U4942 +4943, U4943 +4944, U4944 +4945, U4945 +4946, U4946 +4947, U4947 +4948, U4948 +4949, U4949 +4950, U4950 +4951, U4951 +4952, U4952 +4953, U4953 +4954, U4954 +4955, U4955 +4956, U4956 +4957, U4957 +4958, U4958 +4959, U4959 +4960, U4960 +4961, U4961 +4962, U4962 +4963, U4963 +4964, U4964 +4965, U4965 +4966, U4966 +4967, U4967 +4968, U4968 +4969, U4969 +4970, U4970 +4971, U4971 +4972, U4972 +4973, U4973 +4974, U4974 +4975, U4975 +4976, U4976 +4977, U4977 +4978, U4978 +4979, U4979 +4980, U4980 +4981, U4981 +4982, U4982 +4983, U4983 +4984, U4984 +4985, U4985 +4986, U4986 +4987, U4987 +4988, U4988 +4989, U4989 +4990, U4990 +4991, U4991 +4992, U4992 +4993, U4993 +4994, U4994 +4995, U4995 +4996, U4996 +4997, U4997 +4998, U4998 +4999, U4999 +5000, U5000 +5001, U5001 +5002, U5002 +5003, U5003 +5004, U5004 +5005, U5005 +5006, U5006 +5007, U5007 +5008, U5008 +5009, U5009 +5010, U5010 +5011, U5011 +5012, U5012 +5013, U5013 +5014, U5014 +5015, U5015 +5016, U5016 +5017, U5017 +5018, U5018 +5019, U5019 +5020, U5020 +5021, U5021 +5022, U5022 +5023, U5023 +5024, U5024 +5025, U5025 +5026, U5026 +5027, U5027 +5028, U5028 +5029, U5029 +5030, U5030 +5031, U5031 +5032, U5032 +5033, U5033 +5034, U5034 +5035, U5035 +5036, U5036 +5037, U5037 +5038, U5038 +5039, U5039 +5040, U5040 +5041, U5041 +5042, U5042 +5043, U5043 +5044, U5044 +5045, U5045 +5046, U5046 +5047, U5047 +5048, U5048 +5049, U5049 +5050, U5050 +5051, U5051 +5052, U5052 +5053, U5053 +5054, U5054 +5055, U5055 +5056, U5056 +5057, U5057 +5058, U5058 +5059, U5059 +5060, U5060 +5061, U5061 +5062, U5062 +5063, U5063 +5064, U5064 +5065, U5065 +5066, U5066 +5067, U5067 +5068, U5068 +5069, U5069 +5070, U5070 +5071, U5071 +5072, U5072 +5073, U5073 +5074, U5074 +5075, U5075 +5076, U5076 +5077, U5077 +5078, U5078 +5079, U5079 +5080, U5080 +5081, U5081 +5082, U5082 +5083, U5083 +5084, U5084 +5085, U5085 +5086, U5086 +5087, U5087 +5088, U5088 +5089, U5089 +5090, U5090 +5091, U5091 +5092, U5092 +5093, U5093 +5094, U5094 +5095, U5095 +5096, U5096 +5097, U5097 +5098, U5098 +5099, U5099 +5100, U5100 +5101, U5101 +5102, U5102 +5103, U5103 +5104, U5104 +5105, U5105 +5106, U5106 +5107, U5107 +5108, U5108 +5109, U5109 +5110, U5110 +5111, U5111 +5112, U5112 +5113, U5113 +5114, U5114 +5115, U5115 +5116, U5116 +5117, U5117 +5118, U5118 +5119, U5119 +5120, U5120 +5121, U5121 +5122, U5122 +5123, U5123 +5124, U5124 +5125, U5125 +5126, U5126 +5127, U5127 +5128, U5128 +5129, U5129 +5130, U5130 +5131, U5131 +5132, U5132 +5133, U5133 +5134, U5134 +5135, U5135 +5136, U5136 +5137, U5137 +5138, U5138 +5139, U5139 +5140, U5140 +5141, U5141 +5142, U5142 +5143, U5143 +5144, U5144 +5145, U5145 +5146, U5146 +5147, U5147 +5148, U5148 +5149, U5149 +5150, U5150 +5151, U5151 +5152, U5152 +5153, U5153 +5154, U5154 +5155, U5155 +5156, U5156 +5157, U5157 +5158, U5158 +5159, U5159 +5160, U5160 +5161, U5161 +5162, U5162 +5163, U5163 +5164, U5164 +5165, U5165 +5166, U5166 +5167, U5167 +5168, U5168 +5169, U5169 +5170, U5170 +5171, U5171 +5172, U5172 +5173, U5173 +5174, U5174 +5175, U5175 +5176, U5176 +5177, U5177 +5178, U5178 +5179, U5179 +5180, U5180 +5181, U5181 +5182, U5182 +5183, U5183 +5184, U5184 +5185, U5185 +5186, U5186 +5187, U5187 +5188, U5188 +5189, U5189 +5190, U5190 +5191, U5191 +5192, U5192 +5193, U5193 +5194, U5194 +5195, U5195 +5196, U5196 +5197, U5197 +5198, U5198 +5199, U5199 +5200, U5200 +5201, U5201 +5202, U5202 +5203, U5203 +5204, U5204 +5205, U5205 +5206, U5206 +5207, U5207 +5208, U5208 +5209, U5209 +5210, U5210 +5211, U5211 +5212, U5212 +5213, U5213 +5214, U5214 +5215, U5215 +5216, U5216 +5217, U5217 +5218, U5218 +5219, U5219 +5220, U5220 +5221, U5221 +5222, U5222 +5223, U5223 +5224, U5224 +5225, U5225 +5226, U5226 +5227, U5227 +5228, U5228 +5229, U5229 +5230, U5230 +5231, U5231 +5232, U5232 +5233, U5233 +5234, U5234 +5235, U5235 +5236, U5236 +5237, U5237 +5238, U5238 +5239, U5239 +5240, U5240 +5241, U5241 +5242, U5242 +5243, U5243 +5244, U5244 +5245, U5245 +5246, U5246 +5247, U5247 +5248, U5248 +5249, U5249 +5250, U5250 +5251, U5251 +5252, U5252 +5253, U5253 +5254, U5254 +5255, U5255 +5256, U5256 +5257, U5257 +5258, U5258 +5259, U5259 +5260, U5260 +5261, U5261 +5262, U5262 +5263, U5263 +5264, U5264 +5265, U5265 +5266, U5266 +5267, U5267 +5268, U5268 +5269, U5269 +5270, U5270 +5271, U5271 +5272, U5272 +5273, U5273 +5274, U5274 +5275, U5275 +5276, U5276 +5277, U5277 +5278, U5278 +5279, U5279 +5280, U5280 +5281, U5281 +5282, U5282 +5283, U5283 +5284, U5284 +5285, U5285 +5286, U5286 +5287, U5287 +5288, U5288 +5289, U5289 +5290, U5290 +5291, U5291 +5292, U5292 +5293, U5293 +5294, U5294 +5295, U5295 +5296, U5296 +5297, U5297 +5298, U5298 +5299, U5299 +5300, U5300 +5301, U5301 +5302, U5302 +5303, U5303 +5304, U5304 +5305, U5305 +5306, U5306 +5307, U5307 +5308, U5308 +5309, U5309 +5310, U5310 +5311, U5311 +5312, U5312 +5313, U5313 +5314, U5314 +5315, U5315 +5316, U5316 +5317, U5317 +5318, U5318 +5319, U5319 +5320, U5320 +5321, U5321 +5322, U5322 +5323, U5323 +5324, U5324 +5325, U5325 +5326, U5326 +5327, U5327 +5328, U5328 +5329, U5329 +5330, U5330 +5331, U5331 +5332, U5332 +5333, U5333 +5334, U5334 +5335, U5335 +5336, U5336 +5337, U5337 +5338, U5338 +5339, U5339 +5340, U5340 +5341, U5341 +5342, U5342 +5343, U5343 +5344, U5344 +5345, U5345 +5346, U5346 +5347, U5347 +5348, U5348 +5349, U5349 +5350, U5350 +5351, U5351 +5352, U5352 +5353, U5353 +5354, U5354 +5355, U5355 +5356, U5356 +5357, U5357 +5358, U5358 +5359, U5359 +5360, U5360 +5361, U5361 +5362, U5362 +5363, U5363 +5364, U5364 +5365, U5365 +5366, U5366 +5367, U5367 +5368, U5368 +5369, U5369 +5370, U5370 +5371, U5371 +5372, U5372 +5373, U5373 +5374, U5374 +5375, U5375 +5376, U5376 +5377, U5377 +5378, U5378 +5379, U5379 +5380, U5380 +5381, U5381 +5382, U5382 +5383, U5383 +5384, U5384 +5385, U5385 +5386, U5386 +5387, U5387 +5388, U5388 +5389, U5389 +5390, U5390 +5391, U5391 +5392, U5392 +5393, U5393 +5394, U5394 +5395, U5395 +5396, U5396 +5397, U5397 +5398, U5398 +5399, U5399 +5400, U5400 +5401, U5401 +5402, U5402 +5403, U5403 +5404, U5404 +5405, U5405 +5406, U5406 +5407, U5407 +5408, U5408 +5409, U5409 +5410, U5410 +5411, U5411 +5412, U5412 +5413, U5413 +5414, U5414 +5415, U5415 +5416, U5416 +5417, U5417 +5418, U5418 +5419, U5419 +5420, U5420 +5421, U5421 +5422, U5422 +5423, U5423 +5424, U5424 +5425, U5425 +5426, U5426 +5427, U5427 +5428, U5428 +5429, U5429 +5430, U5430 +5431, U5431 +5432, U5432 +5433, U5433 +5434, U5434 +5435, U5435 +5436, U5436 +5437, U5437 +5438, U5438 +5439, U5439 +5440, U5440 +5441, U5441 +5442, U5442 +5443, U5443 +5444, U5444 +5445, U5445 +5446, U5446 +5447, U5447 +5448, U5448 +5449, U5449 +5450, U5450 +5451, U5451 +5452, U5452 +5453, U5453 +5454, U5454 +5455, U5455 +5456, U5456 +5457, U5457 +5458, U5458 +5459, U5459 +5460, U5460 +5461, U5461 +5462, U5462 +5463, U5463 +5464, U5464 +5465, U5465 +5466, U5466 +5467, U5467 +5468, U5468 +5469, U5469 +5470, U5470 +5471, U5471 +5472, U5472 +5473, U5473 +5474, U5474 +5475, U5475 +5476, U5476 +5477, U5477 +5478, U5478 +5479, U5479 +5480, U5480 +5481, U5481 +5482, U5482 +5483, U5483 +5484, U5484 +5485, U5485 +5486, U5486 +5487, U5487 +5488, U5488 +5489, U5489 +5490, U5490 +5491, U5491 +5492, U5492 +5493, U5493 +5494, U5494 +5495, U5495 +5496, U5496 +5497, U5497 +5498, U5498 +5499, U5499 +5500, U5500 +5501, U5501 +5502, U5502 +5503, U5503 +5504, U5504 +5505, U5505 +5506, U5506 +5507, U5507 +5508, U5508 +5509, U5509 +5510, U5510 +5511, U5511 +5512, U5512 +5513, U5513 +5514, U5514 +5515, U5515 +5516, U5516 +5517, U5517 +5518, U5518 +5519, U5519 +5520, U5520 +5521, U5521 +5522, U5522 +5523, U5523 +5524, U5524 +5525, U5525 +5526, U5526 +5527, U5527 +5528, U5528 +5529, U5529 +5530, U5530 +5531, U5531 +5532, U5532 +5533, U5533 +5534, U5534 +5535, U5535 +5536, U5536 +5537, U5537 +5538, U5538 +5539, U5539 +5540, U5540 +5541, U5541 +5542, U5542 +5543, U5543 +5544, U5544 +5545, U5545 +5546, U5546 +5547, U5547 +5548, U5548 +5549, U5549 +5550, U5550 +5551, U5551 +5552, U5552 +5553, U5553 +5554, U5554 +5555, U5555 +5556, U5556 +5557, U5557 +5558, U5558 +5559, U5559 +5560, U5560 +5561, U5561 +5562, U5562 +5563, U5563 +5564, U5564 +5565, U5565 +5566, U5566 +5567, U5567 +5568, U5568 +5569, U5569 +5570, U5570 +5571, U5571 +5572, U5572 +5573, U5573 +5574, U5574 +5575, U5575 +5576, U5576 +5577, U5577 +5578, U5578 +5579, U5579 +5580, U5580 +5581, U5581 +5582, U5582 +5583, U5583 +5584, U5584 +5585, U5585 +5586, U5586 +5587, U5587 +5588, U5588 +5589, U5589 +5590, U5590 +5591, U5591 +5592, U5592 +5593, U5593 +5594, U5594 +5595, U5595 +5596, U5596 +5597, U5597 +5598, U5598 +5599, U5599 +5600, U5600 +5601, U5601 +5602, U5602 +5603, U5603 +5604, U5604 +5605, U5605 +5606, U5606 +5607, U5607 +5608, U5608 +5609, U5609 +5610, U5610 +5611, U5611 +5612, U5612 +5613, U5613 +5614, U5614 +5615, U5615 +5616, U5616 +5617, U5617 +5618, U5618 +5619, U5619 +5620, U5620 +5621, U5621 +5622, U5622 +5623, U5623 +5624, U5624 +5625, U5625 +5626, U5626 +5627, U5627 +5628, U5628 +5629, U5629 +5630, U5630 +5631, U5631 +5632, U5632 +5633, U5633 +5634, U5634 +5635, U5635 +5636, U5636 +5637, U5637 +5638, U5638 +5639, U5639 +5640, U5640 +5641, U5641 +5642, U5642 +5643, U5643 +5644, U5644 +5645, U5645 +5646, U5646 +5647, U5647 +5648, U5648 +5649, U5649 +5650, U5650 +5651, U5651 +5652, U5652 +5653, U5653 +5654, U5654 +5655, U5655 +5656, U5656 +5657, U5657 +5658, U5658 +5659, U5659 +5660, U5660 +5661, U5661 +5662, U5662 +5663, U5663 +5664, U5664 +5665, U5665 +5666, U5666 +5667, U5667 +5668, U5668 +5669, U5669 +5670, U5670 +5671, U5671 +5672, U5672 +5673, U5673 +5674, U5674 +5675, U5675 +5676, U5676 +5677, U5677 +5678, U5678 +5679, U5679 +5680, U5680 +5681, U5681 +5682, U5682 +5683, U5683 +5684, U5684 +5685, U5685 +5686, U5686 +5687, U5687 +5688, U5688 +5689, U5689 +5690, U5690 +5691, U5691 +5692, U5692 +5693, U5693 +5694, U5694 +5695, U5695 +5696, U5696 +5697, U5697 +5698, U5698 +5699, U5699 +5700, U5700 +5701, U5701 +5702, U5702 +5703, U5703 +5704, U5704 +5705, U5705 +5706, U5706 +5707, U5707 +5708, U5708 +5709, U5709 +5710, U5710 +5711, U5711 +5712, U5712 +5713, U5713 +5714, U5714 +5715, U5715 +5716, U5716 +5717, U5717 +5718, U5718 +5719, U5719 +5720, U5720 +5721, U5721 +5722, U5722 +5723, U5723 +5724, U5724 +5725, U5725 +5726, U5726 +5727, U5727 +5728, U5728 +5729, U5729 +5730, U5730 +5731, U5731 +5732, U5732 +5733, U5733 +5734, U5734 +5735, U5735 +5736, U5736 +5737, U5737 +5738, U5738 +5739, U5739 +5740, U5740 +5741, U5741 +5742, U5742 +5743, U5743 +5744, U5744 +5745, U5745 +5746, U5746 +5747, U5747 +5748, U5748 +5749, U5749 +5750, U5750 +5751, U5751 +5752, U5752 +5753, U5753 +5754, U5754 +5755, U5755 +5756, U5756 +5757, U5757 +5758, U5758 +5759, U5759 +5760, U5760 +5761, U5761 +5762, U5762 +5763, U5763 +5764, U5764 +5765, U5765 +5766, U5766 +5767, U5767 +5768, U5768 +5769, U5769 +5770, U5770 +5771, U5771 +5772, U5772 +5773, U5773 +5774, U5774 +5775, U5775 +5776, U5776 +5777, U5777 +5778, U5778 +5779, U5779 +5780, U5780 +5781, U5781 +5782, U5782 +5783, U5783 +5784, U5784 +5785, U5785 +5786, U5786 +5787, U5787 +5788, U5788 +5789, U5789 +5790, U5790 +5791, U5791 +5792, U5792 +5793, U5793 +5794, U5794 +5795, U5795 +5796, U5796 +5797, U5797 +5798, U5798 +5799, U5799 +5800, U5800 +5801, U5801 +5802, U5802 +5803, U5803 +5804, U5804 +5805, U5805 +5806, U5806 +5807, U5807 +5808, U5808 +5809, U5809 +5810, U5810 +5811, U5811 +5812, U5812 +5813, U5813 +5814, U5814 +5815, U5815 +5816, U5816 +5817, U5817 +5818, U5818 +5819, U5819 +5820, U5820 +5821, U5821 +5822, U5822 +5823, U5823 +5824, U5824 +5825, U5825 +5826, U5826 +5827, U5827 +5828, U5828 +5829, U5829 +5830, U5830 +5831, U5831 +5832, U5832 +5833, U5833 +5834, U5834 +5835, U5835 +5836, U5836 +5837, U5837 +5838, U5838 +5839, U5839 +5840, U5840 +5841, U5841 +5842, U5842 +5843, U5843 +5844, U5844 +5845, U5845 +5846, U5846 +5847, U5847 +5848, U5848 +5849, U5849 +5850, U5850 +5851, U5851 +5852, U5852 +5853, U5853 +5854, U5854 +5855, U5855 +5856, U5856 +5857, U5857 +5858, U5858 +5859, U5859 +5860, U5860 +5861, U5861 +5862, U5862 +5863, U5863 +5864, U5864 +5865, U5865 +5866, U5866 +5867, U5867 +5868, U5868 +5869, U5869 +5870, U5870 +5871, U5871 +5872, U5872 +5873, U5873 +5874, U5874 +5875, U5875 +5876, U5876 +5877, U5877 +5878, U5878 +5879, U5879 +5880, U5880 +5881, U5881 +5882, U5882 +5883, U5883 +5884, U5884 +5885, U5885 +5886, U5886 +5887, U5887 +5888, U5888 +5889, U5889 +5890, U5890 +5891, U5891 +5892, U5892 +5893, U5893 +5894, U5894 +5895, U5895 +5896, U5896 +5897, U5897 +5898, U5898 +5899, U5899 +5900, U5900 +5901, U5901 +5902, U5902 +5903, U5903 +5904, U5904 +5905, U5905 +5906, U5906 +5907, U5907 +5908, U5908 +5909, U5909 +5910, U5910 +5911, U5911 +5912, U5912 +5913, U5913 +5914, U5914 +5915, U5915 +5916, U5916 +5917, U5917 +5918, U5918 +5919, U5919 +5920, U5920 +5921, U5921 +5922, U5922 +5923, U5923 +5924, U5924 +5925, U5925 +5926, U5926 +5927, U5927 +5928, U5928 +5929, U5929 +5930, U5930 +5931, U5931 +5932, U5932 +5933, U5933 +5934, U5934 +5935, U5935 +5936, U5936 +5937, U5937 +5938, U5938 +5939, U5939 +5940, U5940 +5941, U5941 +5942, U5942 +5943, U5943 +5944, U5944 +5945, U5945 +5946, U5946 +5947, U5947 +5948, U5948 +5949, U5949 +5950, U5950 +5951, U5951 +5952, U5952 +5953, U5953 +5954, U5954 +5955, U5955 +5956, U5956 +5957, U5957 +5958, U5958 +5959, U5959 +5960, U5960 +5961, U5961 +5962, U5962 +5963, U5963 +5964, U5964 +5965, U5965 +5966, U5966 +5967, U5967 +5968, U5968 +5969, U5969 +5970, U5970 +5971, U5971 +5972, U5972 +5973, U5973 +5974, U5974 +5975, U5975 +5976, U5976 +5977, U5977 +5978, U5978 +5979, U5979 +5980, U5980 +5981, U5981 +5982, U5982 +5983, U5983 +5984, U5984 +5985, U5985 +5986, U5986 +5987, U5987 +5988, U5988 +5989, U5989 +5990, U5990 +5991, U5991 +5992, U5992 +5993, U5993 +5994, U5994 +5995, U5995 +5996, U5996 +5997, U5997 +5998, U5998 +5999, U5999 +6000, U6000 +6001, U6001 +6002, U6002 +6003, U6003 +6004, U6004 +6005, U6005 +6006, U6006 +6007, U6007 +6008, U6008 +6009, U6009 +6010, U6010 +6011, U6011 +6012, U6012 +6013, U6013 +6014, U6014 +6015, U6015 +6016, U6016 +6017, U6017 +6018, U6018 +6019, U6019 +6020, U6020 +6021, U6021 +6022, U6022 +6023, U6023 +6024, U6024 +6025, U6025 +6026, U6026 +6027, U6027 +6028, U6028 +6029, U6029 +6030, U6030 +6031, U6031 +6032, U6032 +6033, U6033 +6034, U6034 +6035, U6035 +6036, U6036 +6037, U6037 +6038, U6038 +6039, U6039 +6040, U6040 +6041, U6041 +6042, U6042 +6043, U6043 +6044, U6044 +6045, U6045 +6046, U6046 +6047, U6047 +6048, U6048 +6049, U6049 +6050, U6050 +6051, U6051 +6052, U6052 +6053, U6053 +6054, U6054 +6055, U6055 +6056, U6056 +6057, U6057 +6058, U6058 +6059, U6059 +6060, U6060 +6061, U6061 +6062, U6062 +6063, U6063 +6064, U6064 +6065, U6065 +6066, U6066 +6067, U6067 +6068, U6068 +6069, U6069 +6070, U6070 +6071, U6071 +6072, U6072 +6073, U6073 +6074, U6074 +6075, U6075 +6076, U6076 +6077, U6077 +6078, U6078 +6079, U6079 +6080, U6080 +6081, U6081 +6082, U6082 +6083, U6083 +6084, U6084 +6085, U6085 +6086, U6086 +6087, U6087 +6088, U6088 +6089, U6089 +6090, U6090 +6091, U6091 +6092, U6092 +6093, U6093 +6094, U6094 +6095, U6095 +6096, U6096 +6097, U6097 +6098, U6098 +6099, U6099 +6100, U6100 +6101, U6101 +6102, U6102 +6103, U6103 +6104, U6104 +6105, U6105 +6106, U6106 +6107, U6107 +6108, U6108 +6109, U6109 +6110, U6110 +6111, U6111 +6112, U6112 +6113, U6113 +6114, U6114 +6115, U6115 +6116, U6116 +6117, U6117 +6118, U6118 +6119, U6119 +6120, U6120 +6121, U6121 +6122, U6122 +6123, U6123 +6124, U6124 +6125, U6125 +6126, U6126 +6127, U6127 +6128, U6128 +6129, U6129 +6130, U6130 +6131, U6131 +6132, U6132 +6133, U6133 +6134, U6134 +6135, U6135 +6136, U6136 +6137, U6137 +6138, U6138 +6139, U6139 +6140, U6140 +6141, U6141 +6142, U6142 +6143, U6143 +6144, U6144 +6145, U6145 +6146, U6146 +6147, U6147 +6148, U6148 +6149, U6149 +6150, U6150 +6151, U6151 +6152, U6152 +6153, U6153 +6154, U6154 +6155, U6155 +6156, U6156 +6157, U6157 +6158, U6158 +6159, U6159 +6160, U6160 +6161, U6161 +6162, U6162 +6163, U6163 +6164, U6164 +6165, U6165 +6166, U6166 +6167, U6167 +6168, U6168 +6169, U6169 +6170, U6170 +6171, U6171 +6172, U6172 +6173, U6173 +6174, U6174 +6175, U6175 +6176, U6176 +6177, U6177 +6178, U6178 +6179, U6179 +6180, U6180 +6181, U6181 +6182, U6182 +6183, U6183 +6184, U6184 +6185, U6185 +6186, U6186 +6187, U6187 +6188, U6188 +6189, U6189 +6190, U6190 +6191, U6191 +6192, U6192 +6193, U6193 +6194, U6194 +6195, U6195 +6196, U6196 +6197, U6197 +6198, U6198 +6199, U6199 +6200, U6200 +6201, U6201 +6202, U6202 +6203, U6203 +6204, U6204 +6205, U6205 +6206, U6206 +6207, U6207 +6208, U6208 +6209, U6209 +6210, U6210 +6211, U6211 +6212, U6212 +6213, U6213 +6214, U6214 +6215, U6215 +6216, U6216 +6217, U6217 +6218, U6218 +6219, U6219 +6220, U6220 +6221, U6221 +6222, U6222 +6223, U6223 +6224, U6224 +6225, U6225 +6226, U6226 +6227, U6227 +6228, U6228 +6229, U6229 +6230, U6230 +6231, U6231 +6232, U6232 +6233, U6233 +6234, U6234 +6235, U6235 +6236, U6236 +6237, U6237 +6238, U6238 +6239, U6239 +6240, U6240 +6241, U6241 +6242, U6242 +6243, U6243 +6244, U6244 +6245, U6245 +6246, U6246 +6247, U6247 +6248, U6248 +6249, U6249 +6250, U6250 +6251, U6251 +6252, U6252 +6253, U6253 +6254, U6254 +6255, U6255 +6256, U6256 +6257, U6257 +6258, U6258 +6259, U6259 +6260, U6260 +6261, U6261 +6262, U6262 +6263, U6263 +6264, U6264 +6265, U6265 +6266, U6266 +6267, U6267 +6268, U6268 +6269, U6269 +6270, U6270 +6271, U6271 +6272, U6272 +6273, U6273 +6274, U6274 +6275, U6275 +6276, U6276 +6277, U6277 +6278, U6278 +6279, U6279 +6280, U6280 +6281, U6281 +6282, U6282 +6283, U6283 +6284, U6284 +6285, U6285 +6286, U6286 +6287, U6287 +6288, U6288 +6289, U6289 +6290, U6290 +6291, U6291 +6292, U6292 +6293, U6293 +6294, U6294 +6295, U6295 +6296, U6296 +6297, U6297 +6298, U6298 +6299, U6299 +6300, U6300 +6301, U6301 +6302, U6302 +6303, U6303 +6304, U6304 +6305, U6305 +6306, U6306 +6307, U6307 +6308, U6308 +6309, U6309 +6310, U6310 +6311, U6311 +6312, U6312 +6313, U6313 +6314, U6314 +6315, U6315 +6316, U6316 +6317, U6317 +6318, U6318 +6319, U6319 +6320, U6320 +6321, U6321 +6322, U6322 +6323, U6323 +6324, U6324 +6325, U6325 +6326, U6326 +6327, U6327 +6328, U6328 +6329, U6329 +6330, U6330 +6331, U6331 +6332, U6332 +6333, U6333 +6334, U6334 +6335, U6335 +6336, U6336 +6337, U6337 +6338, U6338 +6339, U6339 +6340, U6340 +6341, U6341 +6342, U6342 +6343, U6343 +6344, U6344 +6345, U6345 +6346, U6346 +6347, U6347 +6348, U6348 +6349, U6349 +6350, U6350 +6351, U6351 +6352, U6352 +6353, U6353 +6354, U6354 +6355, U6355 +6356, U6356 +6357, U6357 +6358, U6358 +6359, U6359 +6360, U6360 +6361, U6361 +6362, U6362 +6363, U6363 +6364, U6364 +6365, U6365 +6366, U6366 +6367, U6367 +6368, U6368 +6369, U6369 +6370, U6370 +6371, U6371 +6372, U6372 +6373, U6373 +6374, U6374 +6375, U6375 +6376, U6376 +6377, U6377 +6378, U6378 +6379, U6379 +6380, U6380 +6381, U6381 +6382, U6382 +6383, U6383 +6384, U6384 +6385, U6385 +6386, U6386 +6387, U6387 +6388, U6388 +6389, U6389 +6390, U6390 +6391, U6391 +6392, U6392 +6393, U6393 +6394, U6394 +6395, U6395 +6396, U6396 +6397, U6397 +6398, U6398 +6399, U6399 +6400, U6400 +6401, U6401 +6402, U6402 +6403, U6403 +6404, U6404 +6405, U6405 +6406, U6406 +6407, U6407 +6408, U6408 +6409, U6409 +6410, U6410 +6411, U6411 +6412, U6412 +6413, U6413 +6414, U6414 +6415, U6415 +6416, U6416 +6417, U6417 +6418, U6418 +6419, U6419 +6420, U6420 +6421, U6421 +6422, U6422 +6423, U6423 +6424, U6424 +6425, U6425 +6426, U6426 +6427, U6427 +6428, U6428 +6429, U6429 +6430, U6430 +6431, U6431 +6432, U6432 +6433, U6433 +6434, U6434 +6435, U6435 +6436, U6436 +6437, U6437 +6438, U6438 +6439, U6439 +6440, U6440 +6441, U6441 +6442, U6442 +6443, U6443 +6444, U6444 +6445, U6445 +6446, U6446 +6447, U6447 +6448, U6448 +6449, U6449 +6450, U6450 +6451, U6451 +6452, U6452 +6453, U6453 +6454, U6454 +6455, U6455 +6456, U6456 +6457, U6457 +6458, U6458 +6459, U6459 +6460, U6460 +6461, U6461 +6462, U6462 +6463, U6463 +6464, U6464 +6465, U6465 +6466, U6466 +6467, U6467 +6468, U6468 +6469, U6469 +6470, U6470 +6471, U6471 +6472, U6472 +6473, U6473 +6474, U6474 +6475, U6475 +6476, U6476 +6477, U6477 +6478, U6478 +6479, U6479 +6480, U6480 +6481, U6481 +6482, U6482 +6483, U6483 +6484, U6484 +6485, U6485 +6486, U6486 +6487, U6487 +6488, U6488 +6489, U6489 +6490, U6490 +6491, U6491 +6492, U6492 +6493, U6493 +6494, U6494 +6495, U6495 +6496, U6496 +6497, U6497 +6498, U6498 +6499, U6499 +6500, U6500 +6501, U6501 +6502, U6502 +6503, U6503 +6504, U6504 +6505, U6505 +6506, U6506 +6507, U6507 +6508, U6508 +6509, U6509 +6510, U6510 +6511, U6511 +6512, U6512 +6513, U6513 +6514, U6514 +6515, U6515 +6516, U6516 +6517, U6517 +6518, U6518 +6519, U6519 +6520, U6520 +6521, U6521 +6522, U6522 +6523, U6523 +6524, U6524 +6525, U6525 +6526, U6526 +6527, U6527 +6528, U6528 +6529, U6529 +6530, U6530 +6531, U6531 +6532, U6532 +6533, U6533 +6534, U6534 +6535, U6535 +6536, U6536 +6537, U6537 +6538, U6538 +6539, U6539 +6540, U6540 +6541, U6541 +6542, U6542 +6543, U6543 +6544, U6544 +6545, U6545 +6546, U6546 +6547, U6547 +6548, U6548 +6549, U6549 +6550, U6550 +6551, U6551 +6552, U6552 +6553, U6553 +6554, U6554 +6555, U6555 +6556, U6556 +6557, U6557 +6558, U6558 +6559, U6559 +6560, U6560 +6561, U6561 +6562, U6562 +6563, U6563 +6564, U6564 +6565, U6565 +6566, U6566 +6567, U6567 +6568, U6568 +6569, U6569 +6570, U6570 +6571, U6571 +6572, U6572 +6573, U6573 +6574, U6574 +6575, U6575 +6576, U6576 +6577, U6577 +6578, U6578 +6579, U6579 +6580, U6580 +6581, U6581 +6582, U6582 +6583, U6583 +6584, U6584 +6585, U6585 +6586, U6586 +6587, U6587 +6588, U6588 +6589, U6589 +6590, U6590 +6591, U6591 +6592, U6592 +6593, U6593 +6594, U6594 +6595, U6595 +6596, U6596 +6597, U6597 +6598, U6598 +6599, U6599 +6600, U6600 +6601, U6601 +6602, U6602 +6603, U6603 +6604, U6604 +6605, U6605 +6606, U6606 +6607, U6607 +6608, U6608 +6609, U6609 +6610, U6610 +6611, U6611 +6612, U6612 +6613, U6613 +6614, U6614 +6615, U6615 +6616, U6616 +6617, U6617 +6618, U6618 +6619, U6619 +6620, U6620 +6621, U6621 +6622, U6622 +6623, U6623 +6624, U6624 +6625, U6625 +6626, U6626 +6627, U6627 +6628, U6628 +6629, U6629 +6630, U6630 +6631, U6631 +6632, U6632 +6633, U6633 +6634, U6634 +6635, U6635 +6636, U6636 +6637, U6637 +6638, U6638 +6639, U6639 +6640, U6640 +6641, U6641 +6642, U6642 +6643, U6643 +6644, U6644 +6645, U6645 +6646, U6646 +6647, U6647 +6648, U6648 +6649, U6649 +6650, U6650 +6651, U6651 +6652, U6652 +6653, U6653 +6654, U6654 +6655, U6655 +6656, U6656 +6657, U6657 +6658, U6658 +6659, U6659 +6660, U6660 +6661, U6661 +6662, U6662 +6663, U6663 +6664, U6664 +6665, U6665 +6666, U6666 +6667, U6667 +6668, U6668 +6669, U6669 +6670, U6670 +6671, U6671 +6672, U6672 +6673, U6673 +6674, U6674 +6675, U6675 +6676, U6676 +6677, U6677 +6678, U6678 +6679, U6679 +6680, U6680 +6681, U6681 +6682, U6682 +6683, U6683 +6684, U6684 +6685, U6685 +6686, U6686 +6687, U6687 +6688, U6688 +6689, U6689 +6690, U6690 +6691, U6691 +6692, U6692 +6693, U6693 +6694, U6694 +6695, U6695 +6696, U6696 +6697, U6697 +6698, U6698 +6699, U6699 +6700, U6700 +6701, U6701 +6702, U6702 +6703, U6703 +6704, U6704 +6705, U6705 +6706, U6706 +6707, U6707 +6708, U6708 +6709, U6709 +6710, U6710 +6711, U6711 +6712, U6712 +6713, U6713 +6714, U6714 +6715, U6715 +6716, U6716 +6717, U6717 +6718, U6718 +6719, U6719 +6720, U6720 +6721, U6721 +6722, U6722 +6723, U6723 +6724, U6724 +6725, U6725 +6726, U6726 +6727, U6727 +6728, U6728 +6729, U6729 +6730, U6730 +6731, U6731 +6732, U6732 +6733, U6733 +6734, U6734 +6735, U6735 +6736, U6736 +6737, U6737 +6738, U6738 +6739, U6739 +6740, U6740 +6741, U6741 +6742, U6742 +6743, U6743 +6744, U6744 +6745, U6745 +6746, U6746 +6747, U6747 +6748, U6748 +6749, U6749 +6750, U6750 +6751, U6751 +6752, U6752 +6753, U6753 +6754, U6754 +6755, U6755 +6756, U6756 +6757, U6757 +6758, U6758 +6759, U6759 +6760, U6760 +6761, U6761 +6762, U6762 +6763, U6763 +6764, U6764 +6765, U6765 +6766, U6766 +6767, U6767 +6768, U6768 +6769, U6769 +6770, U6770 +6771, U6771 +6772, U6772 +6773, U6773 +6774, U6774 +6775, U6775 +6776, U6776 +6777, U6777 +6778, U6778 +6779, U6779 +6780, U6780 +6781, U6781 +6782, U6782 +6783, U6783 +6784, U6784 +6785, U6785 +6786, U6786 +6787, U6787 +6788, U6788 +6789, U6789 +6790, U6790 +6791, U6791 +6792, U6792 +6793, U6793 +6794, U6794 +6795, U6795 +6796, U6796 +6797, U6797 +6798, U6798 +6799, U6799 +6800, U6800 +6801, U6801 +6802, U6802 +6803, U6803 +6804, U6804 +6805, U6805 +6806, U6806 +6807, U6807 +6808, U6808 +6809, U6809 +6810, U6810 +6811, U6811 +6812, U6812 +6813, U6813 +6814, U6814 +6815, U6815 +6816, U6816 +6817, U6817 +6818, U6818 +6819, U6819 +6820, U6820 +6821, U6821 +6822, U6822 +6823, U6823 +6824, U6824 +6825, U6825 +6826, U6826 +6827, U6827 +6828, U6828 +6829, U6829 +6830, U6830 +6831, U6831 +6832, U6832 +6833, U6833 +6834, U6834 +6835, U6835 +6836, U6836 +6837, U6837 +6838, U6838 +6839, U6839 +6840, U6840 +6841, U6841 +6842, U6842 +6843, U6843 +6844, U6844 +6845, U6845 +6846, U6846 +6847, U6847 +6848, U6848 +6849, U6849 +6850, U6850 +6851, U6851 +6852, U6852 +6853, U6853 +6854, U6854 +6855, U6855 +6856, U6856 +6857, U6857 +6858, U6858 +6859, U6859 +6860, U6860 +6861, U6861 +6862, U6862 +6863, U6863 +6864, U6864 +6865, U6865 +6866, U6866 +6867, U6867 +6868, U6868 +6869, U6869 +6870, U6870 +6871, U6871 +6872, U6872 +6873, U6873 +6874, U6874 +6875, U6875 +6876, U6876 +6877, U6877 +6878, U6878 +6879, U6879 +6880, U6880 +6881, U6881 +6882, U6882 +6883, U6883 +6884, U6884 +6885, U6885 +6886, U6886 +6887, U6887 +6888, U6888 +6889, U6889 +6890, U6890 +6891, U6891 +6892, U6892 +6893, U6893 +6894, U6894 +6895, U6895 +6896, U6896 +6897, U6897 +6898, U6898 +6899, U6899 +6900, U6900 +6901, U6901 +6902, U6902 +6903, U6903 +6904, U6904 +6905, U6905 +6906, U6906 +6907, U6907 +6908, U6908 +6909, U6909 +6910, U6910 +6911, U6911 +6912, U6912 +6913, U6913 +6914, U6914 +6915, U6915 +6916, U6916 +6917, U6917 +6918, U6918 +6919, U6919 +6920, U6920 +6921, U6921 +6922, U6922 +6923, U6923 +6924, U6924 +6925, U6925 +6926, U6926 +6927, U6927 +6928, U6928 +6929, U6929 +6930, U6930 +6931, U6931 +6932, U6932 +6933, U6933 +6934, U6934 +6935, U6935 +6936, U6936 +6937, U6937 +6938, U6938 +6939, U6939 +6940, U6940 +6941, U6941 +6942, U6942 +6943, U6943 +6944, U6944 +6945, U6945 +6946, U6946 +6947, U6947 +6948, U6948 +6949, U6949 +6950, U6950 +6951, U6951 +6952, U6952 +6953, U6953 +6954, U6954 +6955, U6955 +6956, U6956 +6957, U6957 +6958, U6958 +6959, U6959 +6960, U6960 +6961, U6961 +6962, U6962 +6963, U6963 +6964, U6964 +6965, U6965 +6966, U6966 +6967, U6967 +6968, U6968 +6969, U6969 +6970, U6970 +6971, U6971 +6972, U6972 +6973, U6973 +6974, U6974 +6975, U6975 +6976, U6976 +6977, U6977 +6978, U6978 +6979, U6979 +6980, U6980 +6981, U6981 +6982, U6982 +6983, U6983 +6984, U6984 +6985, U6985 +6986, U6986 +6987, U6987 +6988, U6988 +6989, U6989 +6990, U6990 +6991, U6991 +6992, U6992 +6993, U6993 +6994, U6994 +6995, U6995 +6996, U6996 +6997, U6997 +6998, U6998 +6999, U6999 +7000, U7000 +7001, U7001 +7002, U7002 +7003, U7003 +7004, U7004 +7005, U7005 +7006, U7006 +7007, U7007 +7008, U7008 +7009, U7009 +7010, U7010 +7011, U7011 +7012, U7012 +7013, U7013 +7014, U7014 +7015, U7015 +7016, U7016 +7017, U7017 +7018, U7018 +7019, U7019 +7020, U7020 +7021, U7021 +7022, U7022 +7023, U7023 +7024, U7024 +7025, U7025 +7026, U7026 +7027, U7027 +7028, U7028 +7029, U7029 +7030, U7030 +7031, U7031 +7032, U7032 +7033, U7033 +7034, U7034 +7035, U7035 +7036, U7036 +7037, U7037 +7038, U7038 +7039, U7039 +7040, U7040 +7041, U7041 +7042, U7042 +7043, U7043 +7044, U7044 +7045, U7045 +7046, U7046 +7047, U7047 +7048, U7048 +7049, U7049 +7050, U7050 +7051, U7051 +7052, U7052 +7053, U7053 +7054, U7054 +7055, U7055 +7056, U7056 +7057, U7057 +7058, U7058 +7059, U7059 +7060, U7060 +7061, U7061 +7062, U7062 +7063, U7063 +7064, U7064 +7065, U7065 +7066, U7066 +7067, U7067 +7068, U7068 +7069, U7069 +7070, U7070 +7071, U7071 +7072, U7072 +7073, U7073 +7074, U7074 +7075, U7075 +7076, U7076 +7077, U7077 +7078, U7078 +7079, U7079 +7080, U7080 +7081, U7081 +7082, U7082 +7083, U7083 +7084, U7084 +7085, U7085 +7086, U7086 +7087, U7087 +7088, U7088 +7089, U7089 +7090, U7090 +7091, U7091 +7092, U7092 +7093, U7093 +7094, U7094 +7095, U7095 +7096, U7096 +7097, U7097 +7098, U7098 +7099, U7099 +7100, U7100 +7101, U7101 +7102, U7102 +7103, U7103 +7104, U7104 +7105, U7105 +7106, U7106 +7107, U7107 +7108, U7108 +7109, U7109 +7110, U7110 +7111, U7111 +7112, U7112 +7113, U7113 +7114, U7114 +7115, U7115 +7116, U7116 +7117, U7117 +7118, U7118 +7119, U7119 +7120, U7120 +7121, U7121 +7122, U7122 +7123, U7123 +7124, U7124 +7125, U7125 +7126, U7126 +7127, U7127 +7128, U7128 +7129, U7129 +7130, U7130 +7131, U7131 +7132, U7132 +7133, U7133 +7134, U7134 +7135, U7135 +7136, U7136 +7137, U7137 +7138, U7138 +7139, U7139 +7140, U7140 +7141, U7141 +7142, U7142 +7143, U7143 +7144, U7144 +7145, U7145 +7146, U7146 +7147, U7147 +7148, U7148 +7149, U7149 +7150, U7150 +7151, U7151 +7152, U7152 +7153, U7153 +7154, U7154 +7155, U7155 +7156, U7156 +7157, U7157 +7158, U7158 +7159, U7159 +7160, U7160 +7161, U7161 +7162, U7162 +7163, U7163 +7164, U7164 +7165, U7165 +7166, U7166 +7167, U7167 +7168, U7168 +7169, U7169 +7170, U7170 +7171, U7171 +7172, U7172 +7173, U7173 +7174, U7174 +7175, U7175 +7176, U7176 +7177, U7177 +7178, U7178 +7179, U7179 +7180, U7180 +7181, U7181 +7182, U7182 +7183, U7183 +7184, U7184 +7185, U7185 +7186, U7186 +7187, U7187 +7188, U7188 +7189, U7189 +7190, U7190 +7191, U7191 +7192, U7192 +7193, U7193 +7194, U7194 +7195, U7195 +7196, U7196 +7197, U7197 +7198, U7198 +7199, U7199 +7200, U7200 +7201, U7201 +7202, U7202 +7203, U7203 +7204, U7204 +7205, U7205 +7206, U7206 +7207, U7207 +7208, U7208 +7209, U7209 +7210, U7210 +7211, U7211 +7212, U7212 +7213, U7213 +7214, U7214 +7215, U7215 +7216, U7216 +7217, U7217 +7218, U7218 +7219, U7219 +7220, U7220 +7221, U7221 +7222, U7222 +7223, U7223 +7224, U7224 +7225, U7225 +7226, U7226 +7227, U7227 +7228, U7228 +7229, U7229 +7230, U7230 +7231, U7231 +7232, U7232 +7233, U7233 +7234, U7234 +7235, U7235 +7236, U7236 +7237, U7237 +7238, U7238 +7239, U7239 +7240, U7240 +7241, U7241 +7242, U7242 +7243, U7243 +7244, U7244 +7245, U7245 +7246, U7246 +7247, U7247 +7248, U7248 +7249, U7249 +7250, U7250 +7251, U7251 +7252, U7252 +7253, U7253 +7254, U7254 +7255, U7255 +7256, U7256 +7257, U7257 +7258, U7258 +7259, U7259 +7260, U7260 +7261, U7261 +7262, U7262 +7263, U7263 +7264, U7264 +7265, U7265 +7266, U7266 +7267, U7267 +7268, U7268 +7269, U7269 +7270, U7270 +7271, U7271 +7272, U7272 +7273, U7273 +7274, U7274 +7275, U7275 +7276, U7276 +7277, U7277 +7278, U7278 +7279, U7279 +7280, U7280 +7281, U7281 +7282, U7282 +7283, U7283 +7284, U7284 +7285, U7285 +7286, U7286 +7287, U7287 +7288, U7288 +7289, U7289 +7290, U7290 +7291, U7291 +7292, U7292 +7293, U7293 +7294, U7294 +7295, U7295 +7296, U7296 +7297, U7297 +7298, U7298 +7299, U7299 +7300, U7300 +7301, U7301 +7302, U7302 +7303, U7303 +7304, U7304 +7305, U7305 +7306, U7306 +7307, U7307 +7308, U7308 +7309, U7309 +7310, U7310 +7311, U7311 +7312, U7312 +7313, U7313 +7314, U7314 +7315, U7315 +7316, U7316 +7317, U7317 +7318, U7318 +7319, U7319 +7320, U7320 +7321, U7321 +7322, U7322 +7323, U7323 +7324, U7324 +7325, U7325 +7326, U7326 +7327, U7327 +7328, U7328 +7329, U7329 +7330, U7330 +7331, U7331 +7332, U7332 +7333, U7333 +7334, U7334 +7335, U7335 +7336, U7336 +7337, U7337 +7338, U7338 +7339, U7339 +7340, U7340 +7341, U7341 +7342, U7342 +7343, U7343 +7344, U7344 +7345, U7345 +7346, U7346 +7347, U7347 +7348, U7348 +7349, U7349 +7350, U7350 +7351, U7351 +7352, U7352 +7353, U7353 +7354, U7354 +7355, U7355 +7356, U7356 +7357, U7357 +7358, U7358 +7359, U7359 +7360, U7360 +7361, U7361 +7362, U7362 +7363, U7363 +7364, U7364 +7365, U7365 +7366, U7366 +7367, U7367 +7368, U7368 +7369, U7369 +7370, U7370 +7371, U7371 +7372, U7372 +7373, U7373 +7374, U7374 +7375, U7375 +7376, U7376 +7377, U7377 +7378, U7378 +7379, U7379 +7380, U7380 +7381, U7381 +7382, U7382 +7383, U7383 +7384, U7384 +7385, U7385 +7386, U7386 +7387, U7387 +7388, U7388 +7389, U7389 +7390, U7390 +7391, U7391 +7392, U7392 +7393, U7393 +7394, U7394 +7395, U7395 +7396, U7396 +7397, U7397 +7398, U7398 +7399, U7399 +7400, U7400 +7401, U7401 +7402, U7402 +7403, U7403 +7404, U7404 +7405, U7405 +7406, U7406 +7407, U7407 +7408, U7408 +7409, U7409 +7410, U7410 +7411, U7411 +7412, U7412 +7413, U7413 +7414, U7414 +7415, U7415 +7416, U7416 +7417, U7417 +7418, U7418 +7419, U7419 +7420, U7420 +7421, U7421 +7422, U7422 +7423, U7423 +7424, U7424 +7425, U7425 +7426, U7426 +7427, U7427 +7428, U7428 +7429, U7429 +7430, U7430 +7431, U7431 +7432, U7432 +7433, U7433 +7434, U7434 +7435, U7435 +7436, U7436 +7437, U7437 +7438, U7438 +7439, U7439 +7440, U7440 +7441, U7441 +7442, U7442 +7443, U7443 +7444, U7444 +7445, U7445 +7446, U7446 +7447, U7447 +7448, U7448 +7449, U7449 +7450, U7450 +7451, U7451 +7452, U7452 +7453, U7453 +7454, U7454 +7455, U7455 +7456, U7456 +7457, U7457 +7458, U7458 +7459, U7459 +7460, U7460 +7461, U7461 +7462, U7462 +7463, U7463 +7464, U7464 +7465, U7465 +7466, U7466 +7467, U7467 +7468, U7468 +7469, U7469 +7470, U7470 +7471, U7471 +7472, U7472 +7473, U7473 +7474, U7474 +7475, U7475 +7476, U7476 +7477, U7477 +7478, U7478 +7479, U7479 +7480, U7480 +7481, U7481 +7482, U7482 +7483, U7483 +7484, U7484 +7485, U7485 +7486, U7486 +7487, U7487 +7488, U7488 +7489, U7489 +7490, U7490 +7491, U7491 +7492, U7492 +7493, U7493 +7494, U7494 +7495, U7495 +7496, U7496 +7497, U7497 +7498, U7498 +7499, U7499 +7500, U7500 +7501, U7501 +7502, U7502 +7503, U7503 +7504, U7504 +7505, U7505 +7506, U7506 +7507, U7507 +7508, U7508 +7509, U7509 +7510, U7510 +7511, U7511 +7512, U7512 +7513, U7513 +7514, U7514 +7515, U7515 +7516, U7516 +7517, U7517 +7518, U7518 +7519, U7519 +7520, U7520 +7521, U7521 +7522, U7522 +7523, U7523 +7524, U7524 +7525, U7525 +7526, U7526 +7527, U7527 +7528, U7528 +7529, U7529 +7530, U7530 +7531, U7531 +7532, U7532 +7533, U7533 +7534, U7534 +7535, U7535 +7536, U7536 +7537, U7537 +7538, U7538 +7539, U7539 +7540, U7540 +7541, U7541 +7542, U7542 +7543, U7543 +7544, U7544 +7545, U7545 +7546, U7546 +7547, U7547 +7548, U7548 +7549, U7549 +7550, U7550 +7551, U7551 +7552, U7552 +7553, U7553 +7554, U7554 +7555, U7555 +7556, U7556 +7557, U7557 +7558, U7558 +7559, U7559 +7560, U7560 +7561, U7561 +7562, U7562 +7563, U7563 +7564, U7564 +7565, U7565 +7566, U7566 +7567, U7567 +7568, U7568 +7569, U7569 +7570, U7570 +7571, U7571 +7572, U7572 +7573, U7573 +7574, U7574 +7575, U7575 +7576, U7576 +7577, U7577 +7578, U7578 +7579, U7579 +7580, U7580 +7581, U7581 +7582, U7582 +7583, U7583 +7584, U7584 +7585, U7585 +7586, U7586 +7587, U7587 +7588, U7588 +7589, U7589 +7590, U7590 +7591, U7591 +7592, U7592 +7593, U7593 +7594, U7594 +7595, U7595 +7596, U7596 +7597, U7597 +7598, U7598 +7599, U7599 +7600, U7600 +7601, U7601 +7602, U7602 +7603, U7603 +7604, U7604 +7605, U7605 +7606, U7606 +7607, U7607 +7608, U7608 +7609, U7609 +7610, U7610 +7611, U7611 +7612, U7612 +7613, U7613 +7614, U7614 +7615, U7615 +7616, U7616 +7617, U7617 +7618, U7618 +7619, U7619 +7620, U7620 +7621, U7621 +7622, U7622 +7623, U7623 +7624, U7624 +7625, U7625 +7626, U7626 +7627, U7627 +7628, U7628 +7629, U7629 +7630, U7630 +7631, U7631 +7632, U7632 +7633, U7633 +7634, U7634 +7635, U7635 +7636, U7636 +7637, U7637 +7638, U7638 +7639, U7639 +7640, U7640 +7641, U7641 +7642, U7642 +7643, U7643 +7644, U7644 +7645, U7645 +7646, U7646 +7647, U7647 +7648, U7648 +7649, U7649 +7650, U7650 +7651, U7651 +7652, U7652 +7653, U7653 +7654, U7654 +7655, U7655 +7656, U7656 +7657, U7657 +7658, U7658 +7659, U7659 +7660, U7660 +7661, U7661 +7662, U7662 +7663, U7663 +7664, U7664 +7665, U7665 +7666, U7666 +7667, U7667 +7668, U7668 +7669, U7669 +7670, U7670 +7671, U7671 +7672, U7672 +7673, U7673 +7674, U7674 +7675, U7675 +7676, U7676 +7677, U7677 +7678, U7678 +7679, U7679 +7680, U7680 +7681, U7681 +7682, U7682 +7683, U7683 +7684, U7684 +7685, U7685 +7686, U7686 +7687, U7687 +7688, U7688 +7689, U7689 +7690, U7690 +7691, U7691 +7692, U7692 +7693, U7693 +7694, U7694 +7695, U7695 +7696, U7696 +7697, U7697 +7698, U7698 +7699, U7699 +7700, U7700 +7701, U7701 +7702, U7702 +7703, U7703 +7704, U7704 +7705, U7705 +7706, U7706 +7707, U7707 +7708, U7708 +7709, U7709 +7710, U7710 +7711, U7711 +7712, U7712 +7713, U7713 +7714, U7714 +7715, U7715 +7716, U7716 +7717, U7717 +7718, U7718 +7719, U7719 +7720, U7720 +7721, U7721 +7722, U7722 +7723, U7723 +7724, U7724 +7725, U7725 +7726, U7726 +7727, U7727 +7728, U7728 +7729, U7729 +7730, U7730 +7731, U7731 +7732, U7732 +7733, U7733 +7734, U7734 +7735, U7735 +7736, U7736 +7737, U7737 +7738, U7738 +7739, U7739 +7740, U7740 +7741, U7741 +7742, U7742 +7743, U7743 +7744, U7744 +7745, U7745 +7746, U7746 +7747, U7747 +7748, U7748 +7749, U7749 +7750, U7750 +7751, U7751 +7752, U7752 +7753, U7753 +7754, U7754 +7755, U7755 +7756, U7756 +7757, U7757 +7758, U7758 +7759, U7759 +7760, U7760 +7761, U7761 +7762, U7762 +7763, U7763 +7764, U7764 +7765, U7765 +7766, U7766 +7767, U7767 +7768, U7768 +7769, U7769 +7770, U7770 +7771, U7771 +7772, U7772 +7773, U7773 +7774, U7774 +7775, U7775 +7776, U7776 +7777, U7777 +7778, U7778 +7779, U7779 +7780, U7780 +7781, U7781 +7782, U7782 +7783, U7783 +7784, U7784 +7785, U7785 +7786, U7786 +7787, U7787 +7788, U7788 +7789, U7789 +7790, U7790 +7791, U7791 +7792, U7792 +7793, U7793 +7794, U7794 +7795, U7795 +7796, U7796 +7797, U7797 +7798, U7798 +7799, U7799 +7800, U7800 +7801, U7801 +7802, U7802 +7803, U7803 +7804, U7804 +7805, U7805 +7806, U7806 +7807, U7807 +7808, U7808 +7809, U7809 +7810, U7810 +7811, U7811 +7812, U7812 +7813, U7813 +7814, U7814 +7815, U7815 +7816, U7816 +7817, U7817 +7818, U7818 +7819, U7819 +7820, U7820 +7821, U7821 +7822, U7822 +7823, U7823 +7824, U7824 +7825, U7825 +7826, U7826 +7827, U7827 +7828, U7828 +7829, U7829 +7830, U7830 +7831, U7831 +7832, U7832 +7833, U7833 +7834, U7834 +7835, U7835 +7836, U7836 +7837, U7837 +7838, U7838 +7839, U7839 +7840, U7840 +7841, U7841 +7842, U7842 +7843, U7843 +7844, U7844 +7845, U7845 +7846, U7846 +7847, U7847 +7848, U7848 +7849, U7849 +7850, U7850 +7851, U7851 +7852, U7852 +7853, U7853 +7854, U7854 +7855, U7855 +7856, U7856 +7857, U7857 +7858, U7858 +7859, U7859 +7860, U7860 +7861, U7861 +7862, U7862 +7863, U7863 +7864, U7864 +7865, U7865 +7866, U7866 +7867, U7867 +7868, U7868 +7869, U7869 +7870, U7870 +7871, U7871 +7872, U7872 +7873, U7873 +7874, U7874 +7875, U7875 +7876, U7876 +7877, U7877 +7878, U7878 +7879, U7879 +7880, U7880 +7881, U7881 +7882, U7882 +7883, U7883 +7884, U7884 +7885, U7885 +7886, U7886 +7887, U7887 +7888, U7888 +7889, U7889 +7890, U7890 +7891, U7891 +7892, U7892 +7893, U7893 +7894, U7894 +7895, U7895 +7896, U7896 +7897, U7897 +7898, U7898 +7899, U7899 +7900, U7900 +7901, U7901 +7902, U7902 +7903, U7903 +7904, U7904 +7905, U7905 +7906, U7906 +7907, U7907 +7908, U7908 +7909, U7909 +7910, U7910 +7911, U7911 +7912, U7912 +7913, U7913 +7914, U7914 +7915, U7915 +7916, U7916 +7917, U7917 +7918, U7918 +7919, U7919 +7920, U7920 +7921, U7921 +7922, U7922 +7923, U7923 +7924, U7924 +7925, U7925 +7926, U7926 +7927, U7927 +7928, U7928 +7929, U7929 +7930, U7930 +7931, U7931 +7932, U7932 +7933, U7933 +7934, U7934 +7935, U7935 +7936, U7936 +7937, U7937 +7938, U7938 +7939, U7939 +7940, U7940 +7941, U7941 +7942, U7942 +7943, U7943 +7944, U7944 +7945, U7945 +7946, U7946 +7947, U7947 +7948, U7948 +7949, U7949 +7950, U7950 +7951, U7951 +7952, U7952 +7953, U7953 +7954, U7954 +7955, U7955 +7956, U7956 +7957, U7957 +7958, U7958 +7959, U7959 +7960, U7960 +7961, U7961 +7962, U7962 +7963, U7963 +7964, U7964 +7965, U7965 +7966, U7966 +7967, U7967 +7968, U7968 +7969, U7969 +7970, U7970 +7971, U7971 +7972, U7972 +7973, U7973 +7974, U7974 +7975, U7975 +7976, U7976 +7977, U7977 +7978, U7978 +7979, U7979 +7980, U7980 +7981, U7981 +7982, U7982 +7983, U7983 +7984, U7984 +7985, U7985 +7986, U7986 +7987, U7987 +7988, U7988 +7989, U7989 +7990, U7990 +7991, U7991 +7992, U7992 +7993, U7993 +7994, U7994 +7995, U7995 +7996, U7996 +7997, U7997 +7998, U7998 +7999, U7999 +8000, U8000 +8001, U8001 +8002, U8002 +8003, U8003 +8004, U8004 +8005, U8005 +8006, U8006 +8007, U8007 +8008, U8008 +8009, U8009 +8010, U8010 +8011, U8011 +8012, U8012 +8013, U8013 +8014, U8014 +8015, U8015 +8016, U8016 +8017, U8017 +8018, U8018 +8019, U8019 +8020, U8020 +8021, U8021 +8022, U8022 +8023, U8023 +8024, U8024 +8025, U8025 +8026, U8026 +8027, U8027 +8028, U8028 +8029, U8029 +8030, U8030 +8031, U8031 +8032, U8032 +8033, U8033 +8034, U8034 +8035, U8035 +8036, U8036 +8037, U8037 +8038, U8038 +8039, U8039 +8040, U8040 +8041, U8041 +8042, U8042 +8043, U8043 +8044, U8044 +8045, U8045 +8046, U8046 +8047, U8047 +8048, U8048 +8049, U8049 +8050, U8050 +8051, U8051 +8052, U8052 +8053, U8053 +8054, U8054 +8055, U8055 +8056, U8056 +8057, U8057 +8058, U8058 +8059, U8059 +8060, U8060 +8061, U8061 +8062, U8062 +8063, U8063 +8064, U8064 +8065, U8065 +8066, U8066 +8067, U8067 +8068, U8068 +8069, U8069 +8070, U8070 +8071, U8071 +8072, U8072 +8073, U8073 +8074, U8074 +8075, U8075 +8076, U8076 +8077, U8077 +8078, U8078 +8079, U8079 +8080, U8080 +8081, U8081 +8082, U8082 +8083, U8083 +8084, U8084 +8085, U8085 +8086, U8086 +8087, U8087 +8088, U8088 +8089, U8089 +8090, U8090 +8091, U8091 +8092, U8092 +8093, U8093 +8094, U8094 +8095, U8095 +8096, U8096 +8097, U8097 +8098, U8098 +8099, U8099 +8100, U8100 +8101, U8101 +8102, U8102 +8103, U8103 +8104, U8104 +8105, U8105 +8106, U8106 +8107, U8107 +8108, U8108 +8109, U8109 +8110, U8110 +8111, U8111 +8112, U8112 +8113, U8113 +8114, U8114 +8115, U8115 +8116, U8116 +8117, U8117 +8118, U8118 +8119, U8119 +8120, U8120 +8121, U8121 +8122, U8122 +8123, U8123 +8124, U8124 +8125, U8125 +8126, U8126 +8127, U8127 +8128, U8128 +8129, U8129 +8130, U8130 +8131, U8131 +8132, U8132 +8133, U8133 +8134, U8134 +8135, U8135 +8136, U8136 +8137, U8137 +8138, U8138 +8139, U8139 +8140, U8140 +8141, U8141 +8142, U8142 +8143, U8143 +8144, U8144 +8145, U8145 +8146, U8146 +8147, U8147 +8148, U8148 +8149, U8149 +8150, U8150 +8151, U8151 +8152, U8152 +8153, U8153 +8154, U8154 +8155, U8155 +8156, U8156 +8157, U8157 +8158, U8158 +8159, U8159 +8160, U8160 +8161, U8161 +8162, U8162 +8163, U8163 +8164, U8164 +8165, U8165 +8166, U8166 +8167, U8167 +8168, U8168 +8169, U8169 +8170, U8170 +8171, U8171 +8172, U8172 +8173, U8173 +8174, U8174 +8175, U8175 +8176, U8176 +8177, U8177 +8178, U8178 +8179, U8179 +8180, U8180 +8181, U8181 +8182, U8182 +8183, U8183 +8184, U8184 +8185, U8185 +8186, U8186 +8187, U8187 +8188, U8188 +8189, U8189 +8190, U8190 +8191, U8191 +8192, U8192 +8193, U8193 +8194, U8194 +8195, U8195 +8196, U8196 +8197, U8197 +8198, U8198 +8199, U8199 +8200, U8200 +8201, U8201 +8202, U8202 +8203, U8203 +8204, U8204 +8205, U8205 +8206, U8206 +8207, U8207 +8208, U8208 +8209, U8209 +8210, U8210 +8211, U8211 +8212, U8212 +8213, U8213 +8214, U8214 +8215, U8215 +8216, U8216 +8217, U8217 +8218, U8218 +8219, U8219 +8220, U8220 +8221, U8221 +8222, U8222 +8223, U8223 +8224, U8224 +8225, U8225 +8226, U8226 +8227, U8227 +8228, U8228 +8229, U8229 +8230, U8230 +8231, U8231 +8232, U8232 +8233, U8233 +8234, U8234 +8235, U8235 +8236, U8236 +8237, U8237 +8238, U8238 +8239, U8239 +8240, U8240 +8241, U8241 +8242, U8242 +8243, U8243 +8244, U8244 +8245, U8245 +8246, U8246 +8247, U8247 +8248, U8248 +8249, U8249 +8250, U8250 +8251, U8251 +8252, U8252 +8253, U8253 +8254, U8254 +8255, U8255 +8256, U8256 +8257, U8257 +8258, U8258 +8259, U8259 +8260, U8260 +8261, U8261 +8262, U8262 +8263, U8263 +8264, U8264 +8265, U8265 +8266, U8266 +8267, U8267 +8268, U8268 +8269, U8269 +8270, U8270 +8271, U8271 +8272, U8272 +8273, U8273 +8274, U8274 +8275, U8275 +8276, U8276 +8277, U8277 +8278, U8278 +8279, U8279 +8280, U8280 +8281, U8281 +8282, U8282 +8283, U8283 +8284, U8284 +8285, U8285 +8286, U8286 +8287, U8287 +8288, U8288 +8289, U8289 +8290, U8290 +8291, U8291 +8292, U8292 +8293, U8293 +8294, U8294 +8295, U8295 +8296, U8296 +8297, U8297 +8298, U8298 +8299, U8299 +8300, U8300 +8301, U8301 +8302, U8302 +8303, U8303 +8304, U8304 +8305, U8305 +8306, U8306 +8307, U8307 +8308, U8308 +8309, U8309 +8310, U8310 +8311, U8311 +8312, U8312 +8313, U8313 +8314, U8314 +8315, U8315 +8316, U8316 +8317, U8317 +8318, U8318 +8319, U8319 +8320, U8320 +8321, U8321 +8322, U8322 +8323, U8323 +8324, U8324 +8325, U8325 +8326, U8326 +8327, U8327 +8328, U8328 +8329, U8329 +8330, U8330 +8331, U8331 +8332, U8332 +8333, U8333 +8334, U8334 +8335, U8335 +8336, U8336 +8337, U8337 +8338, U8338 +8339, U8339 +8340, U8340 +8341, U8341 +8342, U8342 +8343, U8343 +8344, U8344 +8345, U8345 +8346, U8346 +8347, U8347 +8348, U8348 +8349, U8349 +8350, U8350 +8351, U8351 +8352, U8352 +8353, U8353 +8354, U8354 +8355, U8355 +8356, U8356 +8357, U8357 +8358, U8358 +8359, U8359 +8360, U8360 +8361, U8361 +8362, U8362 +8363, U8363 +8364, U8364 +8365, U8365 +8366, U8366 +8367, U8367 +8368, U8368 +8369, U8369 +8370, U8370 +8371, U8371 +8372, U8372 +8373, U8373 +8374, U8374 +8375, U8375 +8376, U8376 +8377, U8377 +8378, U8378 +8379, U8379 +8380, U8380 +8381, U8381 +8382, U8382 +8383, U8383 +8384, U8384 +8385, U8385 +8386, U8386 +8387, U8387 +8388, U8388 +8389, U8389 +8390, U8390 +8391, U8391 +8392, U8392 +8393, U8393 +8394, U8394 +8395, U8395 +8396, U8396 +8397, U8397 +8398, U8398 +8399, U8399 +8400, U8400 +8401, U8401 +8402, U8402 +8403, U8403 +8404, U8404 +8405, U8405 +8406, U8406 +8407, U8407 +8408, U8408 +8409, U8409 +8410, U8410 +8411, U8411 +8412, U8412 +8413, U8413 +8414, U8414 +8415, U8415 +8416, U8416 +8417, U8417 +8418, U8418 +8419, U8419 +8420, U8420 +8421, U8421 +8422, U8422 +8423, U8423 +8424, U8424 +8425, U8425 +8426, U8426 +8427, U8427 +8428, U8428 +8429, U8429 +8430, U8430 +8431, U8431 +8432, U8432 +8433, U8433 +8434, U8434 +8435, U8435 +8436, U8436 +8437, U8437 +8438, U8438 +8439, U8439 +8440, U8440 +8441, U8441 +8442, U8442 +8443, U8443 +8444, U8444 +8445, U8445 +8446, U8446 +8447, U8447 +8448, U8448 +8449, U8449 +8450, U8450 +8451, U8451 +8452, U8452 +8453, U8453 +8454, U8454 +8455, U8455 +8456, U8456 +8457, U8457 +8458, U8458 +8459, U8459 +8460, U8460 +8461, U8461 +8462, U8462 +8463, U8463 +8464, U8464 +8465, U8465 +8466, U8466 +8467, U8467 +8468, U8468 +8469, U8469 +8470, U8470 +8471, U8471 +8472, U8472 +8473, U8473 +8474, U8474 +8475, U8475 +8476, U8476 +8477, U8477 +8478, U8478 +8479, U8479 +8480, U8480 +8481, U8481 +8482, U8482 +8483, U8483 +8484, U8484 +8485, U8485 +8486, U8486 +8487, U8487 +8488, U8488 +8489, U8489 +8490, U8490 +8491, U8491 +8492, U8492 +8493, U8493 +8494, U8494 +8495, U8495 +8496, U8496 +8497, U8497 +8498, U8498 +8499, U8499 +8500, U8500 +8501, U8501 +8502, U8502 +8503, U8503 +8504, U8504 +8505, U8505 +8506, U8506 +8507, U8507 +8508, U8508 +8509, U8509 +8510, U8510 +8511, U8511 +8512, U8512 +8513, U8513 +8514, U8514 +8515, U8515 +8516, U8516 +8517, U8517 +8518, U8518 +8519, U8519 +8520, U8520 +8521, U8521 +8522, U8522 +8523, U8523 +8524, U8524 +8525, U8525 +8526, U8526 +8527, U8527 +8528, U8528 +8529, U8529 +8530, U8530 +8531, U8531 +8532, U8532 +8533, U8533 +8534, U8534 +8535, U8535 +8536, U8536 +8537, U8537 +8538, U8538 +8539, U8539 +8540, U8540 +8541, U8541 +8542, U8542 +8543, U8543 +8544, U8544 +8545, U8545 +8546, U8546 +8547, U8547 +8548, U8548 +8549, U8549 +8550, U8550 +8551, U8551 +8552, U8552 +8553, U8553 +8554, U8554 +8555, U8555 +8556, U8556 +8557, U8557 +8558, U8558 +8559, U8559 +8560, U8560 +8561, U8561 +8562, U8562 +8563, U8563 +8564, U8564 +8565, U8565 +8566, U8566 +8567, U8567 +8568, U8568 +8569, U8569 +8570, U8570 +8571, U8571 +8572, U8572 +8573, U8573 +8574, U8574 +8575, U8575 +8576, U8576 +8577, U8577 +8578, U8578 +8579, U8579 +8580, U8580 +8581, U8581 +8582, U8582 +8583, U8583 +8584, U8584 +8585, U8585 +8586, U8586 +8587, U8587 +8588, U8588 +8589, U8589 +8590, U8590 +8591, U8591 +8592, U8592 +8593, U8593 +8594, U8594 +8595, U8595 +8596, U8596 +8597, U8597 +8598, U8598 +8599, U8599 +8600, U8600 +8601, U8601 +8602, U8602 +8603, U8603 +8604, U8604 +8605, U8605 +8606, U8606 +8607, U8607 +8608, U8608 +8609, U8609 +8610, U8610 +8611, U8611 +8612, U8612 +8613, U8613 +8614, U8614 +8615, U8615 +8616, U8616 +8617, U8617 +8618, U8618 +8619, U8619 +8620, U8620 +8621, U8621 +8622, U8622 +8623, U8623 +8624, U8624 +8625, U8625 +8626, U8626 +8627, U8627 +8628, U8628 +8629, U8629 +8630, U8630 +8631, U8631 +8632, U8632 +8633, U8633 +8634, U8634 +8635, U8635 +8636, U8636 +8637, U8637 +8638, U8638 +8639, U8639 +8640, U8640 +8641, U8641 +8642, U8642 +8643, U8643 +8644, U8644 +8645, U8645 +8646, U8646 +8647, U8647 +8648, U8648 +8649, U8649 +8650, U8650 +8651, U8651 +8652, U8652 +8653, U8653 +8654, U8654 +8655, U8655 +8656, U8656 +8657, U8657 +8658, U8658 +8659, U8659 +8660, U8660 +8661, U8661 +8662, U8662 +8663, U8663 +8664, U8664 +8665, U8665 +8666, U8666 +8667, U8667 +8668, U8668 +8669, U8669 +8670, U8670 +8671, U8671 +8672, U8672 +8673, U8673 +8674, U8674 +8675, U8675 +8676, U8676 +8677, U8677 +8678, U8678 +8679, U8679 +8680, U8680 +8681, U8681 +8682, U8682 +8683, U8683 +8684, U8684 +8685, U8685 +8686, U8686 +8687, U8687 +8688, U8688 +8689, U8689 +8690, U8690 +8691, U8691 +8692, U8692 +8693, U8693 +8694, U8694 +8695, U8695 +8696, U8696 +8697, U8697 +8698, U8698 +8699, U8699 +8700, U8700 +8701, U8701 +8702, U8702 +8703, U8703 +8704, U8704 +8705, U8705 +8706, U8706 +8707, U8707 +8708, U8708 +8709, U8709 +8710, U8710 +8711, U8711 +8712, U8712 +8713, U8713 +8714, U8714 +8715, U8715 +8716, U8716 +8717, U8717 +8718, U8718 +8719, U8719 +8720, U8720 +8721, U8721 +8722, U8722 +8723, U8723 +8724, U8724 +8725, U8725 +8726, U8726 +8727, U8727 +8728, U8728 +8729, U8729 +8730, U8730 +8731, U8731 +8732, U8732 +8733, U8733 +8734, U8734 +8735, U8735 +8736, U8736 +8737, U8737 +8738, U8738 +8739, U8739 +8740, U8740 +8741, U8741 +8742, U8742 +8743, U8743 +8744, U8744 +8745, U8745 +8746, U8746 +8747, U8747 +8748, U8748 +8749, U8749 +8750, U8750 +8751, U8751 +8752, U8752 +8753, U8753 +8754, U8754 +8755, U8755 +8756, U8756 +8757, U8757 +8758, U8758 +8759, U8759 +8760, U8760 +8761, U8761 +8762, U8762 +8763, U8763 +8764, U8764 +8765, U8765 +8766, U8766 +8767, U8767 +8768, U8768 +8769, U8769 +8770, U8770 +8771, U8771 +8772, U8772 +8773, U8773 +8774, U8774 +8775, U8775 +8776, U8776 +8777, U8777 +8778, U8778 +8779, U8779 +8780, U8780 +8781, U8781 +8782, U8782 +8783, U8783 +8784, U8784 +8785, U8785 +8786, U8786 +8787, U8787 +8788, U8788 +8789, U8789 +8790, U8790 +8791, U8791 +8792, U8792 +8793, U8793 +8794, U8794 +8795, U8795 +8796, U8796 +8797, U8797 +8798, U8798 +8799, U8799 +8800, U8800 +8801, U8801 +8802, U8802 +8803, U8803 +8804, U8804 +8805, U8805 +8806, U8806 +8807, U8807 +8808, U8808 +8809, U8809 +8810, U8810 +8811, U8811 +8812, U8812 +8813, U8813 +8814, U8814 +8815, U8815 +8816, U8816 +8817, U8817 +8818, U8818 +8819, U8819 +8820, U8820 +8821, U8821 +8822, U8822 +8823, U8823 +8824, U8824 +8825, U8825 +8826, U8826 +8827, U8827 +8828, U8828 +8829, U8829 +8830, U8830 +8831, U8831 +8832, U8832 +8833, U8833 +8834, U8834 +8835, U8835 +8836, U8836 +8837, U8837 +8838, U8838 +8839, U8839 +8840, U8840 +8841, U8841 +8842, U8842 +8843, U8843 +8844, U8844 +8845, U8845 +8846, U8846 +8847, U8847 +8848, U8848 +8849, U8849 +8850, U8850 +8851, U8851 +8852, U8852 +8853, U8853 +8854, U8854 +8855, U8855 +8856, U8856 +8857, U8857 +8858, U8858 +8859, U8859 +8860, U8860 +8861, U8861 +8862, U8862 +8863, U8863 +8864, U8864 +8865, U8865 +8866, U8866 +8867, U8867 +8868, U8868 +8869, U8869 +8870, U8870 +8871, U8871 +8872, U8872 +8873, U8873 +8874, U8874 +8875, U8875 +8876, U8876 +8877, U8877 +8878, U8878 +8879, U8879 +8880, U8880 +8881, U8881 +8882, U8882 +8883, U8883 +8884, U8884 +8885, U8885 +8886, U8886 +8887, U8887 +8888, U8888 +8889, U8889 +8890, U8890 +8891, U8891 +8892, U8892 +8893, U8893 +8894, U8894 +8895, U8895 +8896, U8896 +8897, U8897 +8898, U8898 +8899, U8899 +8900, U8900 +8901, U8901 +8902, U8902 +8903, U8903 +8904, U8904 +8905, U8905 +8906, U8906 +8907, U8907 +8908, U8908 +8909, U8909 +8910, U8910 +8911, U8911 +8912, U8912 +8913, U8913 +8914, U8914 +8915, U8915 +8916, U8916 +8917, U8917 +8918, U8918 +8919, U8919 +8920, U8920 +8921, U8921 +8922, U8922 +8923, U8923 +8924, U8924 +8925, U8925 +8926, U8926 +8927, U8927 +8928, U8928 +8929, U8929 +8930, U8930 +8931, U8931 +8932, U8932 +8933, U8933 +8934, U8934 +8935, U8935 +8936, U8936 +8937, U8937 +8938, U8938 +8939, U8939 +8940, U8940 +8941, U8941 +8942, U8942 +8943, U8943 +8944, U8944 +8945, U8945 +8946, U8946 +8947, U8947 +8948, U8948 +8949, U8949 +8950, U8950 +8951, U8951 +8952, U8952 +8953, U8953 +8954, U8954 +8955, U8955 +8956, U8956 +8957, U8957 +8958, U8958 +8959, U8959 +8960, U8960 +8961, U8961 +8962, U8962 +8963, U8963 +8964, U8964 +8965, U8965 +8966, U8966 +8967, U8967 +8968, U8968 +8969, U8969 +8970, U8970 +8971, U8971 +8972, U8972 +8973, U8973 +8974, U8974 +8975, U8975 +8976, U8976 +8977, U8977 +8978, U8978 +8979, U8979 +8980, U8980 +8981, U8981 +8982, U8982 +8983, U8983 +8984, U8984 +8985, U8985 +8986, U8986 +8987, U8987 +8988, U8988 +8989, U8989 +8990, U8990 +8991, U8991 +8992, U8992 +8993, U8993 +8994, U8994 +8995, U8995 +8996, U8996 +8997, U8997 +8998, U8998 +8999, U8999 +9000, U9000 +9001, U9001 +9002, U9002 +9003, U9003 +9004, U9004 +9005, U9005 +9006, U9006 +9007, U9007 +9008, U9008 +9009, U9009 +9010, U9010 +9011, U9011 +9012, U9012 +9013, U9013 +9014, U9014 +9015, U9015 +9016, U9016 +9017, U9017 +9018, U9018 +9019, U9019 +9020, U9020 +9021, U9021 +9022, U9022 +9023, U9023 +9024, U9024 +9025, U9025 +9026, U9026 +9027, U9027 +9028, U9028 +9029, U9029 +9030, U9030 +9031, U9031 +9032, U9032 +9033, U9033 +9034, U9034 +9035, U9035 +9036, U9036 +9037, U9037 +9038, U9038 +9039, U9039 +9040, U9040 +9041, U9041 +9042, U9042 +9043, U9043 +9044, U9044 +9045, U9045 +9046, U9046 +9047, U9047 +9048, U9048 +9049, U9049 +9050, U9050 +9051, U9051 +9052, U9052 +9053, U9053 +9054, U9054 +9055, U9055 +9056, U9056 +9057, U9057 +9058, U9058 +9059, U9059 +9060, U9060 +9061, U9061 +9062, U9062 +9063, U9063 +9064, U9064 +9065, U9065 +9066, U9066 +9067, U9067 +9068, U9068 +9069, U9069 +9070, U9070 +9071, U9071 +9072, U9072 +9073, U9073 +9074, U9074 +9075, U9075 +9076, U9076 +9077, U9077 +9078, U9078 +9079, U9079 +9080, U9080 +9081, U9081 +9082, U9082 +9083, U9083 +9084, U9084 +9085, U9085 +9086, U9086 +9087, U9087 +9088, U9088 +9089, U9089 +9090, U9090 +9091, U9091 +9092, U9092 +9093, U9093 +9094, U9094 +9095, U9095 +9096, U9096 +9097, U9097 +9098, U9098 +9099, U9099 +9100, U9100 +9101, U9101 +9102, U9102 +9103, U9103 +9104, U9104 +9105, U9105 +9106, U9106 +9107, U9107 +9108, U9108 +9109, U9109 +9110, U9110 +9111, U9111 +9112, U9112 +9113, U9113 +9114, U9114 +9115, U9115 +9116, U9116 +9117, U9117 +9118, U9118 +9119, U9119 +9120, U9120 +9121, U9121 +9122, U9122 +9123, U9123 +9124, U9124 +9125, U9125 +9126, U9126 +9127, U9127 +9128, U9128 +9129, U9129 +9130, U9130 +9131, U9131 +9132, U9132 +9133, U9133 +9134, U9134 +9135, U9135 +9136, U9136 +9137, U9137 +9138, U9138 +9139, U9139 +9140, U9140 +9141, U9141 +9142, U9142 +9143, U9143 +9144, U9144 +9145, U9145 +9146, U9146 +9147, U9147 +9148, U9148 +9149, U9149 +9150, U9150 +9151, U9151 +9152, U9152 +9153, U9153 +9154, U9154 +9155, U9155 +9156, U9156 +9157, U9157 +9158, U9158 +9159, U9159 +9160, U9160 +9161, U9161 +9162, U9162 +9163, U9163 +9164, U9164 +9165, U9165 +9166, U9166 +9167, U9167 +9168, U9168 +9169, U9169 +9170, U9170 +9171, U9171 +9172, U9172 +9173, U9173 +9174, U9174 +9175, U9175 +9176, U9176 +9177, U9177 +9178, U9178 +9179, U9179 +9180, U9180 +9181, U9181 +9182, U9182 +9183, U9183 +9184, U9184 +9185, U9185 +9186, U9186 +9187, U9187 +9188, U9188 +9189, U9189 +9190, U9190 +9191, U9191 +9192, U9192 +9193, U9193 +9194, U9194 +9195, U9195 +9196, U9196 +9197, U9197 +9198, U9198 +9199, U9199 +9200, U9200 +9201, U9201 +9202, U9202 +9203, U9203 +9204, U9204 +9205, U9205 +9206, U9206 +9207, U9207 +9208, U9208 +9209, U9209 +9210, U9210 +9211, U9211 +9212, U9212 +9213, U9213 +9214, U9214 +9215, U9215 +9216, U9216 +9217, U9217 +9218, U9218 +9219, U9219 +9220, U9220 +9221, U9221 +9222, U9222 +9223, U9223 +9224, U9224 +9225, U9225 +9226, U9226 +9227, U9227 +9228, U9228 +9229, U9229 +9230, U9230 +9231, U9231 +9232, U9232 +9233, U9233 +9234, U9234 +9235, U9235 +9236, U9236 +9237, U9237 +9238, U9238 +9239, U9239 +9240, U9240 +9241, U9241 +9242, U9242 +9243, U9243 +9244, U9244 +9245, U9245 +9246, U9246 +9247, U9247 +9248, U9248 +9249, U9249 +9250, U9250 +9251, U9251 +9252, U9252 +9253, U9253 +9254, U9254 +9255, U9255 +9256, U9256 +9257, U9257 +9258, U9258 +9259, U9259 +9260, U9260 +9261, U9261 +9262, U9262 +9263, U9263 +9264, U9264 +9265, U9265 +9266, U9266 +9267, U9267 +9268, U9268 +9269, U9269 +9270, U9270 +9271, U9271 +9272, U9272 +9273, U9273 +9274, U9274 +9275, U9275 +9276, U9276 +9277, U9277 +9278, U9278 +9279, U9279 +9280, U9280 +9281, U9281 +9282, U9282 +9283, U9283 +9284, U9284 +9285, U9285 +9286, U9286 +9287, U9287 +9288, U9288 +9289, U9289 +9290, U9290 +9291, U9291 +9292, U9292 +9293, U9293 +9294, U9294 +9295, U9295 +9296, U9296 +9297, U9297 +9298, U9298 +9299, U9299 +9300, U9300 +9301, U9301 +9302, U9302 +9303, U9303 +9304, U9304 +9305, U9305 +9306, U9306 +9307, U9307 +9308, U9308 +9309, U9309 +9310, U9310 +9311, U9311 +9312, U9312 +9313, U9313 +9314, U9314 +9315, U9315 +9316, U9316 +9317, U9317 +9318, U9318 +9319, U9319 +9320, U9320 +9321, U9321 +9322, U9322 +9323, U9323 +9324, U9324 +9325, U9325 +9326, U9326 +9327, U9327 +9328, U9328 +9329, U9329 +9330, U9330 +9331, U9331 +9332, U9332 +9333, U9333 +9334, U9334 +9335, U9335 +9336, U9336 +9337, U9337 +9338, U9338 +9339, U9339 +9340, U9340 +9341, U9341 +9342, U9342 +9343, U9343 +9344, U9344 +9345, U9345 +9346, U9346 +9347, U9347 +9348, U9348 +9349, U9349 +9350, U9350 +9351, U9351 +9352, U9352 +9353, U9353 +9354, U9354 +9355, U9355 +9356, U9356 +9357, U9357 +9358, U9358 +9359, U9359 +9360, U9360 +9361, U9361 +9362, U9362 +9363, U9363 +9364, U9364 +9365, U9365 +9366, U9366 +9367, U9367 +9368, U9368 +9369, U9369 +9370, U9370 +9371, U9371 +9372, U9372 +9373, U9373 +9374, U9374 +9375, U9375 +9376, U9376 +9377, U9377 +9378, U9378 +9379, U9379 +9380, U9380 +9381, U9381 +9382, U9382 +9383, U9383 +9384, U9384 +9385, U9385 +9386, U9386 +9387, U9387 +9388, U9388 +9389, U9389 +9390, U9390 +9391, U9391 +9392, U9392 +9393, U9393 +9394, U9394 +9395, U9395 +9396, U9396 +9397, U9397 +9398, U9398 +9399, U9399 +9400, U9400 +9401, U9401 +9402, U9402 +9403, U9403 +9404, U9404 +9405, U9405 +9406, U9406 +9407, U9407 +9408, U9408 +9409, U9409 +9410, U9410 +9411, U9411 +9412, U9412 +9413, U9413 +9414, U9414 +9415, U9415 +9416, U9416 +9417, U9417 +9418, U9418 +9419, U9419 +9420, U9420 +9421, U9421 +9422, U9422 +9423, U9423 +9424, U9424 +9425, U9425 +9426, U9426 +9427, U9427 +9428, U9428 +9429, U9429 +9430, U9430 +9431, U9431 +9432, U9432 +9433, U9433 +9434, U9434 +9435, U9435 +9436, U9436 +9437, U9437 +9438, U9438 +9439, U9439 +9440, U9440 +9441, U9441 +9442, U9442 +9443, U9443 +9444, U9444 +9445, U9445 +9446, U9446 +9447, U9447 +9448, U9448 +9449, U9449 +9450, U9450 +9451, U9451 +9452, U9452 +9453, U9453 +9454, U9454 +9455, U9455 +9456, U9456 +9457, U9457 +9458, U9458 +9459, U9459 +9460, U9460 +9461, U9461 +9462, U9462 +9463, U9463 +9464, U9464 +9465, U9465 +9466, U9466 +9467, U9467 +9468, U9468 +9469, U9469 +9470, U9470 +9471, U9471 +9472, U9472 +9473, U9473 +9474, U9474 +9475, U9475 +9476, U9476 +9477, U9477 +9478, U9478 +9479, U9479 +9480, U9480 +9481, U9481 +9482, U9482 +9483, U9483 +9484, U9484 +9485, U9485 +9486, U9486 +9487, U9487 +9488, U9488 +9489, U9489 +9490, U9490 +9491, U9491 +9492, U9492 +9493, U9493 +9494, U9494 +9495, U9495 +9496, U9496 +9497, U9497 +9498, U9498 +9499, U9499 +9500, U9500 +9501, U9501 +9502, U9502 +9503, U9503 +9504, U9504 +9505, U9505 +9506, U9506 +9507, U9507 +9508, U9508 +9509, U9509 +9510, U9510 +9511, U9511 +9512, U9512 +9513, U9513 +9514, U9514 +9515, U9515 +9516, U9516 +9517, U9517 +9518, U9518 +9519, U9519 +9520, U9520 +9521, U9521 +9522, U9522 +9523, U9523 +9524, U9524 +9525, U9525 +9526, U9526 +9527, U9527 +9528, U9528 +9529, U9529 +9530, U9530 +9531, U9531 +9532, U9532 +9533, U9533 +9534, U9534 +9535, U9535 +9536, U9536 +9537, U9537 +9538, U9538 +9539, U9539 +9540, U9540 +9541, U9541 +9542, U9542 +9543, U9543 +9544, U9544 +9545, U9545 +9546, U9546 +9547, U9547 +9548, U9548 +9549, U9549 +9550, U9550 +9551, U9551 +9552, U9552 +9553, U9553 +9554, U9554 +9555, U9555 +9556, U9556 +9557, U9557 +9558, U9558 +9559, U9559 +9560, U9560 +9561, U9561 +9562, U9562 +9563, U9563 +9564, U9564 +9565, U9565 +9566, U9566 +9567, U9567 +9568, U9568 +9569, U9569 +9570, U9570 +9571, U9571 +9572, U9572 +9573, U9573 +9574, U9574 +9575, U9575 +9576, U9576 +9577, U9577 +9578, U9578 +9579, U9579 +9580, U9580 +9581, U9581 +9582, U9582 +9583, U9583 +9584, U9584 +9585, U9585 +9586, U9586 +9587, U9587 +9588, U9588 +9589, U9589 +9590, U9590 +9591, U9591 +9592, U9592 +9593, U9593 +9594, U9594 +9595, U9595 +9596, U9596 +9597, U9597 +9598, U9598 +9599, U9599 +9600, U9600 +9601, U9601 +9602, U9602 +9603, U9603 +9604, U9604 +9605, U9605 +9606, U9606 +9607, U9607 +9608, U9608 +9609, U9609 +9610, U9610 +9611, U9611 +9612, U9612 +9613, U9613 +9614, U9614 +9615, U9615 +9616, U9616 +9617, U9617 +9618, U9618 +9619, U9619 +9620, U9620 +9621, U9621 +9622, U9622 +9623, U9623 +9624, U9624 +9625, U9625 +9626, U9626 +9627, U9627 +9628, U9628 +9629, U9629 +9630, U9630 +9631, U9631 +9632, U9632 +9633, U9633 +9634, U9634 +9635, U9635 +9636, U9636 +9637, U9637 +9638, U9638 +9639, U9639 +9640, U9640 +9641, U9641 +9642, U9642 +9643, U9643 +9644, U9644 +9645, U9645 +9646, U9646 +9647, U9647 +9648, U9648 +9649, U9649 +9650, U9650 +9651, U9651 +9652, U9652 +9653, U9653 +9654, U9654 +9655, U9655 +9656, U9656 +9657, U9657 +9658, U9658 +9659, U9659 +9660, U9660 +9661, U9661 +9662, U9662 +9663, U9663 +9664, U9664 +9665, U9665 +9666, U9666 +9667, U9667 +9668, U9668 +9669, U9669 +9670, U9670 +9671, U9671 +9672, U9672 +9673, U9673 +9674, U9674 +9675, U9675 +9676, U9676 +9677, U9677 +9678, U9678 +9679, U9679 +9680, U9680 +9681, U9681 +9682, U9682 +9683, U9683 +9684, U9684 +9685, U9685 +9686, U9686 +9687, U9687 +9688, U9688 +9689, U9689 +9690, U9690 +9691, U9691 +9692, U9692 +9693, U9693 +9694, U9694 +9695, U9695 +9696, U9696 +9697, U9697 +9698, U9698 +9699, U9699 +9700, U9700 +9701, U9701 +9702, U9702 +9703, U9703 +9704, U9704 +9705, U9705 +9706, U9706 +9707, U9707 +9708, U9708 +9709, U9709 +9710, U9710 +9711, U9711 +9712, U9712 +9713, U9713 +9714, U9714 +9715, U9715 +9716, U9716 +9717, U9717 +9718, U9718 +9719, U9719 +9720, U9720 +9721, U9721 +9722, U9722 +9723, U9723 +9724, U9724 +9725, U9725 +9726, U9726 +9727, U9727 +9728, U9728 +9729, U9729 +9730, U9730 +9731, U9731 +9732, U9732 +9733, U9733 +9734, U9734 +9735, U9735 +9736, U9736 +9737, U9737 +9738, U9738 +9739, U9739 +9740, U9740 +9741, U9741 +9742, U9742 +9743, U9743 +9744, U9744 +9745, U9745 +9746, U9746 +9747, U9747 +9748, U9748 +9749, U9749 +9750, U9750 +9751, U9751 +9752, U9752 +9753, U9753 +9754, U9754 +9755, U9755 +9756, U9756 +9757, U9757 +9758, U9758 +9759, U9759 +9760, U9760 +9761, U9761 +9762, U9762 +9763, U9763 +9764, U9764 +9765, U9765 +9766, U9766 +9767, U9767 +9768, U9768 +9769, U9769 +9770, U9770 +9771, U9771 +9772, U9772 +9773, U9773 +9774, U9774 +9775, U9775 +9776, U9776 +9777, U9777 +9778, U9778 +9779, U9779 +9780, U9780 +9781, U9781 +9782, U9782 +9783, U9783 +9784, U9784 +9785, U9785 +9786, U9786 +9787, U9787 +9788, U9788 +9789, U9789 +9790, U9790 +9791, U9791 +9792, U9792 +9793, U9793 +9794, U9794 +9795, U9795 +9796, U9796 +9797, U9797 +9798, U9798 +9799, U9799 +9800, U9800 +9801, U9801 +9802, U9802 +9803, U9803 +9804, U9804 +9805, U9805 +9806, U9806 +9807, U9807 +9808, U9808 +9809, U9809 +9810, U9810 +9811, U9811 +9812, U9812 +9813, U9813 +9814, U9814 +9815, U9815 +9816, U9816 +9817, U9817 +9818, U9818 +9819, U9819 +9820, U9820 +9821, U9821 +9822, U9822 +9823, U9823 +9824, U9824 +9825, U9825 +9826, U9826 +9827, U9827 +9828, U9828 +9829, U9829 +9830, U9830 +9831, U9831 +9832, U9832 +9833, U9833 +9834, U9834 +9835, U9835 +9836, U9836 +9837, U9837 +9838, U9838 +9839, U9839 +9840, U9840 +9841, U9841 +9842, U9842 +9843, U9843 +9844, U9844 +9845, U9845 +9846, U9846 +9847, U9847 +9848, U9848 +9849, U9849 +9850, U9850 +9851, U9851 +9852, U9852 +9853, U9853 +9854, U9854 +9855, U9855 +9856, U9856 +9857, U9857 +9858, U9858 +9859, U9859 +9860, U9860 +9861, U9861 +9862, U9862 +9863, U9863 +9864, U9864 +9865, U9865 +9866, U9866 +9867, U9867 +9868, U9868 +9869, U9869 +9870, U9870 +9871, U9871 +9872, U9872 +9873, U9873 +9874, U9874 +9875, U9875 +9876, U9876 +9877, U9877 +9878, U9878 +9879, U9879 +9880, U9880 +9881, U9881 +9882, U9882 +9883, U9883 +9884, U9884 +9885, U9885 +9886, U9886 +9887, U9887 +9888, U9888 +9889, U9889 +9890, U9890 +9891, U9891 +9892, U9892 +9893, U9893 +9894, U9894 +9895, U9895 +9896, U9896 +9897, U9897 +9898, U9898 +9899, U9899 +9900, U9900 +9901, U9901 +9902, U9902 +9903, U9903 +9904, U9904 +9905, U9905 +9906, U9906 +9907, U9907 +9908, U9908 +9909, U9909 +9910, U9910 +9911, U9911 +9912, U9912 +9913, U9913 +9914, U9914 +9915, U9915 +9916, U9916 +9917, U9917 +9918, U9918 +9919, U9919 +9920, U9920 +9921, U9921 +9922, U9922 +9923, U9923 +9924, U9924 +9925, U9925 +9926, U9926 +9927, U9927 +9928, U9928 +9929, U9929 +9930, U9930 +9931, U9931 +9932, U9932 +9933, U9933 +9934, U9934 +9935, U9935 +9936, U9936 +9937, U9937 +9938, U9938 +9939, U9939 +9940, U9940 +9941, U9941 +9942, U9942 +9943, U9943 +9944, U9944 +9945, U9945 +9946, U9946 +9947, U9947 +9948, U9948 +9949, U9949 +9950, U9950 +9951, U9951 +9952, U9952 +9953, U9953 +9954, U9954 +9955, U9955 +9956, U9956 +9957, U9957 +9958, U9958 +9959, U9959 +9960, U9960 +9961, U9961 +9962, U9962 +9963, U9963 +9964, U9964 +9965, U9965 +9966, U9966 +9967, U9967 +9968, U9968 +9969, U9969 +9970, U9970 +9971, U9971 +9972, U9972 +9973, U9973 +9974, U9974 +9975, U9975 +9976, U9976 +9977, U9977 +9978, U9978 +9979, U9979 +9980, U9980 +9981, U9981 +9982, U9982 +9983, U9983 +9984, U9984 +9985, U9985 +9986, U9986 +9987, U9987 +9988, U9988 +9989, U9989 +9990, U9990 +9991, U9991 +9992, U9992 +9993, U9993 +9994, U9994 +9995, U9995 +9996, U9996 +9997, U9997 +9998, U9998 +9999, U9999 +10000, U10000 diff --git a/testdb/csv/UA.csv b/testdb/csv/UA.csv new file mode 100644 index 000000000..c74ca403b --- /dev/null +++ b/testdb/csv/UA.csv @@ -0,0 +1,10000 @@ +1, UA1 +2, UA2 +3, UA3 +4, UA4 +5, UA5 +6, UA6 +7, UA7 +8, UA8 +9, UA9 +10, UA10 +11, UA11 +12, UA12 +13, UA13 +14, UA14 +15, UA15 +16, UA16 +17, UA17 +18, UA18 +19, UA19 +20, UA20 +21, UA21 +22, UA22 +23, UA23 +24, UA24 +25, UA25 +26, UA26 +27, UA27 +28, UA28 +29, UA29 +30, UA30 +31, UA31 +32, UA32 +33, UA33 +34, UA34 +35, UA35 +36, UA36 +37, UA37 +38, UA38 +39, UA39 +40, UA40 +41, UA41 +42, UA42 +43, UA43 +44, UA44 +45, UA45 +46, UA46 +47, UA47 +48, UA48 +49, UA49 +50, UA50 +51, UA51 +52, UA52 +53, UA53 +54, UA54 +55, UA55 +56, UA56 +57, UA57 +58, UA58 +59, UA59 +60, UA60 +61, UA61 +62, UA62 +63, UA63 +64, UA64 +65, UA65 +66, UA66 +67, UA67 +68, UA68 +69, UA69 +70, UA70 +71, UA71 +72, UA72 +73, UA73 +74, UA74 +75, UA75 +76, UA76 +77, UA77 +78, UA78 +79, UA79 +80, UA80 +81, UA81 +82, UA82 +83, UA83 +84, UA84 +85, UA85 +86, UA86 +87, UA87 +88, UA88 +89, UA89 +90, UA90 +91, UA91 +92, UA92 +93, UA93 +94, UA94 +95, UA95 +96, UA96 +97, UA97 +98, UA98 +99, UA99 +100, UA100 +101, UA101 +102, UA102 +103, UA103 +104, UA104 +105, UA105 +106, UA106 +107, UA107 +108, UA108 +109, UA109 +110, UA110 +111, UA111 +112, UA112 +113, UA113 +114, UA114 +115, UA115 +116, UA116 +117, UA117 +118, UA118 +119, UA119 +120, UA120 +121, UA121 +122, UA122 +123, UA123 +124, UA124 +125, UA125 +126, UA126 +127, UA127 +128, UA128 +129, UA129 +130, UA130 +131, UA131 +132, UA132 +133, UA133 +134, UA134 +135, UA135 +136, UA136 +137, UA137 +138, UA138 +139, UA139 +140, UA140 +141, UA141 +142, UA142 +143, UA143 +144, UA144 +145, UA145 +146, UA146 +147, UA147 +148, UA148 +149, UA149 +150, UA150 +151, UA151 +152, UA152 +153, UA153 +154, UA154 +155, UA155 +156, UA156 +157, UA157 +158, UA158 +159, UA159 +160, UA160 +161, UA161 +162, UA162 +163, UA163 +164, UA164 +165, UA165 +166, UA166 +167, UA167 +168, UA168 +169, UA169 +170, UA170 +171, UA171 +172, UA172 +173, UA173 +174, UA174 +175, UA175 +176, UA176 +177, UA177 +178, UA178 +179, UA179 +180, UA180 +181, UA181 +182, UA182 +183, UA183 +184, UA184 +185, UA185 +186, UA186 +187, UA187 +188, UA188 +189, UA189 +190, UA190 +191, UA191 +192, UA192 +193, UA193 +194, UA194 +195, UA195 +196, UA196 +197, UA197 +198, UA198 +199, UA199 +200, UA200 +201, UA201 +202, UA202 +203, UA203 +204, UA204 +205, UA205 +206, UA206 +207, UA207 +208, UA208 +209, UA209 +210, UA210 +211, UA211 +212, UA212 +213, UA213 +214, UA214 +215, UA215 +216, UA216 +217, UA217 +218, UA218 +219, UA219 +220, UA220 +221, UA221 +222, UA222 +223, UA223 +224, UA224 +225, UA225 +226, UA226 +227, UA227 +228, UA228 +229, UA229 +230, UA230 +231, UA231 +232, UA232 +233, UA233 +234, UA234 +235, UA235 +236, UA236 +237, UA237 +238, UA238 +239, UA239 +240, UA240 +241, UA241 +242, UA242 +243, UA243 +244, UA244 +245, UA245 +246, UA246 +247, UA247 +248, UA248 +249, UA249 +250, UA250 +251, UA251 +252, UA252 +253, UA253 +254, UA254 +255, UA255 +256, UA256 +257, UA257 +258, UA258 +259, UA259 +260, UA260 +261, UA261 +262, UA262 +263, UA263 +264, UA264 +265, UA265 +266, UA266 +267, UA267 +268, UA268 +269, UA269 +270, UA270 +271, UA271 +272, UA272 +273, UA273 +274, UA274 +275, UA275 +276, UA276 +277, UA277 +278, UA278 +279, UA279 +280, UA280 +281, UA281 +282, UA282 +283, UA283 +284, UA284 +285, UA285 +286, UA286 +287, UA287 +288, UA288 +289, UA289 +290, UA290 +291, UA291 +292, UA292 +293, UA293 +294, UA294 +295, UA295 +296, UA296 +297, UA297 +298, UA298 +299, UA299 +300, UA300 +301, UA301 +302, UA302 +303, UA303 +304, UA304 +305, UA305 +306, UA306 +307, UA307 +308, UA308 +309, UA309 +310, UA310 +311, UA311 +312, UA312 +313, UA313 +314, UA314 +315, UA315 +316, UA316 +317, UA317 +318, UA318 +319, UA319 +320, UA320 +321, UA321 +322, UA322 +323, UA323 +324, UA324 +325, UA325 +326, UA326 +327, UA327 +328, UA328 +329, UA329 +330, UA330 +331, UA331 +332, UA332 +333, UA333 +334, UA334 +335, UA335 +336, UA336 +337, UA337 +338, UA338 +339, UA339 +340, UA340 +341, UA341 +342, UA342 +343, UA343 +344, UA344 +345, UA345 +346, UA346 +347, UA347 +348, UA348 +349, UA349 +350, UA350 +351, UA351 +352, UA352 +353, UA353 +354, UA354 +355, UA355 +356, UA356 +357, UA357 +358, UA358 +359, UA359 +360, UA360 +361, UA361 +362, UA362 +363, UA363 +364, UA364 +365, UA365 +366, UA366 +367, UA367 +368, UA368 +369, UA369 +370, UA370 +371, UA371 +372, UA372 +373, UA373 +374, UA374 +375, UA375 +376, UA376 +377, UA377 +378, UA378 +379, UA379 +380, UA380 +381, UA381 +382, UA382 +383, UA383 +384, UA384 +385, UA385 +386, UA386 +387, UA387 +388, UA388 +389, UA389 +390, UA390 +391, UA391 +392, UA392 +393, UA393 +394, UA394 +395, UA395 +396, UA396 +397, UA397 +398, UA398 +399, UA399 +400, UA400 +401, UA401 +402, UA402 +403, UA403 +404, UA404 +405, UA405 +406, UA406 +407, UA407 +408, UA408 +409, UA409 +410, UA410 +411, UA411 +412, UA412 +413, UA413 +414, UA414 +415, UA415 +416, UA416 +417, UA417 +418, UA418 +419, UA419 +420, UA420 +421, UA421 +422, UA422 +423, UA423 +424, UA424 +425, UA425 +426, UA426 +427, UA427 +428, UA428 +429, UA429 +430, UA430 +431, UA431 +432, UA432 +433, UA433 +434, UA434 +435, UA435 +436, UA436 +437, UA437 +438, UA438 +439, UA439 +440, UA440 +441, UA441 +442, UA442 +443, UA443 +444, UA444 +445, UA445 +446, UA446 +447, UA447 +448, UA448 +449, UA449 +450, UA450 +451, UA451 +452, UA452 +453, UA453 +454, UA454 +455, UA455 +456, UA456 +457, UA457 +458, UA458 +459, UA459 +460, UA460 +461, UA461 +462, UA462 +463, UA463 +464, UA464 +465, UA465 +466, UA466 +467, UA467 +468, UA468 +469, UA469 +470, UA470 +471, UA471 +472, UA472 +473, UA473 +474, UA474 +475, UA475 +476, UA476 +477, UA477 +478, UA478 +479, UA479 +480, UA480 +481, UA481 +482, UA482 +483, UA483 +484, UA484 +485, UA485 +486, UA486 +487, UA487 +488, UA488 +489, UA489 +490, UA490 +491, UA491 +492, UA492 +493, UA493 +494, UA494 +495, UA495 +496, UA496 +497, UA497 +498, UA498 +499, UA499 +500, UA500 +501, UA501 +502, UA502 +503, UA503 +504, UA504 +505, UA505 +506, UA506 +507, UA507 +508, UA508 +509, UA509 +510, UA510 +511, UA511 +512, UA512 +513, UA513 +514, UA514 +515, UA515 +516, UA516 +517, UA517 +518, UA518 +519, UA519 +520, UA520 +521, UA521 +522, UA522 +523, UA523 +524, UA524 +525, UA525 +526, UA526 +527, UA527 +528, UA528 +529, UA529 +530, UA530 +531, UA531 +532, UA532 +533, UA533 +534, UA534 +535, UA535 +536, UA536 +537, UA537 +538, UA538 +539, UA539 +540, UA540 +541, UA541 +542, UA542 +543, UA543 +544, UA544 +545, UA545 +546, UA546 +547, UA547 +548, UA548 +549, UA549 +550, UA550 +551, UA551 +552, UA552 +553, UA553 +554, UA554 +555, UA555 +556, UA556 +557, UA557 +558, UA558 +559, UA559 +560, UA560 +561, UA561 +562, UA562 +563, UA563 +564, UA564 +565, UA565 +566, UA566 +567, UA567 +568, UA568 +569, UA569 +570, UA570 +571, UA571 +572, UA572 +573, UA573 +574, UA574 +575, UA575 +576, UA576 +577, UA577 +578, UA578 +579, UA579 +580, UA580 +581, UA581 +582, UA582 +583, UA583 +584, UA584 +585, UA585 +586, UA586 +587, UA587 +588, UA588 +589, UA589 +590, UA590 +591, UA591 +592, UA592 +593, UA593 +594, UA594 +595, UA595 +596, UA596 +597, UA597 +598, UA598 +599, UA599 +600, UA600 +601, UA601 +602, UA602 +603, UA603 +604, UA604 +605, UA605 +606, UA606 +607, UA607 +608, UA608 +609, UA609 +610, UA610 +611, UA611 +612, UA612 +613, UA613 +614, UA614 +615, UA615 +616, UA616 +617, UA617 +618, UA618 +619, UA619 +620, UA620 +621, UA621 +622, UA622 +623, UA623 +624, UA624 +625, UA625 +626, UA626 +627, UA627 +628, UA628 +629, UA629 +630, UA630 +631, UA631 +632, UA632 +633, UA633 +634, UA634 +635, UA635 +636, UA636 +637, UA637 +638, UA638 +639, UA639 +640, UA640 +641, UA641 +642, UA642 +643, UA643 +644, UA644 +645, UA645 +646, UA646 +647, UA647 +648, UA648 +649, UA649 +650, UA650 +651, UA651 +652, UA652 +653, UA653 +654, UA654 +655, UA655 +656, UA656 +657, UA657 +658, UA658 +659, UA659 +660, UA660 +661, UA661 +662, UA662 +663, UA663 +664, UA664 +665, UA665 +666, UA666 +667, UA667 +668, UA668 +669, UA669 +670, UA670 +671, UA671 +672, UA672 +673, UA673 +674, UA674 +675, UA675 +676, UA676 +677, UA677 +678, UA678 +679, UA679 +680, UA680 +681, UA681 +682, UA682 +683, UA683 +684, UA684 +685, UA685 +686, UA686 +687, UA687 +688, UA688 +689, UA689 +690, UA690 +691, UA691 +692, UA692 +693, UA693 +694, UA694 +695, UA695 +696, UA696 +697, UA697 +698, UA698 +699, UA699 +700, UA700 +701, UA701 +702, UA702 +703, UA703 +704, UA704 +705, UA705 +706, UA706 +707, UA707 +708, UA708 +709, UA709 +710, UA710 +711, UA711 +712, UA712 +713, UA713 +714, UA714 +715, UA715 +716, UA716 +717, UA717 +718, UA718 +719, UA719 +720, UA720 +721, UA721 +722, UA722 +723, UA723 +724, UA724 +725, UA725 +726, UA726 +727, UA727 +728, UA728 +729, UA729 +730, UA730 +731, UA731 +732, UA732 +733, UA733 +734, UA734 +735, UA735 +736, UA736 +737, UA737 +738, UA738 +739, UA739 +740, UA740 +741, UA741 +742, UA742 +743, UA743 +744, UA744 +745, UA745 +746, UA746 +747, UA747 +748, UA748 +749, UA749 +750, UA750 +751, UA751 +752, UA752 +753, UA753 +754, UA754 +755, UA755 +756, UA756 +757, UA757 +758, UA758 +759, UA759 +760, UA760 +761, UA761 +762, UA762 +763, UA763 +764, UA764 +765, UA765 +766, UA766 +767, UA767 +768, UA768 +769, UA769 +770, UA770 +771, UA771 +772, UA772 +773, UA773 +774, UA774 +775, UA775 +776, UA776 +777, UA777 +778, UA778 +779, UA779 +780, UA780 +781, UA781 +782, UA782 +783, UA783 +784, UA784 +785, UA785 +786, UA786 +787, UA787 +788, UA788 +789, UA789 +790, UA790 +791, UA791 +792, UA792 +793, UA793 +794, UA794 +795, UA795 +796, UA796 +797, UA797 +798, UA798 +799, UA799 +800, UA800 +801, UA801 +802, UA802 +803, UA803 +804, UA804 +805, UA805 +806, UA806 +807, UA807 +808, UA808 +809, UA809 +810, UA810 +811, UA811 +812, UA812 +813, UA813 +814, UA814 +815, UA815 +816, UA816 +817, UA817 +818, UA818 +819, UA819 +820, UA820 +821, UA821 +822, UA822 +823, UA823 +824, UA824 +825, UA825 +826, UA826 +827, UA827 +828, UA828 +829, UA829 +830, UA830 +831, UA831 +832, UA832 +833, UA833 +834, UA834 +835, UA835 +836, UA836 +837, UA837 +838, UA838 +839, UA839 +840, UA840 +841, UA841 +842, UA842 +843, UA843 +844, UA844 +845, UA845 +846, UA846 +847, UA847 +848, UA848 +849, UA849 +850, UA850 +851, UA851 +852, UA852 +853, UA853 +854, UA854 +855, UA855 +856, UA856 +857, UA857 +858, UA858 +859, UA859 +860, UA860 +861, UA861 +862, UA862 +863, UA863 +864, UA864 +865, UA865 +866, UA866 +867, UA867 +868, UA868 +869, UA869 +870, UA870 +871, UA871 +872, UA872 +873, UA873 +874, UA874 +875, UA875 +876, UA876 +877, UA877 +878, UA878 +879, UA879 +880, UA880 +881, UA881 +882, UA882 +883, UA883 +884, UA884 +885, UA885 +886, UA886 +887, UA887 +888, UA888 +889, UA889 +890, UA890 +891, UA891 +892, UA892 +893, UA893 +894, UA894 +895, UA895 +896, UA896 +897, UA897 +898, UA898 +899, UA899 +900, UA900 +901, UA901 +902, UA902 +903, UA903 +904, UA904 +905, UA905 +906, UA906 +907, UA907 +908, UA908 +909, UA909 +910, UA910 +911, UA911 +912, UA912 +913, UA913 +914, UA914 +915, UA915 +916, UA916 +917, UA917 +918, UA918 +919, UA919 +920, UA920 +921, UA921 +922, UA922 +923, UA923 +924, UA924 +925, UA925 +926, UA926 +927, UA927 +928, UA928 +929, UA929 +930, UA930 +931, UA931 +932, UA932 +933, UA933 +934, UA934 +935, UA935 +936, UA936 +937, UA937 +938, UA938 +939, UA939 +940, UA940 +941, UA941 +942, UA942 +943, UA943 +944, UA944 +945, UA945 +946, UA946 +947, UA947 +948, UA948 +949, UA949 +950, UA950 +951, UA951 +952, UA952 +953, UA953 +954, UA954 +955, UA955 +956, UA956 +957, UA957 +958, UA958 +959, UA959 +960, UA960 +961, UA961 +962, UA962 +963, UA963 +964, UA964 +965, UA965 +966, UA966 +967, UA967 +968, UA968 +969, UA969 +970, UA970 +971, UA971 +972, UA972 +973, UA973 +974, UA974 +975, UA975 +976, UA976 +977, UA977 +978, UA978 +979, UA979 +980, UA980 +981, UA981 +982, UA982 +983, UA983 +984, UA984 +985, UA985 +986, UA986 +987, UA987 +988, UA988 +989, UA989 +990, UA990 +991, UA991 +992, UA992 +993, UA993 +994, UA994 +995, UA995 +996, UA996 +997, UA997 +998, UA998 +999, UA999 +1000, UA1000 +1001, UA1001 +1002, UA1002 +1003, UA1003 +1004, UA1004 +1005, UA1005 +1006, UA1006 +1007, UA1007 +1008, UA1008 +1009, UA1009 +1010, UA1010 +1011, UA1011 +1012, UA1012 +1013, UA1013 +1014, UA1014 +1015, UA1015 +1016, UA1016 +1017, UA1017 +1018, UA1018 +1019, UA1019 +1020, UA1020 +1021, UA1021 +1022, UA1022 +1023, UA1023 +1024, UA1024 +1025, UA1025 +1026, UA1026 +1027, UA1027 +1028, UA1028 +1029, UA1029 +1030, UA1030 +1031, UA1031 +1032, UA1032 +1033, UA1033 +1034, UA1034 +1035, UA1035 +1036, UA1036 +1037, UA1037 +1038, UA1038 +1039, UA1039 +1040, UA1040 +1041, UA1041 +1042, UA1042 +1043, UA1043 +1044, UA1044 +1045, UA1045 +1046, UA1046 +1047, UA1047 +1048, UA1048 +1049, UA1049 +1050, UA1050 +1051, UA1051 +1052, UA1052 +1053, UA1053 +1054, UA1054 +1055, UA1055 +1056, UA1056 +1057, UA1057 +1058, UA1058 +1059, UA1059 +1060, UA1060 +1061, UA1061 +1062, UA1062 +1063, UA1063 +1064, UA1064 +1065, UA1065 +1066, UA1066 +1067, UA1067 +1068, UA1068 +1069, UA1069 +1070, UA1070 +1071, UA1071 +1072, UA1072 +1073, UA1073 +1074, UA1074 +1075, UA1075 +1076, UA1076 +1077, UA1077 +1078, UA1078 +1079, UA1079 +1080, UA1080 +1081, UA1081 +1082, UA1082 +1083, UA1083 +1084, UA1084 +1085, UA1085 +1086, UA1086 +1087, UA1087 +1088, UA1088 +1089, UA1089 +1090, UA1090 +1091, UA1091 +1092, UA1092 +1093, UA1093 +1094, UA1094 +1095, UA1095 +1096, UA1096 +1097, UA1097 +1098, UA1098 +1099, UA1099 +1100, UA1100 +1101, UA1101 +1102, UA1102 +1103, UA1103 +1104, UA1104 +1105, UA1105 +1106, UA1106 +1107, UA1107 +1108, UA1108 +1109, UA1109 +1110, UA1110 +1111, UA1111 +1112, UA1112 +1113, UA1113 +1114, UA1114 +1115, UA1115 +1116, UA1116 +1117, UA1117 +1118, UA1118 +1119, UA1119 +1120, UA1120 +1121, UA1121 +1122, UA1122 +1123, UA1123 +1124, UA1124 +1125, UA1125 +1126, UA1126 +1127, UA1127 +1128, UA1128 +1129, UA1129 +1130, UA1130 +1131, UA1131 +1132, UA1132 +1133, UA1133 +1134, UA1134 +1135, UA1135 +1136, UA1136 +1137, UA1137 +1138, UA1138 +1139, UA1139 +1140, UA1140 +1141, UA1141 +1142, UA1142 +1143, UA1143 +1144, UA1144 +1145, UA1145 +1146, UA1146 +1147, UA1147 +1148, UA1148 +1149, UA1149 +1150, UA1150 +1151, UA1151 +1152, UA1152 +1153, UA1153 +1154, UA1154 +1155, UA1155 +1156, UA1156 +1157, UA1157 +1158, UA1158 +1159, UA1159 +1160, UA1160 +1161, UA1161 +1162, UA1162 +1163, UA1163 +1164, UA1164 +1165, UA1165 +1166, UA1166 +1167, UA1167 +1168, UA1168 +1169, UA1169 +1170, UA1170 +1171, UA1171 +1172, UA1172 +1173, UA1173 +1174, UA1174 +1175, UA1175 +1176, UA1176 +1177, UA1177 +1178, UA1178 +1179, UA1179 +1180, UA1180 +1181, UA1181 +1182, UA1182 +1183, UA1183 +1184, UA1184 +1185, UA1185 +1186, UA1186 +1187, UA1187 +1188, UA1188 +1189, UA1189 +1190, UA1190 +1191, UA1191 +1192, UA1192 +1193, UA1193 +1194, UA1194 +1195, UA1195 +1196, UA1196 +1197, UA1197 +1198, UA1198 +1199, UA1199 +1200, UA1200 +1201, UA1201 +1202, UA1202 +1203, UA1203 +1204, UA1204 +1205, UA1205 +1206, UA1206 +1207, UA1207 +1208, UA1208 +1209, UA1209 +1210, UA1210 +1211, UA1211 +1212, UA1212 +1213, UA1213 +1214, UA1214 +1215, UA1215 +1216, UA1216 +1217, UA1217 +1218, UA1218 +1219, UA1219 +1220, UA1220 +1221, UA1221 +1222, UA1222 +1223, UA1223 +1224, UA1224 +1225, UA1225 +1226, UA1226 +1227, UA1227 +1228, UA1228 +1229, UA1229 +1230, UA1230 +1231, UA1231 +1232, UA1232 +1233, UA1233 +1234, UA1234 +1235, UA1235 +1236, UA1236 +1237, UA1237 +1238, UA1238 +1239, UA1239 +1240, UA1240 +1241, UA1241 +1242, UA1242 +1243, UA1243 +1244, UA1244 +1245, UA1245 +1246, UA1246 +1247, UA1247 +1248, UA1248 +1249, UA1249 +1250, UA1250 +1251, UA1251 +1252, UA1252 +1253, UA1253 +1254, UA1254 +1255, UA1255 +1256, UA1256 +1257, UA1257 +1258, UA1258 +1259, UA1259 +1260, UA1260 +1261, UA1261 +1262, UA1262 +1263, UA1263 +1264, UA1264 +1265, UA1265 +1266, UA1266 +1267, UA1267 +1268, UA1268 +1269, UA1269 +1270, UA1270 +1271, UA1271 +1272, UA1272 +1273, UA1273 +1274, UA1274 +1275, UA1275 +1276, UA1276 +1277, UA1277 +1278, UA1278 +1279, UA1279 +1280, UA1280 +1281, UA1281 +1282, UA1282 +1283, UA1283 +1284, UA1284 +1285, UA1285 +1286, UA1286 +1287, UA1287 +1288, UA1288 +1289, UA1289 +1290, UA1290 +1291, UA1291 +1292, UA1292 +1293, UA1293 +1294, UA1294 +1295, UA1295 +1296, UA1296 +1297, UA1297 +1298, UA1298 +1299, UA1299 +1300, UA1300 +1301, UA1301 +1302, UA1302 +1303, UA1303 +1304, UA1304 +1305, UA1305 +1306, UA1306 +1307, UA1307 +1308, UA1308 +1309, UA1309 +1310, UA1310 +1311, UA1311 +1312, UA1312 +1313, UA1313 +1314, UA1314 +1315, UA1315 +1316, UA1316 +1317, UA1317 +1318, UA1318 +1319, UA1319 +1320, UA1320 +1321, UA1321 +1322, UA1322 +1323, UA1323 +1324, UA1324 +1325, UA1325 +1326, UA1326 +1327, UA1327 +1328, UA1328 +1329, UA1329 +1330, UA1330 +1331, UA1331 +1332, UA1332 +1333, UA1333 +1334, UA1334 +1335, UA1335 +1336, UA1336 +1337, UA1337 +1338, UA1338 +1339, UA1339 +1340, UA1340 +1341, UA1341 +1342, UA1342 +1343, UA1343 +1344, UA1344 +1345, UA1345 +1346, UA1346 +1347, UA1347 +1348, UA1348 +1349, UA1349 +1350, UA1350 +1351, UA1351 +1352, UA1352 +1353, UA1353 +1354, UA1354 +1355, UA1355 +1356, UA1356 +1357, UA1357 +1358, UA1358 +1359, UA1359 +1360, UA1360 +1361, UA1361 +1362, UA1362 +1363, UA1363 +1364, UA1364 +1365, UA1365 +1366, UA1366 +1367, UA1367 +1368, UA1368 +1369, UA1369 +1370, UA1370 +1371, UA1371 +1372, UA1372 +1373, UA1373 +1374, UA1374 +1375, UA1375 +1376, UA1376 +1377, UA1377 +1378, UA1378 +1379, UA1379 +1380, UA1380 +1381, UA1381 +1382, UA1382 +1383, UA1383 +1384, UA1384 +1385, UA1385 +1386, UA1386 +1387, UA1387 +1388, UA1388 +1389, UA1389 +1390, UA1390 +1391, UA1391 +1392, UA1392 +1393, UA1393 +1394, UA1394 +1395, UA1395 +1396, UA1396 +1397, UA1397 +1398, UA1398 +1399, UA1399 +1400, UA1400 +1401, UA1401 +1402, UA1402 +1403, UA1403 +1404, UA1404 +1405, UA1405 +1406, UA1406 +1407, UA1407 +1408, UA1408 +1409, UA1409 +1410, UA1410 +1411, UA1411 +1412, UA1412 +1413, UA1413 +1414, UA1414 +1415, UA1415 +1416, UA1416 +1417, UA1417 +1418, UA1418 +1419, UA1419 +1420, UA1420 +1421, UA1421 +1422, UA1422 +1423, UA1423 +1424, UA1424 +1425, UA1425 +1426, UA1426 +1427, UA1427 +1428, UA1428 +1429, UA1429 +1430, UA1430 +1431, UA1431 +1432, UA1432 +1433, UA1433 +1434, UA1434 +1435, UA1435 +1436, UA1436 +1437, UA1437 +1438, UA1438 +1439, UA1439 +1440, UA1440 +1441, UA1441 +1442, UA1442 +1443, UA1443 +1444, UA1444 +1445, UA1445 +1446, UA1446 +1447, UA1447 +1448, UA1448 +1449, UA1449 +1450, UA1450 +1451, UA1451 +1452, UA1452 +1453, UA1453 +1454, UA1454 +1455, UA1455 +1456, UA1456 +1457, UA1457 +1458, UA1458 +1459, UA1459 +1460, UA1460 +1461, UA1461 +1462, UA1462 +1463, UA1463 +1464, UA1464 +1465, UA1465 +1466, UA1466 +1467, UA1467 +1468, UA1468 +1469, UA1469 +1470, UA1470 +1471, UA1471 +1472, UA1472 +1473, UA1473 +1474, UA1474 +1475, UA1475 +1476, UA1476 +1477, UA1477 +1478, UA1478 +1479, UA1479 +1480, UA1480 +1481, UA1481 +1482, UA1482 +1483, UA1483 +1484, UA1484 +1485, UA1485 +1486, UA1486 +1487, UA1487 +1488, UA1488 +1489, UA1489 +1490, UA1490 +1491, UA1491 +1492, UA1492 +1493, UA1493 +1494, UA1494 +1495, UA1495 +1496, UA1496 +1497, UA1497 +1498, UA1498 +1499, UA1499 +1500, UA1500 +1501, UA1501 +1502, UA1502 +1503, UA1503 +1504, UA1504 +1505, UA1505 +1506, UA1506 +1507, UA1507 +1508, UA1508 +1509, UA1509 +1510, UA1510 +1511, UA1511 +1512, UA1512 +1513, UA1513 +1514, UA1514 +1515, UA1515 +1516, UA1516 +1517, UA1517 +1518, UA1518 +1519, UA1519 +1520, UA1520 +1521, UA1521 +1522, UA1522 +1523, UA1523 +1524, UA1524 +1525, UA1525 +1526, UA1526 +1527, UA1527 +1528, UA1528 +1529, UA1529 +1530, UA1530 +1531, UA1531 +1532, UA1532 +1533, UA1533 +1534, UA1534 +1535, UA1535 +1536, UA1536 +1537, UA1537 +1538, UA1538 +1539, UA1539 +1540, UA1540 +1541, UA1541 +1542, UA1542 +1543, UA1543 +1544, UA1544 +1545, UA1545 +1546, UA1546 +1547, UA1547 +1548, UA1548 +1549, UA1549 +1550, UA1550 +1551, UA1551 +1552, UA1552 +1553, UA1553 +1554, UA1554 +1555, UA1555 +1556, UA1556 +1557, UA1557 +1558, UA1558 +1559, UA1559 +1560, UA1560 +1561, UA1561 +1562, UA1562 +1563, UA1563 +1564, UA1564 +1565, UA1565 +1566, UA1566 +1567, UA1567 +1568, UA1568 +1569, UA1569 +1570, UA1570 +1571, UA1571 +1572, UA1572 +1573, UA1573 +1574, UA1574 +1575, UA1575 +1576, UA1576 +1577, UA1577 +1578, UA1578 +1579, UA1579 +1580, UA1580 +1581, UA1581 +1582, UA1582 +1583, UA1583 +1584, UA1584 +1585, UA1585 +1586, UA1586 +1587, UA1587 +1588, UA1588 +1589, UA1589 +1590, UA1590 +1591, UA1591 +1592, UA1592 +1593, UA1593 +1594, UA1594 +1595, UA1595 +1596, UA1596 +1597, UA1597 +1598, UA1598 +1599, UA1599 +1600, UA1600 +1601, UA1601 +1602, UA1602 +1603, UA1603 +1604, UA1604 +1605, UA1605 +1606, UA1606 +1607, UA1607 +1608, UA1608 +1609, UA1609 +1610, UA1610 +1611, UA1611 +1612, UA1612 +1613, UA1613 +1614, UA1614 +1615, UA1615 +1616, UA1616 +1617, UA1617 +1618, UA1618 +1619, UA1619 +1620, UA1620 +1621, UA1621 +1622, UA1622 +1623, UA1623 +1624, UA1624 +1625, UA1625 +1626, UA1626 +1627, UA1627 +1628, UA1628 +1629, UA1629 +1630, UA1630 +1631, UA1631 +1632, UA1632 +1633, UA1633 +1634, UA1634 +1635, UA1635 +1636, UA1636 +1637, UA1637 +1638, UA1638 +1639, UA1639 +1640, UA1640 +1641, UA1641 +1642, UA1642 +1643, UA1643 +1644, UA1644 +1645, UA1645 +1646, UA1646 +1647, UA1647 +1648, UA1648 +1649, UA1649 +1650, UA1650 +1651, UA1651 +1652, UA1652 +1653, UA1653 +1654, UA1654 +1655, UA1655 +1656, UA1656 +1657, UA1657 +1658, UA1658 +1659, UA1659 +1660, UA1660 +1661, UA1661 +1662, UA1662 +1663, UA1663 +1664, UA1664 +1665, UA1665 +1666, UA1666 +1667, UA1667 +1668, UA1668 +1669, UA1669 +1670, UA1670 +1671, UA1671 +1672, UA1672 +1673, UA1673 +1674, UA1674 +1675, UA1675 +1676, UA1676 +1677, UA1677 +1678, UA1678 +1679, UA1679 +1680, UA1680 +1681, UA1681 +1682, UA1682 +1683, UA1683 +1684, UA1684 +1685, UA1685 +1686, UA1686 +1687, UA1687 +1688, UA1688 +1689, UA1689 +1690, UA1690 +1691, UA1691 +1692, UA1692 +1693, UA1693 +1694, UA1694 +1695, UA1695 +1696, UA1696 +1697, UA1697 +1698, UA1698 +1699, UA1699 +1700, UA1700 +1701, UA1701 +1702, UA1702 +1703, UA1703 +1704, UA1704 +1705, UA1705 +1706, UA1706 +1707, UA1707 +1708, UA1708 +1709, UA1709 +1710, UA1710 +1711, UA1711 +1712, UA1712 +1713, UA1713 +1714, UA1714 +1715, UA1715 +1716, UA1716 +1717, UA1717 +1718, UA1718 +1719, UA1719 +1720, UA1720 +1721, UA1721 +1722, UA1722 +1723, UA1723 +1724, UA1724 +1725, UA1725 +1726, UA1726 +1727, UA1727 +1728, UA1728 +1729, UA1729 +1730, UA1730 +1731, UA1731 +1732, UA1732 +1733, UA1733 +1734, UA1734 +1735, UA1735 +1736, UA1736 +1737, UA1737 +1738, UA1738 +1739, UA1739 +1740, UA1740 +1741, UA1741 +1742, UA1742 +1743, UA1743 +1744, UA1744 +1745, UA1745 +1746, UA1746 +1747, UA1747 +1748, UA1748 +1749, UA1749 +1750, UA1750 +1751, UA1751 +1752, UA1752 +1753, UA1753 +1754, UA1754 +1755, UA1755 +1756, UA1756 +1757, UA1757 +1758, UA1758 +1759, UA1759 +1760, UA1760 +1761, UA1761 +1762, UA1762 +1763, UA1763 +1764, UA1764 +1765, UA1765 +1766, UA1766 +1767, UA1767 +1768, UA1768 +1769, UA1769 +1770, UA1770 +1771, UA1771 +1772, UA1772 +1773, UA1773 +1774, UA1774 +1775, UA1775 +1776, UA1776 +1777, UA1777 +1778, UA1778 +1779, UA1779 +1780, UA1780 +1781, UA1781 +1782, UA1782 +1783, UA1783 +1784, UA1784 +1785, UA1785 +1786, UA1786 +1787, UA1787 +1788, UA1788 +1789, UA1789 +1790, UA1790 +1791, UA1791 +1792, UA1792 +1793, UA1793 +1794, UA1794 +1795, UA1795 +1796, UA1796 +1797, UA1797 +1798, UA1798 +1799, UA1799 +1800, UA1800 +1801, UA1801 +1802, UA1802 +1803, UA1803 +1804, UA1804 +1805, UA1805 +1806, UA1806 +1807, UA1807 +1808, UA1808 +1809, UA1809 +1810, UA1810 +1811, UA1811 +1812, UA1812 +1813, UA1813 +1814, UA1814 +1815, UA1815 +1816, UA1816 +1817, UA1817 +1818, UA1818 +1819, UA1819 +1820, UA1820 +1821, UA1821 +1822, UA1822 +1823, UA1823 +1824, UA1824 +1825, UA1825 +1826, UA1826 +1827, UA1827 +1828, UA1828 +1829, UA1829 +1830, UA1830 +1831, UA1831 +1832, UA1832 +1833, UA1833 +1834, UA1834 +1835, UA1835 +1836, UA1836 +1837, UA1837 +1838, UA1838 +1839, UA1839 +1840, UA1840 +1841, UA1841 +1842, UA1842 +1843, UA1843 +1844, UA1844 +1845, UA1845 +1846, UA1846 +1847, UA1847 +1848, UA1848 +1849, UA1849 +1850, UA1850 +1851, UA1851 +1852, UA1852 +1853, UA1853 +1854, UA1854 +1855, UA1855 +1856, UA1856 +1857, UA1857 +1858, UA1858 +1859, UA1859 +1860, UA1860 +1861, UA1861 +1862, UA1862 +1863, UA1863 +1864, UA1864 +1865, UA1865 +1866, UA1866 +1867, UA1867 +1868, UA1868 +1869, UA1869 +1870, UA1870 +1871, UA1871 +1872, UA1872 +1873, UA1873 +1874, UA1874 +1875, UA1875 +1876, UA1876 +1877, UA1877 +1878, UA1878 +1879, UA1879 +1880, UA1880 +1881, UA1881 +1882, UA1882 +1883, UA1883 +1884, UA1884 +1885, UA1885 +1886, UA1886 +1887, UA1887 +1888, UA1888 +1889, UA1889 +1890, UA1890 +1891, UA1891 +1892, UA1892 +1893, UA1893 +1894, UA1894 +1895, UA1895 +1896, UA1896 +1897, UA1897 +1898, UA1898 +1899, UA1899 +1900, UA1900 +1901, UA1901 +1902, UA1902 +1903, UA1903 +1904, UA1904 +1905, UA1905 +1906, UA1906 +1907, UA1907 +1908, UA1908 +1909, UA1909 +1910, UA1910 +1911, UA1911 +1912, UA1912 +1913, UA1913 +1914, UA1914 +1915, UA1915 +1916, UA1916 +1917, UA1917 +1918, UA1918 +1919, UA1919 +1920, UA1920 +1921, UA1921 +1922, UA1922 +1923, UA1923 +1924, UA1924 +1925, UA1925 +1926, UA1926 +1927, UA1927 +1928, UA1928 +1929, UA1929 +1930, UA1930 +1931, UA1931 +1932, UA1932 +1933, UA1933 +1934, UA1934 +1935, UA1935 +1936, UA1936 +1937, UA1937 +1938, UA1938 +1939, UA1939 +1940, UA1940 +1941, UA1941 +1942, UA1942 +1943, UA1943 +1944, UA1944 +1945, UA1945 +1946, UA1946 +1947, UA1947 +1948, UA1948 +1949, UA1949 +1950, UA1950 +1951, UA1951 +1952, UA1952 +1953, UA1953 +1954, UA1954 +1955, UA1955 +1956, UA1956 +1957, UA1957 +1958, UA1958 +1959, UA1959 +1960, UA1960 +1961, UA1961 +1962, UA1962 +1963, UA1963 +1964, UA1964 +1965, UA1965 +1966, UA1966 +1967, UA1967 +1968, UA1968 +1969, UA1969 +1970, UA1970 +1971, UA1971 +1972, UA1972 +1973, UA1973 +1974, UA1974 +1975, UA1975 +1976, UA1976 +1977, UA1977 +1978, UA1978 +1979, UA1979 +1980, UA1980 +1981, UA1981 +1982, UA1982 +1983, UA1983 +1984, UA1984 +1985, UA1985 +1986, UA1986 +1987, UA1987 +1988, UA1988 +1989, UA1989 +1990, UA1990 +1991, UA1991 +1992, UA1992 +1993, UA1993 +1994, UA1994 +1995, UA1995 +1996, UA1996 +1997, UA1997 +1998, UA1998 +1999, UA1999 +2000, UA2000 +2001, UA2001 +2002, UA2002 +2003, UA2003 +2004, UA2004 +2005, UA2005 +2006, UA2006 +2007, UA2007 +2008, UA2008 +2009, UA2009 +2010, UA2010 +2011, UA2011 +2012, UA2012 +2013, UA2013 +2014, UA2014 +2015, UA2015 +2016, UA2016 +2017, UA2017 +2018, UA2018 +2019, UA2019 +2020, UA2020 +2021, UA2021 +2022, UA2022 +2023, UA2023 +2024, UA2024 +2025, UA2025 +2026, UA2026 +2027, UA2027 +2028, UA2028 +2029, UA2029 +2030, UA2030 +2031, UA2031 +2032, UA2032 +2033, UA2033 +2034, UA2034 +2035, UA2035 +2036, UA2036 +2037, UA2037 +2038, UA2038 +2039, UA2039 +2040, UA2040 +2041, UA2041 +2042, UA2042 +2043, UA2043 +2044, UA2044 +2045, UA2045 +2046, UA2046 +2047, UA2047 +2048, UA2048 +2049, UA2049 +2050, UA2050 +2051, UA2051 +2052, UA2052 +2053, UA2053 +2054, UA2054 +2055, UA2055 +2056, UA2056 +2057, UA2057 +2058, UA2058 +2059, UA2059 +2060, UA2060 +2061, UA2061 +2062, UA2062 +2063, UA2063 +2064, UA2064 +2065, UA2065 +2066, UA2066 +2067, UA2067 +2068, UA2068 +2069, UA2069 +2070, UA2070 +2071, UA2071 +2072, UA2072 +2073, UA2073 +2074, UA2074 +2075, UA2075 +2076, UA2076 +2077, UA2077 +2078, UA2078 +2079, UA2079 +2080, UA2080 +2081, UA2081 +2082, UA2082 +2083, UA2083 +2084, UA2084 +2085, UA2085 +2086, UA2086 +2087, UA2087 +2088, UA2088 +2089, UA2089 +2090, UA2090 +2091, UA2091 +2092, UA2092 +2093, UA2093 +2094, UA2094 +2095, UA2095 +2096, UA2096 +2097, UA2097 +2098, UA2098 +2099, UA2099 +2100, UA2100 +2101, UA2101 +2102, UA2102 +2103, UA2103 +2104, UA2104 +2105, UA2105 +2106, UA2106 +2107, UA2107 +2108, UA2108 +2109, UA2109 +2110, UA2110 +2111, UA2111 +2112, UA2112 +2113, UA2113 +2114, UA2114 +2115, UA2115 +2116, UA2116 +2117, UA2117 +2118, UA2118 +2119, UA2119 +2120, UA2120 +2121, UA2121 +2122, UA2122 +2123, UA2123 +2124, UA2124 +2125, UA2125 +2126, UA2126 +2127, UA2127 +2128, UA2128 +2129, UA2129 +2130, UA2130 +2131, UA2131 +2132, UA2132 +2133, UA2133 +2134, UA2134 +2135, UA2135 +2136, UA2136 +2137, UA2137 +2138, UA2138 +2139, UA2139 +2140, UA2140 +2141, UA2141 +2142, UA2142 +2143, UA2143 +2144, UA2144 +2145, UA2145 +2146, UA2146 +2147, UA2147 +2148, UA2148 +2149, UA2149 +2150, UA2150 +2151, UA2151 +2152, UA2152 +2153, UA2153 +2154, UA2154 +2155, UA2155 +2156, UA2156 +2157, UA2157 +2158, UA2158 +2159, UA2159 +2160, UA2160 +2161, UA2161 +2162, UA2162 +2163, UA2163 +2164, UA2164 +2165, UA2165 +2166, UA2166 +2167, UA2167 +2168, UA2168 +2169, UA2169 +2170, UA2170 +2171, UA2171 +2172, UA2172 +2173, UA2173 +2174, UA2174 +2175, UA2175 +2176, UA2176 +2177, UA2177 +2178, UA2178 +2179, UA2179 +2180, UA2180 +2181, UA2181 +2182, UA2182 +2183, UA2183 +2184, UA2184 +2185, UA2185 +2186, UA2186 +2187, UA2187 +2188, UA2188 +2189, UA2189 +2190, UA2190 +2191, UA2191 +2192, UA2192 +2193, UA2193 +2194, UA2194 +2195, UA2195 +2196, UA2196 +2197, UA2197 +2198, UA2198 +2199, UA2199 +2200, UA2200 +2201, UA2201 +2202, UA2202 +2203, UA2203 +2204, UA2204 +2205, UA2205 +2206, UA2206 +2207, UA2207 +2208, UA2208 +2209, UA2209 +2210, UA2210 +2211, UA2211 +2212, UA2212 +2213, UA2213 +2214, UA2214 +2215, UA2215 +2216, UA2216 +2217, UA2217 +2218, UA2218 +2219, UA2219 +2220, UA2220 +2221, UA2221 +2222, UA2222 +2223, UA2223 +2224, UA2224 +2225, UA2225 +2226, UA2226 +2227, UA2227 +2228, UA2228 +2229, UA2229 +2230, UA2230 +2231, UA2231 +2232, UA2232 +2233, UA2233 +2234, UA2234 +2235, UA2235 +2236, UA2236 +2237, UA2237 +2238, UA2238 +2239, UA2239 +2240, UA2240 +2241, UA2241 +2242, UA2242 +2243, UA2243 +2244, UA2244 +2245, UA2245 +2246, UA2246 +2247, UA2247 +2248, UA2248 +2249, UA2249 +2250, UA2250 +2251, UA2251 +2252, UA2252 +2253, UA2253 +2254, UA2254 +2255, UA2255 +2256, UA2256 +2257, UA2257 +2258, UA2258 +2259, UA2259 +2260, UA2260 +2261, UA2261 +2262, UA2262 +2263, UA2263 +2264, UA2264 +2265, UA2265 +2266, UA2266 +2267, UA2267 +2268, UA2268 +2269, UA2269 +2270, UA2270 +2271, UA2271 +2272, UA2272 +2273, UA2273 +2274, UA2274 +2275, UA2275 +2276, UA2276 +2277, UA2277 +2278, UA2278 +2279, UA2279 +2280, UA2280 +2281, UA2281 +2282, UA2282 +2283, UA2283 +2284, UA2284 +2285, UA2285 +2286, UA2286 +2287, UA2287 +2288, UA2288 +2289, UA2289 +2290, UA2290 +2291, UA2291 +2292, UA2292 +2293, UA2293 +2294, UA2294 +2295, UA2295 +2296, UA2296 +2297, UA2297 +2298, UA2298 +2299, UA2299 +2300, UA2300 +2301, UA2301 +2302, UA2302 +2303, UA2303 +2304, UA2304 +2305, UA2305 +2306, UA2306 +2307, UA2307 +2308, UA2308 +2309, UA2309 +2310, UA2310 +2311, UA2311 +2312, UA2312 +2313, UA2313 +2314, UA2314 +2315, UA2315 +2316, UA2316 +2317, UA2317 +2318, UA2318 +2319, UA2319 +2320, UA2320 +2321, UA2321 +2322, UA2322 +2323, UA2323 +2324, UA2324 +2325, UA2325 +2326, UA2326 +2327, UA2327 +2328, UA2328 +2329, UA2329 +2330, UA2330 +2331, UA2331 +2332, UA2332 +2333, UA2333 +2334, UA2334 +2335, UA2335 +2336, UA2336 +2337, UA2337 +2338, UA2338 +2339, UA2339 +2340, UA2340 +2341, UA2341 +2342, UA2342 +2343, UA2343 +2344, UA2344 +2345, UA2345 +2346, UA2346 +2347, UA2347 +2348, UA2348 +2349, UA2349 +2350, UA2350 +2351, UA2351 +2352, UA2352 +2353, UA2353 +2354, UA2354 +2355, UA2355 +2356, UA2356 +2357, UA2357 +2358, UA2358 +2359, UA2359 +2360, UA2360 +2361, UA2361 +2362, UA2362 +2363, UA2363 +2364, UA2364 +2365, UA2365 +2366, UA2366 +2367, UA2367 +2368, UA2368 +2369, UA2369 +2370, UA2370 +2371, UA2371 +2372, UA2372 +2373, UA2373 +2374, UA2374 +2375, UA2375 +2376, UA2376 +2377, UA2377 +2378, UA2378 +2379, UA2379 +2380, UA2380 +2381, UA2381 +2382, UA2382 +2383, UA2383 +2384, UA2384 +2385, UA2385 +2386, UA2386 +2387, UA2387 +2388, UA2388 +2389, UA2389 +2390, UA2390 +2391, UA2391 +2392, UA2392 +2393, UA2393 +2394, UA2394 +2395, UA2395 +2396, UA2396 +2397, UA2397 +2398, UA2398 +2399, UA2399 +2400, UA2400 +2401, UA2401 +2402, UA2402 +2403, UA2403 +2404, UA2404 +2405, UA2405 +2406, UA2406 +2407, UA2407 +2408, UA2408 +2409, UA2409 +2410, UA2410 +2411, UA2411 +2412, UA2412 +2413, UA2413 +2414, UA2414 +2415, UA2415 +2416, UA2416 +2417, UA2417 +2418, UA2418 +2419, UA2419 +2420, UA2420 +2421, UA2421 +2422, UA2422 +2423, UA2423 +2424, UA2424 +2425, UA2425 +2426, UA2426 +2427, UA2427 +2428, UA2428 +2429, UA2429 +2430, UA2430 +2431, UA2431 +2432, UA2432 +2433, UA2433 +2434, UA2434 +2435, UA2435 +2436, UA2436 +2437, UA2437 +2438, UA2438 +2439, UA2439 +2440, UA2440 +2441, UA2441 +2442, UA2442 +2443, UA2443 +2444, UA2444 +2445, UA2445 +2446, UA2446 +2447, UA2447 +2448, UA2448 +2449, UA2449 +2450, UA2450 +2451, UA2451 +2452, UA2452 +2453, UA2453 +2454, UA2454 +2455, UA2455 +2456, UA2456 +2457, UA2457 +2458, UA2458 +2459, UA2459 +2460, UA2460 +2461, UA2461 +2462, UA2462 +2463, UA2463 +2464, UA2464 +2465, UA2465 +2466, UA2466 +2467, UA2467 +2468, UA2468 +2469, UA2469 +2470, UA2470 +2471, UA2471 +2472, UA2472 +2473, UA2473 +2474, UA2474 +2475, UA2475 +2476, UA2476 +2477, UA2477 +2478, UA2478 +2479, UA2479 +2480, UA2480 +2481, UA2481 +2482, UA2482 +2483, UA2483 +2484, UA2484 +2485, UA2485 +2486, UA2486 +2487, UA2487 +2488, UA2488 +2489, UA2489 +2490, UA2490 +2491, UA2491 +2492, UA2492 +2493, UA2493 +2494, UA2494 +2495, UA2495 +2496, UA2496 +2497, UA2497 +2498, UA2498 +2499, UA2499 +2500, UA2500 +2501, UA2501 +2502, UA2502 +2503, UA2503 +2504, UA2504 +2505, UA2505 +2506, UA2506 +2507, UA2507 +2508, UA2508 +2509, UA2509 +2510, UA2510 +2511, UA2511 +2512, UA2512 +2513, UA2513 +2514, UA2514 +2515, UA2515 +2516, UA2516 +2517, UA2517 +2518, UA2518 +2519, UA2519 +2520, UA2520 +2521, UA2521 +2522, UA2522 +2523, UA2523 +2524, UA2524 +2525, UA2525 +2526, UA2526 +2527, UA2527 +2528, UA2528 +2529, UA2529 +2530, UA2530 +2531, UA2531 +2532, UA2532 +2533, UA2533 +2534, UA2534 +2535, UA2535 +2536, UA2536 +2537, UA2537 +2538, UA2538 +2539, UA2539 +2540, UA2540 +2541, UA2541 +2542, UA2542 +2543, UA2543 +2544, UA2544 +2545, UA2545 +2546, UA2546 +2547, UA2547 +2548, UA2548 +2549, UA2549 +2550, UA2550 +2551, UA2551 +2552, UA2552 +2553, UA2553 +2554, UA2554 +2555, UA2555 +2556, UA2556 +2557, UA2557 +2558, UA2558 +2559, UA2559 +2560, UA2560 +2561, UA2561 +2562, UA2562 +2563, UA2563 +2564, UA2564 +2565, UA2565 +2566, UA2566 +2567, UA2567 +2568, UA2568 +2569, UA2569 +2570, UA2570 +2571, UA2571 +2572, UA2572 +2573, UA2573 +2574, UA2574 +2575, UA2575 +2576, UA2576 +2577, UA2577 +2578, UA2578 +2579, UA2579 +2580, UA2580 +2581, UA2581 +2582, UA2582 +2583, UA2583 +2584, UA2584 +2585, UA2585 +2586, UA2586 +2587, UA2587 +2588, UA2588 +2589, UA2589 +2590, UA2590 +2591, UA2591 +2592, UA2592 +2593, UA2593 +2594, UA2594 +2595, UA2595 +2596, UA2596 +2597, UA2597 +2598, UA2598 +2599, UA2599 +2600, UA2600 +2601, UA2601 +2602, UA2602 +2603, UA2603 +2604, UA2604 +2605, UA2605 +2606, UA2606 +2607, UA2607 +2608, UA2608 +2609, UA2609 +2610, UA2610 +2611, UA2611 +2612, UA2612 +2613, UA2613 +2614, UA2614 +2615, UA2615 +2616, UA2616 +2617, UA2617 +2618, UA2618 +2619, UA2619 +2620, UA2620 +2621, UA2621 +2622, UA2622 +2623, UA2623 +2624, UA2624 +2625, UA2625 +2626, UA2626 +2627, UA2627 +2628, UA2628 +2629, UA2629 +2630, UA2630 +2631, UA2631 +2632, UA2632 +2633, UA2633 +2634, UA2634 +2635, UA2635 +2636, UA2636 +2637, UA2637 +2638, UA2638 +2639, UA2639 +2640, UA2640 +2641, UA2641 +2642, UA2642 +2643, UA2643 +2644, UA2644 +2645, UA2645 +2646, UA2646 +2647, UA2647 +2648, UA2648 +2649, UA2649 +2650, UA2650 +2651, UA2651 +2652, UA2652 +2653, UA2653 +2654, UA2654 +2655, UA2655 +2656, UA2656 +2657, UA2657 +2658, UA2658 +2659, UA2659 +2660, UA2660 +2661, UA2661 +2662, UA2662 +2663, UA2663 +2664, UA2664 +2665, UA2665 +2666, UA2666 +2667, UA2667 +2668, UA2668 +2669, UA2669 +2670, UA2670 +2671, UA2671 +2672, UA2672 +2673, UA2673 +2674, UA2674 +2675, UA2675 +2676, UA2676 +2677, UA2677 +2678, UA2678 +2679, UA2679 +2680, UA2680 +2681, UA2681 +2682, UA2682 +2683, UA2683 +2684, UA2684 +2685, UA2685 +2686, UA2686 +2687, UA2687 +2688, UA2688 +2689, UA2689 +2690, UA2690 +2691, UA2691 +2692, UA2692 +2693, UA2693 +2694, UA2694 +2695, UA2695 +2696, UA2696 +2697, UA2697 +2698, UA2698 +2699, UA2699 +2700, UA2700 +2701, UA2701 +2702, UA2702 +2703, UA2703 +2704, UA2704 +2705, UA2705 +2706, UA2706 +2707, UA2707 +2708, UA2708 +2709, UA2709 +2710, UA2710 +2711, UA2711 +2712, UA2712 +2713, UA2713 +2714, UA2714 +2715, UA2715 +2716, UA2716 +2717, UA2717 +2718, UA2718 +2719, UA2719 +2720, UA2720 +2721, UA2721 +2722, UA2722 +2723, UA2723 +2724, UA2724 +2725, UA2725 +2726, UA2726 +2727, UA2727 +2728, UA2728 +2729, UA2729 +2730, UA2730 +2731, UA2731 +2732, UA2732 +2733, UA2733 +2734, UA2734 +2735, UA2735 +2736, UA2736 +2737, UA2737 +2738, UA2738 +2739, UA2739 +2740, UA2740 +2741, UA2741 +2742, UA2742 +2743, UA2743 +2744, UA2744 +2745, UA2745 +2746, UA2746 +2747, UA2747 +2748, UA2748 +2749, UA2749 +2750, UA2750 +2751, UA2751 +2752, UA2752 +2753, UA2753 +2754, UA2754 +2755, UA2755 +2756, UA2756 +2757, UA2757 +2758, UA2758 +2759, UA2759 +2760, UA2760 +2761, UA2761 +2762, UA2762 +2763, UA2763 +2764, UA2764 +2765, UA2765 +2766, UA2766 +2767, UA2767 +2768, UA2768 +2769, UA2769 +2770, UA2770 +2771, UA2771 +2772, UA2772 +2773, UA2773 +2774, UA2774 +2775, UA2775 +2776, UA2776 +2777, UA2777 +2778, UA2778 +2779, UA2779 +2780, UA2780 +2781, UA2781 +2782, UA2782 +2783, UA2783 +2784, UA2784 +2785, UA2785 +2786, UA2786 +2787, UA2787 +2788, UA2788 +2789, UA2789 +2790, UA2790 +2791, UA2791 +2792, UA2792 +2793, UA2793 +2794, UA2794 +2795, UA2795 +2796, UA2796 +2797, UA2797 +2798, UA2798 +2799, UA2799 +2800, UA2800 +2801, UA2801 +2802, UA2802 +2803, UA2803 +2804, UA2804 +2805, UA2805 +2806, UA2806 +2807, UA2807 +2808, UA2808 +2809, UA2809 +2810, UA2810 +2811, UA2811 +2812, UA2812 +2813, UA2813 +2814, UA2814 +2815, UA2815 +2816, UA2816 +2817, UA2817 +2818, UA2818 +2819, UA2819 +2820, UA2820 +2821, UA2821 +2822, UA2822 +2823, UA2823 +2824, UA2824 +2825, UA2825 +2826, UA2826 +2827, UA2827 +2828, UA2828 +2829, UA2829 +2830, UA2830 +2831, UA2831 +2832, UA2832 +2833, UA2833 +2834, UA2834 +2835, UA2835 +2836, UA2836 +2837, UA2837 +2838, UA2838 +2839, UA2839 +2840, UA2840 +2841, UA2841 +2842, UA2842 +2843, UA2843 +2844, UA2844 +2845, UA2845 +2846, UA2846 +2847, UA2847 +2848, UA2848 +2849, UA2849 +2850, UA2850 +2851, UA2851 +2852, UA2852 +2853, UA2853 +2854, UA2854 +2855, UA2855 +2856, UA2856 +2857, UA2857 +2858, UA2858 +2859, UA2859 +2860, UA2860 +2861, UA2861 +2862, UA2862 +2863, UA2863 +2864, UA2864 +2865, UA2865 +2866, UA2866 +2867, UA2867 +2868, UA2868 +2869, UA2869 +2870, UA2870 +2871, UA2871 +2872, UA2872 +2873, UA2873 +2874, UA2874 +2875, UA2875 +2876, UA2876 +2877, UA2877 +2878, UA2878 +2879, UA2879 +2880, UA2880 +2881, UA2881 +2882, UA2882 +2883, UA2883 +2884, UA2884 +2885, UA2885 +2886, UA2886 +2887, UA2887 +2888, UA2888 +2889, UA2889 +2890, UA2890 +2891, UA2891 +2892, UA2892 +2893, UA2893 +2894, UA2894 +2895, UA2895 +2896, UA2896 +2897, UA2897 +2898, UA2898 +2899, UA2899 +2900, UA2900 +2901, UA2901 +2902, UA2902 +2903, UA2903 +2904, UA2904 +2905, UA2905 +2906, UA2906 +2907, UA2907 +2908, UA2908 +2909, UA2909 +2910, UA2910 +2911, UA2911 +2912, UA2912 +2913, UA2913 +2914, UA2914 +2915, UA2915 +2916, UA2916 +2917, UA2917 +2918, UA2918 +2919, UA2919 +2920, UA2920 +2921, UA2921 +2922, UA2922 +2923, UA2923 +2924, UA2924 +2925, UA2925 +2926, UA2926 +2927, UA2927 +2928, UA2928 +2929, UA2929 +2930, UA2930 +2931, UA2931 +2932, UA2932 +2933, UA2933 +2934, UA2934 +2935, UA2935 +2936, UA2936 +2937, UA2937 +2938, UA2938 +2939, UA2939 +2940, UA2940 +2941, UA2941 +2942, UA2942 +2943, UA2943 +2944, UA2944 +2945, UA2945 +2946, UA2946 +2947, UA2947 +2948, UA2948 +2949, UA2949 +2950, UA2950 +2951, UA2951 +2952, UA2952 +2953, UA2953 +2954, UA2954 +2955, UA2955 +2956, UA2956 +2957, UA2957 +2958, UA2958 +2959, UA2959 +2960, UA2960 +2961, UA2961 +2962, UA2962 +2963, UA2963 +2964, UA2964 +2965, UA2965 +2966, UA2966 +2967, UA2967 +2968, UA2968 +2969, UA2969 +2970, UA2970 +2971, UA2971 +2972, UA2972 +2973, UA2973 +2974, UA2974 +2975, UA2975 +2976, UA2976 +2977, UA2977 +2978, UA2978 +2979, UA2979 +2980, UA2980 +2981, UA2981 +2982, UA2982 +2983, UA2983 +2984, UA2984 +2985, UA2985 +2986, UA2986 +2987, UA2987 +2988, UA2988 +2989, UA2989 +2990, UA2990 +2991, UA2991 +2992, UA2992 +2993, UA2993 +2994, UA2994 +2995, UA2995 +2996, UA2996 +2997, UA2997 +2998, UA2998 +2999, UA2999 +3000, UA3000 +3001, UA3001 +3002, UA3002 +3003, UA3003 +3004, UA3004 +3005, UA3005 +3006, UA3006 +3007, UA3007 +3008, UA3008 +3009, UA3009 +3010, UA3010 +3011, UA3011 +3012, UA3012 +3013, UA3013 +3014, UA3014 +3015, UA3015 +3016, UA3016 +3017, UA3017 +3018, UA3018 +3019, UA3019 +3020, UA3020 +3021, UA3021 +3022, UA3022 +3023, UA3023 +3024, UA3024 +3025, UA3025 +3026, UA3026 +3027, UA3027 +3028, UA3028 +3029, UA3029 +3030, UA3030 +3031, UA3031 +3032, UA3032 +3033, UA3033 +3034, UA3034 +3035, UA3035 +3036, UA3036 +3037, UA3037 +3038, UA3038 +3039, UA3039 +3040, UA3040 +3041, UA3041 +3042, UA3042 +3043, UA3043 +3044, UA3044 +3045, UA3045 +3046, UA3046 +3047, UA3047 +3048, UA3048 +3049, UA3049 +3050, UA3050 +3051, UA3051 +3052, UA3052 +3053, UA3053 +3054, UA3054 +3055, UA3055 +3056, UA3056 +3057, UA3057 +3058, UA3058 +3059, UA3059 +3060, UA3060 +3061, UA3061 +3062, UA3062 +3063, UA3063 +3064, UA3064 +3065, UA3065 +3066, UA3066 +3067, UA3067 +3068, UA3068 +3069, UA3069 +3070, UA3070 +3071, UA3071 +3072, UA3072 +3073, UA3073 +3074, UA3074 +3075, UA3075 +3076, UA3076 +3077, UA3077 +3078, UA3078 +3079, UA3079 +3080, UA3080 +3081, UA3081 +3082, UA3082 +3083, UA3083 +3084, UA3084 +3085, UA3085 +3086, UA3086 +3087, UA3087 +3088, UA3088 +3089, UA3089 +3090, UA3090 +3091, UA3091 +3092, UA3092 +3093, UA3093 +3094, UA3094 +3095, UA3095 +3096, UA3096 +3097, UA3097 +3098, UA3098 +3099, UA3099 +3100, UA3100 +3101, UA3101 +3102, UA3102 +3103, UA3103 +3104, UA3104 +3105, UA3105 +3106, UA3106 +3107, UA3107 +3108, UA3108 +3109, UA3109 +3110, UA3110 +3111, UA3111 +3112, UA3112 +3113, UA3113 +3114, UA3114 +3115, UA3115 +3116, UA3116 +3117, UA3117 +3118, UA3118 +3119, UA3119 +3120, UA3120 +3121, UA3121 +3122, UA3122 +3123, UA3123 +3124, UA3124 +3125, UA3125 +3126, UA3126 +3127, UA3127 +3128, UA3128 +3129, UA3129 +3130, UA3130 +3131, UA3131 +3132, UA3132 +3133, UA3133 +3134, UA3134 +3135, UA3135 +3136, UA3136 +3137, UA3137 +3138, UA3138 +3139, UA3139 +3140, UA3140 +3141, UA3141 +3142, UA3142 +3143, UA3143 +3144, UA3144 +3145, UA3145 +3146, UA3146 +3147, UA3147 +3148, UA3148 +3149, UA3149 +3150, UA3150 +3151, UA3151 +3152, UA3152 +3153, UA3153 +3154, UA3154 +3155, UA3155 +3156, UA3156 +3157, UA3157 +3158, UA3158 +3159, UA3159 +3160, UA3160 +3161, UA3161 +3162, UA3162 +3163, UA3163 +3164, UA3164 +3165, UA3165 +3166, UA3166 +3167, UA3167 +3168, UA3168 +3169, UA3169 +3170, UA3170 +3171, UA3171 +3172, UA3172 +3173, UA3173 +3174, UA3174 +3175, UA3175 +3176, UA3176 +3177, UA3177 +3178, UA3178 +3179, UA3179 +3180, UA3180 +3181, UA3181 +3182, UA3182 +3183, UA3183 +3184, UA3184 +3185, UA3185 +3186, UA3186 +3187, UA3187 +3188, UA3188 +3189, UA3189 +3190, UA3190 +3191, UA3191 +3192, UA3192 +3193, UA3193 +3194, UA3194 +3195, UA3195 +3196, UA3196 +3197, UA3197 +3198, UA3198 +3199, UA3199 +3200, UA3200 +3201, UA3201 +3202, UA3202 +3203, UA3203 +3204, UA3204 +3205, UA3205 +3206, UA3206 +3207, UA3207 +3208, UA3208 +3209, UA3209 +3210, UA3210 +3211, UA3211 +3212, UA3212 +3213, UA3213 +3214, UA3214 +3215, UA3215 +3216, UA3216 +3217, UA3217 +3218, UA3218 +3219, UA3219 +3220, UA3220 +3221, UA3221 +3222, UA3222 +3223, UA3223 +3224, UA3224 +3225, UA3225 +3226, UA3226 +3227, UA3227 +3228, UA3228 +3229, UA3229 +3230, UA3230 +3231, UA3231 +3232, UA3232 +3233, UA3233 +3234, UA3234 +3235, UA3235 +3236, UA3236 +3237, UA3237 +3238, UA3238 +3239, UA3239 +3240, UA3240 +3241, UA3241 +3242, UA3242 +3243, UA3243 +3244, UA3244 +3245, UA3245 +3246, UA3246 +3247, UA3247 +3248, UA3248 +3249, UA3249 +3250, UA3250 +3251, UA3251 +3252, UA3252 +3253, UA3253 +3254, UA3254 +3255, UA3255 +3256, UA3256 +3257, UA3257 +3258, UA3258 +3259, UA3259 +3260, UA3260 +3261, UA3261 +3262, UA3262 +3263, UA3263 +3264, UA3264 +3265, UA3265 +3266, UA3266 +3267, UA3267 +3268, UA3268 +3269, UA3269 +3270, UA3270 +3271, UA3271 +3272, UA3272 +3273, UA3273 +3274, UA3274 +3275, UA3275 +3276, UA3276 +3277, UA3277 +3278, UA3278 +3279, UA3279 +3280, UA3280 +3281, UA3281 +3282, UA3282 +3283, UA3283 +3284, UA3284 +3285, UA3285 +3286, UA3286 +3287, UA3287 +3288, UA3288 +3289, UA3289 +3290, UA3290 +3291, UA3291 +3292, UA3292 +3293, UA3293 +3294, UA3294 +3295, UA3295 +3296, UA3296 +3297, UA3297 +3298, UA3298 +3299, UA3299 +3300, UA3300 +3301, UA3301 +3302, UA3302 +3303, UA3303 +3304, UA3304 +3305, UA3305 +3306, UA3306 +3307, UA3307 +3308, UA3308 +3309, UA3309 +3310, UA3310 +3311, UA3311 +3312, UA3312 +3313, UA3313 +3314, UA3314 +3315, UA3315 +3316, UA3316 +3317, UA3317 +3318, UA3318 +3319, UA3319 +3320, UA3320 +3321, UA3321 +3322, UA3322 +3323, UA3323 +3324, UA3324 +3325, UA3325 +3326, UA3326 +3327, UA3327 +3328, UA3328 +3329, UA3329 +3330, UA3330 +3331, UA3331 +3332, UA3332 +3333, UA3333 +3334, UA3334 +3335, UA3335 +3336, UA3336 +3337, UA3337 +3338, UA3338 +3339, UA3339 +3340, UA3340 +3341, UA3341 +3342, UA3342 +3343, UA3343 +3344, UA3344 +3345, UA3345 +3346, UA3346 +3347, UA3347 +3348, UA3348 +3349, UA3349 +3350, UA3350 +3351, UA3351 +3352, UA3352 +3353, UA3353 +3354, UA3354 +3355, UA3355 +3356, UA3356 +3357, UA3357 +3358, UA3358 +3359, UA3359 +3360, UA3360 +3361, UA3361 +3362, UA3362 +3363, UA3363 +3364, UA3364 +3365, UA3365 +3366, UA3366 +3367, UA3367 +3368, UA3368 +3369, UA3369 +3370, UA3370 +3371, UA3371 +3372, UA3372 +3373, UA3373 +3374, UA3374 +3375, UA3375 +3376, UA3376 +3377, UA3377 +3378, UA3378 +3379, UA3379 +3380, UA3380 +3381, UA3381 +3382, UA3382 +3383, UA3383 +3384, UA3384 +3385, UA3385 +3386, UA3386 +3387, UA3387 +3388, UA3388 +3389, UA3389 +3390, UA3390 +3391, UA3391 +3392, UA3392 +3393, UA3393 +3394, UA3394 +3395, UA3395 +3396, UA3396 +3397, UA3397 +3398, UA3398 +3399, UA3399 +3400, UA3400 +3401, UA3401 +3402, UA3402 +3403, UA3403 +3404, UA3404 +3405, UA3405 +3406, UA3406 +3407, UA3407 +3408, UA3408 +3409, UA3409 +3410, UA3410 +3411, UA3411 +3412, UA3412 +3413, UA3413 +3414, UA3414 +3415, UA3415 +3416, UA3416 +3417, UA3417 +3418, UA3418 +3419, UA3419 +3420, UA3420 +3421, UA3421 +3422, UA3422 +3423, UA3423 +3424, UA3424 +3425, UA3425 +3426, UA3426 +3427, UA3427 +3428, UA3428 +3429, UA3429 +3430, UA3430 +3431, UA3431 +3432, UA3432 +3433, UA3433 +3434, UA3434 +3435, UA3435 +3436, UA3436 +3437, UA3437 +3438, UA3438 +3439, UA3439 +3440, UA3440 +3441, UA3441 +3442, UA3442 +3443, UA3443 +3444, UA3444 +3445, UA3445 +3446, UA3446 +3447, UA3447 +3448, UA3448 +3449, UA3449 +3450, UA3450 +3451, UA3451 +3452, UA3452 +3453, UA3453 +3454, UA3454 +3455, UA3455 +3456, UA3456 +3457, UA3457 +3458, UA3458 +3459, UA3459 +3460, UA3460 +3461, UA3461 +3462, UA3462 +3463, UA3463 +3464, UA3464 +3465, UA3465 +3466, UA3466 +3467, UA3467 +3468, UA3468 +3469, UA3469 +3470, UA3470 +3471, UA3471 +3472, UA3472 +3473, UA3473 +3474, UA3474 +3475, UA3475 +3476, UA3476 +3477, UA3477 +3478, UA3478 +3479, UA3479 +3480, UA3480 +3481, UA3481 +3482, UA3482 +3483, UA3483 +3484, UA3484 +3485, UA3485 +3486, UA3486 +3487, UA3487 +3488, UA3488 +3489, UA3489 +3490, UA3490 +3491, UA3491 +3492, UA3492 +3493, UA3493 +3494, UA3494 +3495, UA3495 +3496, UA3496 +3497, UA3497 +3498, UA3498 +3499, UA3499 +3500, UA3500 +3501, UA3501 +3502, UA3502 +3503, UA3503 +3504, UA3504 +3505, UA3505 +3506, UA3506 +3507, UA3507 +3508, UA3508 +3509, UA3509 +3510, UA3510 +3511, UA3511 +3512, UA3512 +3513, UA3513 +3514, UA3514 +3515, UA3515 +3516, UA3516 +3517, UA3517 +3518, UA3518 +3519, UA3519 +3520, UA3520 +3521, UA3521 +3522, UA3522 +3523, UA3523 +3524, UA3524 +3525, UA3525 +3526, UA3526 +3527, UA3527 +3528, UA3528 +3529, UA3529 +3530, UA3530 +3531, UA3531 +3532, UA3532 +3533, UA3533 +3534, UA3534 +3535, UA3535 +3536, UA3536 +3537, UA3537 +3538, UA3538 +3539, UA3539 +3540, UA3540 +3541, UA3541 +3542, UA3542 +3543, UA3543 +3544, UA3544 +3545, UA3545 +3546, UA3546 +3547, UA3547 +3548, UA3548 +3549, UA3549 +3550, UA3550 +3551, UA3551 +3552, UA3552 +3553, UA3553 +3554, UA3554 +3555, UA3555 +3556, UA3556 +3557, UA3557 +3558, UA3558 +3559, UA3559 +3560, UA3560 +3561, UA3561 +3562, UA3562 +3563, UA3563 +3564, UA3564 +3565, UA3565 +3566, UA3566 +3567, UA3567 +3568, UA3568 +3569, UA3569 +3570, UA3570 +3571, UA3571 +3572, UA3572 +3573, UA3573 +3574, UA3574 +3575, UA3575 +3576, UA3576 +3577, UA3577 +3578, UA3578 +3579, UA3579 +3580, UA3580 +3581, UA3581 +3582, UA3582 +3583, UA3583 +3584, UA3584 +3585, UA3585 +3586, UA3586 +3587, UA3587 +3588, UA3588 +3589, UA3589 +3590, UA3590 +3591, UA3591 +3592, UA3592 +3593, UA3593 +3594, UA3594 +3595, UA3595 +3596, UA3596 +3597, UA3597 +3598, UA3598 +3599, UA3599 +3600, UA3600 +3601, UA3601 +3602, UA3602 +3603, UA3603 +3604, UA3604 +3605, UA3605 +3606, UA3606 +3607, UA3607 +3608, UA3608 +3609, UA3609 +3610, UA3610 +3611, UA3611 +3612, UA3612 +3613, UA3613 +3614, UA3614 +3615, UA3615 +3616, UA3616 +3617, UA3617 +3618, UA3618 +3619, UA3619 +3620, UA3620 +3621, UA3621 +3622, UA3622 +3623, UA3623 +3624, UA3624 +3625, UA3625 +3626, UA3626 +3627, UA3627 +3628, UA3628 +3629, UA3629 +3630, UA3630 +3631, UA3631 +3632, UA3632 +3633, UA3633 +3634, UA3634 +3635, UA3635 +3636, UA3636 +3637, UA3637 +3638, UA3638 +3639, UA3639 +3640, UA3640 +3641, UA3641 +3642, UA3642 +3643, UA3643 +3644, UA3644 +3645, UA3645 +3646, UA3646 +3647, UA3647 +3648, UA3648 +3649, UA3649 +3650, UA3650 +3651, UA3651 +3652, UA3652 +3653, UA3653 +3654, UA3654 +3655, UA3655 +3656, UA3656 +3657, UA3657 +3658, UA3658 +3659, UA3659 +3660, UA3660 +3661, UA3661 +3662, UA3662 +3663, UA3663 +3664, UA3664 +3665, UA3665 +3666, UA3666 +3667, UA3667 +3668, UA3668 +3669, UA3669 +3670, UA3670 +3671, UA3671 +3672, UA3672 +3673, UA3673 +3674, UA3674 +3675, UA3675 +3676, UA3676 +3677, UA3677 +3678, UA3678 +3679, UA3679 +3680, UA3680 +3681, UA3681 +3682, UA3682 +3683, UA3683 +3684, UA3684 +3685, UA3685 +3686, UA3686 +3687, UA3687 +3688, UA3688 +3689, UA3689 +3690, UA3690 +3691, UA3691 +3692, UA3692 +3693, UA3693 +3694, UA3694 +3695, UA3695 +3696, UA3696 +3697, UA3697 +3698, UA3698 +3699, UA3699 +3700, UA3700 +3701, UA3701 +3702, UA3702 +3703, UA3703 +3704, UA3704 +3705, UA3705 +3706, UA3706 +3707, UA3707 +3708, UA3708 +3709, UA3709 +3710, UA3710 +3711, UA3711 +3712, UA3712 +3713, UA3713 +3714, UA3714 +3715, UA3715 +3716, UA3716 +3717, UA3717 +3718, UA3718 +3719, UA3719 +3720, UA3720 +3721, UA3721 +3722, UA3722 +3723, UA3723 +3724, UA3724 +3725, UA3725 +3726, UA3726 +3727, UA3727 +3728, UA3728 +3729, UA3729 +3730, UA3730 +3731, UA3731 +3732, UA3732 +3733, UA3733 +3734, UA3734 +3735, UA3735 +3736, UA3736 +3737, UA3737 +3738, UA3738 +3739, UA3739 +3740, UA3740 +3741, UA3741 +3742, UA3742 +3743, UA3743 +3744, UA3744 +3745, UA3745 +3746, UA3746 +3747, UA3747 +3748, UA3748 +3749, UA3749 +3750, UA3750 +3751, UA3751 +3752, UA3752 +3753, UA3753 +3754, UA3754 +3755, UA3755 +3756, UA3756 +3757, UA3757 +3758, UA3758 +3759, UA3759 +3760, UA3760 +3761, UA3761 +3762, UA3762 +3763, UA3763 +3764, UA3764 +3765, UA3765 +3766, UA3766 +3767, UA3767 +3768, UA3768 +3769, UA3769 +3770, UA3770 +3771, UA3771 +3772, UA3772 +3773, UA3773 +3774, UA3774 +3775, UA3775 +3776, UA3776 +3777, UA3777 +3778, UA3778 +3779, UA3779 +3780, UA3780 +3781, UA3781 +3782, UA3782 +3783, UA3783 +3784, UA3784 +3785, UA3785 +3786, UA3786 +3787, UA3787 +3788, UA3788 +3789, UA3789 +3790, UA3790 +3791, UA3791 +3792, UA3792 +3793, UA3793 +3794, UA3794 +3795, UA3795 +3796, UA3796 +3797, UA3797 +3798, UA3798 +3799, UA3799 +3800, UA3800 +3801, UA3801 +3802, UA3802 +3803, UA3803 +3804, UA3804 +3805, UA3805 +3806, UA3806 +3807, UA3807 +3808, UA3808 +3809, UA3809 +3810, UA3810 +3811, UA3811 +3812, UA3812 +3813, UA3813 +3814, UA3814 +3815, UA3815 +3816, UA3816 +3817, UA3817 +3818, UA3818 +3819, UA3819 +3820, UA3820 +3821, UA3821 +3822, UA3822 +3823, UA3823 +3824, UA3824 +3825, UA3825 +3826, UA3826 +3827, UA3827 +3828, UA3828 +3829, UA3829 +3830, UA3830 +3831, UA3831 +3832, UA3832 +3833, UA3833 +3834, UA3834 +3835, UA3835 +3836, UA3836 +3837, UA3837 +3838, UA3838 +3839, UA3839 +3840, UA3840 +3841, UA3841 +3842, UA3842 +3843, UA3843 +3844, UA3844 +3845, UA3845 +3846, UA3846 +3847, UA3847 +3848, UA3848 +3849, UA3849 +3850, UA3850 +3851, UA3851 +3852, UA3852 +3853, UA3853 +3854, UA3854 +3855, UA3855 +3856, UA3856 +3857, UA3857 +3858, UA3858 +3859, UA3859 +3860, UA3860 +3861, UA3861 +3862, UA3862 +3863, UA3863 +3864, UA3864 +3865, UA3865 +3866, UA3866 +3867, UA3867 +3868, UA3868 +3869, UA3869 +3870, UA3870 +3871, UA3871 +3872, UA3872 +3873, UA3873 +3874, UA3874 +3875, UA3875 +3876, UA3876 +3877, UA3877 +3878, UA3878 +3879, UA3879 +3880, UA3880 +3881, UA3881 +3882, UA3882 +3883, UA3883 +3884, UA3884 +3885, UA3885 +3886, UA3886 +3887, UA3887 +3888, UA3888 +3889, UA3889 +3890, UA3890 +3891, UA3891 +3892, UA3892 +3893, UA3893 +3894, UA3894 +3895, UA3895 +3896, UA3896 +3897, UA3897 +3898, UA3898 +3899, UA3899 +3900, UA3900 +3901, UA3901 +3902, UA3902 +3903, UA3903 +3904, UA3904 +3905, UA3905 +3906, UA3906 +3907, UA3907 +3908, UA3908 +3909, UA3909 +3910, UA3910 +3911, UA3911 +3912, UA3912 +3913, UA3913 +3914, UA3914 +3915, UA3915 +3916, UA3916 +3917, UA3917 +3918, UA3918 +3919, UA3919 +3920, UA3920 +3921, UA3921 +3922, UA3922 +3923, UA3923 +3924, UA3924 +3925, UA3925 +3926, UA3926 +3927, UA3927 +3928, UA3928 +3929, UA3929 +3930, UA3930 +3931, UA3931 +3932, UA3932 +3933, UA3933 +3934, UA3934 +3935, UA3935 +3936, UA3936 +3937, UA3937 +3938, UA3938 +3939, UA3939 +3940, UA3940 +3941, UA3941 +3942, UA3942 +3943, UA3943 +3944, UA3944 +3945, UA3945 +3946, UA3946 +3947, UA3947 +3948, UA3948 +3949, UA3949 +3950, UA3950 +3951, UA3951 +3952, UA3952 +3953, UA3953 +3954, UA3954 +3955, UA3955 +3956, UA3956 +3957, UA3957 +3958, UA3958 +3959, UA3959 +3960, UA3960 +3961, UA3961 +3962, UA3962 +3963, UA3963 +3964, UA3964 +3965, UA3965 +3966, UA3966 +3967, UA3967 +3968, UA3968 +3969, UA3969 +3970, UA3970 +3971, UA3971 +3972, UA3972 +3973, UA3973 +3974, UA3974 +3975, UA3975 +3976, UA3976 +3977, UA3977 +3978, UA3978 +3979, UA3979 +3980, UA3980 +3981, UA3981 +3982, UA3982 +3983, UA3983 +3984, UA3984 +3985, UA3985 +3986, UA3986 +3987, UA3987 +3988, UA3988 +3989, UA3989 +3990, UA3990 +3991, UA3991 +3992, UA3992 +3993, UA3993 +3994, UA3994 +3995, UA3995 +3996, UA3996 +3997, UA3997 +3998, UA3998 +3999, UA3999 +4000, UA4000 +4001, UA4001 +4002, UA4002 +4003, UA4003 +4004, UA4004 +4005, UA4005 +4006, UA4006 +4007, UA4007 +4008, UA4008 +4009, UA4009 +4010, UA4010 +4011, UA4011 +4012, UA4012 +4013, UA4013 +4014, UA4014 +4015, UA4015 +4016, UA4016 +4017, UA4017 +4018, UA4018 +4019, UA4019 +4020, UA4020 +4021, UA4021 +4022, UA4022 +4023, UA4023 +4024, UA4024 +4025, UA4025 +4026, UA4026 +4027, UA4027 +4028, UA4028 +4029, UA4029 +4030, UA4030 +4031, UA4031 +4032, UA4032 +4033, UA4033 +4034, UA4034 +4035, UA4035 +4036, UA4036 +4037, UA4037 +4038, UA4038 +4039, UA4039 +4040, UA4040 +4041, UA4041 +4042, UA4042 +4043, UA4043 +4044, UA4044 +4045, UA4045 +4046, UA4046 +4047, UA4047 +4048, UA4048 +4049, UA4049 +4050, UA4050 +4051, UA4051 +4052, UA4052 +4053, UA4053 +4054, UA4054 +4055, UA4055 +4056, UA4056 +4057, UA4057 +4058, UA4058 +4059, UA4059 +4060, UA4060 +4061, UA4061 +4062, UA4062 +4063, UA4063 +4064, UA4064 +4065, UA4065 +4066, UA4066 +4067, UA4067 +4068, UA4068 +4069, UA4069 +4070, UA4070 +4071, UA4071 +4072, UA4072 +4073, UA4073 +4074, UA4074 +4075, UA4075 +4076, UA4076 +4077, UA4077 +4078, UA4078 +4079, UA4079 +4080, UA4080 +4081, UA4081 +4082, UA4082 +4083, UA4083 +4084, UA4084 +4085, UA4085 +4086, UA4086 +4087, UA4087 +4088, UA4088 +4089, UA4089 +4090, UA4090 +4091, UA4091 +4092, UA4092 +4093, UA4093 +4094, UA4094 +4095, UA4095 +4096, UA4096 +4097, UA4097 +4098, UA4098 +4099, UA4099 +4100, UA4100 +4101, UA4101 +4102, UA4102 +4103, UA4103 +4104, UA4104 +4105, UA4105 +4106, UA4106 +4107, UA4107 +4108, UA4108 +4109, UA4109 +4110, UA4110 +4111, UA4111 +4112, UA4112 +4113, UA4113 +4114, UA4114 +4115, UA4115 +4116, UA4116 +4117, UA4117 +4118, UA4118 +4119, UA4119 +4120, UA4120 +4121, UA4121 +4122, UA4122 +4123, UA4123 +4124, UA4124 +4125, UA4125 +4126, UA4126 +4127, UA4127 +4128, UA4128 +4129, UA4129 +4130, UA4130 +4131, UA4131 +4132, UA4132 +4133, UA4133 +4134, UA4134 +4135, UA4135 +4136, UA4136 +4137, UA4137 +4138, UA4138 +4139, UA4139 +4140, UA4140 +4141, UA4141 +4142, UA4142 +4143, UA4143 +4144, UA4144 +4145, UA4145 +4146, UA4146 +4147, UA4147 +4148, UA4148 +4149, UA4149 +4150, UA4150 +4151, UA4151 +4152, UA4152 +4153, UA4153 +4154, UA4154 +4155, UA4155 +4156, UA4156 +4157, UA4157 +4158, UA4158 +4159, UA4159 +4160, UA4160 +4161, UA4161 +4162, UA4162 +4163, UA4163 +4164, UA4164 +4165, UA4165 +4166, UA4166 +4167, UA4167 +4168, UA4168 +4169, UA4169 +4170, UA4170 +4171, UA4171 +4172, UA4172 +4173, UA4173 +4174, UA4174 +4175, UA4175 +4176, UA4176 +4177, UA4177 +4178, UA4178 +4179, UA4179 +4180, UA4180 +4181, UA4181 +4182, UA4182 +4183, UA4183 +4184, UA4184 +4185, UA4185 +4186, UA4186 +4187, UA4187 +4188, UA4188 +4189, UA4189 +4190, UA4190 +4191, UA4191 +4192, UA4192 +4193, UA4193 +4194, UA4194 +4195, UA4195 +4196, UA4196 +4197, UA4197 +4198, UA4198 +4199, UA4199 +4200, UA4200 +4201, UA4201 +4202, UA4202 +4203, UA4203 +4204, UA4204 +4205, UA4205 +4206, UA4206 +4207, UA4207 +4208, UA4208 +4209, UA4209 +4210, UA4210 +4211, UA4211 +4212, UA4212 +4213, UA4213 +4214, UA4214 +4215, UA4215 +4216, UA4216 +4217, UA4217 +4218, UA4218 +4219, UA4219 +4220, UA4220 +4221, UA4221 +4222, UA4222 +4223, UA4223 +4224, UA4224 +4225, UA4225 +4226, UA4226 +4227, UA4227 +4228, UA4228 +4229, UA4229 +4230, UA4230 +4231, UA4231 +4232, UA4232 +4233, UA4233 +4234, UA4234 +4235, UA4235 +4236, UA4236 +4237, UA4237 +4238, UA4238 +4239, UA4239 +4240, UA4240 +4241, UA4241 +4242, UA4242 +4243, UA4243 +4244, UA4244 +4245, UA4245 +4246, UA4246 +4247, UA4247 +4248, UA4248 +4249, UA4249 +4250, UA4250 +4251, UA4251 +4252, UA4252 +4253, UA4253 +4254, UA4254 +4255, UA4255 +4256, UA4256 +4257, UA4257 +4258, UA4258 +4259, UA4259 +4260, UA4260 +4261, UA4261 +4262, UA4262 +4263, UA4263 +4264, UA4264 +4265, UA4265 +4266, UA4266 +4267, UA4267 +4268, UA4268 +4269, UA4269 +4270, UA4270 +4271, UA4271 +4272, UA4272 +4273, UA4273 +4274, UA4274 +4275, UA4275 +4276, UA4276 +4277, UA4277 +4278, UA4278 +4279, UA4279 +4280, UA4280 +4281, UA4281 +4282, UA4282 +4283, UA4283 +4284, UA4284 +4285, UA4285 +4286, UA4286 +4287, UA4287 +4288, UA4288 +4289, UA4289 +4290, UA4290 +4291, UA4291 +4292, UA4292 +4293, UA4293 +4294, UA4294 +4295, UA4295 +4296, UA4296 +4297, UA4297 +4298, UA4298 +4299, UA4299 +4300, UA4300 +4301, UA4301 +4302, UA4302 +4303, UA4303 +4304, UA4304 +4305, UA4305 +4306, UA4306 +4307, UA4307 +4308, UA4308 +4309, UA4309 +4310, UA4310 +4311, UA4311 +4312, UA4312 +4313, UA4313 +4314, UA4314 +4315, UA4315 +4316, UA4316 +4317, UA4317 +4318, UA4318 +4319, UA4319 +4320, UA4320 +4321, UA4321 +4322, UA4322 +4323, UA4323 +4324, UA4324 +4325, UA4325 +4326, UA4326 +4327, UA4327 +4328, UA4328 +4329, UA4329 +4330, UA4330 +4331, UA4331 +4332, UA4332 +4333, UA4333 +4334, UA4334 +4335, UA4335 +4336, UA4336 +4337, UA4337 +4338, UA4338 +4339, UA4339 +4340, UA4340 +4341, UA4341 +4342, UA4342 +4343, UA4343 +4344, UA4344 +4345, UA4345 +4346, UA4346 +4347, UA4347 +4348, UA4348 +4349, UA4349 +4350, UA4350 +4351, UA4351 +4352, UA4352 +4353, UA4353 +4354, UA4354 +4355, UA4355 +4356, UA4356 +4357, UA4357 +4358, UA4358 +4359, UA4359 +4360, UA4360 +4361, UA4361 +4362, UA4362 +4363, UA4363 +4364, UA4364 +4365, UA4365 +4366, UA4366 +4367, UA4367 +4368, UA4368 +4369, UA4369 +4370, UA4370 +4371, UA4371 +4372, UA4372 +4373, UA4373 +4374, UA4374 +4375, UA4375 +4376, UA4376 +4377, UA4377 +4378, UA4378 +4379, UA4379 +4380, UA4380 +4381, UA4381 +4382, UA4382 +4383, UA4383 +4384, UA4384 +4385, UA4385 +4386, UA4386 +4387, UA4387 +4388, UA4388 +4389, UA4389 +4390, UA4390 +4391, UA4391 +4392, UA4392 +4393, UA4393 +4394, UA4394 +4395, UA4395 +4396, UA4396 +4397, UA4397 +4398, UA4398 +4399, UA4399 +4400, UA4400 +4401, UA4401 +4402, UA4402 +4403, UA4403 +4404, UA4404 +4405, UA4405 +4406, UA4406 +4407, UA4407 +4408, UA4408 +4409, UA4409 +4410, UA4410 +4411, UA4411 +4412, UA4412 +4413, UA4413 +4414, UA4414 +4415, UA4415 +4416, UA4416 +4417, UA4417 +4418, UA4418 +4419, UA4419 +4420, UA4420 +4421, UA4421 +4422, UA4422 +4423, UA4423 +4424, UA4424 +4425, UA4425 +4426, UA4426 +4427, UA4427 +4428, UA4428 +4429, UA4429 +4430, UA4430 +4431, UA4431 +4432, UA4432 +4433, UA4433 +4434, UA4434 +4435, UA4435 +4436, UA4436 +4437, UA4437 +4438, UA4438 +4439, UA4439 +4440, UA4440 +4441, UA4441 +4442, UA4442 +4443, UA4443 +4444, UA4444 +4445, UA4445 +4446, UA4446 +4447, UA4447 +4448, UA4448 +4449, UA4449 +4450, UA4450 +4451, UA4451 +4452, UA4452 +4453, UA4453 +4454, UA4454 +4455, UA4455 +4456, UA4456 +4457, UA4457 +4458, UA4458 +4459, UA4459 +4460, UA4460 +4461, UA4461 +4462, UA4462 +4463, UA4463 +4464, UA4464 +4465, UA4465 +4466, UA4466 +4467, UA4467 +4468, UA4468 +4469, UA4469 +4470, UA4470 +4471, UA4471 +4472, UA4472 +4473, UA4473 +4474, UA4474 +4475, UA4475 +4476, UA4476 +4477, UA4477 +4478, UA4478 +4479, UA4479 +4480, UA4480 +4481, UA4481 +4482, UA4482 +4483, UA4483 +4484, UA4484 +4485, UA4485 +4486, UA4486 +4487, UA4487 +4488, UA4488 +4489, UA4489 +4490, UA4490 +4491, UA4491 +4492, UA4492 +4493, UA4493 +4494, UA4494 +4495, UA4495 +4496, UA4496 +4497, UA4497 +4498, UA4498 +4499, UA4499 +4500, UA4500 +4501, UA4501 +4502, UA4502 +4503, UA4503 +4504, UA4504 +4505, UA4505 +4506, UA4506 +4507, UA4507 +4508, UA4508 +4509, UA4509 +4510, UA4510 +4511, UA4511 +4512, UA4512 +4513, UA4513 +4514, UA4514 +4515, UA4515 +4516, UA4516 +4517, UA4517 +4518, UA4518 +4519, UA4519 +4520, UA4520 +4521, UA4521 +4522, UA4522 +4523, UA4523 +4524, UA4524 +4525, UA4525 +4526, UA4526 +4527, UA4527 +4528, UA4528 +4529, UA4529 +4530, UA4530 +4531, UA4531 +4532, UA4532 +4533, UA4533 +4534, UA4534 +4535, UA4535 +4536, UA4536 +4537, UA4537 +4538, UA4538 +4539, UA4539 +4540, UA4540 +4541, UA4541 +4542, UA4542 +4543, UA4543 +4544, UA4544 +4545, UA4545 +4546, UA4546 +4547, UA4547 +4548, UA4548 +4549, UA4549 +4550, UA4550 +4551, UA4551 +4552, UA4552 +4553, UA4553 +4554, UA4554 +4555, UA4555 +4556, UA4556 +4557, UA4557 +4558, UA4558 +4559, UA4559 +4560, UA4560 +4561, UA4561 +4562, UA4562 +4563, UA4563 +4564, UA4564 +4565, UA4565 +4566, UA4566 +4567, UA4567 +4568, UA4568 +4569, UA4569 +4570, UA4570 +4571, UA4571 +4572, UA4572 +4573, UA4573 +4574, UA4574 +4575, UA4575 +4576, UA4576 +4577, UA4577 +4578, UA4578 +4579, UA4579 +4580, UA4580 +4581, UA4581 +4582, UA4582 +4583, UA4583 +4584, UA4584 +4585, UA4585 +4586, UA4586 +4587, UA4587 +4588, UA4588 +4589, UA4589 +4590, UA4590 +4591, UA4591 +4592, UA4592 +4593, UA4593 +4594, UA4594 +4595, UA4595 +4596, UA4596 +4597, UA4597 +4598, UA4598 +4599, UA4599 +4600, UA4600 +4601, UA4601 +4602, UA4602 +4603, UA4603 +4604, UA4604 +4605, UA4605 +4606, UA4606 +4607, UA4607 +4608, UA4608 +4609, UA4609 +4610, UA4610 +4611, UA4611 +4612, UA4612 +4613, UA4613 +4614, UA4614 +4615, UA4615 +4616, UA4616 +4617, UA4617 +4618, UA4618 +4619, UA4619 +4620, UA4620 +4621, UA4621 +4622, UA4622 +4623, UA4623 +4624, UA4624 +4625, UA4625 +4626, UA4626 +4627, UA4627 +4628, UA4628 +4629, UA4629 +4630, UA4630 +4631, UA4631 +4632, UA4632 +4633, UA4633 +4634, UA4634 +4635, UA4635 +4636, UA4636 +4637, UA4637 +4638, UA4638 +4639, UA4639 +4640, UA4640 +4641, UA4641 +4642, UA4642 +4643, UA4643 +4644, UA4644 +4645, UA4645 +4646, UA4646 +4647, UA4647 +4648, UA4648 +4649, UA4649 +4650, UA4650 +4651, UA4651 +4652, UA4652 +4653, UA4653 +4654, UA4654 +4655, UA4655 +4656, UA4656 +4657, UA4657 +4658, UA4658 +4659, UA4659 +4660, UA4660 +4661, UA4661 +4662, UA4662 +4663, UA4663 +4664, UA4664 +4665, UA4665 +4666, UA4666 +4667, UA4667 +4668, UA4668 +4669, UA4669 +4670, UA4670 +4671, UA4671 +4672, UA4672 +4673, UA4673 +4674, UA4674 +4675, UA4675 +4676, UA4676 +4677, UA4677 +4678, UA4678 +4679, UA4679 +4680, UA4680 +4681, UA4681 +4682, UA4682 +4683, UA4683 +4684, UA4684 +4685, UA4685 +4686, UA4686 +4687, UA4687 +4688, UA4688 +4689, UA4689 +4690, UA4690 +4691, UA4691 +4692, UA4692 +4693, UA4693 +4694, UA4694 +4695, UA4695 +4696, UA4696 +4697, UA4697 +4698, UA4698 +4699, UA4699 +4700, UA4700 +4701, UA4701 +4702, UA4702 +4703, UA4703 +4704, UA4704 +4705, UA4705 +4706, UA4706 +4707, UA4707 +4708, UA4708 +4709, UA4709 +4710, UA4710 +4711, UA4711 +4712, UA4712 +4713, UA4713 +4714, UA4714 +4715, UA4715 +4716, UA4716 +4717, UA4717 +4718, UA4718 +4719, UA4719 +4720, UA4720 +4721, UA4721 +4722, UA4722 +4723, UA4723 +4724, UA4724 +4725, UA4725 +4726, UA4726 +4727, UA4727 +4728, UA4728 +4729, UA4729 +4730, UA4730 +4731, UA4731 +4732, UA4732 +4733, UA4733 +4734, UA4734 +4735, UA4735 +4736, UA4736 +4737, UA4737 +4738, UA4738 +4739, UA4739 +4740, UA4740 +4741, UA4741 +4742, UA4742 +4743, UA4743 +4744, UA4744 +4745, UA4745 +4746, UA4746 +4747, UA4747 +4748, UA4748 +4749, UA4749 +4750, UA4750 +4751, UA4751 +4752, UA4752 +4753, UA4753 +4754, UA4754 +4755, UA4755 +4756, UA4756 +4757, UA4757 +4758, UA4758 +4759, UA4759 +4760, UA4760 +4761, UA4761 +4762, UA4762 +4763, UA4763 +4764, UA4764 +4765, UA4765 +4766, UA4766 +4767, UA4767 +4768, UA4768 +4769, UA4769 +4770, UA4770 +4771, UA4771 +4772, UA4772 +4773, UA4773 +4774, UA4774 +4775, UA4775 +4776, UA4776 +4777, UA4777 +4778, UA4778 +4779, UA4779 +4780, UA4780 +4781, UA4781 +4782, UA4782 +4783, UA4783 +4784, UA4784 +4785, UA4785 +4786, UA4786 +4787, UA4787 +4788, UA4788 +4789, UA4789 +4790, UA4790 +4791, UA4791 +4792, UA4792 +4793, UA4793 +4794, UA4794 +4795, UA4795 +4796, UA4796 +4797, UA4797 +4798, UA4798 +4799, UA4799 +4800, UA4800 +4801, UA4801 +4802, UA4802 +4803, UA4803 +4804, UA4804 +4805, UA4805 +4806, UA4806 +4807, UA4807 +4808, UA4808 +4809, UA4809 +4810, UA4810 +4811, UA4811 +4812, UA4812 +4813, UA4813 +4814, UA4814 +4815, UA4815 +4816, UA4816 +4817, UA4817 +4818, UA4818 +4819, UA4819 +4820, UA4820 +4821, UA4821 +4822, UA4822 +4823, UA4823 +4824, UA4824 +4825, UA4825 +4826, UA4826 +4827, UA4827 +4828, UA4828 +4829, UA4829 +4830, UA4830 +4831, UA4831 +4832, UA4832 +4833, UA4833 +4834, UA4834 +4835, UA4835 +4836, UA4836 +4837, UA4837 +4838, UA4838 +4839, UA4839 +4840, UA4840 +4841, UA4841 +4842, UA4842 +4843, UA4843 +4844, UA4844 +4845, UA4845 +4846, UA4846 +4847, UA4847 +4848, UA4848 +4849, UA4849 +4850, UA4850 +4851, UA4851 +4852, UA4852 +4853, UA4853 +4854, UA4854 +4855, UA4855 +4856, UA4856 +4857, UA4857 +4858, UA4858 +4859, UA4859 +4860, UA4860 +4861, UA4861 +4862, UA4862 +4863, UA4863 +4864, UA4864 +4865, UA4865 +4866, UA4866 +4867, UA4867 +4868, UA4868 +4869, UA4869 +4870, UA4870 +4871, UA4871 +4872, UA4872 +4873, UA4873 +4874, UA4874 +4875, UA4875 +4876, UA4876 +4877, UA4877 +4878, UA4878 +4879, UA4879 +4880, UA4880 +4881, UA4881 +4882, UA4882 +4883, UA4883 +4884, UA4884 +4885, UA4885 +4886, UA4886 +4887, UA4887 +4888, UA4888 +4889, UA4889 +4890, UA4890 +4891, UA4891 +4892, UA4892 +4893, UA4893 +4894, UA4894 +4895, UA4895 +4896, UA4896 +4897, UA4897 +4898, UA4898 +4899, UA4899 +4900, UA4900 +4901, UA4901 +4902, UA4902 +4903, UA4903 +4904, UA4904 +4905, UA4905 +4906, UA4906 +4907, UA4907 +4908, UA4908 +4909, UA4909 +4910, UA4910 +4911, UA4911 +4912, UA4912 +4913, UA4913 +4914, UA4914 +4915, UA4915 +4916, UA4916 +4917, UA4917 +4918, UA4918 +4919, UA4919 +4920, UA4920 +4921, UA4921 +4922, UA4922 +4923, UA4923 +4924, UA4924 +4925, UA4925 +4926, UA4926 +4927, UA4927 +4928, UA4928 +4929, UA4929 +4930, UA4930 +4931, UA4931 +4932, UA4932 +4933, UA4933 +4934, UA4934 +4935, UA4935 +4936, UA4936 +4937, UA4937 +4938, UA4938 +4939, UA4939 +4940, UA4940 +4941, UA4941 +4942, UA4942 +4943, UA4943 +4944, UA4944 +4945, UA4945 +4946, UA4946 +4947, UA4947 +4948, UA4948 +4949, UA4949 +4950, UA4950 +4951, UA4951 +4952, UA4952 +4953, UA4953 +4954, UA4954 +4955, UA4955 +4956, UA4956 +4957, UA4957 +4958, UA4958 +4959, UA4959 +4960, UA4960 +4961, UA4961 +4962, UA4962 +4963, UA4963 +4964, UA4964 +4965, UA4965 +4966, UA4966 +4967, UA4967 +4968, UA4968 +4969, UA4969 +4970, UA4970 +4971, UA4971 +4972, UA4972 +4973, UA4973 +4974, UA4974 +4975, UA4975 +4976, UA4976 +4977, UA4977 +4978, UA4978 +4979, UA4979 +4980, UA4980 +4981, UA4981 +4982, UA4982 +4983, UA4983 +4984, UA4984 +4985, UA4985 +4986, UA4986 +4987, UA4987 +4988, UA4988 +4989, UA4989 +4990, UA4990 +4991, UA4991 +4992, UA4992 +4993, UA4993 +4994, UA4994 +4995, UA4995 +4996, UA4996 +4997, UA4997 +4998, UA4998 +4999, UA4999 +5000, UA5000 +5001, UA5001 +5002, UA5002 +5003, UA5003 +5004, UA5004 +5005, UA5005 +5006, UA5006 +5007, UA5007 +5008, UA5008 +5009, UA5009 +5010, UA5010 +5011, UA5011 +5012, UA5012 +5013, UA5013 +5014, UA5014 +5015, UA5015 +5016, UA5016 +5017, UA5017 +5018, UA5018 +5019, UA5019 +5020, UA5020 +5021, UA5021 +5022, UA5022 +5023, UA5023 +5024, UA5024 +5025, UA5025 +5026, UA5026 +5027, UA5027 +5028, UA5028 +5029, UA5029 +5030, UA5030 +5031, UA5031 +5032, UA5032 +5033, UA5033 +5034, UA5034 +5035, UA5035 +5036, UA5036 +5037, UA5037 +5038, UA5038 +5039, UA5039 +5040, UA5040 +5041, UA5041 +5042, UA5042 +5043, UA5043 +5044, UA5044 +5045, UA5045 +5046, UA5046 +5047, UA5047 +5048, UA5048 +5049, UA5049 +5050, UA5050 +5051, UA5051 +5052, UA5052 +5053, UA5053 +5054, UA5054 +5055, UA5055 +5056, UA5056 +5057, UA5057 +5058, UA5058 +5059, UA5059 +5060, UA5060 +5061, UA5061 +5062, UA5062 +5063, UA5063 +5064, UA5064 +5065, UA5065 +5066, UA5066 +5067, UA5067 +5068, UA5068 +5069, UA5069 +5070, UA5070 +5071, UA5071 +5072, UA5072 +5073, UA5073 +5074, UA5074 +5075, UA5075 +5076, UA5076 +5077, UA5077 +5078, UA5078 +5079, UA5079 +5080, UA5080 +5081, UA5081 +5082, UA5082 +5083, UA5083 +5084, UA5084 +5085, UA5085 +5086, UA5086 +5087, UA5087 +5088, UA5088 +5089, UA5089 +5090, UA5090 +5091, UA5091 +5092, UA5092 +5093, UA5093 +5094, UA5094 +5095, UA5095 +5096, UA5096 +5097, UA5097 +5098, UA5098 +5099, UA5099 +5100, UA5100 +5101, UA5101 +5102, UA5102 +5103, UA5103 +5104, UA5104 +5105, UA5105 +5106, UA5106 +5107, UA5107 +5108, UA5108 +5109, UA5109 +5110, UA5110 +5111, UA5111 +5112, UA5112 +5113, UA5113 +5114, UA5114 +5115, UA5115 +5116, UA5116 +5117, UA5117 +5118, UA5118 +5119, UA5119 +5120, UA5120 +5121, UA5121 +5122, UA5122 +5123, UA5123 +5124, UA5124 +5125, UA5125 +5126, UA5126 +5127, UA5127 +5128, UA5128 +5129, UA5129 +5130, UA5130 +5131, UA5131 +5132, UA5132 +5133, UA5133 +5134, UA5134 +5135, UA5135 +5136, UA5136 +5137, UA5137 +5138, UA5138 +5139, UA5139 +5140, UA5140 +5141, UA5141 +5142, UA5142 +5143, UA5143 +5144, UA5144 +5145, UA5145 +5146, UA5146 +5147, UA5147 +5148, UA5148 +5149, UA5149 +5150, UA5150 +5151, UA5151 +5152, UA5152 +5153, UA5153 +5154, UA5154 +5155, UA5155 +5156, UA5156 +5157, UA5157 +5158, UA5158 +5159, UA5159 +5160, UA5160 +5161, UA5161 +5162, UA5162 +5163, UA5163 +5164, UA5164 +5165, UA5165 +5166, UA5166 +5167, UA5167 +5168, UA5168 +5169, UA5169 +5170, UA5170 +5171, UA5171 +5172, UA5172 +5173, UA5173 +5174, UA5174 +5175, UA5175 +5176, UA5176 +5177, UA5177 +5178, UA5178 +5179, UA5179 +5180, UA5180 +5181, UA5181 +5182, UA5182 +5183, UA5183 +5184, UA5184 +5185, UA5185 +5186, UA5186 +5187, UA5187 +5188, UA5188 +5189, UA5189 +5190, UA5190 +5191, UA5191 +5192, UA5192 +5193, UA5193 +5194, UA5194 +5195, UA5195 +5196, UA5196 +5197, UA5197 +5198, UA5198 +5199, UA5199 +5200, UA5200 +5201, UA5201 +5202, UA5202 +5203, UA5203 +5204, UA5204 +5205, UA5205 +5206, UA5206 +5207, UA5207 +5208, UA5208 +5209, UA5209 +5210, UA5210 +5211, UA5211 +5212, UA5212 +5213, UA5213 +5214, UA5214 +5215, UA5215 +5216, UA5216 +5217, UA5217 +5218, UA5218 +5219, UA5219 +5220, UA5220 +5221, UA5221 +5222, UA5222 +5223, UA5223 +5224, UA5224 +5225, UA5225 +5226, UA5226 +5227, UA5227 +5228, UA5228 +5229, UA5229 +5230, UA5230 +5231, UA5231 +5232, UA5232 +5233, UA5233 +5234, UA5234 +5235, UA5235 +5236, UA5236 +5237, UA5237 +5238, UA5238 +5239, UA5239 +5240, UA5240 +5241, UA5241 +5242, UA5242 +5243, UA5243 +5244, UA5244 +5245, UA5245 +5246, UA5246 +5247, UA5247 +5248, UA5248 +5249, UA5249 +5250, UA5250 +5251, UA5251 +5252, UA5252 +5253, UA5253 +5254, UA5254 +5255, UA5255 +5256, UA5256 +5257, UA5257 +5258, UA5258 +5259, UA5259 +5260, UA5260 +5261, UA5261 +5262, UA5262 +5263, UA5263 +5264, UA5264 +5265, UA5265 +5266, UA5266 +5267, UA5267 +5268, UA5268 +5269, UA5269 +5270, UA5270 +5271, UA5271 +5272, UA5272 +5273, UA5273 +5274, UA5274 +5275, UA5275 +5276, UA5276 +5277, UA5277 +5278, UA5278 +5279, UA5279 +5280, UA5280 +5281, UA5281 +5282, UA5282 +5283, UA5283 +5284, UA5284 +5285, UA5285 +5286, UA5286 +5287, UA5287 +5288, UA5288 +5289, UA5289 +5290, UA5290 +5291, UA5291 +5292, UA5292 +5293, UA5293 +5294, UA5294 +5295, UA5295 +5296, UA5296 +5297, UA5297 +5298, UA5298 +5299, UA5299 +5300, UA5300 +5301, UA5301 +5302, UA5302 +5303, UA5303 +5304, UA5304 +5305, UA5305 +5306, UA5306 +5307, UA5307 +5308, UA5308 +5309, UA5309 +5310, UA5310 +5311, UA5311 +5312, UA5312 +5313, UA5313 +5314, UA5314 +5315, UA5315 +5316, UA5316 +5317, UA5317 +5318, UA5318 +5319, UA5319 +5320, UA5320 +5321, UA5321 +5322, UA5322 +5323, UA5323 +5324, UA5324 +5325, UA5325 +5326, UA5326 +5327, UA5327 +5328, UA5328 +5329, UA5329 +5330, UA5330 +5331, UA5331 +5332, UA5332 +5333, UA5333 +5334, UA5334 +5335, UA5335 +5336, UA5336 +5337, UA5337 +5338, UA5338 +5339, UA5339 +5340, UA5340 +5341, UA5341 +5342, UA5342 +5343, UA5343 +5344, UA5344 +5345, UA5345 +5346, UA5346 +5347, UA5347 +5348, UA5348 +5349, UA5349 +5350, UA5350 +5351, UA5351 +5352, UA5352 +5353, UA5353 +5354, UA5354 +5355, UA5355 +5356, UA5356 +5357, UA5357 +5358, UA5358 +5359, UA5359 +5360, UA5360 +5361, UA5361 +5362, UA5362 +5363, UA5363 +5364, UA5364 +5365, UA5365 +5366, UA5366 +5367, UA5367 +5368, UA5368 +5369, UA5369 +5370, UA5370 +5371, UA5371 +5372, UA5372 +5373, UA5373 +5374, UA5374 +5375, UA5375 +5376, UA5376 +5377, UA5377 +5378, UA5378 +5379, UA5379 +5380, UA5380 +5381, UA5381 +5382, UA5382 +5383, UA5383 +5384, UA5384 +5385, UA5385 +5386, UA5386 +5387, UA5387 +5388, UA5388 +5389, UA5389 +5390, UA5390 +5391, UA5391 +5392, UA5392 +5393, UA5393 +5394, UA5394 +5395, UA5395 +5396, UA5396 +5397, UA5397 +5398, UA5398 +5399, UA5399 +5400, UA5400 +5401, UA5401 +5402, UA5402 +5403, UA5403 +5404, UA5404 +5405, UA5405 +5406, UA5406 +5407, UA5407 +5408, UA5408 +5409, UA5409 +5410, UA5410 +5411, UA5411 +5412, UA5412 +5413, UA5413 +5414, UA5414 +5415, UA5415 +5416, UA5416 +5417, UA5417 +5418, UA5418 +5419, UA5419 +5420, UA5420 +5421, UA5421 +5422, UA5422 +5423, UA5423 +5424, UA5424 +5425, UA5425 +5426, UA5426 +5427, UA5427 +5428, UA5428 +5429, UA5429 +5430, UA5430 +5431, UA5431 +5432, UA5432 +5433, UA5433 +5434, UA5434 +5435, UA5435 +5436, UA5436 +5437, UA5437 +5438, UA5438 +5439, UA5439 +5440, UA5440 +5441, UA5441 +5442, UA5442 +5443, UA5443 +5444, UA5444 +5445, UA5445 +5446, UA5446 +5447, UA5447 +5448, UA5448 +5449, UA5449 +5450, UA5450 +5451, UA5451 +5452, UA5452 +5453, UA5453 +5454, UA5454 +5455, UA5455 +5456, UA5456 +5457, UA5457 +5458, UA5458 +5459, UA5459 +5460, UA5460 +5461, UA5461 +5462, UA5462 +5463, UA5463 +5464, UA5464 +5465, UA5465 +5466, UA5466 +5467, UA5467 +5468, UA5468 +5469, UA5469 +5470, UA5470 +5471, UA5471 +5472, UA5472 +5473, UA5473 +5474, UA5474 +5475, UA5475 +5476, UA5476 +5477, UA5477 +5478, UA5478 +5479, UA5479 +5480, UA5480 +5481, UA5481 +5482, UA5482 +5483, UA5483 +5484, UA5484 +5485, UA5485 +5486, UA5486 +5487, UA5487 +5488, UA5488 +5489, UA5489 +5490, UA5490 +5491, UA5491 +5492, UA5492 +5493, UA5493 +5494, UA5494 +5495, UA5495 +5496, UA5496 +5497, UA5497 +5498, UA5498 +5499, UA5499 +5500, UA5500 +5501, UA5501 +5502, UA5502 +5503, UA5503 +5504, UA5504 +5505, UA5505 +5506, UA5506 +5507, UA5507 +5508, UA5508 +5509, UA5509 +5510, UA5510 +5511, UA5511 +5512, UA5512 +5513, UA5513 +5514, UA5514 +5515, UA5515 +5516, UA5516 +5517, UA5517 +5518, UA5518 +5519, UA5519 +5520, UA5520 +5521, UA5521 +5522, UA5522 +5523, UA5523 +5524, UA5524 +5525, UA5525 +5526, UA5526 +5527, UA5527 +5528, UA5528 +5529, UA5529 +5530, UA5530 +5531, UA5531 +5532, UA5532 +5533, UA5533 +5534, UA5534 +5535, UA5535 +5536, UA5536 +5537, UA5537 +5538, UA5538 +5539, UA5539 +5540, UA5540 +5541, UA5541 +5542, UA5542 +5543, UA5543 +5544, UA5544 +5545, UA5545 +5546, UA5546 +5547, UA5547 +5548, UA5548 +5549, UA5549 +5550, UA5550 +5551, UA5551 +5552, UA5552 +5553, UA5553 +5554, UA5554 +5555, UA5555 +5556, UA5556 +5557, UA5557 +5558, UA5558 +5559, UA5559 +5560, UA5560 +5561, UA5561 +5562, UA5562 +5563, UA5563 +5564, UA5564 +5565, UA5565 +5566, UA5566 +5567, UA5567 +5568, UA5568 +5569, UA5569 +5570, UA5570 +5571, UA5571 +5572, UA5572 +5573, UA5573 +5574, UA5574 +5575, UA5575 +5576, UA5576 +5577, UA5577 +5578, UA5578 +5579, UA5579 +5580, UA5580 +5581, UA5581 +5582, UA5582 +5583, UA5583 +5584, UA5584 +5585, UA5585 +5586, UA5586 +5587, UA5587 +5588, UA5588 +5589, UA5589 +5590, UA5590 +5591, UA5591 +5592, UA5592 +5593, UA5593 +5594, UA5594 +5595, UA5595 +5596, UA5596 +5597, UA5597 +5598, UA5598 +5599, UA5599 +5600, UA5600 +5601, UA5601 +5602, UA5602 +5603, UA5603 +5604, UA5604 +5605, UA5605 +5606, UA5606 +5607, UA5607 +5608, UA5608 +5609, UA5609 +5610, UA5610 +5611, UA5611 +5612, UA5612 +5613, UA5613 +5614, UA5614 +5615, UA5615 +5616, UA5616 +5617, UA5617 +5618, UA5618 +5619, UA5619 +5620, UA5620 +5621, UA5621 +5622, UA5622 +5623, UA5623 +5624, UA5624 +5625, UA5625 +5626, UA5626 +5627, UA5627 +5628, UA5628 +5629, UA5629 +5630, UA5630 +5631, UA5631 +5632, UA5632 +5633, UA5633 +5634, UA5634 +5635, UA5635 +5636, UA5636 +5637, UA5637 +5638, UA5638 +5639, UA5639 +5640, UA5640 +5641, UA5641 +5642, UA5642 +5643, UA5643 +5644, UA5644 +5645, UA5645 +5646, UA5646 +5647, UA5647 +5648, UA5648 +5649, UA5649 +5650, UA5650 +5651, UA5651 +5652, UA5652 +5653, UA5653 +5654, UA5654 +5655, UA5655 +5656, UA5656 +5657, UA5657 +5658, UA5658 +5659, UA5659 +5660, UA5660 +5661, UA5661 +5662, UA5662 +5663, UA5663 +5664, UA5664 +5665, UA5665 +5666, UA5666 +5667, UA5667 +5668, UA5668 +5669, UA5669 +5670, UA5670 +5671, UA5671 +5672, UA5672 +5673, UA5673 +5674, UA5674 +5675, UA5675 +5676, UA5676 +5677, UA5677 +5678, UA5678 +5679, UA5679 +5680, UA5680 +5681, UA5681 +5682, UA5682 +5683, UA5683 +5684, UA5684 +5685, UA5685 +5686, UA5686 +5687, UA5687 +5688, UA5688 +5689, UA5689 +5690, UA5690 +5691, UA5691 +5692, UA5692 +5693, UA5693 +5694, UA5694 +5695, UA5695 +5696, UA5696 +5697, UA5697 +5698, UA5698 +5699, UA5699 +5700, UA5700 +5701, UA5701 +5702, UA5702 +5703, UA5703 +5704, UA5704 +5705, UA5705 +5706, UA5706 +5707, UA5707 +5708, UA5708 +5709, UA5709 +5710, UA5710 +5711, UA5711 +5712, UA5712 +5713, UA5713 +5714, UA5714 +5715, UA5715 +5716, UA5716 +5717, UA5717 +5718, UA5718 +5719, UA5719 +5720, UA5720 +5721, UA5721 +5722, UA5722 +5723, UA5723 +5724, UA5724 +5725, UA5725 +5726, UA5726 +5727, UA5727 +5728, UA5728 +5729, UA5729 +5730, UA5730 +5731, UA5731 +5732, UA5732 +5733, UA5733 +5734, UA5734 +5735, UA5735 +5736, UA5736 +5737, UA5737 +5738, UA5738 +5739, UA5739 +5740, UA5740 +5741, UA5741 +5742, UA5742 +5743, UA5743 +5744, UA5744 +5745, UA5745 +5746, UA5746 +5747, UA5747 +5748, UA5748 +5749, UA5749 +5750, UA5750 +5751, UA5751 +5752, UA5752 +5753, UA5753 +5754, UA5754 +5755, UA5755 +5756, UA5756 +5757, UA5757 +5758, UA5758 +5759, UA5759 +5760, UA5760 +5761, UA5761 +5762, UA5762 +5763, UA5763 +5764, UA5764 +5765, UA5765 +5766, UA5766 +5767, UA5767 +5768, UA5768 +5769, UA5769 +5770, UA5770 +5771, UA5771 +5772, UA5772 +5773, UA5773 +5774, UA5774 +5775, UA5775 +5776, UA5776 +5777, UA5777 +5778, UA5778 +5779, UA5779 +5780, UA5780 +5781, UA5781 +5782, UA5782 +5783, UA5783 +5784, UA5784 +5785, UA5785 +5786, UA5786 +5787, UA5787 +5788, UA5788 +5789, UA5789 +5790, UA5790 +5791, UA5791 +5792, UA5792 +5793, UA5793 +5794, UA5794 +5795, UA5795 +5796, UA5796 +5797, UA5797 +5798, UA5798 +5799, UA5799 +5800, UA5800 +5801, UA5801 +5802, UA5802 +5803, UA5803 +5804, UA5804 +5805, UA5805 +5806, UA5806 +5807, UA5807 +5808, UA5808 +5809, UA5809 +5810, UA5810 +5811, UA5811 +5812, UA5812 +5813, UA5813 +5814, UA5814 +5815, UA5815 +5816, UA5816 +5817, UA5817 +5818, UA5818 +5819, UA5819 +5820, UA5820 +5821, UA5821 +5822, UA5822 +5823, UA5823 +5824, UA5824 +5825, UA5825 +5826, UA5826 +5827, UA5827 +5828, UA5828 +5829, UA5829 +5830, UA5830 +5831, UA5831 +5832, UA5832 +5833, UA5833 +5834, UA5834 +5835, UA5835 +5836, UA5836 +5837, UA5837 +5838, UA5838 +5839, UA5839 +5840, UA5840 +5841, UA5841 +5842, UA5842 +5843, UA5843 +5844, UA5844 +5845, UA5845 +5846, UA5846 +5847, UA5847 +5848, UA5848 +5849, UA5849 +5850, UA5850 +5851, UA5851 +5852, UA5852 +5853, UA5853 +5854, UA5854 +5855, UA5855 +5856, UA5856 +5857, UA5857 +5858, UA5858 +5859, UA5859 +5860, UA5860 +5861, UA5861 +5862, UA5862 +5863, UA5863 +5864, UA5864 +5865, UA5865 +5866, UA5866 +5867, UA5867 +5868, UA5868 +5869, UA5869 +5870, UA5870 +5871, UA5871 +5872, UA5872 +5873, UA5873 +5874, UA5874 +5875, UA5875 +5876, UA5876 +5877, UA5877 +5878, UA5878 +5879, UA5879 +5880, UA5880 +5881, UA5881 +5882, UA5882 +5883, UA5883 +5884, UA5884 +5885, UA5885 +5886, UA5886 +5887, UA5887 +5888, UA5888 +5889, UA5889 +5890, UA5890 +5891, UA5891 +5892, UA5892 +5893, UA5893 +5894, UA5894 +5895, UA5895 +5896, UA5896 +5897, UA5897 +5898, UA5898 +5899, UA5899 +5900, UA5900 +5901, UA5901 +5902, UA5902 +5903, UA5903 +5904, UA5904 +5905, UA5905 +5906, UA5906 +5907, UA5907 +5908, UA5908 +5909, UA5909 +5910, UA5910 +5911, UA5911 +5912, UA5912 +5913, UA5913 +5914, UA5914 +5915, UA5915 +5916, UA5916 +5917, UA5917 +5918, UA5918 +5919, UA5919 +5920, UA5920 +5921, UA5921 +5922, UA5922 +5923, UA5923 +5924, UA5924 +5925, UA5925 +5926, UA5926 +5927, UA5927 +5928, UA5928 +5929, UA5929 +5930, UA5930 +5931, UA5931 +5932, UA5932 +5933, UA5933 +5934, UA5934 +5935, UA5935 +5936, UA5936 +5937, UA5937 +5938, UA5938 +5939, UA5939 +5940, UA5940 +5941, UA5941 +5942, UA5942 +5943, UA5943 +5944, UA5944 +5945, UA5945 +5946, UA5946 +5947, UA5947 +5948, UA5948 +5949, UA5949 +5950, UA5950 +5951, UA5951 +5952, UA5952 +5953, UA5953 +5954, UA5954 +5955, UA5955 +5956, UA5956 +5957, UA5957 +5958, UA5958 +5959, UA5959 +5960, UA5960 +5961, UA5961 +5962, UA5962 +5963, UA5963 +5964, UA5964 +5965, UA5965 +5966, UA5966 +5967, UA5967 +5968, UA5968 +5969, UA5969 +5970, UA5970 +5971, UA5971 +5972, UA5972 +5973, UA5973 +5974, UA5974 +5975, UA5975 +5976, UA5976 +5977, UA5977 +5978, UA5978 +5979, UA5979 +5980, UA5980 +5981, UA5981 +5982, UA5982 +5983, UA5983 +5984, UA5984 +5985, UA5985 +5986, UA5986 +5987, UA5987 +5988, UA5988 +5989, UA5989 +5990, UA5990 +5991, UA5991 +5992, UA5992 +5993, UA5993 +5994, UA5994 +5995, UA5995 +5996, UA5996 +5997, UA5997 +5998, UA5998 +5999, UA5999 +6000, UA6000 +6001, UA6001 +6002, UA6002 +6003, UA6003 +6004, UA6004 +6005, UA6005 +6006, UA6006 +6007, UA6007 +6008, UA6008 +6009, UA6009 +6010, UA6010 +6011, UA6011 +6012, UA6012 +6013, UA6013 +6014, UA6014 +6015, UA6015 +6016, UA6016 +6017, UA6017 +6018, UA6018 +6019, UA6019 +6020, UA6020 +6021, UA6021 +6022, UA6022 +6023, UA6023 +6024, UA6024 +6025, UA6025 +6026, UA6026 +6027, UA6027 +6028, UA6028 +6029, UA6029 +6030, UA6030 +6031, UA6031 +6032, UA6032 +6033, UA6033 +6034, UA6034 +6035, UA6035 +6036, UA6036 +6037, UA6037 +6038, UA6038 +6039, UA6039 +6040, UA6040 +6041, UA6041 +6042, UA6042 +6043, UA6043 +6044, UA6044 +6045, UA6045 +6046, UA6046 +6047, UA6047 +6048, UA6048 +6049, UA6049 +6050, UA6050 +6051, UA6051 +6052, UA6052 +6053, UA6053 +6054, UA6054 +6055, UA6055 +6056, UA6056 +6057, UA6057 +6058, UA6058 +6059, UA6059 +6060, UA6060 +6061, UA6061 +6062, UA6062 +6063, UA6063 +6064, UA6064 +6065, UA6065 +6066, UA6066 +6067, UA6067 +6068, UA6068 +6069, UA6069 +6070, UA6070 +6071, UA6071 +6072, UA6072 +6073, UA6073 +6074, UA6074 +6075, UA6075 +6076, UA6076 +6077, UA6077 +6078, UA6078 +6079, UA6079 +6080, UA6080 +6081, UA6081 +6082, UA6082 +6083, UA6083 +6084, UA6084 +6085, UA6085 +6086, UA6086 +6087, UA6087 +6088, UA6088 +6089, UA6089 +6090, UA6090 +6091, UA6091 +6092, UA6092 +6093, UA6093 +6094, UA6094 +6095, UA6095 +6096, UA6096 +6097, UA6097 +6098, UA6098 +6099, UA6099 +6100, UA6100 +6101, UA6101 +6102, UA6102 +6103, UA6103 +6104, UA6104 +6105, UA6105 +6106, UA6106 +6107, UA6107 +6108, UA6108 +6109, UA6109 +6110, UA6110 +6111, UA6111 +6112, UA6112 +6113, UA6113 +6114, UA6114 +6115, UA6115 +6116, UA6116 +6117, UA6117 +6118, UA6118 +6119, UA6119 +6120, UA6120 +6121, UA6121 +6122, UA6122 +6123, UA6123 +6124, UA6124 +6125, UA6125 +6126, UA6126 +6127, UA6127 +6128, UA6128 +6129, UA6129 +6130, UA6130 +6131, UA6131 +6132, UA6132 +6133, UA6133 +6134, UA6134 +6135, UA6135 +6136, UA6136 +6137, UA6137 +6138, UA6138 +6139, UA6139 +6140, UA6140 +6141, UA6141 +6142, UA6142 +6143, UA6143 +6144, UA6144 +6145, UA6145 +6146, UA6146 +6147, UA6147 +6148, UA6148 +6149, UA6149 +6150, UA6150 +6151, UA6151 +6152, UA6152 +6153, UA6153 +6154, UA6154 +6155, UA6155 +6156, UA6156 +6157, UA6157 +6158, UA6158 +6159, UA6159 +6160, UA6160 +6161, UA6161 +6162, UA6162 +6163, UA6163 +6164, UA6164 +6165, UA6165 +6166, UA6166 +6167, UA6167 +6168, UA6168 +6169, UA6169 +6170, UA6170 +6171, UA6171 +6172, UA6172 +6173, UA6173 +6174, UA6174 +6175, UA6175 +6176, UA6176 +6177, UA6177 +6178, UA6178 +6179, UA6179 +6180, UA6180 +6181, UA6181 +6182, UA6182 +6183, UA6183 +6184, UA6184 +6185, UA6185 +6186, UA6186 +6187, UA6187 +6188, UA6188 +6189, UA6189 +6190, UA6190 +6191, UA6191 +6192, UA6192 +6193, UA6193 +6194, UA6194 +6195, UA6195 +6196, UA6196 +6197, UA6197 +6198, UA6198 +6199, UA6199 +6200, UA6200 +6201, UA6201 +6202, UA6202 +6203, UA6203 +6204, UA6204 +6205, UA6205 +6206, UA6206 +6207, UA6207 +6208, UA6208 +6209, UA6209 +6210, UA6210 +6211, UA6211 +6212, UA6212 +6213, UA6213 +6214, UA6214 +6215, UA6215 +6216, UA6216 +6217, UA6217 +6218, UA6218 +6219, UA6219 +6220, UA6220 +6221, UA6221 +6222, UA6222 +6223, UA6223 +6224, UA6224 +6225, UA6225 +6226, UA6226 +6227, UA6227 +6228, UA6228 +6229, UA6229 +6230, UA6230 +6231, UA6231 +6232, UA6232 +6233, UA6233 +6234, UA6234 +6235, UA6235 +6236, UA6236 +6237, UA6237 +6238, UA6238 +6239, UA6239 +6240, UA6240 +6241, UA6241 +6242, UA6242 +6243, UA6243 +6244, UA6244 +6245, UA6245 +6246, UA6246 +6247, UA6247 +6248, UA6248 +6249, UA6249 +6250, UA6250 +6251, UA6251 +6252, UA6252 +6253, UA6253 +6254, UA6254 +6255, UA6255 +6256, UA6256 +6257, UA6257 +6258, UA6258 +6259, UA6259 +6260, UA6260 +6261, UA6261 +6262, UA6262 +6263, UA6263 +6264, UA6264 +6265, UA6265 +6266, UA6266 +6267, UA6267 +6268, UA6268 +6269, UA6269 +6270, UA6270 +6271, UA6271 +6272, UA6272 +6273, UA6273 +6274, UA6274 +6275, UA6275 +6276, UA6276 +6277, UA6277 +6278, UA6278 +6279, UA6279 +6280, UA6280 +6281, UA6281 +6282, UA6282 +6283, UA6283 +6284, UA6284 +6285, UA6285 +6286, UA6286 +6287, UA6287 +6288, UA6288 +6289, UA6289 +6290, UA6290 +6291, UA6291 +6292, UA6292 +6293, UA6293 +6294, UA6294 +6295, UA6295 +6296, UA6296 +6297, UA6297 +6298, UA6298 +6299, UA6299 +6300, UA6300 +6301, UA6301 +6302, UA6302 +6303, UA6303 +6304, UA6304 +6305, UA6305 +6306, UA6306 +6307, UA6307 +6308, UA6308 +6309, UA6309 +6310, UA6310 +6311, UA6311 +6312, UA6312 +6313, UA6313 +6314, UA6314 +6315, UA6315 +6316, UA6316 +6317, UA6317 +6318, UA6318 +6319, UA6319 +6320, UA6320 +6321, UA6321 +6322, UA6322 +6323, UA6323 +6324, UA6324 +6325, UA6325 +6326, UA6326 +6327, UA6327 +6328, UA6328 +6329, UA6329 +6330, UA6330 +6331, UA6331 +6332, UA6332 +6333, UA6333 +6334, UA6334 +6335, UA6335 +6336, UA6336 +6337, UA6337 +6338, UA6338 +6339, UA6339 +6340, UA6340 +6341, UA6341 +6342, UA6342 +6343, UA6343 +6344, UA6344 +6345, UA6345 +6346, UA6346 +6347, UA6347 +6348, UA6348 +6349, UA6349 +6350, UA6350 +6351, UA6351 +6352, UA6352 +6353, UA6353 +6354, UA6354 +6355, UA6355 +6356, UA6356 +6357, UA6357 +6358, UA6358 +6359, UA6359 +6360, UA6360 +6361, UA6361 +6362, UA6362 +6363, UA6363 +6364, UA6364 +6365, UA6365 +6366, UA6366 +6367, UA6367 +6368, UA6368 +6369, UA6369 +6370, UA6370 +6371, UA6371 +6372, UA6372 +6373, UA6373 +6374, UA6374 +6375, UA6375 +6376, UA6376 +6377, UA6377 +6378, UA6378 +6379, UA6379 +6380, UA6380 +6381, UA6381 +6382, UA6382 +6383, UA6383 +6384, UA6384 +6385, UA6385 +6386, UA6386 +6387, UA6387 +6388, UA6388 +6389, UA6389 +6390, UA6390 +6391, UA6391 +6392, UA6392 +6393, UA6393 +6394, UA6394 +6395, UA6395 +6396, UA6396 +6397, UA6397 +6398, UA6398 +6399, UA6399 +6400, UA6400 +6401, UA6401 +6402, UA6402 +6403, UA6403 +6404, UA6404 +6405, UA6405 +6406, UA6406 +6407, UA6407 +6408, UA6408 +6409, UA6409 +6410, UA6410 +6411, UA6411 +6412, UA6412 +6413, UA6413 +6414, UA6414 +6415, UA6415 +6416, UA6416 +6417, UA6417 +6418, UA6418 +6419, UA6419 +6420, UA6420 +6421, UA6421 +6422, UA6422 +6423, UA6423 +6424, UA6424 +6425, UA6425 +6426, UA6426 +6427, UA6427 +6428, UA6428 +6429, UA6429 +6430, UA6430 +6431, UA6431 +6432, UA6432 +6433, UA6433 +6434, UA6434 +6435, UA6435 +6436, UA6436 +6437, UA6437 +6438, UA6438 +6439, UA6439 +6440, UA6440 +6441, UA6441 +6442, UA6442 +6443, UA6443 +6444, UA6444 +6445, UA6445 +6446, UA6446 +6447, UA6447 +6448, UA6448 +6449, UA6449 +6450, UA6450 +6451, UA6451 +6452, UA6452 +6453, UA6453 +6454, UA6454 +6455, UA6455 +6456, UA6456 +6457, UA6457 +6458, UA6458 +6459, UA6459 +6460, UA6460 +6461, UA6461 +6462, UA6462 +6463, UA6463 +6464, UA6464 +6465, UA6465 +6466, UA6466 +6467, UA6467 +6468, UA6468 +6469, UA6469 +6470, UA6470 +6471, UA6471 +6472, UA6472 +6473, UA6473 +6474, UA6474 +6475, UA6475 +6476, UA6476 +6477, UA6477 +6478, UA6478 +6479, UA6479 +6480, UA6480 +6481, UA6481 +6482, UA6482 +6483, UA6483 +6484, UA6484 +6485, UA6485 +6486, UA6486 +6487, UA6487 +6488, UA6488 +6489, UA6489 +6490, UA6490 +6491, UA6491 +6492, UA6492 +6493, UA6493 +6494, UA6494 +6495, UA6495 +6496, UA6496 +6497, UA6497 +6498, UA6498 +6499, UA6499 +6500, UA6500 +6501, UA6501 +6502, UA6502 +6503, UA6503 +6504, UA6504 +6505, UA6505 +6506, UA6506 +6507, UA6507 +6508, UA6508 +6509, UA6509 +6510, UA6510 +6511, UA6511 +6512, UA6512 +6513, UA6513 +6514, UA6514 +6515, UA6515 +6516, UA6516 +6517, UA6517 +6518, UA6518 +6519, UA6519 +6520, UA6520 +6521, UA6521 +6522, UA6522 +6523, UA6523 +6524, UA6524 +6525, UA6525 +6526, UA6526 +6527, UA6527 +6528, UA6528 +6529, UA6529 +6530, UA6530 +6531, UA6531 +6532, UA6532 +6533, UA6533 +6534, UA6534 +6535, UA6535 +6536, UA6536 +6537, UA6537 +6538, UA6538 +6539, UA6539 +6540, UA6540 +6541, UA6541 +6542, UA6542 +6543, UA6543 +6544, UA6544 +6545, UA6545 +6546, UA6546 +6547, UA6547 +6548, UA6548 +6549, UA6549 +6550, UA6550 +6551, UA6551 +6552, UA6552 +6553, UA6553 +6554, UA6554 +6555, UA6555 +6556, UA6556 +6557, UA6557 +6558, UA6558 +6559, UA6559 +6560, UA6560 +6561, UA6561 +6562, UA6562 +6563, UA6563 +6564, UA6564 +6565, UA6565 +6566, UA6566 +6567, UA6567 +6568, UA6568 +6569, UA6569 +6570, UA6570 +6571, UA6571 +6572, UA6572 +6573, UA6573 +6574, UA6574 +6575, UA6575 +6576, UA6576 +6577, UA6577 +6578, UA6578 +6579, UA6579 +6580, UA6580 +6581, UA6581 +6582, UA6582 +6583, UA6583 +6584, UA6584 +6585, UA6585 +6586, UA6586 +6587, UA6587 +6588, UA6588 +6589, UA6589 +6590, UA6590 +6591, UA6591 +6592, UA6592 +6593, UA6593 +6594, UA6594 +6595, UA6595 +6596, UA6596 +6597, UA6597 +6598, UA6598 +6599, UA6599 +6600, UA6600 +6601, UA6601 +6602, UA6602 +6603, UA6603 +6604, UA6604 +6605, UA6605 +6606, UA6606 +6607, UA6607 +6608, UA6608 +6609, UA6609 +6610, UA6610 +6611, UA6611 +6612, UA6612 +6613, UA6613 +6614, UA6614 +6615, UA6615 +6616, UA6616 +6617, UA6617 +6618, UA6618 +6619, UA6619 +6620, UA6620 +6621, UA6621 +6622, UA6622 +6623, UA6623 +6624, UA6624 +6625, UA6625 +6626, UA6626 +6627, UA6627 +6628, UA6628 +6629, UA6629 +6630, UA6630 +6631, UA6631 +6632, UA6632 +6633, UA6633 +6634, UA6634 +6635, UA6635 +6636, UA6636 +6637, UA6637 +6638, UA6638 +6639, UA6639 +6640, UA6640 +6641, UA6641 +6642, UA6642 +6643, UA6643 +6644, UA6644 +6645, UA6645 +6646, UA6646 +6647, UA6647 +6648, UA6648 +6649, UA6649 +6650, UA6650 +6651, UA6651 +6652, UA6652 +6653, UA6653 +6654, UA6654 +6655, UA6655 +6656, UA6656 +6657, UA6657 +6658, UA6658 +6659, UA6659 +6660, UA6660 +6661, UA6661 +6662, UA6662 +6663, UA6663 +6664, UA6664 +6665, UA6665 +6666, UA6666 +6667, UA6667 +6668, UA6668 +6669, UA6669 +6670, UA6670 +6671, UA6671 +6672, UA6672 +6673, UA6673 +6674, UA6674 +6675, UA6675 +6676, UA6676 +6677, UA6677 +6678, UA6678 +6679, UA6679 +6680, UA6680 +6681, UA6681 +6682, UA6682 +6683, UA6683 +6684, UA6684 +6685, UA6685 +6686, UA6686 +6687, UA6687 +6688, UA6688 +6689, UA6689 +6690, UA6690 +6691, UA6691 +6692, UA6692 +6693, UA6693 +6694, UA6694 +6695, UA6695 +6696, UA6696 +6697, UA6697 +6698, UA6698 +6699, UA6699 +6700, UA6700 +6701, UA6701 +6702, UA6702 +6703, UA6703 +6704, UA6704 +6705, UA6705 +6706, UA6706 +6707, UA6707 +6708, UA6708 +6709, UA6709 +6710, UA6710 +6711, UA6711 +6712, UA6712 +6713, UA6713 +6714, UA6714 +6715, UA6715 +6716, UA6716 +6717, UA6717 +6718, UA6718 +6719, UA6719 +6720, UA6720 +6721, UA6721 +6722, UA6722 +6723, UA6723 +6724, UA6724 +6725, UA6725 +6726, UA6726 +6727, UA6727 +6728, UA6728 +6729, UA6729 +6730, UA6730 +6731, UA6731 +6732, UA6732 +6733, UA6733 +6734, UA6734 +6735, UA6735 +6736, UA6736 +6737, UA6737 +6738, UA6738 +6739, UA6739 +6740, UA6740 +6741, UA6741 +6742, UA6742 +6743, UA6743 +6744, UA6744 +6745, UA6745 +6746, UA6746 +6747, UA6747 +6748, UA6748 +6749, UA6749 +6750, UA6750 +6751, UA6751 +6752, UA6752 +6753, UA6753 +6754, UA6754 +6755, UA6755 +6756, UA6756 +6757, UA6757 +6758, UA6758 +6759, UA6759 +6760, UA6760 +6761, UA6761 +6762, UA6762 +6763, UA6763 +6764, UA6764 +6765, UA6765 +6766, UA6766 +6767, UA6767 +6768, UA6768 +6769, UA6769 +6770, UA6770 +6771, UA6771 +6772, UA6772 +6773, UA6773 +6774, UA6774 +6775, UA6775 +6776, UA6776 +6777, UA6777 +6778, UA6778 +6779, UA6779 +6780, UA6780 +6781, UA6781 +6782, UA6782 +6783, UA6783 +6784, UA6784 +6785, UA6785 +6786, UA6786 +6787, UA6787 +6788, UA6788 +6789, UA6789 +6790, UA6790 +6791, UA6791 +6792, UA6792 +6793, UA6793 +6794, UA6794 +6795, UA6795 +6796, UA6796 +6797, UA6797 +6798, UA6798 +6799, UA6799 +6800, UA6800 +6801, UA6801 +6802, UA6802 +6803, UA6803 +6804, UA6804 +6805, UA6805 +6806, UA6806 +6807, UA6807 +6808, UA6808 +6809, UA6809 +6810, UA6810 +6811, UA6811 +6812, UA6812 +6813, UA6813 +6814, UA6814 +6815, UA6815 +6816, UA6816 +6817, UA6817 +6818, UA6818 +6819, UA6819 +6820, UA6820 +6821, UA6821 +6822, UA6822 +6823, UA6823 +6824, UA6824 +6825, UA6825 +6826, UA6826 +6827, UA6827 +6828, UA6828 +6829, UA6829 +6830, UA6830 +6831, UA6831 +6832, UA6832 +6833, UA6833 +6834, UA6834 +6835, UA6835 +6836, UA6836 +6837, UA6837 +6838, UA6838 +6839, UA6839 +6840, UA6840 +6841, UA6841 +6842, UA6842 +6843, UA6843 +6844, UA6844 +6845, UA6845 +6846, UA6846 +6847, UA6847 +6848, UA6848 +6849, UA6849 +6850, UA6850 +6851, UA6851 +6852, UA6852 +6853, UA6853 +6854, UA6854 +6855, UA6855 +6856, UA6856 +6857, UA6857 +6858, UA6858 +6859, UA6859 +6860, UA6860 +6861, UA6861 +6862, UA6862 +6863, UA6863 +6864, UA6864 +6865, UA6865 +6866, UA6866 +6867, UA6867 +6868, UA6868 +6869, UA6869 +6870, UA6870 +6871, UA6871 +6872, UA6872 +6873, UA6873 +6874, UA6874 +6875, UA6875 +6876, UA6876 +6877, UA6877 +6878, UA6878 +6879, UA6879 +6880, UA6880 +6881, UA6881 +6882, UA6882 +6883, UA6883 +6884, UA6884 +6885, UA6885 +6886, UA6886 +6887, UA6887 +6888, UA6888 +6889, UA6889 +6890, UA6890 +6891, UA6891 +6892, UA6892 +6893, UA6893 +6894, UA6894 +6895, UA6895 +6896, UA6896 +6897, UA6897 +6898, UA6898 +6899, UA6899 +6900, UA6900 +6901, UA6901 +6902, UA6902 +6903, UA6903 +6904, UA6904 +6905, UA6905 +6906, UA6906 +6907, UA6907 +6908, UA6908 +6909, UA6909 +6910, UA6910 +6911, UA6911 +6912, UA6912 +6913, UA6913 +6914, UA6914 +6915, UA6915 +6916, UA6916 +6917, UA6917 +6918, UA6918 +6919, UA6919 +6920, UA6920 +6921, UA6921 +6922, UA6922 +6923, UA6923 +6924, UA6924 +6925, UA6925 +6926, UA6926 +6927, UA6927 +6928, UA6928 +6929, UA6929 +6930, UA6930 +6931, UA6931 +6932, UA6932 +6933, UA6933 +6934, UA6934 +6935, UA6935 +6936, UA6936 +6937, UA6937 +6938, UA6938 +6939, UA6939 +6940, UA6940 +6941, UA6941 +6942, UA6942 +6943, UA6943 +6944, UA6944 +6945, UA6945 +6946, UA6946 +6947, UA6947 +6948, UA6948 +6949, UA6949 +6950, UA6950 +6951, UA6951 +6952, UA6952 +6953, UA6953 +6954, UA6954 +6955, UA6955 +6956, UA6956 +6957, UA6957 +6958, UA6958 +6959, UA6959 +6960, UA6960 +6961, UA6961 +6962, UA6962 +6963, UA6963 +6964, UA6964 +6965, UA6965 +6966, UA6966 +6967, UA6967 +6968, UA6968 +6969, UA6969 +6970, UA6970 +6971, UA6971 +6972, UA6972 +6973, UA6973 +6974, UA6974 +6975, UA6975 +6976, UA6976 +6977, UA6977 +6978, UA6978 +6979, UA6979 +6980, UA6980 +6981, UA6981 +6982, UA6982 +6983, UA6983 +6984, UA6984 +6985, UA6985 +6986, UA6986 +6987, UA6987 +6988, UA6988 +6989, UA6989 +6990, UA6990 +6991, UA6991 +6992, UA6992 +6993, UA6993 +6994, UA6994 +6995, UA6995 +6996, UA6996 +6997, UA6997 +6998, UA6998 +6999, UA6999 +7000, UA7000 +7001, UA7001 +7002, UA7002 +7003, UA7003 +7004, UA7004 +7005, UA7005 +7006, UA7006 +7007, UA7007 +7008, UA7008 +7009, UA7009 +7010, UA7010 +7011, UA7011 +7012, UA7012 +7013, UA7013 +7014, UA7014 +7015, UA7015 +7016, UA7016 +7017, UA7017 +7018, UA7018 +7019, UA7019 +7020, UA7020 +7021, UA7021 +7022, UA7022 +7023, UA7023 +7024, UA7024 +7025, UA7025 +7026, UA7026 +7027, UA7027 +7028, UA7028 +7029, UA7029 +7030, UA7030 +7031, UA7031 +7032, UA7032 +7033, UA7033 +7034, UA7034 +7035, UA7035 +7036, UA7036 +7037, UA7037 +7038, UA7038 +7039, UA7039 +7040, UA7040 +7041, UA7041 +7042, UA7042 +7043, UA7043 +7044, UA7044 +7045, UA7045 +7046, UA7046 +7047, UA7047 +7048, UA7048 +7049, UA7049 +7050, UA7050 +7051, UA7051 +7052, UA7052 +7053, UA7053 +7054, UA7054 +7055, UA7055 +7056, UA7056 +7057, UA7057 +7058, UA7058 +7059, UA7059 +7060, UA7060 +7061, UA7061 +7062, UA7062 +7063, UA7063 +7064, UA7064 +7065, UA7065 +7066, UA7066 +7067, UA7067 +7068, UA7068 +7069, UA7069 +7070, UA7070 +7071, UA7071 +7072, UA7072 +7073, UA7073 +7074, UA7074 +7075, UA7075 +7076, UA7076 +7077, UA7077 +7078, UA7078 +7079, UA7079 +7080, UA7080 +7081, UA7081 +7082, UA7082 +7083, UA7083 +7084, UA7084 +7085, UA7085 +7086, UA7086 +7087, UA7087 +7088, UA7088 +7089, UA7089 +7090, UA7090 +7091, UA7091 +7092, UA7092 +7093, UA7093 +7094, UA7094 +7095, UA7095 +7096, UA7096 +7097, UA7097 +7098, UA7098 +7099, UA7099 +7100, UA7100 +7101, UA7101 +7102, UA7102 +7103, UA7103 +7104, UA7104 +7105, UA7105 +7106, UA7106 +7107, UA7107 +7108, UA7108 +7109, UA7109 +7110, UA7110 +7111, UA7111 +7112, UA7112 +7113, UA7113 +7114, UA7114 +7115, UA7115 +7116, UA7116 +7117, UA7117 +7118, UA7118 +7119, UA7119 +7120, UA7120 +7121, UA7121 +7122, UA7122 +7123, UA7123 +7124, UA7124 +7125, UA7125 +7126, UA7126 +7127, UA7127 +7128, UA7128 +7129, UA7129 +7130, UA7130 +7131, UA7131 +7132, UA7132 +7133, UA7133 +7134, UA7134 +7135, UA7135 +7136, UA7136 +7137, UA7137 +7138, UA7138 +7139, UA7139 +7140, UA7140 +7141, UA7141 +7142, UA7142 +7143, UA7143 +7144, UA7144 +7145, UA7145 +7146, UA7146 +7147, UA7147 +7148, UA7148 +7149, UA7149 +7150, UA7150 +7151, UA7151 +7152, UA7152 +7153, UA7153 +7154, UA7154 +7155, UA7155 +7156, UA7156 +7157, UA7157 +7158, UA7158 +7159, UA7159 +7160, UA7160 +7161, UA7161 +7162, UA7162 +7163, UA7163 +7164, UA7164 +7165, UA7165 +7166, UA7166 +7167, UA7167 +7168, UA7168 +7169, UA7169 +7170, UA7170 +7171, UA7171 +7172, UA7172 +7173, UA7173 +7174, UA7174 +7175, UA7175 +7176, UA7176 +7177, UA7177 +7178, UA7178 +7179, UA7179 +7180, UA7180 +7181, UA7181 +7182, UA7182 +7183, UA7183 +7184, UA7184 +7185, UA7185 +7186, UA7186 +7187, UA7187 +7188, UA7188 +7189, UA7189 +7190, UA7190 +7191, UA7191 +7192, UA7192 +7193, UA7193 +7194, UA7194 +7195, UA7195 +7196, UA7196 +7197, UA7197 +7198, UA7198 +7199, UA7199 +7200, UA7200 +7201, UA7201 +7202, UA7202 +7203, UA7203 +7204, UA7204 +7205, UA7205 +7206, UA7206 +7207, UA7207 +7208, UA7208 +7209, UA7209 +7210, UA7210 +7211, UA7211 +7212, UA7212 +7213, UA7213 +7214, UA7214 +7215, UA7215 +7216, UA7216 +7217, UA7217 +7218, UA7218 +7219, UA7219 +7220, UA7220 +7221, UA7221 +7222, UA7222 +7223, UA7223 +7224, UA7224 +7225, UA7225 +7226, UA7226 +7227, UA7227 +7228, UA7228 +7229, UA7229 +7230, UA7230 +7231, UA7231 +7232, UA7232 +7233, UA7233 +7234, UA7234 +7235, UA7235 +7236, UA7236 +7237, UA7237 +7238, UA7238 +7239, UA7239 +7240, UA7240 +7241, UA7241 +7242, UA7242 +7243, UA7243 +7244, UA7244 +7245, UA7245 +7246, UA7246 +7247, UA7247 +7248, UA7248 +7249, UA7249 +7250, UA7250 +7251, UA7251 +7252, UA7252 +7253, UA7253 +7254, UA7254 +7255, UA7255 +7256, UA7256 +7257, UA7257 +7258, UA7258 +7259, UA7259 +7260, UA7260 +7261, UA7261 +7262, UA7262 +7263, UA7263 +7264, UA7264 +7265, UA7265 +7266, UA7266 +7267, UA7267 +7268, UA7268 +7269, UA7269 +7270, UA7270 +7271, UA7271 +7272, UA7272 +7273, UA7273 +7274, UA7274 +7275, UA7275 +7276, UA7276 +7277, UA7277 +7278, UA7278 +7279, UA7279 +7280, UA7280 +7281, UA7281 +7282, UA7282 +7283, UA7283 +7284, UA7284 +7285, UA7285 +7286, UA7286 +7287, UA7287 +7288, UA7288 +7289, UA7289 +7290, UA7290 +7291, UA7291 +7292, UA7292 +7293, UA7293 +7294, UA7294 +7295, UA7295 +7296, UA7296 +7297, UA7297 +7298, UA7298 +7299, UA7299 +7300, UA7300 +7301, UA7301 +7302, UA7302 +7303, UA7303 +7304, UA7304 +7305, UA7305 +7306, UA7306 +7307, UA7307 +7308, UA7308 +7309, UA7309 +7310, UA7310 +7311, UA7311 +7312, UA7312 +7313, UA7313 +7314, UA7314 +7315, UA7315 +7316, UA7316 +7317, UA7317 +7318, UA7318 +7319, UA7319 +7320, UA7320 +7321, UA7321 +7322, UA7322 +7323, UA7323 +7324, UA7324 +7325, UA7325 +7326, UA7326 +7327, UA7327 +7328, UA7328 +7329, UA7329 +7330, UA7330 +7331, UA7331 +7332, UA7332 +7333, UA7333 +7334, UA7334 +7335, UA7335 +7336, UA7336 +7337, UA7337 +7338, UA7338 +7339, UA7339 +7340, UA7340 +7341, UA7341 +7342, UA7342 +7343, UA7343 +7344, UA7344 +7345, UA7345 +7346, UA7346 +7347, UA7347 +7348, UA7348 +7349, UA7349 +7350, UA7350 +7351, UA7351 +7352, UA7352 +7353, UA7353 +7354, UA7354 +7355, UA7355 +7356, UA7356 +7357, UA7357 +7358, UA7358 +7359, UA7359 +7360, UA7360 +7361, UA7361 +7362, UA7362 +7363, UA7363 +7364, UA7364 +7365, UA7365 +7366, UA7366 +7367, UA7367 +7368, UA7368 +7369, UA7369 +7370, UA7370 +7371, UA7371 +7372, UA7372 +7373, UA7373 +7374, UA7374 +7375, UA7375 +7376, UA7376 +7377, UA7377 +7378, UA7378 +7379, UA7379 +7380, UA7380 +7381, UA7381 +7382, UA7382 +7383, UA7383 +7384, UA7384 +7385, UA7385 +7386, UA7386 +7387, UA7387 +7388, UA7388 +7389, UA7389 +7390, UA7390 +7391, UA7391 +7392, UA7392 +7393, UA7393 +7394, UA7394 +7395, UA7395 +7396, UA7396 +7397, UA7397 +7398, UA7398 +7399, UA7399 +7400, UA7400 +7401, UA7401 +7402, UA7402 +7403, UA7403 +7404, UA7404 +7405, UA7405 +7406, UA7406 +7407, UA7407 +7408, UA7408 +7409, UA7409 +7410, UA7410 +7411, UA7411 +7412, UA7412 +7413, UA7413 +7414, UA7414 +7415, UA7415 +7416, UA7416 +7417, UA7417 +7418, UA7418 +7419, UA7419 +7420, UA7420 +7421, UA7421 +7422, UA7422 +7423, UA7423 +7424, UA7424 +7425, UA7425 +7426, UA7426 +7427, UA7427 +7428, UA7428 +7429, UA7429 +7430, UA7430 +7431, UA7431 +7432, UA7432 +7433, UA7433 +7434, UA7434 +7435, UA7435 +7436, UA7436 +7437, UA7437 +7438, UA7438 +7439, UA7439 +7440, UA7440 +7441, UA7441 +7442, UA7442 +7443, UA7443 +7444, UA7444 +7445, UA7445 +7446, UA7446 +7447, UA7447 +7448, UA7448 +7449, UA7449 +7450, UA7450 +7451, UA7451 +7452, UA7452 +7453, UA7453 +7454, UA7454 +7455, UA7455 +7456, UA7456 +7457, UA7457 +7458, UA7458 +7459, UA7459 +7460, UA7460 +7461, UA7461 +7462, UA7462 +7463, UA7463 +7464, UA7464 +7465, UA7465 +7466, UA7466 +7467, UA7467 +7468, UA7468 +7469, UA7469 +7470, UA7470 +7471, UA7471 +7472, UA7472 +7473, UA7473 +7474, UA7474 +7475, UA7475 +7476, UA7476 +7477, UA7477 +7478, UA7478 +7479, UA7479 +7480, UA7480 +7481, UA7481 +7482, UA7482 +7483, UA7483 +7484, UA7484 +7485, UA7485 +7486, UA7486 +7487, UA7487 +7488, UA7488 +7489, UA7489 +7490, UA7490 +7491, UA7491 +7492, UA7492 +7493, UA7493 +7494, UA7494 +7495, UA7495 +7496, UA7496 +7497, UA7497 +7498, UA7498 +7499, UA7499 +7500, UA7500 +7501, UA7501 +7502, UA7502 +7503, UA7503 +7504, UA7504 +7505, UA7505 +7506, UA7506 +7507, UA7507 +7508, UA7508 +7509, UA7509 +7510, UA7510 +7511, UA7511 +7512, UA7512 +7513, UA7513 +7514, UA7514 +7515, UA7515 +7516, UA7516 +7517, UA7517 +7518, UA7518 +7519, UA7519 +7520, UA7520 +7521, UA7521 +7522, UA7522 +7523, UA7523 +7524, UA7524 +7525, UA7525 +7526, UA7526 +7527, UA7527 +7528, UA7528 +7529, UA7529 +7530, UA7530 +7531, UA7531 +7532, UA7532 +7533, UA7533 +7534, UA7534 +7535, UA7535 +7536, UA7536 +7537, UA7537 +7538, UA7538 +7539, UA7539 +7540, UA7540 +7541, UA7541 +7542, UA7542 +7543, UA7543 +7544, UA7544 +7545, UA7545 +7546, UA7546 +7547, UA7547 +7548, UA7548 +7549, UA7549 +7550, UA7550 +7551, UA7551 +7552, UA7552 +7553, UA7553 +7554, UA7554 +7555, UA7555 +7556, UA7556 +7557, UA7557 +7558, UA7558 +7559, UA7559 +7560, UA7560 +7561, UA7561 +7562, UA7562 +7563, UA7563 +7564, UA7564 +7565, UA7565 +7566, UA7566 +7567, UA7567 +7568, UA7568 +7569, UA7569 +7570, UA7570 +7571, UA7571 +7572, UA7572 +7573, UA7573 +7574, UA7574 +7575, UA7575 +7576, UA7576 +7577, UA7577 +7578, UA7578 +7579, UA7579 +7580, UA7580 +7581, UA7581 +7582, UA7582 +7583, UA7583 +7584, UA7584 +7585, UA7585 +7586, UA7586 +7587, UA7587 +7588, UA7588 +7589, UA7589 +7590, UA7590 +7591, UA7591 +7592, UA7592 +7593, UA7593 +7594, UA7594 +7595, UA7595 +7596, UA7596 +7597, UA7597 +7598, UA7598 +7599, UA7599 +7600, UA7600 +7601, UA7601 +7602, UA7602 +7603, UA7603 +7604, UA7604 +7605, UA7605 +7606, UA7606 +7607, UA7607 +7608, UA7608 +7609, UA7609 +7610, UA7610 +7611, UA7611 +7612, UA7612 +7613, UA7613 +7614, UA7614 +7615, UA7615 +7616, UA7616 +7617, UA7617 +7618, UA7618 +7619, UA7619 +7620, UA7620 +7621, UA7621 +7622, UA7622 +7623, UA7623 +7624, UA7624 +7625, UA7625 +7626, UA7626 +7627, UA7627 +7628, UA7628 +7629, UA7629 +7630, UA7630 +7631, UA7631 +7632, UA7632 +7633, UA7633 +7634, UA7634 +7635, UA7635 +7636, UA7636 +7637, UA7637 +7638, UA7638 +7639, UA7639 +7640, UA7640 +7641, UA7641 +7642, UA7642 +7643, UA7643 +7644, UA7644 +7645, UA7645 +7646, UA7646 +7647, UA7647 +7648, UA7648 +7649, UA7649 +7650, UA7650 +7651, UA7651 +7652, UA7652 +7653, UA7653 +7654, UA7654 +7655, UA7655 +7656, UA7656 +7657, UA7657 +7658, UA7658 +7659, UA7659 +7660, UA7660 +7661, UA7661 +7662, UA7662 +7663, UA7663 +7664, UA7664 +7665, UA7665 +7666, UA7666 +7667, UA7667 +7668, UA7668 +7669, UA7669 +7670, UA7670 +7671, UA7671 +7672, UA7672 +7673, UA7673 +7674, UA7674 +7675, UA7675 +7676, UA7676 +7677, UA7677 +7678, UA7678 +7679, UA7679 +7680, UA7680 +7681, UA7681 +7682, UA7682 +7683, UA7683 +7684, UA7684 +7685, UA7685 +7686, UA7686 +7687, UA7687 +7688, UA7688 +7689, UA7689 +7690, UA7690 +7691, UA7691 +7692, UA7692 +7693, UA7693 +7694, UA7694 +7695, UA7695 +7696, UA7696 +7697, UA7697 +7698, UA7698 +7699, UA7699 +7700, UA7700 +7701, UA7701 +7702, UA7702 +7703, UA7703 +7704, UA7704 +7705, UA7705 +7706, UA7706 +7707, UA7707 +7708, UA7708 +7709, UA7709 +7710, UA7710 +7711, UA7711 +7712, UA7712 +7713, UA7713 +7714, UA7714 +7715, UA7715 +7716, UA7716 +7717, UA7717 +7718, UA7718 +7719, UA7719 +7720, UA7720 +7721, UA7721 +7722, UA7722 +7723, UA7723 +7724, UA7724 +7725, UA7725 +7726, UA7726 +7727, UA7727 +7728, UA7728 +7729, UA7729 +7730, UA7730 +7731, UA7731 +7732, UA7732 +7733, UA7733 +7734, UA7734 +7735, UA7735 +7736, UA7736 +7737, UA7737 +7738, UA7738 +7739, UA7739 +7740, UA7740 +7741, UA7741 +7742, UA7742 +7743, UA7743 +7744, UA7744 +7745, UA7745 +7746, UA7746 +7747, UA7747 +7748, UA7748 +7749, UA7749 +7750, UA7750 +7751, UA7751 +7752, UA7752 +7753, UA7753 +7754, UA7754 +7755, UA7755 +7756, UA7756 +7757, UA7757 +7758, UA7758 +7759, UA7759 +7760, UA7760 +7761, UA7761 +7762, UA7762 +7763, UA7763 +7764, UA7764 +7765, UA7765 +7766, UA7766 +7767, UA7767 +7768, UA7768 +7769, UA7769 +7770, UA7770 +7771, UA7771 +7772, UA7772 +7773, UA7773 +7774, UA7774 +7775, UA7775 +7776, UA7776 +7777, UA7777 +7778, UA7778 +7779, UA7779 +7780, UA7780 +7781, UA7781 +7782, UA7782 +7783, UA7783 +7784, UA7784 +7785, UA7785 +7786, UA7786 +7787, UA7787 +7788, UA7788 +7789, UA7789 +7790, UA7790 +7791, UA7791 +7792, UA7792 +7793, UA7793 +7794, UA7794 +7795, UA7795 +7796, UA7796 +7797, UA7797 +7798, UA7798 +7799, UA7799 +7800, UA7800 +7801, UA7801 +7802, UA7802 +7803, UA7803 +7804, UA7804 +7805, UA7805 +7806, UA7806 +7807, UA7807 +7808, UA7808 +7809, UA7809 +7810, UA7810 +7811, UA7811 +7812, UA7812 +7813, UA7813 +7814, UA7814 +7815, UA7815 +7816, UA7816 +7817, UA7817 +7818, UA7818 +7819, UA7819 +7820, UA7820 +7821, UA7821 +7822, UA7822 +7823, UA7823 +7824, UA7824 +7825, UA7825 +7826, UA7826 +7827, UA7827 +7828, UA7828 +7829, UA7829 +7830, UA7830 +7831, UA7831 +7832, UA7832 +7833, UA7833 +7834, UA7834 +7835, UA7835 +7836, UA7836 +7837, UA7837 +7838, UA7838 +7839, UA7839 +7840, UA7840 +7841, UA7841 +7842, UA7842 +7843, UA7843 +7844, UA7844 +7845, UA7845 +7846, UA7846 +7847, UA7847 +7848, UA7848 +7849, UA7849 +7850, UA7850 +7851, UA7851 +7852, UA7852 +7853, UA7853 +7854, UA7854 +7855, UA7855 +7856, UA7856 +7857, UA7857 +7858, UA7858 +7859, UA7859 +7860, UA7860 +7861, UA7861 +7862, UA7862 +7863, UA7863 +7864, UA7864 +7865, UA7865 +7866, UA7866 +7867, UA7867 +7868, UA7868 +7869, UA7869 +7870, UA7870 +7871, UA7871 +7872, UA7872 +7873, UA7873 +7874, UA7874 +7875, UA7875 +7876, UA7876 +7877, UA7877 +7878, UA7878 +7879, UA7879 +7880, UA7880 +7881, UA7881 +7882, UA7882 +7883, UA7883 +7884, UA7884 +7885, UA7885 +7886, UA7886 +7887, UA7887 +7888, UA7888 +7889, UA7889 +7890, UA7890 +7891, UA7891 +7892, UA7892 +7893, UA7893 +7894, UA7894 +7895, UA7895 +7896, UA7896 +7897, UA7897 +7898, UA7898 +7899, UA7899 +7900, UA7900 +7901, UA7901 +7902, UA7902 +7903, UA7903 +7904, UA7904 +7905, UA7905 +7906, UA7906 +7907, UA7907 +7908, UA7908 +7909, UA7909 +7910, UA7910 +7911, UA7911 +7912, UA7912 +7913, UA7913 +7914, UA7914 +7915, UA7915 +7916, UA7916 +7917, UA7917 +7918, UA7918 +7919, UA7919 +7920, UA7920 +7921, UA7921 +7922, UA7922 +7923, UA7923 +7924, UA7924 +7925, UA7925 +7926, UA7926 +7927, UA7927 +7928, UA7928 +7929, UA7929 +7930, UA7930 +7931, UA7931 +7932, UA7932 +7933, UA7933 +7934, UA7934 +7935, UA7935 +7936, UA7936 +7937, UA7937 +7938, UA7938 +7939, UA7939 +7940, UA7940 +7941, UA7941 +7942, UA7942 +7943, UA7943 +7944, UA7944 +7945, UA7945 +7946, UA7946 +7947, UA7947 +7948, UA7948 +7949, UA7949 +7950, UA7950 +7951, UA7951 +7952, UA7952 +7953, UA7953 +7954, UA7954 +7955, UA7955 +7956, UA7956 +7957, UA7957 +7958, UA7958 +7959, UA7959 +7960, UA7960 +7961, UA7961 +7962, UA7962 +7963, UA7963 +7964, UA7964 +7965, UA7965 +7966, UA7966 +7967, UA7967 +7968, UA7968 +7969, UA7969 +7970, UA7970 +7971, UA7971 +7972, UA7972 +7973, UA7973 +7974, UA7974 +7975, UA7975 +7976, UA7976 +7977, UA7977 +7978, UA7978 +7979, UA7979 +7980, UA7980 +7981, UA7981 +7982, UA7982 +7983, UA7983 +7984, UA7984 +7985, UA7985 +7986, UA7986 +7987, UA7987 +7988, UA7988 +7989, UA7989 +7990, UA7990 +7991, UA7991 +7992, UA7992 +7993, UA7993 +7994, UA7994 +7995, UA7995 +7996, UA7996 +7997, UA7997 +7998, UA7998 +7999, UA7999 +8000, UA8000 +8001, UA8001 +8002, UA8002 +8003, UA8003 +8004, UA8004 +8005, UA8005 +8006, UA8006 +8007, UA8007 +8008, UA8008 +8009, UA8009 +8010, UA8010 +8011, UA8011 +8012, UA8012 +8013, UA8013 +8014, UA8014 +8015, UA8015 +8016, UA8016 +8017, UA8017 +8018, UA8018 +8019, UA8019 +8020, UA8020 +8021, UA8021 +8022, UA8022 +8023, UA8023 +8024, UA8024 +8025, UA8025 +8026, UA8026 +8027, UA8027 +8028, UA8028 +8029, UA8029 +8030, UA8030 +8031, UA8031 +8032, UA8032 +8033, UA8033 +8034, UA8034 +8035, UA8035 +8036, UA8036 +8037, UA8037 +8038, UA8038 +8039, UA8039 +8040, UA8040 +8041, UA8041 +8042, UA8042 +8043, UA8043 +8044, UA8044 +8045, UA8045 +8046, UA8046 +8047, UA8047 +8048, UA8048 +8049, UA8049 +8050, UA8050 +8051, UA8051 +8052, UA8052 +8053, UA8053 +8054, UA8054 +8055, UA8055 +8056, UA8056 +8057, UA8057 +8058, UA8058 +8059, UA8059 +8060, UA8060 +8061, UA8061 +8062, UA8062 +8063, UA8063 +8064, UA8064 +8065, UA8065 +8066, UA8066 +8067, UA8067 +8068, UA8068 +8069, UA8069 +8070, UA8070 +8071, UA8071 +8072, UA8072 +8073, UA8073 +8074, UA8074 +8075, UA8075 +8076, UA8076 +8077, UA8077 +8078, UA8078 +8079, UA8079 +8080, UA8080 +8081, UA8081 +8082, UA8082 +8083, UA8083 +8084, UA8084 +8085, UA8085 +8086, UA8086 +8087, UA8087 +8088, UA8088 +8089, UA8089 +8090, UA8090 +8091, UA8091 +8092, UA8092 +8093, UA8093 +8094, UA8094 +8095, UA8095 +8096, UA8096 +8097, UA8097 +8098, UA8098 +8099, UA8099 +8100, UA8100 +8101, UA8101 +8102, UA8102 +8103, UA8103 +8104, UA8104 +8105, UA8105 +8106, UA8106 +8107, UA8107 +8108, UA8108 +8109, UA8109 +8110, UA8110 +8111, UA8111 +8112, UA8112 +8113, UA8113 +8114, UA8114 +8115, UA8115 +8116, UA8116 +8117, UA8117 +8118, UA8118 +8119, UA8119 +8120, UA8120 +8121, UA8121 +8122, UA8122 +8123, UA8123 +8124, UA8124 +8125, UA8125 +8126, UA8126 +8127, UA8127 +8128, UA8128 +8129, UA8129 +8130, UA8130 +8131, UA8131 +8132, UA8132 +8133, UA8133 +8134, UA8134 +8135, UA8135 +8136, UA8136 +8137, UA8137 +8138, UA8138 +8139, UA8139 +8140, UA8140 +8141, UA8141 +8142, UA8142 +8143, UA8143 +8144, UA8144 +8145, UA8145 +8146, UA8146 +8147, UA8147 +8148, UA8148 +8149, UA8149 +8150, UA8150 +8151, UA8151 +8152, UA8152 +8153, UA8153 +8154, UA8154 +8155, UA8155 +8156, UA8156 +8157, UA8157 +8158, UA8158 +8159, UA8159 +8160, UA8160 +8161, UA8161 +8162, UA8162 +8163, UA8163 +8164, UA8164 +8165, UA8165 +8166, UA8166 +8167, UA8167 +8168, UA8168 +8169, UA8169 +8170, UA8170 +8171, UA8171 +8172, UA8172 +8173, UA8173 +8174, UA8174 +8175, UA8175 +8176, UA8176 +8177, UA8177 +8178, UA8178 +8179, UA8179 +8180, UA8180 +8181, UA8181 +8182, UA8182 +8183, UA8183 +8184, UA8184 +8185, UA8185 +8186, UA8186 +8187, UA8187 +8188, UA8188 +8189, UA8189 +8190, UA8190 +8191, UA8191 +8192, UA8192 +8193, UA8193 +8194, UA8194 +8195, UA8195 +8196, UA8196 +8197, UA8197 +8198, UA8198 +8199, UA8199 +8200, UA8200 +8201, UA8201 +8202, UA8202 +8203, UA8203 +8204, UA8204 +8205, UA8205 +8206, UA8206 +8207, UA8207 +8208, UA8208 +8209, UA8209 +8210, UA8210 +8211, UA8211 +8212, UA8212 +8213, UA8213 +8214, UA8214 +8215, UA8215 +8216, UA8216 +8217, UA8217 +8218, UA8218 +8219, UA8219 +8220, UA8220 +8221, UA8221 +8222, UA8222 +8223, UA8223 +8224, UA8224 +8225, UA8225 +8226, UA8226 +8227, UA8227 +8228, UA8228 +8229, UA8229 +8230, UA8230 +8231, UA8231 +8232, UA8232 +8233, UA8233 +8234, UA8234 +8235, UA8235 +8236, UA8236 +8237, UA8237 +8238, UA8238 +8239, UA8239 +8240, UA8240 +8241, UA8241 +8242, UA8242 +8243, UA8243 +8244, UA8244 +8245, UA8245 +8246, UA8246 +8247, UA8247 +8248, UA8248 +8249, UA8249 +8250, UA8250 +8251, UA8251 +8252, UA8252 +8253, UA8253 +8254, UA8254 +8255, UA8255 +8256, UA8256 +8257, UA8257 +8258, UA8258 +8259, UA8259 +8260, UA8260 +8261, UA8261 +8262, UA8262 +8263, UA8263 +8264, UA8264 +8265, UA8265 +8266, UA8266 +8267, UA8267 +8268, UA8268 +8269, UA8269 +8270, UA8270 +8271, UA8271 +8272, UA8272 +8273, UA8273 +8274, UA8274 +8275, UA8275 +8276, UA8276 +8277, UA8277 +8278, UA8278 +8279, UA8279 +8280, UA8280 +8281, UA8281 +8282, UA8282 +8283, UA8283 +8284, UA8284 +8285, UA8285 +8286, UA8286 +8287, UA8287 +8288, UA8288 +8289, UA8289 +8290, UA8290 +8291, UA8291 +8292, UA8292 +8293, UA8293 +8294, UA8294 +8295, UA8295 +8296, UA8296 +8297, UA8297 +8298, UA8298 +8299, UA8299 +8300, UA8300 +8301, UA8301 +8302, UA8302 +8303, UA8303 +8304, UA8304 +8305, UA8305 +8306, UA8306 +8307, UA8307 +8308, UA8308 +8309, UA8309 +8310, UA8310 +8311, UA8311 +8312, UA8312 +8313, UA8313 +8314, UA8314 +8315, UA8315 +8316, UA8316 +8317, UA8317 +8318, UA8318 +8319, UA8319 +8320, UA8320 +8321, UA8321 +8322, UA8322 +8323, UA8323 +8324, UA8324 +8325, UA8325 +8326, UA8326 +8327, UA8327 +8328, UA8328 +8329, UA8329 +8330, UA8330 +8331, UA8331 +8332, UA8332 +8333, UA8333 +8334, UA8334 +8335, UA8335 +8336, UA8336 +8337, UA8337 +8338, UA8338 +8339, UA8339 +8340, UA8340 +8341, UA8341 +8342, UA8342 +8343, UA8343 +8344, UA8344 +8345, UA8345 +8346, UA8346 +8347, UA8347 +8348, UA8348 +8349, UA8349 +8350, UA8350 +8351, UA8351 +8352, UA8352 +8353, UA8353 +8354, UA8354 +8355, UA8355 +8356, UA8356 +8357, UA8357 +8358, UA8358 +8359, UA8359 +8360, UA8360 +8361, UA8361 +8362, UA8362 +8363, UA8363 +8364, UA8364 +8365, UA8365 +8366, UA8366 +8367, UA8367 +8368, UA8368 +8369, UA8369 +8370, UA8370 +8371, UA8371 +8372, UA8372 +8373, UA8373 +8374, UA8374 +8375, UA8375 +8376, UA8376 +8377, UA8377 +8378, UA8378 +8379, UA8379 +8380, UA8380 +8381, UA8381 +8382, UA8382 +8383, UA8383 +8384, UA8384 +8385, UA8385 +8386, UA8386 +8387, UA8387 +8388, UA8388 +8389, UA8389 +8390, UA8390 +8391, UA8391 +8392, UA8392 +8393, UA8393 +8394, UA8394 +8395, UA8395 +8396, UA8396 +8397, UA8397 +8398, UA8398 +8399, UA8399 +8400, UA8400 +8401, UA8401 +8402, UA8402 +8403, UA8403 +8404, UA8404 +8405, UA8405 +8406, UA8406 +8407, UA8407 +8408, UA8408 +8409, UA8409 +8410, UA8410 +8411, UA8411 +8412, UA8412 +8413, UA8413 +8414, UA8414 +8415, UA8415 +8416, UA8416 +8417, UA8417 +8418, UA8418 +8419, UA8419 +8420, UA8420 +8421, UA8421 +8422, UA8422 +8423, UA8423 +8424, UA8424 +8425, UA8425 +8426, UA8426 +8427, UA8427 +8428, UA8428 +8429, UA8429 +8430, UA8430 +8431, UA8431 +8432, UA8432 +8433, UA8433 +8434, UA8434 +8435, UA8435 +8436, UA8436 +8437, UA8437 +8438, UA8438 +8439, UA8439 +8440, UA8440 +8441, UA8441 +8442, UA8442 +8443, UA8443 +8444, UA8444 +8445, UA8445 +8446, UA8446 +8447, UA8447 +8448, UA8448 +8449, UA8449 +8450, UA8450 +8451, UA8451 +8452, UA8452 +8453, UA8453 +8454, UA8454 +8455, UA8455 +8456, UA8456 +8457, UA8457 +8458, UA8458 +8459, UA8459 +8460, UA8460 +8461, UA8461 +8462, UA8462 +8463, UA8463 +8464, UA8464 +8465, UA8465 +8466, UA8466 +8467, UA8467 +8468, UA8468 +8469, UA8469 +8470, UA8470 +8471, UA8471 +8472, UA8472 +8473, UA8473 +8474, UA8474 +8475, UA8475 +8476, UA8476 +8477, UA8477 +8478, UA8478 +8479, UA8479 +8480, UA8480 +8481, UA8481 +8482, UA8482 +8483, UA8483 +8484, UA8484 +8485, UA8485 +8486, UA8486 +8487, UA8487 +8488, UA8488 +8489, UA8489 +8490, UA8490 +8491, UA8491 +8492, UA8492 +8493, UA8493 +8494, UA8494 +8495, UA8495 +8496, UA8496 +8497, UA8497 +8498, UA8498 +8499, UA8499 +8500, UA8500 +8501, UA8501 +8502, UA8502 +8503, UA8503 +8504, UA8504 +8505, UA8505 +8506, UA8506 +8507, UA8507 +8508, UA8508 +8509, UA8509 +8510, UA8510 +8511, UA8511 +8512, UA8512 +8513, UA8513 +8514, UA8514 +8515, UA8515 +8516, UA8516 +8517, UA8517 +8518, UA8518 +8519, UA8519 +8520, UA8520 +8521, UA8521 +8522, UA8522 +8523, UA8523 +8524, UA8524 +8525, UA8525 +8526, UA8526 +8527, UA8527 +8528, UA8528 +8529, UA8529 +8530, UA8530 +8531, UA8531 +8532, UA8532 +8533, UA8533 +8534, UA8534 +8535, UA8535 +8536, UA8536 +8537, UA8537 +8538, UA8538 +8539, UA8539 +8540, UA8540 +8541, UA8541 +8542, UA8542 +8543, UA8543 +8544, UA8544 +8545, UA8545 +8546, UA8546 +8547, UA8547 +8548, UA8548 +8549, UA8549 +8550, UA8550 +8551, UA8551 +8552, UA8552 +8553, UA8553 +8554, UA8554 +8555, UA8555 +8556, UA8556 +8557, UA8557 +8558, UA8558 +8559, UA8559 +8560, UA8560 +8561, UA8561 +8562, UA8562 +8563, UA8563 +8564, UA8564 +8565, UA8565 +8566, UA8566 +8567, UA8567 +8568, UA8568 +8569, UA8569 +8570, UA8570 +8571, UA8571 +8572, UA8572 +8573, UA8573 +8574, UA8574 +8575, UA8575 +8576, UA8576 +8577, UA8577 +8578, UA8578 +8579, UA8579 +8580, UA8580 +8581, UA8581 +8582, UA8582 +8583, UA8583 +8584, UA8584 +8585, UA8585 +8586, UA8586 +8587, UA8587 +8588, UA8588 +8589, UA8589 +8590, UA8590 +8591, UA8591 +8592, UA8592 +8593, UA8593 +8594, UA8594 +8595, UA8595 +8596, UA8596 +8597, UA8597 +8598, UA8598 +8599, UA8599 +8600, UA8600 +8601, UA8601 +8602, UA8602 +8603, UA8603 +8604, UA8604 +8605, UA8605 +8606, UA8606 +8607, UA8607 +8608, UA8608 +8609, UA8609 +8610, UA8610 +8611, UA8611 +8612, UA8612 +8613, UA8613 +8614, UA8614 +8615, UA8615 +8616, UA8616 +8617, UA8617 +8618, UA8618 +8619, UA8619 +8620, UA8620 +8621, UA8621 +8622, UA8622 +8623, UA8623 +8624, UA8624 +8625, UA8625 +8626, UA8626 +8627, UA8627 +8628, UA8628 +8629, UA8629 +8630, UA8630 +8631, UA8631 +8632, UA8632 +8633, UA8633 +8634, UA8634 +8635, UA8635 +8636, UA8636 +8637, UA8637 +8638, UA8638 +8639, UA8639 +8640, UA8640 +8641, UA8641 +8642, UA8642 +8643, UA8643 +8644, UA8644 +8645, UA8645 +8646, UA8646 +8647, UA8647 +8648, UA8648 +8649, UA8649 +8650, UA8650 +8651, UA8651 +8652, UA8652 +8653, UA8653 +8654, UA8654 +8655, UA8655 +8656, UA8656 +8657, UA8657 +8658, UA8658 +8659, UA8659 +8660, UA8660 +8661, UA8661 +8662, UA8662 +8663, UA8663 +8664, UA8664 +8665, UA8665 +8666, UA8666 +8667, UA8667 +8668, UA8668 +8669, UA8669 +8670, UA8670 +8671, UA8671 +8672, UA8672 +8673, UA8673 +8674, UA8674 +8675, UA8675 +8676, UA8676 +8677, UA8677 +8678, UA8678 +8679, UA8679 +8680, UA8680 +8681, UA8681 +8682, UA8682 +8683, UA8683 +8684, UA8684 +8685, UA8685 +8686, UA8686 +8687, UA8687 +8688, UA8688 +8689, UA8689 +8690, UA8690 +8691, UA8691 +8692, UA8692 +8693, UA8693 +8694, UA8694 +8695, UA8695 +8696, UA8696 +8697, UA8697 +8698, UA8698 +8699, UA8699 +8700, UA8700 +8701, UA8701 +8702, UA8702 +8703, UA8703 +8704, UA8704 +8705, UA8705 +8706, UA8706 +8707, UA8707 +8708, UA8708 +8709, UA8709 +8710, UA8710 +8711, UA8711 +8712, UA8712 +8713, UA8713 +8714, UA8714 +8715, UA8715 +8716, UA8716 +8717, UA8717 +8718, UA8718 +8719, UA8719 +8720, UA8720 +8721, UA8721 +8722, UA8722 +8723, UA8723 +8724, UA8724 +8725, UA8725 +8726, UA8726 +8727, UA8727 +8728, UA8728 +8729, UA8729 +8730, UA8730 +8731, UA8731 +8732, UA8732 +8733, UA8733 +8734, UA8734 +8735, UA8735 +8736, UA8736 +8737, UA8737 +8738, UA8738 +8739, UA8739 +8740, UA8740 +8741, UA8741 +8742, UA8742 +8743, UA8743 +8744, UA8744 +8745, UA8745 +8746, UA8746 +8747, UA8747 +8748, UA8748 +8749, UA8749 +8750, UA8750 +8751, UA8751 +8752, UA8752 +8753, UA8753 +8754, UA8754 +8755, UA8755 +8756, UA8756 +8757, UA8757 +8758, UA8758 +8759, UA8759 +8760, UA8760 +8761, UA8761 +8762, UA8762 +8763, UA8763 +8764, UA8764 +8765, UA8765 +8766, UA8766 +8767, UA8767 +8768, UA8768 +8769, UA8769 +8770, UA8770 +8771, UA8771 +8772, UA8772 +8773, UA8773 +8774, UA8774 +8775, UA8775 +8776, UA8776 +8777, UA8777 +8778, UA8778 +8779, UA8779 +8780, UA8780 +8781, UA8781 +8782, UA8782 +8783, UA8783 +8784, UA8784 +8785, UA8785 +8786, UA8786 +8787, UA8787 +8788, UA8788 +8789, UA8789 +8790, UA8790 +8791, UA8791 +8792, UA8792 +8793, UA8793 +8794, UA8794 +8795, UA8795 +8796, UA8796 +8797, UA8797 +8798, UA8798 +8799, UA8799 +8800, UA8800 +8801, UA8801 +8802, UA8802 +8803, UA8803 +8804, UA8804 +8805, UA8805 +8806, UA8806 +8807, UA8807 +8808, UA8808 +8809, UA8809 +8810, UA8810 +8811, UA8811 +8812, UA8812 +8813, UA8813 +8814, UA8814 +8815, UA8815 +8816, UA8816 +8817, UA8817 +8818, UA8818 +8819, UA8819 +8820, UA8820 +8821, UA8821 +8822, UA8822 +8823, UA8823 +8824, UA8824 +8825, UA8825 +8826, UA8826 +8827, UA8827 +8828, UA8828 +8829, UA8829 +8830, UA8830 +8831, UA8831 +8832, UA8832 +8833, UA8833 +8834, UA8834 +8835, UA8835 +8836, UA8836 +8837, UA8837 +8838, UA8838 +8839, UA8839 +8840, UA8840 +8841, UA8841 +8842, UA8842 +8843, UA8843 +8844, UA8844 +8845, UA8845 +8846, UA8846 +8847, UA8847 +8848, UA8848 +8849, UA8849 +8850, UA8850 +8851, UA8851 +8852, UA8852 +8853, UA8853 +8854, UA8854 +8855, UA8855 +8856, UA8856 +8857, UA8857 +8858, UA8858 +8859, UA8859 +8860, UA8860 +8861, UA8861 +8862, UA8862 +8863, UA8863 +8864, UA8864 +8865, UA8865 +8866, UA8866 +8867, UA8867 +8868, UA8868 +8869, UA8869 +8870, UA8870 +8871, UA8871 +8872, UA8872 +8873, UA8873 +8874, UA8874 +8875, UA8875 +8876, UA8876 +8877, UA8877 +8878, UA8878 +8879, UA8879 +8880, UA8880 +8881, UA8881 +8882, UA8882 +8883, UA8883 +8884, UA8884 +8885, UA8885 +8886, UA8886 +8887, UA8887 +8888, UA8888 +8889, UA8889 +8890, UA8890 +8891, UA8891 +8892, UA8892 +8893, UA8893 +8894, UA8894 +8895, UA8895 +8896, UA8896 +8897, UA8897 +8898, UA8898 +8899, UA8899 +8900, UA8900 +8901, UA8901 +8902, UA8902 +8903, UA8903 +8904, UA8904 +8905, UA8905 +8906, UA8906 +8907, UA8907 +8908, UA8908 +8909, UA8909 +8910, UA8910 +8911, UA8911 +8912, UA8912 +8913, UA8913 +8914, UA8914 +8915, UA8915 +8916, UA8916 +8917, UA8917 +8918, UA8918 +8919, UA8919 +8920, UA8920 +8921, UA8921 +8922, UA8922 +8923, UA8923 +8924, UA8924 +8925, UA8925 +8926, UA8926 +8927, UA8927 +8928, UA8928 +8929, UA8929 +8930, UA8930 +8931, UA8931 +8932, UA8932 +8933, UA8933 +8934, UA8934 +8935, UA8935 +8936, UA8936 +8937, UA8937 +8938, UA8938 +8939, UA8939 +8940, UA8940 +8941, UA8941 +8942, UA8942 +8943, UA8943 +8944, UA8944 +8945, UA8945 +8946, UA8946 +8947, UA8947 +8948, UA8948 +8949, UA8949 +8950, UA8950 +8951, UA8951 +8952, UA8952 +8953, UA8953 +8954, UA8954 +8955, UA8955 +8956, UA8956 +8957, UA8957 +8958, UA8958 +8959, UA8959 +8960, UA8960 +8961, UA8961 +8962, UA8962 +8963, UA8963 +8964, UA8964 +8965, UA8965 +8966, UA8966 +8967, UA8967 +8968, UA8968 +8969, UA8969 +8970, UA8970 +8971, UA8971 +8972, UA8972 +8973, UA8973 +8974, UA8974 +8975, UA8975 +8976, UA8976 +8977, UA8977 +8978, UA8978 +8979, UA8979 +8980, UA8980 +8981, UA8981 +8982, UA8982 +8983, UA8983 +8984, UA8984 +8985, UA8985 +8986, UA8986 +8987, UA8987 +8988, UA8988 +8989, UA8989 +8990, UA8990 +8991, UA8991 +8992, UA8992 +8993, UA8993 +8994, UA8994 +8995, UA8995 +8996, UA8996 +8997, UA8997 +8998, UA8998 +8999, UA8999 +9000, UA9000 +9001, UA9001 +9002, UA9002 +9003, UA9003 +9004, UA9004 +9005, UA9005 +9006, UA9006 +9007, UA9007 +9008, UA9008 +9009, UA9009 +9010, UA9010 +9011, UA9011 +9012, UA9012 +9013, UA9013 +9014, UA9014 +9015, UA9015 +9016, UA9016 +9017, UA9017 +9018, UA9018 +9019, UA9019 +9020, UA9020 +9021, UA9021 +9022, UA9022 +9023, UA9023 +9024, UA9024 +9025, UA9025 +9026, UA9026 +9027, UA9027 +9028, UA9028 +9029, UA9029 +9030, UA9030 +9031, UA9031 +9032, UA9032 +9033, UA9033 +9034, UA9034 +9035, UA9035 +9036, UA9036 +9037, UA9037 +9038, UA9038 +9039, UA9039 +9040, UA9040 +9041, UA9041 +9042, UA9042 +9043, UA9043 +9044, UA9044 +9045, UA9045 +9046, UA9046 +9047, UA9047 +9048, UA9048 +9049, UA9049 +9050, UA9050 +9051, UA9051 +9052, UA9052 +9053, UA9053 +9054, UA9054 +9055, UA9055 +9056, UA9056 +9057, UA9057 +9058, UA9058 +9059, UA9059 +9060, UA9060 +9061, UA9061 +9062, UA9062 +9063, UA9063 +9064, UA9064 +9065, UA9065 +9066, UA9066 +9067, UA9067 +9068, UA9068 +9069, UA9069 +9070, UA9070 +9071, UA9071 +9072, UA9072 +9073, UA9073 +9074, UA9074 +9075, UA9075 +9076, UA9076 +9077, UA9077 +9078, UA9078 +9079, UA9079 +9080, UA9080 +9081, UA9081 +9082, UA9082 +9083, UA9083 +9084, UA9084 +9085, UA9085 +9086, UA9086 +9087, UA9087 +9088, UA9088 +9089, UA9089 +9090, UA9090 +9091, UA9091 +9092, UA9092 +9093, UA9093 +9094, UA9094 +9095, UA9095 +9096, UA9096 +9097, UA9097 +9098, UA9098 +9099, UA9099 +9100, UA9100 +9101, UA9101 +9102, UA9102 +9103, UA9103 +9104, UA9104 +9105, UA9105 +9106, UA9106 +9107, UA9107 +9108, UA9108 +9109, UA9109 +9110, UA9110 +9111, UA9111 +9112, UA9112 +9113, UA9113 +9114, UA9114 +9115, UA9115 +9116, UA9116 +9117, UA9117 +9118, UA9118 +9119, UA9119 +9120, UA9120 +9121, UA9121 +9122, UA9122 +9123, UA9123 +9124, UA9124 +9125, UA9125 +9126, UA9126 +9127, UA9127 +9128, UA9128 +9129, UA9129 +9130, UA9130 +9131, UA9131 +9132, UA9132 +9133, UA9133 +9134, UA9134 +9135, UA9135 +9136, UA9136 +9137, UA9137 +9138, UA9138 +9139, UA9139 +9140, UA9140 +9141, UA9141 +9142, UA9142 +9143, UA9143 +9144, UA9144 +9145, UA9145 +9146, UA9146 +9147, UA9147 +9148, UA9148 +9149, UA9149 +9150, UA9150 +9151, UA9151 +9152, UA9152 +9153, UA9153 +9154, UA9154 +9155, UA9155 +9156, UA9156 +9157, UA9157 +9158, UA9158 +9159, UA9159 +9160, UA9160 +9161, UA9161 +9162, UA9162 +9163, UA9163 +9164, UA9164 +9165, UA9165 +9166, UA9166 +9167, UA9167 +9168, UA9168 +9169, UA9169 +9170, UA9170 +9171, UA9171 +9172, UA9172 +9173, UA9173 +9174, UA9174 +9175, UA9175 +9176, UA9176 +9177, UA9177 +9178, UA9178 +9179, UA9179 +9180, UA9180 +9181, UA9181 +9182, UA9182 +9183, UA9183 +9184, UA9184 +9185, UA9185 +9186, UA9186 +9187, UA9187 +9188, UA9188 +9189, UA9189 +9190, UA9190 +9191, UA9191 +9192, UA9192 +9193, UA9193 +9194, UA9194 +9195, UA9195 +9196, UA9196 +9197, UA9197 +9198, UA9198 +9199, UA9199 +9200, UA9200 +9201, UA9201 +9202, UA9202 +9203, UA9203 +9204, UA9204 +9205, UA9205 +9206, UA9206 +9207, UA9207 +9208, UA9208 +9209, UA9209 +9210, UA9210 +9211, UA9211 +9212, UA9212 +9213, UA9213 +9214, UA9214 +9215, UA9215 +9216, UA9216 +9217, UA9217 +9218, UA9218 +9219, UA9219 +9220, UA9220 +9221, UA9221 +9222, UA9222 +9223, UA9223 +9224, UA9224 +9225, UA9225 +9226, UA9226 +9227, UA9227 +9228, UA9228 +9229, UA9229 +9230, UA9230 +9231, UA9231 +9232, UA9232 +9233, UA9233 +9234, UA9234 +9235, UA9235 +9236, UA9236 +9237, UA9237 +9238, UA9238 +9239, UA9239 +9240, UA9240 +9241, UA9241 +9242, UA9242 +9243, UA9243 +9244, UA9244 +9245, UA9245 +9246, UA9246 +9247, UA9247 +9248, UA9248 +9249, UA9249 +9250, UA9250 +9251, UA9251 +9252, UA9252 +9253, UA9253 +9254, UA9254 +9255, UA9255 +9256, UA9256 +9257, UA9257 +9258, UA9258 +9259, UA9259 +9260, UA9260 +9261, UA9261 +9262, UA9262 +9263, UA9263 +9264, UA9264 +9265, UA9265 +9266, UA9266 +9267, UA9267 +9268, UA9268 +9269, UA9269 +9270, UA9270 +9271, UA9271 +9272, UA9272 +9273, UA9273 +9274, UA9274 +9275, UA9275 +9276, UA9276 +9277, UA9277 +9278, UA9278 +9279, UA9279 +9280, UA9280 +9281, UA9281 +9282, UA9282 +9283, UA9283 +9284, UA9284 +9285, UA9285 +9286, UA9286 +9287, UA9287 +9288, UA9288 +9289, UA9289 +9290, UA9290 +9291, UA9291 +9292, UA9292 +9293, UA9293 +9294, UA9294 +9295, UA9295 +9296, UA9296 +9297, UA9297 +9298, UA9298 +9299, UA9299 +9300, UA9300 +9301, UA9301 +9302, UA9302 +9303, UA9303 +9304, UA9304 +9305, UA9305 +9306, UA9306 +9307, UA9307 +9308, UA9308 +9309, UA9309 +9310, UA9310 +9311, UA9311 +9312, UA9312 +9313, UA9313 +9314, UA9314 +9315, UA9315 +9316, UA9316 +9317, UA9317 +9318, UA9318 +9319, UA9319 +9320, UA9320 +9321, UA9321 +9322, UA9322 +9323, UA9323 +9324, UA9324 +9325, UA9325 +9326, UA9326 +9327, UA9327 +9328, UA9328 +9329, UA9329 +9330, UA9330 +9331, UA9331 +9332, UA9332 +9333, UA9333 +9334, UA9334 +9335, UA9335 +9336, UA9336 +9337, UA9337 +9338, UA9338 +9339, UA9339 +9340, UA9340 +9341, UA9341 +9342, UA9342 +9343, UA9343 +9344, UA9344 +9345, UA9345 +9346, UA9346 +9347, UA9347 +9348, UA9348 +9349, UA9349 +9350, UA9350 +9351, UA9351 +9352, UA9352 +9353, UA9353 +9354, UA9354 +9355, UA9355 +9356, UA9356 +9357, UA9357 +9358, UA9358 +9359, UA9359 +9360, UA9360 +9361, UA9361 +9362, UA9362 +9363, UA9363 +9364, UA9364 +9365, UA9365 +9366, UA9366 +9367, UA9367 +9368, UA9368 +9369, UA9369 +9370, UA9370 +9371, UA9371 +9372, UA9372 +9373, UA9373 +9374, UA9374 +9375, UA9375 +9376, UA9376 +9377, UA9377 +9378, UA9378 +9379, UA9379 +9380, UA9380 +9381, UA9381 +9382, UA9382 +9383, UA9383 +9384, UA9384 +9385, UA9385 +9386, UA9386 +9387, UA9387 +9388, UA9388 +9389, UA9389 +9390, UA9390 +9391, UA9391 +9392, UA9392 +9393, UA9393 +9394, UA9394 +9395, UA9395 +9396, UA9396 +9397, UA9397 +9398, UA9398 +9399, UA9399 +9400, UA9400 +9401, UA9401 +9402, UA9402 +9403, UA9403 +9404, UA9404 +9405, UA9405 +9406, UA9406 +9407, UA9407 +9408, UA9408 +9409, UA9409 +9410, UA9410 +9411, UA9411 +9412, UA9412 +9413, UA9413 +9414, UA9414 +9415, UA9415 +9416, UA9416 +9417, UA9417 +9418, UA9418 +9419, UA9419 +9420, UA9420 +9421, UA9421 +9422, UA9422 +9423, UA9423 +9424, UA9424 +9425, UA9425 +9426, UA9426 +9427, UA9427 +9428, UA9428 +9429, UA9429 +9430, UA9430 +9431, UA9431 +9432, UA9432 +9433, UA9433 +9434, UA9434 +9435, UA9435 +9436, UA9436 +9437, UA9437 +9438, UA9438 +9439, UA9439 +9440, UA9440 +9441, UA9441 +9442, UA9442 +9443, UA9443 +9444, UA9444 +9445, UA9445 +9446, UA9446 +9447, UA9447 +9448, UA9448 +9449, UA9449 +9450, UA9450 +9451, UA9451 +9452, UA9452 +9453, UA9453 +9454, UA9454 +9455, UA9455 +9456, UA9456 +9457, UA9457 +9458, UA9458 +9459, UA9459 +9460, UA9460 +9461, UA9461 +9462, UA9462 +9463, UA9463 +9464, UA9464 +9465, UA9465 +9466, UA9466 +9467, UA9467 +9468, UA9468 +9469, UA9469 +9470, UA9470 +9471, UA9471 +9472, UA9472 +9473, UA9473 +9474, UA9474 +9475, UA9475 +9476, UA9476 +9477, UA9477 +9478, UA9478 +9479, UA9479 +9480, UA9480 +9481, UA9481 +9482, UA9482 +9483, UA9483 +9484, UA9484 +9485, UA9485 +9486, UA9486 +9487, UA9487 +9488, UA9488 +9489, UA9489 +9490, UA9490 +9491, UA9491 +9492, UA9492 +9493, UA9493 +9494, UA9494 +9495, UA9495 +9496, UA9496 +9497, UA9497 +9498, UA9498 +9499, UA9499 +9500, UA9500 +9501, UA9501 +9502, UA9502 +9503, UA9503 +9504, UA9504 +9505, UA9505 +9506, UA9506 +9507, UA9507 +9508, UA9508 +9509, UA9509 +9510, UA9510 +9511, UA9511 +9512, UA9512 +9513, UA9513 +9514, UA9514 +9515, UA9515 +9516, UA9516 +9517, UA9517 +9518, UA9518 +9519, UA9519 +9520, UA9520 +9521, UA9521 +9522, UA9522 +9523, UA9523 +9524, UA9524 +9525, UA9525 +9526, UA9526 +9527, UA9527 +9528, UA9528 +9529, UA9529 +9530, UA9530 +9531, UA9531 +9532, UA9532 +9533, UA9533 +9534, UA9534 +9535, UA9535 +9536, UA9536 +9537, UA9537 +9538, UA9538 +9539, UA9539 +9540, UA9540 +9541, UA9541 +9542, UA9542 +9543, UA9543 +9544, UA9544 +9545, UA9545 +9546, UA9546 +9547, UA9547 +9548, UA9548 +9549, UA9549 +9550, UA9550 +9551, UA9551 +9552, UA9552 +9553, UA9553 +9554, UA9554 +9555, UA9555 +9556, UA9556 +9557, UA9557 +9558, UA9558 +9559, UA9559 +9560, UA9560 +9561, UA9561 +9562, UA9562 +9563, UA9563 +9564, UA9564 +9565, UA9565 +9566, UA9566 +9567, UA9567 +9568, UA9568 +9569, UA9569 +9570, UA9570 +9571, UA9571 +9572, UA9572 +9573, UA9573 +9574, UA9574 +9575, UA9575 +9576, UA9576 +9577, UA9577 +9578, UA9578 +9579, UA9579 +9580, UA9580 +9581, UA9581 +9582, UA9582 +9583, UA9583 +9584, UA9584 +9585, UA9585 +9586, UA9586 +9587, UA9587 +9588, UA9588 +9589, UA9589 +9590, UA9590 +9591, UA9591 +9592, UA9592 +9593, UA9593 +9594, UA9594 +9595, UA9595 +9596, UA9596 +9597, UA9597 +9598, UA9598 +9599, UA9599 +9600, UA9600 +9601, UA9601 +9602, UA9602 +9603, UA9603 +9604, UA9604 +9605, UA9605 +9606, UA9606 +9607, UA9607 +9608, UA9608 +9609, UA9609 +9610, UA9610 +9611, UA9611 +9612, UA9612 +9613, UA9613 +9614, UA9614 +9615, UA9615 +9616, UA9616 +9617, UA9617 +9618, UA9618 +9619, UA9619 +9620, UA9620 +9621, UA9621 +9622, UA9622 +9623, UA9623 +9624, UA9624 +9625, UA9625 +9626, UA9626 +9627, UA9627 +9628, UA9628 +9629, UA9629 +9630, UA9630 +9631, UA9631 +9632, UA9632 +9633, UA9633 +9634, UA9634 +9635, UA9635 +9636, UA9636 +9637, UA9637 +9638, UA9638 +9639, UA9639 +9640, UA9640 +9641, UA9641 +9642, UA9642 +9643, UA9643 +9644, UA9644 +9645, UA9645 +9646, UA9646 +9647, UA9647 +9648, UA9648 +9649, UA9649 +9650, UA9650 +9651, UA9651 +9652, UA9652 +9653, UA9653 +9654, UA9654 +9655, UA9655 +9656, UA9656 +9657, UA9657 +9658, UA9658 +9659, UA9659 +9660, UA9660 +9661, UA9661 +9662, UA9662 +9663, UA9663 +9664, UA9664 +9665, UA9665 +9666, UA9666 +9667, UA9667 +9668, UA9668 +9669, UA9669 +9670, UA9670 +9671, UA9671 +9672, UA9672 +9673, UA9673 +9674, UA9674 +9675, UA9675 +9676, UA9676 +9677, UA9677 +9678, UA9678 +9679, UA9679 +9680, UA9680 +9681, UA9681 +9682, UA9682 +9683, UA9683 +9684, UA9684 +9685, UA9685 +9686, UA9686 +9687, UA9687 +9688, UA9688 +9689, UA9689 +9690, UA9690 +9691, UA9691 +9692, UA9692 +9693, UA9693 +9694, UA9694 +9695, UA9695 +9696, UA9696 +9697, UA9697 +9698, UA9698 +9699, UA9699 +9700, UA9700 +9701, UA9701 +9702, UA9702 +9703, UA9703 +9704, UA9704 +9705, UA9705 +9706, UA9706 +9707, UA9707 +9708, UA9708 +9709, UA9709 +9710, UA9710 +9711, UA9711 +9712, UA9712 +9713, UA9713 +9714, UA9714 +9715, UA9715 +9716, UA9716 +9717, UA9717 +9718, UA9718 +9719, UA9719 +9720, UA9720 +9721, UA9721 +9722, UA9722 +9723, UA9723 +9724, UA9724 +9725, UA9725 +9726, UA9726 +9727, UA9727 +9728, UA9728 +9729, UA9729 +9730, UA9730 +9731, UA9731 +9732, UA9732 +9733, UA9733 +9734, UA9734 +9735, UA9735 +9736, UA9736 +9737, UA9737 +9738, UA9738 +9739, UA9739 +9740, UA9740 +9741, UA9741 +9742, UA9742 +9743, UA9743 +9744, UA9744 +9745, UA9745 +9746, UA9746 +9747, UA9747 +9748, UA9748 +9749, UA9749 +9750, UA9750 +9751, UA9751 +9752, UA9752 +9753, UA9753 +9754, UA9754 +9755, UA9755 +9756, UA9756 +9757, UA9757 +9758, UA9758 +9759, UA9759 +9760, UA9760 +9761, UA9761 +9762, UA9762 +9763, UA9763 +9764, UA9764 +9765, UA9765 +9766, UA9766 +9767, UA9767 +9768, UA9768 +9769, UA9769 +9770, UA9770 +9771, UA9771 +9772, UA9772 +9773, UA9773 +9774, UA9774 +9775, UA9775 +9776, UA9776 +9777, UA9777 +9778, UA9778 +9779, UA9779 +9780, UA9780 +9781, UA9781 +9782, UA9782 +9783, UA9783 +9784, UA9784 +9785, UA9785 +9786, UA9786 +9787, UA9787 +9788, UA9788 +9789, UA9789 +9790, UA9790 +9791, UA9791 +9792, UA9792 +9793, UA9793 +9794, UA9794 +9795, UA9795 +9796, UA9796 +9797, UA9797 +9798, UA9798 +9799, UA9799 +9800, UA9800 +9801, UA9801 +9802, UA9802 +9803, UA9803 +9804, UA9804 +9805, UA9805 +9806, UA9806 +9807, UA9807 +9808, UA9808 +9809, UA9809 +9810, UA9810 +9811, UA9811 +9812, UA9812 +9813, UA9813 +9814, UA9814 +9815, UA9815 +9816, UA9816 +9817, UA9817 +9818, UA9818 +9819, UA9819 +9820, UA9820 +9821, UA9821 +9822, UA9822 +9823, UA9823 +9824, UA9824 +9825, UA9825 +9826, UA9826 +9827, UA9827 +9828, UA9828 +9829, UA9829 +9830, UA9830 +9831, UA9831 +9832, UA9832 +9833, UA9833 +9834, UA9834 +9835, UA9835 +9836, UA9836 +9837, UA9837 +9838, UA9838 +9839, UA9839 +9840, UA9840 +9841, UA9841 +9842, UA9842 +9843, UA9843 +9844, UA9844 +9845, UA9845 +9846, UA9846 +9847, UA9847 +9848, UA9848 +9849, UA9849 +9850, UA9850 +9851, UA9851 +9852, UA9852 +9853, UA9853 +9854, UA9854 +9855, UA9855 +9856, UA9856 +9857, UA9857 +9858, UA9858 +9859, UA9859 +9860, UA9860 +9861, UA9861 +9862, UA9862 +9863, UA9863 +9864, UA9864 +9865, UA9865 +9866, UA9866 +9867, UA9867 +9868, UA9868 +9869, UA9869 +9870, UA9870 +9871, UA9871 +9872, UA9872 +9873, UA9873 +9874, UA9874 +9875, UA9875 +9876, UA9876 +9877, UA9877 +9878, UA9878 +9879, UA9879 +9880, UA9880 +9881, UA9881 +9882, UA9882 +9883, UA9883 +9884, UA9884 +9885, UA9885 +9886, UA9886 +9887, UA9887 +9888, UA9888 +9889, UA9889 +9890, UA9890 +9891, UA9891 +9892, UA9892 +9893, UA9893 +9894, UA9894 +9895, UA9895 +9896, UA9896 +9897, UA9897 +9898, UA9898 +9899, UA9899 +9900, UA9900 +9901, UA9901 +9902, UA9902 +9903, UA9903 +9904, UA9904 +9905, UA9905 +9906, UA9906 +9907, UA9907 +9908, UA9908 +9909, UA9909 +9910, UA9910 +9911, UA9911 +9912, UA9912 +9913, UA9913 +9914, UA9914 +9915, UA9915 +9916, UA9916 +9917, UA9917 +9918, UA9918 +9919, UA9919 +9920, UA9920 +9921, UA9921 +9922, UA9922 +9923, UA9923 +9924, UA9924 +9925, UA9925 +9926, UA9926 +9927, UA9927 +9928, UA9928 +9929, UA9929 +9930, UA9930 +9931, UA9931 +9932, UA9932 +9933, UA9933 +9934, UA9934 +9935, UA9935 +9936, UA9936 +9937, UA9937 +9938, UA9938 +9939, UA9939 +9940, UA9940 +9941, UA9941 +9942, UA9942 +9943, UA9943 +9944, UA9944 +9945, UA9945 +9946, UA9946 +9947, UA9947 +9948, UA9948 +9949, UA9949 +9950, UA9950 +9951, UA9951 +9952, UA9952 +9953, UA9953 +9954, UA9954 +9955, UA9955 +9956, UA9956 +9957, UA9957 +9958, UA9958 +9959, UA9959 +9960, UA9960 +9961, UA9961 +9962, UA9962 +9963, UA9963 +9964, UA9964 +9965, UA9965 +9966, UA9966 +9967, UA9967 +9968, UA9968 +9969, UA9969 +9970, UA9970 +9971, UA9971 +9972, UA9972 +9973, UA9973 +9974, UA9974 +9975, UA9975 +9976, UA9976 +9977, UA9977 +9978, UA9978 +9979, UA9979 +9980, UA9980 +9981, UA9981 +9982, UA9982 +9983, UA9983 +9984, UA9984 +9985, UA9985 +9986, UA9986 +9987, UA9987 +9988, UA9988 +9989, UA9989 +9990, UA9990 +9991, UA9991 +9992, UA9992 +9993, UA9993 +9994, UA9994 +9995, UA9995 +9996, UA9996 +9997, UA9997 +9998, UA9998 +9999, UA9999 +10000, UA10000 diff --git a/testdb/csv/roles.csv b/testdb/csv/roles.csv new file mode 100644 index 000000000..704fb6c6a --- /dev/null +++ b/testdb/csv/roles.csv @@ -0,0 +1,10 @@ +:START_ID,role,:END_ID,:TYPE +keanu,"Neo",tt0133093,ACTED_IN +keanu,"Neo",tt0234215,ACTED_IN +keanu,"Neo",tt0242653,ACTED_IN +laurence,"Morpheus",tt0133093,ACTED_IN +laurence,"Morpheus",tt0234215,ACTED_IN +laurence,"Morpheus",tt0242653,ACTED_IN +carrieanne,"Trinity",tt0133093,ACTED_IN +carrieanne,"Trinity",tt0234215,ACTED_IN +carrieanne,"Trinity",tt0242653,ACTED_IN \ No newline at end of file diff --git a/testdb/data/databases/neo4j/database_lock b/testdb/data/databases/neo4j/database_lock new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/neo4j/id-buffer.tmp.0 b/testdb/data/databases/neo4j/id-buffer.tmp.0 new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/neo4j/neostore b/testdb/data/databases/neo4j/neostore new file mode 100644 index 000000000..6296bc39d Binary files /dev/null and b/testdb/data/databases/neo4j/neostore differ diff --git a/testdb/data/databases/neo4j/neostore.counts.db b/testdb/data/databases/neo4j/neostore.counts.db new file mode 100644 index 000000000..7563cb0a5 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.counts.db differ diff --git a/testdb/data/databases/neo4j/neostore.indexstats.db b/testdb/data/databases/neo4j/neostore.indexstats.db new file mode 100644 index 000000000..2b26684a3 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.indexstats.db differ diff --git a/testdb/data/databases/neo4j/neostore.labeltokenstore.db b/testdb/data/databases/neo4j/neostore.labeltokenstore.db new file mode 100644 index 000000000..971474ada Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.labeltokenstore.db differ diff --git a/testdb/data/databases/neo4j/neostore.labeltokenstore.db.id b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.id new file mode 100644 index 000000000..440280e76 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names new file mode 100644 index 000000000..e915b489c Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names differ diff --git a/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names.id b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names.id new file mode 100644 index 000000000..d7edb9b27 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.labeltokenstore.db.names.id differ diff --git a/testdb/data/databases/neo4j/neostore.nodestore.db b/testdb/data/databases/neo4j/neostore.nodestore.db new file mode 100644 index 000000000..60400234a Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.nodestore.db differ diff --git a/testdb/data/databases/neo4j/neostore.nodestore.db.id b/testdb/data/databases/neo4j/neostore.nodestore.db.id new file mode 100644 index 000000000..b3a9f6307 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.nodestore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.nodestore.db.labels b/testdb/data/databases/neo4j/neostore.nodestore.db.labels new file mode 100644 index 000000000..df8ce2a58 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.nodestore.db.labels differ diff --git a/testdb/data/databases/neo4j/neostore.nodestore.db.labels.id b/testdb/data/databases/neo4j/neostore.nodestore.db.labels.id new file mode 100644 index 000000000..066eca9a6 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.nodestore.db.labels.id differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db b/testdb/data/databases/neo4j/neostore.propertystore.db new file mode 100644 index 000000000..9309edcd1 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.arrays b/testdb/data/databases/neo4j/neostore.propertystore.db.arrays new file mode 100644 index 000000000..d19598d74 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.arrays differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.arrays.id b/testdb/data/databases/neo4j/neostore.propertystore.db.arrays.id new file mode 100644 index 000000000..066eca9a6 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.arrays.id differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.id b/testdb/data/databases/neo4j/neostore.propertystore.db.id new file mode 100644 index 000000000..15f21b577 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.index b/testdb/data/databases/neo4j/neostore.propertystore.db.index new file mode 100644 index 000000000..490638f31 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.index differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.index.id b/testdb/data/databases/neo4j/neostore.propertystore.db.index.id new file mode 100644 index 000000000..4b752eb13 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.index.id differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys b/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys new file mode 100644 index 000000000..39d5c9665 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys.id b/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys.id new file mode 100644 index 000000000..5da2192c1 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.index.keys.id differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.strings b/testdb/data/databases/neo4j/neostore.propertystore.db.strings new file mode 100644 index 000000000..d19598d74 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.strings differ diff --git a/testdb/data/databases/neo4j/neostore.propertystore.db.strings.id b/testdb/data/databases/neo4j/neostore.propertystore.db.strings.id new file mode 100644 index 000000000..066eca9a6 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.propertystore.db.strings.id differ diff --git a/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db new file mode 100644 index 000000000..b72840ef5 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db differ diff --git a/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db.id b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db.id new file mode 100644 index 000000000..066eca9a6 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.relationshipgroupstore.degrees.db b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.degrees.db new file mode 100644 index 000000000..aac2e7f48 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshipgroupstore.degrees.db differ diff --git a/testdb/data/databases/neo4j/neostore.relationshipstore.db b/testdb/data/databases/neo4j/neostore.relationshipstore.db new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/neo4j/neostore.relationshipstore.db.id b/testdb/data/databases/neo4j/neostore.relationshipstore.db.id new file mode 100644 index 000000000..3bdcdc2ef Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshipstore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.relationshiptypestore.db b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.id b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.id new file mode 100644 index 000000000..3bdcdc2ef Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.id differ diff --git a/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names new file mode 100644 index 000000000..ce6529796 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names differ diff --git a/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names.id b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names.id new file mode 100644 index 000000000..066eca9a6 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.relationshiptypestore.db.names.id differ diff --git a/testdb/data/databases/neo4j/neostore.schemastore.db b/testdb/data/databases/neo4j/neostore.schemastore.db new file mode 100644 index 000000000..e7792bca8 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.schemastore.db differ diff --git a/testdb/data/databases/neo4j/neostore.schemastore.db.id b/testdb/data/databases/neo4j/neostore.schemastore.db.id new file mode 100644 index 000000000..cfa777598 Binary files /dev/null and b/testdb/data/databases/neo4j/neostore.schemastore.db.id differ diff --git a/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 b/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 new file mode 100644 index 000000000..3e6fb3454 Binary files /dev/null and b/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 differ diff --git a/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 b/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 new file mode 100644 index 000000000..737bfa7f3 Binary files /dev/null and b/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 differ diff --git a/testdb/data/databases/store_lock b/testdb/data/databases/store_lock new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/system/database_lock b/testdb/data/databases/system/database_lock new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/system/id-buffer.tmp.0 b/testdb/data/databases/system/id-buffer.tmp.0 new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/data/databases/system/neostore b/testdb/data/databases/system/neostore new file mode 100644 index 000000000..fd14193bb Binary files /dev/null and b/testdb/data/databases/system/neostore differ diff --git a/testdb/data/databases/system/neostore.counts.db b/testdb/data/databases/system/neostore.counts.db new file mode 100644 index 000000000..e59fe1d9f Binary files /dev/null and b/testdb/data/databases/system/neostore.counts.db differ diff --git a/testdb/data/databases/system/neostore.indexstats.db b/testdb/data/databases/system/neostore.indexstats.db new file mode 100644 index 000000000..76eb43b3a Binary files /dev/null and b/testdb/data/databases/system/neostore.indexstats.db differ diff --git a/testdb/data/databases/system/neostore.labeltokenstore.db b/testdb/data/databases/system/neostore.labeltokenstore.db new file mode 100644 index 000000000..707ccdc3f Binary files /dev/null and b/testdb/data/databases/system/neostore.labeltokenstore.db differ diff --git a/testdb/data/databases/system/neostore.labeltokenstore.db.id b/testdb/data/databases/system/neostore.labeltokenstore.db.id new file mode 100644 index 000000000..fde73153d Binary files /dev/null and b/testdb/data/databases/system/neostore.labeltokenstore.db.id differ diff --git a/testdb/data/databases/system/neostore.labeltokenstore.db.names b/testdb/data/databases/system/neostore.labeltokenstore.db.names new file mode 100644 index 000000000..c99c601d5 Binary files /dev/null and b/testdb/data/databases/system/neostore.labeltokenstore.db.names differ diff --git a/testdb/data/databases/system/neostore.labeltokenstore.db.names.id b/testdb/data/databases/system/neostore.labeltokenstore.db.names.id new file mode 100644 index 000000000..8bebace32 Binary files /dev/null and b/testdb/data/databases/system/neostore.labeltokenstore.db.names.id differ diff --git a/testdb/data/databases/system/neostore.nodestore.db b/testdb/data/databases/system/neostore.nodestore.db new file mode 100644 index 000000000..9df8d4382 Binary files /dev/null and b/testdb/data/databases/system/neostore.nodestore.db differ diff --git a/testdb/data/databases/system/neostore.nodestore.db.id b/testdb/data/databases/system/neostore.nodestore.db.id new file mode 100644 index 000000000..1a980e23c Binary files /dev/null and b/testdb/data/databases/system/neostore.nodestore.db.id differ diff --git a/testdb/data/databases/system/neostore.nodestore.db.labels b/testdb/data/databases/system/neostore.nodestore.db.labels new file mode 100644 index 000000000..df8ce2a58 Binary files /dev/null and b/testdb/data/databases/system/neostore.nodestore.db.labels differ diff --git a/testdb/data/databases/system/neostore.nodestore.db.labels.id b/testdb/data/databases/system/neostore.nodestore.db.labels.id new file mode 100644 index 000000000..6eee274b1 Binary files /dev/null and b/testdb/data/databases/system/neostore.nodestore.db.labels.id differ diff --git a/testdb/data/databases/system/neostore.propertystore.db b/testdb/data/databases/system/neostore.propertystore.db new file mode 100644 index 000000000..fb217016a Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.arrays b/testdb/data/databases/system/neostore.propertystore.db.arrays new file mode 100644 index 000000000..d19598d74 Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.arrays differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.arrays.id b/testdb/data/databases/system/neostore.propertystore.db.arrays.id new file mode 100644 index 000000000..6eee274b1 Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.arrays.id differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.id b/testdb/data/databases/system/neostore.propertystore.db.id new file mode 100644 index 000000000..e577d07fb Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.id differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.index b/testdb/data/databases/system/neostore.propertystore.db.index new file mode 100644 index 000000000..1ab599176 Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.index differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.index.id b/testdb/data/databases/system/neostore.propertystore.db.index.id new file mode 100644 index 000000000..3cbc630ad Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.index.id differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.index.keys b/testdb/data/databases/system/neostore.propertystore.db.index.keys new file mode 100644 index 000000000..681ced28d Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.index.keys differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.index.keys.id b/testdb/data/databases/system/neostore.propertystore.db.index.keys.id new file mode 100644 index 000000000..65cab0a22 Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.index.keys.id differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.strings b/testdb/data/databases/system/neostore.propertystore.db.strings new file mode 100644 index 000000000..8119cb65a Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.strings differ diff --git a/testdb/data/databases/system/neostore.propertystore.db.strings.id b/testdb/data/databases/system/neostore.propertystore.db.strings.id new file mode 100644 index 000000000..c43613250 Binary files /dev/null and b/testdb/data/databases/system/neostore.propertystore.db.strings.id differ diff --git a/testdb/data/databases/system/neostore.relationshipgroupstore.db b/testdb/data/databases/system/neostore.relationshipgroupstore.db new file mode 100644 index 000000000..b72840ef5 Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshipgroupstore.db differ diff --git a/testdb/data/databases/system/neostore.relationshipgroupstore.db.id b/testdb/data/databases/system/neostore.relationshipgroupstore.db.id new file mode 100644 index 000000000..6eee274b1 Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshipgroupstore.db.id differ diff --git a/testdb/data/databases/system/neostore.relationshipgroupstore.degrees.db b/testdb/data/databases/system/neostore.relationshipgroupstore.degrees.db new file mode 100644 index 000000000..533388a92 Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshipgroupstore.degrees.db differ diff --git a/testdb/data/databases/system/neostore.relationshipstore.db b/testdb/data/databases/system/neostore.relationshipstore.db new file mode 100644 index 000000000..7d5e69b5b Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshipstore.db differ diff --git a/testdb/data/databases/system/neostore.relationshipstore.db.id b/testdb/data/databases/system/neostore.relationshipstore.db.id new file mode 100644 index 000000000..2e1c74a3d Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshipstore.db.id differ diff --git a/testdb/data/databases/system/neostore.relationshiptypestore.db b/testdb/data/databases/system/neostore.relationshiptypestore.db new file mode 100644 index 000000000..5a7a0b60b Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshiptypestore.db differ diff --git a/testdb/data/databases/system/neostore.relationshiptypestore.db.id b/testdb/data/databases/system/neostore.relationshiptypestore.db.id new file mode 100644 index 000000000..6eee274b1 Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshiptypestore.db.id differ diff --git a/testdb/data/databases/system/neostore.relationshiptypestore.db.names b/testdb/data/databases/system/neostore.relationshiptypestore.db.names new file mode 100644 index 000000000..1aa8cf651 Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshiptypestore.db.names differ diff --git a/testdb/data/databases/system/neostore.relationshiptypestore.db.names.id b/testdb/data/databases/system/neostore.relationshiptypestore.db.names.id new file mode 100644 index 000000000..2e1c74a3d Binary files /dev/null and b/testdb/data/databases/system/neostore.relationshiptypestore.db.names.id differ diff --git a/testdb/data/databases/system/neostore.schemastore.db b/testdb/data/databases/system/neostore.schemastore.db new file mode 100644 index 000000000..7628a6bc4 Binary files /dev/null and b/testdb/data/databases/system/neostore.schemastore.db differ diff --git a/testdb/data/databases/system/neostore.schemastore.db.id b/testdb/data/databases/system/neostore.schemastore.db.id new file mode 100644 index 000000000..76bb70000 Binary files /dev/null and b/testdb/data/databases/system/neostore.schemastore.db.id differ diff --git a/testdb/data/databases/system/schema/index/range-1.0/3/index-3 b/testdb/data/databases/system/schema/index/range-1.0/3/index-3 new file mode 100644 index 000000000..a4513aac0 Binary files /dev/null and b/testdb/data/databases/system/schema/index/range-1.0/3/index-3 differ diff --git a/testdb/data/databases/system/schema/index/range-1.0/4/index-4 b/testdb/data/databases/system/schema/index/range-1.0/4/index-4 new file mode 100644 index 000000000..8be2d417d Binary files /dev/null and b/testdb/data/databases/system/schema/index/range-1.0/4/index-4 differ diff --git a/testdb/data/databases/system/schema/index/range-1.0/7/index-7 b/testdb/data/databases/system/schema/index/range-1.0/7/index-7 new file mode 100644 index 000000000..28904a6b1 Binary files /dev/null and b/testdb/data/databases/system/schema/index/range-1.0/7/index-7 differ diff --git a/testdb/data/databases/system/schema/index/range-1.0/8/index-8 b/testdb/data/databases/system/schema/index/range-1.0/8/index-8 new file mode 100644 index 000000000..a5f6f9ebe Binary files /dev/null and b/testdb/data/databases/system/schema/index/range-1.0/8/index-8 differ diff --git a/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 b/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 new file mode 100644 index 000000000..7cd8c05d1 Binary files /dev/null and b/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 differ diff --git a/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 b/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 new file mode 100644 index 000000000..b46881cf8 Binary files /dev/null and b/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 differ diff --git a/testdb/data/server_id b/testdb/data/server_id new file mode 100644 index 000000000..411a355a2 --- /dev/null +++ b/testdb/data/server_id @@ -0,0 +1 @@ +TISK”M–]-(), indexProvider='token-lookup-1.0' )] +2024-04-03 04:12:33.494+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' )]. +2024-04-03 04:12:33.515+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index population started: [Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' )] +2024-04-03 04:12:33.562+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' )]. +2024-04-03 04:12:33.582+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [system/00000000] Checkpoint triggered by "Database init completed." @ txId: 3 checkpoint started... +2024-04-03 04:12:34.127+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [system/00000000] Checkpoint triggered by "Database init completed." @ txId: 3 checkpoint completed in 543ms. Checkpoint flushed 74 pages (0% of total available pages), in 57 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:12:34.132+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [system/00000000] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:12:34.320+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index population started: [Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:DatabaseName {name, namespace}), indexProvider='range-1.0' )] +2024-04-03 04:12:34.387+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:DatabaseName {name, namespace}), indexProvider='range-1.0' )]. +2024-04-03 04:12:34.436+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index population started: [Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Database {name}), indexProvider='range-1.0' )] +2024-04-03 04:12:34.488+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Database {name}), indexProvider='range-1.0' )]. +2024-04-03 04:12:34.561+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] Constraint Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0' ) is ONLINE. +2024-04-03 04:12:34.562+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] Constraint Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0' ) is ONLINE. +2024-04-03 04:12:34.907+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index population started: [Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:User {name}), indexProvider='range-1.0' )] +2024-04-03 04:12:34.953+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:User {name}), indexProvider='range-1.0' )]. +2024-04-03 04:12:34.995+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index population started: [Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:User {id}), indexProvider='range-1.0' )] +2024-04-03 04:12:35.050+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [system/00000000] Index creation finished for index [Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:User {id}), indexProvider='range-1.0' )]. +2024-04-03 04:12:35.080+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] Constraint Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0' ) is ONLINE. +2024-04-03 04:12:35.080+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] Constraint Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0' ) is ONLINE. +2024-04-03 04:12:35.083+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Initializing system graph model for component 'security-users' with version -1 and status UNINITIALIZED +2024-04-03 04:12:35.093+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Setting up initial user from defaults: neo4j +2024-04-03 04:12:35.094+0000 INFO [o.n.s.s.a.CommunitySecurityModule] CREATE USER neo4j PASSWORD ****** CHANGE REQUIRED +2024-04-03 04:12:35.136+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Setting version for 'security-users' to 4 +2024-04-03 04:12:35.153+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] After initialization of system graph model component 'security-users' have version 4 and status CURRENT +2024-04-03 04:12:35.171+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:12:35.178+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:12:35.181+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:12:35.188+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected configured format for store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:12:35.325+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109544144896 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:12:35.312+0000 - 0B + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:12:35.315+0000 - 0B + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:12:35.274+0000 - 0B + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:12:35.273+0000 - 0B + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:12:35.261+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:12:35.260+0000 - 0B + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:12:35.203+0000 - 0B + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:12:35.202+0000 - 0B + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:12:35.189+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:12:35.244+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:12:35.232+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:12:35.244+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:12:35.220+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:12:35.219+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:12:35.205+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:12:35.204+0000 - 0B + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:12:35.221+0000 - 0B + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:12:35.288+0000 - 0B + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:12:35.313+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:12:35.246+0000 - 0B + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:35.275+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:12:35.275+0000 - 0B + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 72.00KiB + [neo4j/fefd0874] Total size of mapped files: 72.00KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 1 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: -1--1 + [neo4j/fefd0874] - no transactions found + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: -1--1 + [neo4j/fefd0874] - no checkpoints found + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=1 high=0 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=0 high=-1 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=1 high=0 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=0 high=-1 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=1 high=0 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:12:35.327+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:12:35.327+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:12:35.330+0000 WARN [o.n.k.i.s.MetaDataStore] [neo4j/fefd0874] Missing counts store, rebuilding it. +2024-04-03 04:12:35.330+0000 WARN [o.n.k.i.s.MetaDataStore] [neo4j/fefd0874] Counts store rebuild completed. +2024-04-03 04:12:35.341+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:12:35.355+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:12:35.357+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:12:35.360+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:12:35.360+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:12:35.388+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [neo4j/fefd0874] Index population started: [Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' )] +2024-04-03 04:12:35.445+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [neo4j/fefd0874] Index creation finished for index [Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' )]. +2024-04-03 04:12:35.458+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [neo4j/fefd0874] Index population started: [Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' )] +2024-04-03 04:12:35.505+0000 INFO [o.n.k.i.a.i.IndexPopulationJob] [neo4j/fefd0874] Index creation finished for index [Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' )]. +2024-04-03 04:12:35.518+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Database init completed." @ txId: 3 checkpoint started... +2024-04-03 04:12:36.110+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Database init completed." @ txId: 3 checkpoint completed in 591ms. Checkpoint flushed 74 pages (0% of total available pages), in 57 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:12:36.110+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:12:36.173+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:12:36.173+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:12:36.177+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:12:36.177+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:12:36.177+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:12:37.765+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] Shutdown started +2024-04-03 04:12:37.765+0000 INFO [o.n.b.BoltServer] Requested Bolt server shutdown +2024-04-03 04:12:37.766+0000 INFO [o.n.b.p.c.c.ConnectionRegistry] Stopping remaining idle connections for connector bolt +2024-04-03 04:12:37.766+0000 INFO [o.n.b.p.c.c.ConnectionRegistry] Stopped 0 idling connections for connector bolt +2024-04-03 04:12:37.768+0000 INFO [o.n.d.d.DatabaseLifecycles] Stopping 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:12:37.774+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:12:37.774+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:12:37.775+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Waiting for closing transactions. +2024-04-03 04:12:37.776+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] All transactions are closed. +2024-04-03 04:12:37.776+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Database shutdown" @ txId: 7 checkpoint started... +2024-04-03 04:12:38.237+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Database shutdown" @ txId: 7 checkpoint completed in 460ms. Checkpoint flushed 37 pages (0% of total available pages), in 37 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:12:38.237+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:12:38.705+0000 INFO [o.n.d.d.DatabaseLifecycles] Stopped 'DatabaseId{fefd0874[neo4j]}' successfully. +2024-04-03 04:12:38.705+0000 INFO [o.n.d.d.DatabaseLifecycles] Stopping 'DatabaseId{00000000[system]}'. +2024-04-03 04:12:38.706+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:12:38.706+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:12:38.706+0000 INFO [o.n.k.d.Database] [system/00000000] Waiting for closing transactions. +2024-04-03 04:12:38.706+0000 INFO [o.n.k.d.Database] [system/00000000] All transactions are closed. +2024-04-03 04:12:38.707+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [system/00000000] Checkpoint triggered by "Database shutdown" @ txId: 37 checkpoint started... +2024-04-03 04:12:39.513+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [system/00000000] Checkpoint triggered by "Database shutdown" @ txId: 37 checkpoint completed in 806ms. Checkpoint flushed 69 pages (0% of total available pages), in 69 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:12:39.514+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [system/00000000] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:12:40.031+0000 INFO [o.n.d.d.DatabaseLifecycles] Stopped 'DatabaseId{00000000[system]}' successfully. +2024-04-03 04:12:40.035+0000 INFO [o.n.b.BoltServer] Shutting down Bolt server +2024-04-03 04:12:40.035+0000 INFO [o.n.b.p.c.c.ConnectionRegistry] Stopping 0 connections for connector bolt +2024-04-03 04:12:40.036+0000 INFO [o.n.b.p.c.c.ConnectionRegistry] Stopped all remaining connections for connector bolt +2024-04-03 04:18:35.785+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:18:35.962+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:18:35.962+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:18:35.993+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:18:35.994+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:18:36.222+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 115.1MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.552GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 148.0MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.208MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=3.938MiB, used=3.927MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=84.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=23.58MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.395MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=983.9KiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 42640 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=74494328883025, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56055:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 74494328883025 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna15730937095053768034.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:18:36.362+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:18:36.363+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:18:37.166+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:18:37.361+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:18:37.482+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:18:37.482+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:18:37.497+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:18:37.777+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:18:37.857+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:18:37.857+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:18:38.469+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109544579072 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:18:38.280+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:18:38.328+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:18:38.209+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:18:38.194+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:18:38.051+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:18:38.027+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:18:38.116+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:18:38.131+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:18:38.086+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:18:38.071+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:18:38.100+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:18:38.238+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:18:38.307+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:18:38.143+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:18:38.171+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:18:38.157+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:18:38.224+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:12:39.549+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:12:39.558+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:12:39.569+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:12:39.591+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:12:39.526+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:12:39.539+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:18:38.797+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 149ms +2024-04-03 04:18:38.801+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:18:38.802+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:18:38.862+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:18:38.865+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:18:38.866+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:18:38.869+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:18:38.899+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:18:38.899+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:18:39.009+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:18:39.009+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:18:39.022+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:18:39.025+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:18:39.045+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:18:39.062+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:18:39.062+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:18:39.321+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109544583168 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:18:39.269+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:18:39.294+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:12:38.210+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:18:39.220+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:12:38.182+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:18:39.208+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:12:38.172+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:18:39.077+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:18:39.065+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:12:38.196+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:18:39.134+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:18:39.149+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:12:38.160+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:18:39.103+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:12:38.151+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:18:39.089+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:18:39.121+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:18:39.255+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:18:39.281+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:18:39.162+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:18:39.193+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:18:39.181+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:18:39.238+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:12:38.253+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:12:38.266+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 880.0KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 7 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 3.650KiB + [neo4j/fefd0874] - total size of files: 3.650KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=3738}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=7, checksum=1516686099, commitTimestamp=1712117556227, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 7, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=1 high=0 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=22 high=21 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=12 high=11 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=9 high=8 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=2 high=1 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=1 high=0 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:18:39.370+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 46ms +2024-04-03 04:18:39.371+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:18:39.372+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:18:39.375+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:18:39.377+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:18:39.379+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:18:39.380+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:18:39.381+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:18:39.381+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:18:39.427+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:18:39.427+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:18:39.430+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:18:39.430+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:18:39.431+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:21:09.094+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:21:09.254+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:21:09.254+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:21:09.287+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:21:09.288+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:21:09.510+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 322.5MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.552GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 148.1MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.211MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.563MiB, used=4.503MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=84.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.82MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.093MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.214MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 42896 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=74647662238119, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56143:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 74647662238119 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna12214014348561551387.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:21:09.647+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:21:09.648+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:21:10.421+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:21:10.625+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:21:10.703+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:21:10.703+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:21:10.717+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:21:10.951+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:21:10.998+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:21:10.998+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:21:11.610+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109537165312 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:18:38.801+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:21:11.433+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:21:11.479+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:21:11.352+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:21:11.336+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:21:11.176+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:21:11.153+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:21:11.249+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:21:11.273+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:21:11.212+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:21:11.194+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:21:11.230+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:21:11.389+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:21:11.462+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:21:11.289+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:21:11.322+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:21:11.303+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:21:11.370+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:18:38.719+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:18:38.733+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:18:38.759+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:18:38.785+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:18:38.672+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:18:38.688+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:21:11.799+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:11.799+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:11.801+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.801+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:11.824+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:11.824+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:11.825+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.825+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:11.858+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:21:11.858+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:21:11.859+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.859+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:21:11.884+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:21:11.884+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:21:11.885+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.885+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:21:11.904+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:21:11.904+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:21:11.905+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.905+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:21:11.924+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:21:11.924+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:21:11.925+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 154ms +2024-04-03 04:21:11.925+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:11.925+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:21:11.930+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:21:11.930+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:21:11.986+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:21:11.989+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:21:11.990+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:21:11.993+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:21:12.027+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:21:12.027+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:21:12.129+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:21:12.129+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:21:12.141+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:21:12.143+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:21:12.160+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:21:12.174+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:21:12.174+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:21:12.416+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109537165312 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:18:39.371+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:21:12.368+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:21:12.391+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:12:38.210+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:21:12.325+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:12:38.182+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:21:12.311+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:12:38.172+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:21:12.187+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:21:12.175+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:12:38.196+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:21:12.242+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:21:12.254+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:12:38.160+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:21:12.214+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:12:38.151+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:21:12.199+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:21:12.227+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:21:12.354+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:21:12.380+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:21:12.267+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:21:12.297+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:21:12.285+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:21:12.341+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:18:39.335+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:18:39.359+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 880.0KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 7 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 3.650KiB + [neo4j/fefd0874] - total size of files: 3.650KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=3738}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=7, checksum=1516686099, commitTimestamp=1712117556227, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 7, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=1 high=0 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=22 high=21 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=12 high=11 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=9 high=8 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=2 high=1 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=1 high=0 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:21:12.441+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:12.441+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:12.442+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:12.442+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:21:12.466+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:12.466+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:12.466+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 47ms +2024-04-03 04:21:12.467+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:21:12.467+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:21:12.469+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:21:12.469+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:21:12.471+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:21:12.472+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:21:12.473+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:21:12.475+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:21:12.476+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:21:12.476+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:21:12.522+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:21:12.522+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:21:12.524+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:21:12.524+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:21:12.524+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:25:52.651+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:25:52.804+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:25:52.805+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:25:52.836+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:25:52.836+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:25:53.061+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 565.7MiB + Committed virtual memory: 38.30GiB + Total swap space: 2.000GiB + Free swap space: 1.552GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 146.9MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.215MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.74MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.375MiB, used=4.373MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=84.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=23.93MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.184MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.274MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 43319 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=74931250975476, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56274:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 74931250975476 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna5876030457686468303.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:25:53.209+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:25:53.210+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:25:53.978+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:25:54.173+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:25:54.256+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:25:54.256+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:25:54.270+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:25:54.510+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:25:54.554+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:25:54.554+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:25:55.174+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109517807616 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:21:11.930+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:25:54.996+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:25:55.046+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:25:54.922+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:25:54.907+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:25:54.732+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:25:54.705+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:25:54.799+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:25:54.829+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:25:54.763+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:25:54.745+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:25:54.782+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:25:54.952+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:25:55.025+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:25:54.846+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:25:54.889+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:25:54.867+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:25:54.939+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:21:11.848+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:21:11.869+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:21:11.894+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:21:11.915+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:21:11.788+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:21:11.814+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:25:55.381+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:55.381+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:55.383+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.383+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:55.408+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:55.409+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:55.409+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.409+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:55.443+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:25:55.443+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:25:55.444+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.444+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:25:55.473+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:25:55.474+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:25:55.475+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.475+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:25:55.494+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:25:55.494+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:25:55.496+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.496+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:25:55.517+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:25:55.517+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:25:55.518+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 167ms +2024-04-03 04:25:55.518+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:55.518+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:25:55.524+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:25:55.524+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:25:55.581+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:25:55.585+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:25:55.586+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:25:55.588+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:25:55.618+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:25:55.619+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:25:55.723+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:25:55.724+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:25:55.735+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:25:55.738+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:25:55.756+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:25:55.767+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:25:55.767+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:25:56.018+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109517807616 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:21:12.468+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:25:55.969+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:25:55.995+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:12:38.210+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:25:55.923+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:12:38.182+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:25:55.907+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:12:38.172+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:25:55.781+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:25:55.768+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:12:38.196+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:25:55.838+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:25:55.853+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:12:38.160+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:25:55.811+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:12:38.151+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:25:55.797+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:25:55.824+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:25:55.954+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:25:55.984+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:25:55.866+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:25:55.895+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:25:55.884+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:25:55.939+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:21:12.431+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:21:12.456+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 880.0KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 7 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 3.650KiB + [neo4j/fefd0874] - total size of files: 3.650KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=3738}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=7, checksum=1516686099, commitTimestamp=1712117556227, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 7, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=1 high=0 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=22 high=21 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=12 high=11 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=9 high=8 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=2 high=1 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=1 high=0 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:25:56.047+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:56.047+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:56.048+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:56.048+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:25:56.073+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:56.074+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 53ms +2024-04-03 04:25:56.074+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:56.075+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:25:56.076+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:25:56.077+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:25:56.077+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:25:56.079+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:25:56.081+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:25:56.082+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:25:56.083+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:25:56.085+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:25:56.085+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:25:56.130+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:25:56.130+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:25:56.132+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:25:56.133+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:25:56.133+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:30:24.355+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:30:24.529+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:30:24.530+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:30:24.564+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:30:24.564+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:30:24.790+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 576.5MiB + Committed virtual memory: 38.30GiB + Total swap space: 2.000GiB + Free swap space: 1.583GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 112.0MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.214MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.74MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.375MiB, used=4.327MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.122MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=152.0MiB, used=114.0MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=23.96MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=8.000MiB, used=8.000MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.319MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 43732 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=75202940778428, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56356:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 75202940778428 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna11524302625197281968.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:30:24.939+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:30:24.939+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:30:25.696+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:30:25.888+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:30:25.980+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:30:25.981+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:30:25.994+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:30:26.231+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:30:26.294+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:30:26.294+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:30:26.910+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109507604480 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:25:55.523+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:30:26.723+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:30:26.770+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:30:26.654+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:30:26.636+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:30:26.467+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:30:26.442+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:30:26.549+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:30:26.567+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:30:26.506+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:30:26.490+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:30:26.527+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:30:26.684+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:30:26.749+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:30:26.586+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:30:26.621+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:30:26.606+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:30:26.668+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:25:55.433+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:25:55.456+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:25:55.484+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:25:55.508+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:25:55.370+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:25:55.398+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:30:27.101+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.101+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.103+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.103+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.124+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.124+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.125+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.125+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.158+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:30:27.158+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:30:27.159+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.159+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:30:27.184+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:30:27.185+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:30:27.186+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.186+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:30:27.208+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:30:27.209+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:30:27.210+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.211+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:30:27.232+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:30:27.233+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:30:27.234+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 151ms +2024-04-03 04:30:27.234+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.234+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:30:27.240+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:30:27.241+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:30:27.296+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:30:27.299+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:30:27.300+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:30:27.303+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:30:27.333+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:30:27.333+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:30:27.430+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:30:27.430+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:30:27.441+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:30:27.444+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:30:27.466+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:30:27.497+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:30:27.497+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:30:27.728+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=3738}). First observed transaction id: 8. +2024-04-03 04:30:27.771+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=3738} +2024-04-03 04:30:27.780+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 04:30:27.787+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 04:30:27.788+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 04:30:27.788+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 04:30:27.788+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 04:30:27.789+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 04:30:27.816+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.817+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.817+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.817+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.819+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.819+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.819+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.819+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:30:27.839+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.840+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.840+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 49ms +2024-04-03 04:30:27.840+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.840+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.841+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.842+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:30:27.842+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.842+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:30:27.852+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 04:30:27.852+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 04:30:27.853+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 04:30:27.861+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 04:30:27.861+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 04:30:27.863+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:8, last:10]: 3 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 133ms. +2024-04-03 04:30:27.865+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:30:27.866+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 10 checkpoint started... +2024-04-03 04:30:28.329+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 10 checkpoint completed in 461ms. Checkpoint flushed 39 pages (0% of total available pages), in 36 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:30:28.333+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:30:28.642+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:30:28.656+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:30:28.656+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:30:28.901+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109507608576 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:25:56.076+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:30:28.848+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:30:28.875+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:30:28.303+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:30:28.805+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:30:28.279+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:30:28.791+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:30:28.267+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:30:28.672+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:30:28.658+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:30:28.290+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:30:28.724+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:30:28.738+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:30:28.696+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:30:28.683+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:30:28.710+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:30:28.835+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:30:28.863+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:30:28.751+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:30:28.778+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:30:28.765+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:30:28.821+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:30:28.335+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:30:28.346+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 880.0KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 10 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 4.381KiB + [neo4j/fefd0874] - total size of files: 4.381KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=4486}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=592}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=824}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=824}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=10, checksum=135021038, commitTimestamp=1712118358000, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 10, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=5 high=4 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=13 high=12 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=3 high=2 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=2 high=1 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:30:28.945+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 41ms +2024-04-03 04:30:28.947+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:30:28.947+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:30:28.951+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:30:28.952+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:30:28.953+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:30:28.954+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:30:28.956+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:30:28.958+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:30:29.017+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:30:29.017+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:30:29.019+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:30:29.020+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:30:29.020+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:52:38.440+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:52:38.603+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:52:38.603+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:52:38.647+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:52:38.647+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:52:38.979+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 29.38MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.583GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 145.3MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.210MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.76MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.063MiB, used=4.051MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.122MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=86.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=24.35MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.240MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1017KiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 45761 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=76537111206369, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56643:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 76537111206369 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna11541004363576127623.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:52:39.131+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:52:39.132+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:52:40.027+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:52:40.243+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:52:40.330+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:52:40.331+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:52:40.346+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:52:40.636+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:40.690+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:52:40.690+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:52:41.390+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109509001216 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:30:27.240+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:52:41.178+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:52:41.230+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:52:41.099+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:52:41.081+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:52:40.889+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:52:40.861+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:52:40.978+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:52:41.001+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:52:40.935+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:52:40.912+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:52:40.958+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:52:41.133+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:52:41.208+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:52:41.024+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:52:41.065+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:52:41.045+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:52:41.115+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:30:27.145+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:30:27.171+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:30:27.198+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:30:27.222+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:30:27.091+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:30:27.114+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:52:41.592+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:41.592+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:41.594+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:41.594+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:41.618+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:41.618+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:41.619+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:41.619+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:41.658+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:52:41.658+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:52:41.659+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:41.659+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:52:41.682+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:52:41.682+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:52:41.684+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 1ms +2024-04-03 04:52:41.684+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:52:41.706+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:52:41.707+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:52:41.708+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:41.708+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:52:41.735+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:52:41.735+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:52:41.736+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 182ms +2024-04-03 04:52:41.737+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:41.737+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:52:41.744+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:52:41.744+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:52:41.799+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:52:41.802+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:52:41.803+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:41.806+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:52:41.839+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:52:41.840+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:52:41.956+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:52:41.956+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:52:41.969+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:52:41.972+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:52:41.992+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:42.029+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:52:42.029+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:52:42.269+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=4486}). First observed transaction id: 11. +2024-04-03 04:52:42.313+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=4486} +2024-04-03 04:52:42.319+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 04:52:42.326+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 04:52:42.327+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 04:52:42.327+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 04:52:42.327+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 04:52:42.327+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 04:52:42.352+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.353+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.353+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.353+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.354+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:42.355+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:42.355+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.355+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:52:42.377+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.377+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.377+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 48ms +2024-04-03 04:52:42.378+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.378+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.379+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:42.379+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:52:42.379+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.379+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:52:42.399+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 04:52:42.399+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 04:52:42.399+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 04:52:42.399+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 04:52:42.399+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 04:52:42.401+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:11, last:11]: 1 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 130ms. +2024-04-03 04:52:42.403+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:52:42.404+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 11 checkpoint started... +2024-04-03 04:52:42.783+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 11 checkpoint completed in 377ms. Checkpoint flushed 35 pages (0% of total available pages), in 33 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:52:42.787+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:52:43.083+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:43.106+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:52:43.107+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:52:43.342+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109508988928 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:30:30.962+0000 - 125B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:52:43.289+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:52:43.314+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:30:28.303+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:52:43.254+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:30:28.279+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:52:43.241+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:52:42.746+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:52:43.122+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:52:43.109+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:52:42.757+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:52:43.169+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:52:43.182+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:52:43.145+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:52:43.133+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:52:43.157+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:52:43.279+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:52:43.301+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:52:43.195+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:52:43.229+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:52:43.208+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:52:43.265+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:52:42.789+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:52:42.800+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 896.1KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 11 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 5.030KiB + [neo4j/fefd0874] - total size of files: 5.030KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=5151}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=824}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1056}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1056}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=11, checksum=1638704931, commitTimestamp=1712118630378, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 11, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=5 high=4 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=13 high=12 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=3 high=2 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=2 high=1 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:52:43.378+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 34ms +2024-04-03 04:52:43.381+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:52:43.381+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:52:43.385+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:52:43.387+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:52:43.388+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:43.389+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:52:43.390+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:52:43.391+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:52:43.447+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:52:43.447+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:52:43.449+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:52:43.450+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:52:43.450+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 04:52:57.890+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 04:52:58.041+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:52:58.041+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 04:52:58.073+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 04:52:58.073+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 04:52:58.305+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 255.4MiB + Committed virtual memory: 38.30GiB + Total swap space: 2.000GiB + Free swap space: 1.583GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 145.5MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.209MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.438MiB, used=4.396MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.122MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=84.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=24.07MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.433MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.116MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 227 + Process id: 45806 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=76556429377928, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=56650:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 76556429377928 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna5872863713983418069.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 04:52:58.461+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:52:58.462+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 04:52:59.260+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 04:52:59.457+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 04:52:59.540+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 04:52:59.541+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 04:52:59.555+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 04:52:59.818+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:52:59.877+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 04:52:59.877+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:53:00.518+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109508726784 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:52:41.743+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 04:53:00.332+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 04:53:00.383+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 04:53:00.258+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 04:53:00.243+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 04:53:00.065+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 04:53:00.038+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 04:53:00.149+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 04:53:00.175+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 04:53:00.108+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 04:53:00.085+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 04:53:00.131+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 04:53:00.291+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:53:00.362+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 04:53:00.189+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 04:53:00.225+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:53:00.208+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 04:53:00.275+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:52:41.646+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:52:41.671+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:52:41.695+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:52:41.721+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:52:41.581+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:52:41.608+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 04:53:00.709+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:00.710+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:00.711+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.712+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:00.736+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:00.737+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:00.738+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.738+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:00.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:53:00.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:53:00.773+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.773+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 04:53:00.795+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:53:00.795+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:53:00.796+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.796+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 04:53:00.821+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:53:00.821+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:53:00.822+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.823+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 04:53:00.841+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:53:00.841+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:53:00.842+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 166ms +2024-04-03 04:53:00.842+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:00.843+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 04:53:00.848+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 04:53:00.848+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 04:53:00.903+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 04:53:00.906+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 04:53:00.907+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:53:00.910+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 04:53:00.940+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 04:53:00.940+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 04:53:01.043+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 04:53:01.043+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 04:53:01.056+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:53:01.059+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 04:53:01.076+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:53:01.108+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:53:01.108+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:53:01.346+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=5151}). First observed transaction id: 12. +2024-04-03 04:53:01.390+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=5151} +2024-04-03 04:53:01.400+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 04:53:01.410+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 04:53:01.410+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 04:53:01.411+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 04:53:01.412+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 04:53:01.412+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 04:53:01.439+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.439+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.439+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.440+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.440+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:01.440+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:01.441+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.441+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 04:53:01.461+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.461+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.461+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.461+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 47ms +2024-04-03 04:53:01.462+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.462+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:01.462+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 04:53:01.462+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.463+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 04:53:01.480+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 04:53:01.482+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 04:53:01.486+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 04:53:01.488+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 04:53:01.492+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 04:53:01.493+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:12, last:21]: 10 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 147ms. +2024-04-03 04:53:01.496+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:53:01.497+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 21 checkpoint started... +2024-04-03 04:53:01.999+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 21 checkpoint completed in 501ms. Checkpoint flushed 41 pages (0% of total available pages), in 35 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 04:53:02.005+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 04:53:02.753+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:53:02.778+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 04:53:02.778+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 04:53:03.007+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109508440064 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:52:43.380+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 04:53:02.961+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 04:53:02.983+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 04:53:02.923+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 04:53:02.909+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 04:53:01.890+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 04:53:02.791+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 04:53:02.779+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 04:53:01.920+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 04:53:02.837+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 04:53:02.852+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 04:53:02.814+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 04:53:02.803+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 04:53:02.827+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 04:53:02.949+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 04:53:02.970+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 04:53:02.868+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 04:53:02.896+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 04:53:02.882+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 04:53:02.936+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 04:53:02.007+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 04:53:02.027+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 896.0KiB + [neo4j/fefd0874] Total size of mapped files: 192.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 21 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 15.63KiB + [neo4j/fefd0874] - total size of files: 15.63KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=16000}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1056}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1288}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1288}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=21, checksum=488858741, commitTimestamp=1712119965752, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 21, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=103 high=102 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=111 high=110 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 04:53:03.043+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 33ms +2024-04-03 04:53:03.044+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 04:53:03.044+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 04:53:03.047+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 04:53:03.048+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 04:53:03.049+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 04:53:03.051+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 04:53:03.052+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 04:53:03.052+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 04:53:03.087+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 04:53:03.087+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 04:53:03.089+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 04:53:03.089+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 04:53:03.089+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 05:20:13.733+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Scheduled checkpoint for every 15 minutes threshold" @ txId: 27 checkpoint started... +2024-04-03 05:20:14.155+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Scheduled checkpoint for every 15 minutes threshold" @ txId: 27 checkpoint completed in 419ms. Checkpoint flushed 41 pages (0% of total available pages), in 41 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 05:20:14.155+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 06:06:29.007+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1666, gcTime=0, gcCount=0} +2024-04-03 06:06:30.520+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1150, gcTime=0, gcCount=0} +2024-04-03 06:36:42.004+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1215, gcTime=0, gcCount=0} +2024-04-03 06:36:43.358+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1154, gcTime=0, gcCount=0} +2024-04-03 07:08:17.006+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1355, gcTime=0, gcCount=0} +2024-04-03 07:08:18.437+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1154, gcTime=0, gcCount=0} +2024-04-03 07:40:01.006+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1479, gcTime=0, gcCount=0} +2024-04-03 07:40:02.358+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1152, gcTime=0, gcCount=0} +2024-04-03 08:07:02.002+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1317, gcTime=0, gcCount=0} +2024-04-03 08:07:04.372+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1153, gcTime=0, gcCount=0} +2024-04-03 11:14:57.003+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1339, gcTime=0, gcCount=0} +2024-04-03 11:14:58.352+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1148, gcTime=0, gcCount=0} +2024-04-03 13:37:40.003+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1672, gcTime=0, gcCount=0} +2024-04-03 13:37:41.694+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=1149, gcTime=0, gcCount=0} +2024-04-03 13:47:47.609+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 13:47:47.866+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 13:47:47.867+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 13:47:47.930+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 13:47:47.931+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 13:47:48.300+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 30.16MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.244GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 150.0MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.213MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.79MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.125MiB, used=4.112MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=82.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.54MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.421MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=980.8KiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 56400 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=80960699803784, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=57967:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 80960699803784 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna10565714216054377640.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 13:47:48.449+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 13:47:48.450+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 13:47:49.220+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 13:47:49.459+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 13:47:49.541+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 13:47:49.541+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 13:47:49.555+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 13:47:49.808+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 13:47:49.853+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 13:47:49.854+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 13:47:50.495+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109507289088 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 04:53:00.847+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 13:47:50.311+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 13:47:50.359+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 13:47:50.246+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 13:47:50.227+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 13:47:50.051+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 13:47:50.020+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 13:47:50.131+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 13:47:50.152+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 13:47:50.092+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 13:47:50.074+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 13:47:50.111+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 13:47:50.274+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 13:47:50.338+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 13:47:50.174+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 13:47:50.211+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 13:47:50.197+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 13:47:50.260+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 04:53:00.761+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 04:53:00.787+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 04:53:00.809+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 04:53:00.832+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 04:53:00.697+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 04:53:00.725+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 13:47:50.691+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:50.691+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:50.693+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.693+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:50.716+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:50.716+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:50.717+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.717+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:50.750+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 13:47:50.750+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 13:47:50.751+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.752+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 13:47:50.771+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 13:47:50.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 13:47:50.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 13:47:50.794+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 13:47:50.795+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 13:47:50.796+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.797+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 13:47:50.820+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 13:47:50.820+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 13:47:50.821+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 159ms +2024-04-03 13:47:50.821+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:50.821+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 13:47:50.827+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 13:47:50.827+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 13:47:50.882+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 13:47:50.885+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 13:47:50.886+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 13:47:50.889+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 13:47:50.922+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 13:47:50.922+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 13:47:51.031+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 13:47:51.031+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 13:47:51.043+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 13:47:51.046+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 13:47:51.062+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 13:47:51.076+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 13:47:51.076+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 13:47:51.302+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109507289088 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 04:53:05.057+0000 - 1.653KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 13:47:51.253+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 13:47:51.276+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 13:47:51.219+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 13:47:51.208+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 05:20:14.119+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 13:47:51.093+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 13:47:51.082+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 05:20:14.131+0000 - 16.00KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 13:47:51.144+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 13:47:51.156+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 13:47:51.120+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 13:47:51.105+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 13:47:51.130+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 13:47:51.241+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 13:47:51.264+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 13:47:51.170+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 13:47:51.195+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 13:47:51.183+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 13:47:51.230+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 05:20:13.821+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 05:20:13.832+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 913.7KiB + [neo4j/fefd0874] Total size of mapped files: 200.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 27 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 35.60KiB + [neo4j/fefd0874] - total size of files: 35.60KiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=36450}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1288}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1520}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1520}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=27, checksum=1878242770, commitTimestamp=1712119985140, consensusIndex=-1], reason=Checkpoint triggered by "Scheduled checkpoint for every 15 minutes threshold" @ txId: 27, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=206 high=205 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=214 high=213 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 13:47:51.325+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:51.325+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:51.326+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:51.326+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 13:47:51.352+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:51.352+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 48ms +2024-04-03 13:47:51.352+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:51.353+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 13:47:51.353+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 13:47:51.354+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 13:47:51.354+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 13:47:51.362+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 13:47:51.363+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 13:47:51.365+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 13:47:51.366+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 13:47:51.367+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 13:47:51.367+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 13:47:51.411+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 13:47:51.412+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 13:47:51.414+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 13:47:51.414+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 13:47:51.415+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:05:58.698+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:05:58.864+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:05:58.865+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:05:58.902+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:05:58.902+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:05:59.150+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 48.68MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 148.9MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.208MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.063MiB, used=4.058MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=82.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.69MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.402MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1009KiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 69507 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82051882387726, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58207:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82051882387726 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna12907876084920120300.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:05:59.290+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:05:59.291+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:06:00.213+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:06:00.422+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:06:00.517+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:06:00.517+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:06:00.532+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:06:00.816+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:00.878+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:06:00.878+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:06:01.561+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109611720704 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 13:47:50.826+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:06:01.350+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:06:01.405+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:06:01.265+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:06:01.244+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:06:01.068+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:06:01.039+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:06:01.150+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:06:01.172+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:06:01.109+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:06:01.085+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:06:01.126+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:06:01.302+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:06:01.380+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:06:01.189+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:06:01.228+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:06:01.206+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:06:01.283+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 13:47:50.740+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 13:47:50.762+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 13:47:50.784+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 13:47:50.810+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 13:47:50.681+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 13:47:50.706+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:06:01.753+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:01.754+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:01.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:01.756+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:01.783+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:01.784+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:01.785+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:01.785+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:01.823+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:01.823+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:01.824+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:01.825+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:01.849+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:01.850+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:01.851+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:01.851+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:01.872+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:01.873+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:01.874+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 1ms +2024-04-03 14:06:01.875+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:01.899+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:01.899+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:01.900+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 181ms +2024-04-03 14:06:01.900+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:01.900+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:01.906+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:06:01.907+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:06:01.961+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:06:01.965+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:06:01.966+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:01.969+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:06:02.001+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:06:02.002+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:06:02.119+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:06:02.119+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:06:02.133+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:06:02.136+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:06:02.155+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:02.190+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:06:02.190+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:06:02.477+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=36450}). First observed transaction id: 28. +2024-04-03 14:06:02.526+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=36450} +2024-04-03 14:06:02.579+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:06:02.613+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:06:02.627+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:06:02.631+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:06:02.632+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:06:02.633+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:06:02.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.663+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:02.663+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:02.664+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.664+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:02.684+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.684+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.684+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 49ms +2024-04-03 14:06:02.684+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.684+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.685+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:02.685+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:02.685+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.685+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:02.714+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:06:02.748+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:06:02.777+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:06:02.784+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:06:02.823+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:06:02.825+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:28, last:33]: 6 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 347ms. +2024-04-03 14:06:02.827+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:06:02.828+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 33 checkpoint started... +2024-04-03 14:06:03.258+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 33 checkpoint completed in 429ms. Checkpoint flushed 109 pages (0% of total available pages), in 42 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:06:03.261+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:06:03.565+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:03.578+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:06:03.578+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:06:03.802+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109611159552 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 13:47:53.370+0000 - 1.653KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:06:03.750+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:06:03.775+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:06:03.713+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:06:03.701+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:06:03.221+0000 - 152.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:06:03.595+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:06:03.580+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:06:03.235+0000 - 408.0KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:06:03.642+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:06:03.654+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:06:03.617+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:06:03.604+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:06:03.630+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:06:03.738+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:06:03.763+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:06:03.666+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:06:03.687+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:06:03.678+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:06:03.725+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:06:03.262+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:06:03.274+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 1.416MiB + [neo4j/fefd0874] Total size of mapped files: 736.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 33 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 1.026MiB + [neo4j/fefd0874] - total size of files: 1.026MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=1075496}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1520}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1752}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1752}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=33, checksum=-1492631610, commitTimestamp=1712152078887, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 33, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=10003 high=10002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=10011 high=10010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:06:03.850+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 46ms +2024-04-03 14:06:03.853+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:06:03.853+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:06:03.856+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:06:03.857+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:06:03.859+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:03.861+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:06:03.863+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:06:03.863+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:06:03.924+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:06:03.924+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:06:03.926+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:06:03.926+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:06:03.927+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:06:41.386+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:06:41.548+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:06:41.548+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:06:41.581+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:06:41.582+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:06:41.794+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 208.7MiB + Committed virtual memory: 38.30GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 150.0MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.242MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.75MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.313MiB, used=4.274MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=80.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.54MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.504MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.277MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 69584 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82094439769183, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58223:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82094439769183 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna10199870036105880014.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:06:41.938+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:06:41.939+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:06:42.731+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:06:42.930+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:06:43.014+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:06:43.014+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:06:43.029+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:06:43.277+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:43.327+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:06:43.327+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:06:43.964+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109611675648 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:06:01.906+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:06:43.793+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:06:43.835+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:06:43.728+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:06:43.713+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:06:43.546+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:06:43.519+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:06:43.620+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:06:43.641+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:06:43.587+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:06:43.566+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:06:43.601+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:06:43.758+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:06:43.816+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:06:43.662+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:06:43.695+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:06:43.676+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:06:43.744+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:06:01.811+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:06:01.839+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:06:01.862+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:06:01.888+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:06:01.741+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:06:01.772+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:06:44.156+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.157+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.158+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.158+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.183+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.184+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.184+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.185+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.222+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:44.223+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:44.224+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.225+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:06:44.249+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:44.249+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:44.250+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.250+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:06:44.273+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:44.273+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:44.274+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.274+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:06:44.298+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:44.298+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:44.299+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 174ms +2024-04-03 14:06:44.299+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.300+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:06:44.306+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:06:44.307+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:06:44.369+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:06:44.373+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:06:44.373+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:44.376+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:06:44.406+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:06:44.406+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:06:44.523+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:06:44.524+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:06:44.536+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:06:44.539+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:06:44.566+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:44.614+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:06:44.614+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:06:44.856+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109611417600 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:06:03.852+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:06:44.803+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:06:44.831+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:06:44.763+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:06:44.748+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:06:03.221+0000 - 152.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:06:44.629+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:06:44.616+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:06:03.235+0000 - 408.0KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:06:44.678+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:06:44.691+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:06:44.652+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:06:44.640+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:06:44.660+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:06:44.788+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:06:44.820+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:06:44.707+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:06:44.734+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:06:44.719+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:06:44.775+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:06:03.815+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:06:03.838+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 1.414MiB + [neo4j/fefd0874] Total size of mapped files: 736.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 33 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 1.026MiB + [neo4j/fefd0874] - total size of files: 1.026MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=1075496}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1520}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1752}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1752}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=33, checksum=-1492631610, commitTimestamp=1712152078887, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 33, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=10003 high=10002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=10011 high=10010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:06:44.880+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.880+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.881+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.882+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:06:44.899+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.900+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 41ms +2024-04-03 14:06:44.900+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.901+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:06:44.901+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:06:44.902+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:06:44.902+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:06:44.905+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:06:44.907+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:06:44.908+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:06:44.909+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:06:44.911+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:06:44.911+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:06:44.955+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:06:44.955+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:06:44.958+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:06:44.958+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:06:44.958+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:07:24.072+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:07:24.276+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:07:24.276+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:07:24.311+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:07:24.311+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:07:24.539+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 342.4MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 152.5MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.213MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.75MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.375MiB, used=4.326MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=154.0MiB, used=78.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.43MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=6.000MiB, used=4.108MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.355MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 69669 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82137059248674, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58232:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82137059248674 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna9588401164563302641.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:07:24.693+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:07:24.694+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:07:25.456+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:07:25.661+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:07:25.743+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:07:25.743+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:07:25.758+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:07:26.025+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:07:26.111+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:07:26.111+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:07:26.772+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109607124992 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:06:44.306+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:07:26.593+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:07:26.639+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:07:26.522+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:07:26.506+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:07:26.315+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:07:26.292+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:07:26.403+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:07:26.428+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:07:26.364+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:07:26.339+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:07:26.386+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:07:26.556+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:07:26.619+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:07:26.443+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:07:26.478+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:07:26.460+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:07:26.538+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:06:44.210+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:06:44.238+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:06:44.262+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:06:44.288+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:06:44.145+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:06:44.172+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:07:26.957+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:26.958+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:26.961+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:26.961+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:26.985+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:26.986+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:26.987+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:26.987+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.022+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:07:27.022+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:07:27.023+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.023+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:07:27.048+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:07:27.049+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:07:27.050+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.050+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:07:27.076+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:07:27.076+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:07:27.078+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.078+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:07:27.103+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:07:27.104+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:07:27.105+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 170ms +2024-04-03 14:07:27.105+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.105+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:07:27.111+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:07:27.111+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:07:27.168+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:07:27.172+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:07:27.173+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:07:27.176+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:07:27.213+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:07:27.213+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:07:27.343+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:07:27.343+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:07:27.356+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:07:27.359+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:07:27.376+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:07:27.467+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:07:27.467+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:07:27.695+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=1075496}). First observed transaction id: 34. +2024-04-03 14:07:27.739+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=1075496} +2024-04-03 14:07:27.785+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:07:27.816+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:07:27.828+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:07:27.832+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:07:27.847+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:07:27.869+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:07:27.893+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.894+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.894+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.894+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.895+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.895+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.895+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.895+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:07:27.914+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.914+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.915+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.915+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 43ms +2024-04-03 14:07:27.915+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.915+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.916+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:07:27.916+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:27.916+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:07:28.091+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:07:28.101+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:07:28.131+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:07:28.144+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:07:28.205+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:07:28.207+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:34, last:39]: 6 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 510ms. +2024-04-03 14:07:28.209+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:07:28.210+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 39 checkpoint started... +2024-04-03 14:07:29.006+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 39 checkpoint completed in 794ms. Checkpoint flushed 109 pages (0% of total available pages), in 41 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:07:29.009+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:07:29.616+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:07:29.641+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:07:29.641+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:07:29.849+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109591961600 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:06:46.915+0000 - 156.4KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:07:29.799+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:07:29.823+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:07:29.764+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:07:29.752+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:07:28.913+0000 - 152.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:07:29.651+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:07:29.642+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:07:28.946+0000 - 408.0KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:07:29.696+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:07:29.705+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:07:29.673+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:07:29.661+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:07:29.682+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:07:29.789+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:07:29.812+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:07:29.714+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:07:29.741+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:07:29.727+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:07:29.776+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:07:29.010+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:07:29.035+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 1.567MiB + [neo4j/fefd0874] Total size of mapped files: 736.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 39 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 2.988MiB + [neo4j/fefd0874] - total size of files: 2.988MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=3133138}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1752}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=1984}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=1984}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=39, checksum=1809616111, commitTimestamp=1712153213107, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 39, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=10003 high=10002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=10011 high=10010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:07:29.895+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 43ms +2024-04-03 14:07:29.898+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:07:29.898+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:07:29.901+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:07:29.902+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:07:29.903+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:07:29.904+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:07:29.906+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:07:29.906+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:07:29.952+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:07:29.953+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:07:29.955+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:07:29.955+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:07:29.956+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:09:49.590+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:09:49.772+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:09:49.772+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:09:49.805+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:09:49.806+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:09:50.058+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 550.1MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 150.2MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.212MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.78MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.438MiB, used=4.404MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=80.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.29MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.520MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.291MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 69919 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82282532177713, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58276:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82282532177713 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna5610753358236026199.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:09:50.219+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:09:50.220+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:09:51.017+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:09:51.238+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:09:51.323+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:09:51.323+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:09:51.337+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:09:51.579+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:09:51.631+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:09:51.631+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:09:52.287+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109589286912 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:07:27.110+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:09:52.104+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:09:52.155+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:09:52.027+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:09:52.014+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:09:51.824+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:09:51.794+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:09:51.915+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:09:51.936+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:09:51.869+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:09:51.845+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:09:51.891+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:09:52.063+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:09:52.132+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:09:51.955+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:09:51.996+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:09:51.973+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:09:52.046+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:07:27.011+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:07:27.035+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:07:27.064+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:07:27.089+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:07:26.945+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:07:26.974+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:09:52.478+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:52.478+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:52.480+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.480+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:52.508+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:52.508+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:52.509+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.509+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:52.553+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:09:52.554+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:09:52.554+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.555+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:09:52.583+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:09:52.584+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:09:52.585+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.585+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:09:52.610+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:09:52.610+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:09:52.612+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.612+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:09:52.632+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:09:52.633+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:09:52.634+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 185ms +2024-04-03 14:09:52.634+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:52.634+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:09:52.640+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:09:52.641+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:09:52.704+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:09:52.707+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:09:52.708+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:09:52.711+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:09:52.742+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:09:52.742+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:09:52.846+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:09:52.846+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:09:52.859+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:09:52.862+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:09:52.882+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:09:52.950+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:09:52.950+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:09:53.208+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=3133138}). First observed transaction id: 40. +2024-04-03 14:09:53.253+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=3133138} +2024-04-03 14:09:53.297+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:09:53.331+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:09:53.345+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:09:53.349+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:09:53.366+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:09:53.385+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:09:53.411+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.411+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.411+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.412+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.412+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:53.412+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:53.413+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.413+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:09:53.433+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.433+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.433+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 46ms +2024-04-03 14:09:53.433+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.434+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.434+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:53.434+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:09:53.434+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.435+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:09:53.628+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:09:53.639+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:09:53.671+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:09:53.685+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:09:53.738+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:09:53.740+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:40, last:45]: 6 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 531ms. +2024-04-03 14:09:53.743+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:09:53.744+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 45 checkpoint started... +2024-04-03 14:09:54.101+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 45 checkpoint completed in 356ms. Checkpoint flushed 109 pages (0% of total available pages), in 41 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:09:54.104+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:09:54.344+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:09:54.356+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:09:54.356+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:09:54.585+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109589286912 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:07:31.907+0000 - 156.4KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:09:54.536+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:09:54.560+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:09:54.496+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:09:54.484+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:09:54.067+0000 - 152.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:09:54.371+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:09:54.358+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:09:54.077+0000 - 408.0KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:09:54.420+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:09:54.431+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:09:54.394+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:09:54.382+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:09:54.405+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:09:54.523+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:09:54.547+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:09:54.445+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:09:54.473+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:09:54.457+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:09:54.509+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:09:54.105+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:09:54.115+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 1.567MiB + [neo4j/fefd0874] Total size of mapped files: 736.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 45 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 4.950MiB + [neo4j/fefd0874] - total size of files: 4.950MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=5190780}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=1984}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=2216}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=2216}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=45, checksum=-444033535, commitTimestamp=1712153258234, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 45, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=10003 high=10002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=10011 high=10010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:09:54.618+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 31ms +2024-04-03 14:09:54.621+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:09:54.621+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:09:54.624+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:09:54.626+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:09:54.627+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:09:54.628+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:09:54.630+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:09:54.630+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:09:54.679+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:09:54.680+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:09:54.683+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:09:54.683+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:09:54.683+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:10:23.880+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:10:24.072+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:10:24.072+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:10:24.104+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:10:24.105+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:10:24.344+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 539.8MiB + Committed virtual memory: 38.30GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 147.1MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.209MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.75MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.375MiB, used=4.354MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=86.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.77MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.123MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.348MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 69974 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82316928064678, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58288:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82316928064678 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna1843128982761854704.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:10:24.511+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:10:24.512+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:10:25.264+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:10:25.474+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:10:25.540+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:10:25.541+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:10:25.555+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:10:25.800+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:10:25.851+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:10:25.851+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:10:26.458+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109593931776 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:09:52.640+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:10:26.301+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:10:26.345+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:10:26.230+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:10:26.209+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:10:26.039+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:10:26.017+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:10:26.117+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:10:26.140+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:10:26.080+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:10:26.058+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:10:26.103+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:10:26.265+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:10:26.328+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:10:26.160+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:10:26.192+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:10:26.176+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:10:26.247+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:09:52.540+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:09:52.568+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:09:52.599+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:09:52.621+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:09:52.469+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:09:52.497+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:10:26.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:26.662+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:26.664+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.664+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:26.687+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:26.687+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:26.688+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.688+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:26.724+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:10:26.725+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:10:26.725+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.726+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:10:26.745+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:10:26.746+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:10:26.748+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.748+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:10:26.770+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:10:26.771+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:10:26.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.772+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:10:26.791+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:10:26.792+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:10:26.792+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 162ms +2024-04-03 14:10:26.792+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:26.793+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:10:26.798+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:10:26.798+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:10:26.852+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:10:26.855+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:10:26.856+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:10:26.859+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:10:26.886+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:10:26.886+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:10:26.988+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:10:26.988+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:10:27.001+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:10:27.004+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:10:27.025+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:10:27.102+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:10:27.102+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:10:27.386+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=5190780}). First observed transaction id: 46. +2024-04-03 14:10:27.432+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=5190780} +2024-04-03 14:10:27.472+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:10:27.508+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:10:27.520+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:10:27.525+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:10:27.544+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:10:27.579+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:10:27.609+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.609+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.609+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.610+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.610+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:27.610+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:27.611+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.611+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:10:27.631+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.631+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.631+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.631+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 50ms +2024-04-03 14:10:27.632+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.632+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:27.632+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:10:27.632+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.633+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:10:27.802+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:10:27.812+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:10:27.840+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:10:27.851+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:10:27.899+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:10:27.901+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:46, last:51]: 6 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 514ms. +2024-04-03 14:10:27.903+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:10:27.905+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 51 checkpoint started... +2024-04-03 14:10:28.255+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 51 checkpoint completed in 349ms. Checkpoint flushed 109 pages (0% of total available pages), in 40 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:10:28.259+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:10:28.505+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:10:28.526+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:10:28.526+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:10:28.739+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109592690688 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:09:56.633+0000 - 156.4KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:10:28.692+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:10:28.713+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:10:28.657+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:10:28.646+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:10:28.218+0000 - 152.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:10:28.540+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:10:28.528+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:10:28.230+0000 - 408.0KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:10:28.586+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:10:28.602+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:10:28.563+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:10:28.550+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:10:28.574+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:10:28.678+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:10:28.702+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:10:28.612+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:10:28.635+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:10:28.624+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:10:28.666+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:10:28.260+0000 - 48.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 48.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:10:28.272+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 88.00KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 1.567MiB + [neo4j/fefd0874] Total size of mapped files: 736.0KiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 51 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 6.913MiB + [neo4j/fefd0874] - total size of files: 6.913MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=7248422}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=2216}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=2448}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=2448}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=51, checksum=133469850, commitTimestamp=1712153402624, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 51, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=10003 high=10002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=10011 high=10010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:10:28.772+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 31ms +2024-04-03 14:10:28.775+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:10:28.775+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:10:28.778+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:10:28.780+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:10:28.781+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:10:28.782+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:10:28.783+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:10:28.783+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:10:28.819+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:10:28.820+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:10:28.822+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:10:28.822+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:10:28.822+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:15:56.006+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:15:56.161+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:15:56.161+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:15:56.190+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:15:56.190+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:15:56.518+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 589.6MiB + Committed virtual memory: 38.29GiB + Total swap space: 2.000GiB + Free swap space: 1.275GiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 152.1MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.215MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.500MiB, used=4.476MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=154.0MiB, used=80.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.81MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=6.000MiB, used=4.099MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.286MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 70470 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=82649297547112, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58355:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 82649297547112 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna13332725988493100663.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:15:56.656+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:15:56.657+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:15:57.338+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:15:57.599+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:15:57.667+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:15:57.667+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:15:57.681+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:15:57.902+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:15:57.951+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:15:57.951+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:15:58.535+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 109624033280 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:10:26.797+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:15:58.371+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:15:58.415+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:15:58.305+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:15:58.291+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:15:58.126+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:15:58.099+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:15:58.205+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:15:58.220+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:15:58.167+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:15:58.147+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:15:58.187+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:15:58.336+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:15:58.395+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:15:58.240+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:15:58.274+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:15:58.259+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:15:58.320+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:10:26.715+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:10:26.737+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:10:26.759+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:10:26.784+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:10:26.651+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:10:26.677+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:15:58.731+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:58.732+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:58.733+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.734+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:58.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:58.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:58.756+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.756+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:58.787+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:15:58.788+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:15:58.789+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.789+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:15:58.812+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:15:58.813+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:15:58.814+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.814+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:15:58.834+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:15:58.835+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:15:58.836+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.836+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:15:58.864+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:15:58.864+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:15:58.866+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 168ms +2024-04-03 14:15:58.866+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:58.866+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:15:58.872+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:15:58.873+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:15:58.927+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:15:58.931+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:15:58.932+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:15:58.934+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:15:58.964+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:15:58.964+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:15:59.063+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:15:59.064+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:15:59.074+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:15:59.078+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:15:59.094+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:15:59.161+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:15:59.161+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:15:59.372+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=7248422}). First observed transaction id: 52. +2024-04-03 14:15:59.429+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=7248422} +2024-04-03 14:15:59.546+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:15:59.629+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:15:59.661+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:15:59.691+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:15:59.709+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:15:59.709+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:15:59.733+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.734+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.734+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.734+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.735+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:59.735+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:59.735+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.735+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:15:59.754+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.754+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.754+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 43ms +2024-04-03 14:15:59.754+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.754+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:59.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:15:59.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.755+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:15:59.902+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:15:59.904+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:15:59.977+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:16:00.149+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:16:00.149+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:16:00.151+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:52, last:55]: 4 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 777ms. +2024-04-03 14:16:00.153+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:16:00.154+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 55 checkpoint started... +2024-04-03 14:16:00.538+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 55 checkpoint completed in 382ms. Checkpoint flushed 317 pages (0% of total available pages), in 40 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:16:00.541+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:16:01.012+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:16:01.038+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:16:01.038+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:16:01.277+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 109621850112 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:10:30.788+0000 - 156.4KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:16:01.221+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:16:01.249+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:16:01.181+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:16:01.172+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:16:00.499+0000 - 592.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:16:01.056+0000 - 48.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:16:01.040+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:16:00.512+0000 - 1.578MiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:16:01.103+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:16:01.116+0000 - 48.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:16:01.082+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:16:01.068+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:16:01.093+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:16:01.205+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:16:01.236+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:16:01.132+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:16:01.160+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:16:01.145+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:16:01.194+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:16:00.543+0000 - 64.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 64.00KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:16:00.553+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 104.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 104.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 104.0KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 3.192MiB + [neo4j/fefd0874] Total size of mapped files: 2.344MiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 55 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 11.82MiB + [neo4j/fefd0874] - total size of files: 11.82MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=12397492}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=2448}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=2680}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=2680}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=55, checksum=962710397, commitTimestamp=1712153656328, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 55, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=40003 high=40002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=40011 high=40010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:16:01.310+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 32ms +2024-04-03 14:16:01.313+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:16:01.313+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:16:01.316+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:16:01.317+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:16:01.318+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:16:01.319+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:16:01.321+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:16:01.321+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:16:01.365+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:16:01.365+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:16:01.368+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:16:01.368+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:16:01.368+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:28:14.378+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:28:14.536+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:28:14.537+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:28:14.576+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:28:14.577+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:28:15.009+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 1.743GiB + Committed virtual memory: 38.29GiB + Total swap space: 3.000GiB + Free swap space: 934.8MiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 148.8MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.211MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.77MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.438MiB, used=4.427MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=84.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.86MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.370MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.348MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 71701 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=83387447776122, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58512:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 83387447776122 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna12852001861721599847.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:28:15.193+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:28:15.195+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:28:16.130+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:28:16.398+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:28:16.482+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:28:16.482+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:28:16.496+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:28:16.780+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:16.835+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:28:16.835+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:17.577+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 108523016192 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:15:58.872+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:28:17.348+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:28:17.405+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:28:17.266+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:28:17.249+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:28:17.036+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:28:17.005+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:28:17.132+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:28:17.154+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:28:17.084+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:28:17.063+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:28:17.109+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:28:17.306+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:28:17.379+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:28:17.180+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:28:17.228+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:28:17.204+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:28:17.286+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:15:58.777+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:15:58.801+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:15:58.825+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:15:58.852+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:15:58.721+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:15:58.745+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:28:17.847+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:17.848+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:17.850+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:17.850+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:17.878+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:17.878+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:17.880+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:17.880+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:17.925+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:17.925+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:17.926+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:17.926+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:17.951+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:17.951+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:17.953+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 1ms +2024-04-03 14:28:17.953+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:17.982+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:17.982+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:17.988+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 5ms +2024-04-03 14:28:17.989+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:18.012+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:18.013+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:18.013+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 208ms +2024-04-03 14:28:18.014+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:18.014+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:18.019+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:28:18.020+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:28:18.076+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:28:18.080+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:28:18.081+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:18.084+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:28:18.121+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:28:18.121+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:28:18.244+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:28:18.244+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:28:18.259+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:28:18.262+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:28:18.296+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:18.451+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:28:18.451+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:18.727+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=12397492}). First observed transaction id: 56. +2024-04-03 14:28:18.769+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=12397492} +2024-04-03 14:28:18.860+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:28:18.915+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:28:19.002+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:28:19.015+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:28:19.049+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:28:19.132+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:28:19.161+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.161+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.161+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.161+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.163+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 5, Number of tree nodes: 4, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:19.163+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 5, Number of tree nodes: 4, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:19.163+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.163+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:19.184+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.184+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.184+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.184+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 49ms +2024-04-03 14:28:19.185+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.185+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:19.185+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:19.186+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.186+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:19.611+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:28:19.614+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:28:19.682+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:28:19.821+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:28:19.854+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:28:19.857+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:56, last:60]: 5 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 1s 129ms. +2024-04-03 14:28:19.860+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:28:19.861+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 60 checkpoint started... +2024-04-03 14:28:20.257+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 60 checkpoint completed in 395ms. Checkpoint flushed 398 pages (0% of total available pages), in 47 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:28:20.260+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:28:20.580+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:20.602+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:28:20.602+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:20.818+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 108522741760 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:16:03.326+0000 - 625.3KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:28:20.762+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:28:20.792+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:28:20.727+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:28:20.715+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:28:20.208+0000 - 736.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:28:20.614+0000 - 80.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:28:20.603+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:28:20.226+0000 - 1.969MiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:28:20.660+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:28:20.671+0000 - 80.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:28:20.639+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:28:20.626+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:28:20.650+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:28:20.750+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:28:20.775+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:28:20.683+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:28:20.703+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:28:20.693+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:28:20.739+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:28:20.262+0000 - 104.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 104.0KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:28:20.274+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 4.283MiB + [neo4j/fefd0874] Total size of mapped files: 2.914MiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 60 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 20.66MiB + [neo4j/fefd0874] - total size of files: 20.66MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=21667402}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=2680}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=2912}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=2912}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=60, checksum=1048532841, commitTimestamp=1712153993083, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 60, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=50003 high=50002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=50011 high=50010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:28:20.854+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 33ms +2024-04-03 14:28:20.856+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:28:20.856+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:28:20.858+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:28:20.859+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:28:20.860+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:20.862+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:28:20.863+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:28:20.863+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:28:20.917+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:28:20.917+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:28:20.920+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:28:20.920+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:28:20.920+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:28:39.991+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:28:40.166+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:28:40.166+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:28:40.197+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:28:40.197+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:28:40.427+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 1.677GiB + Committed virtual memory: 38.29GiB + Total swap space: 3.000GiB + Free swap space: 934.8MiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 149.7MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.209MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.13MiB, used=19.75MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.438MiB, used=4.397MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=80.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.79MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.556MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.308MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 71747 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=83413100904674, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58522:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 83413100904674 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna14464725335181737622.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:28:40.579+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:28:40.582+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:28:41.241+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:28:41.438+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:28:41.499+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:28:41.499+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:28:41.513+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:28:41.743+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:41.789+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:28:41.789+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:42.407+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 108516245504 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:28:18.019+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:28:42.246+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:28:42.291+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:28:42.172+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:28:42.155+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:28:41.962+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:28:41.935+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:28:42.053+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:28:42.076+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:28:42.010+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:28:41.985+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:28:42.035+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:28:42.207+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:28:42.273+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:28:42.096+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:28:42.134+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:28:42.118+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:28:42.189+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:28:17.913+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:28:17.939+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:28:17.966+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:28:18.001+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:28:17.833+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:28:17.867+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:28:42.598+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:42.599+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:42.601+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.601+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:42.622+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:42.623+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:42.624+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.624+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:42.662+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:42.663+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:42.664+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.664+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:28:42.689+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:42.689+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:42.690+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.690+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:28:42.715+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:42.716+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:42.717+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.717+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:28:42.747+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:42.747+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:42.748+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 184ms +2024-04-03 14:28:42.749+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:42.749+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:28:42.755+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:28:42.756+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:28:42.817+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:28:42.820+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:28:42.822+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:42.825+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:28:42.856+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:28:42.856+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:28:42.951+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:28:42.951+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:28:42.963+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:28:42.967+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:28:43.001+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:43.162+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:28:43.163+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:43.408+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Transaction logs entries found after the last check point (which is at LogPosition{logVersion=0, byteOffset=21667402}). First observed transaction id: 61. +2024-04-03 14:28:43.451+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery required from position LogPosition{logVersion=0, byteOffset=21667402} +2024-04-03 14:28:43.509+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] TransactionLogsRecovery +2024-04-03 14:28:43.672+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 10% completed +2024-04-03 14:28:43.672+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 20% completed +2024-04-03 14:28:43.672+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 30% completed +2024-04-03 14:28:43.672+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 40% completed +2024-04-03 14:28:43.672+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 50% completed +2024-04-03 14:28:43.701+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.702+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.702+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.702+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.703+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 10, Number of tree nodes: 9, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:43.703+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 10, Number of tree nodes: 9, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:43.703+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.703+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:28:43.725+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:43.726+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:43.726+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:43.726+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 51ms +2024-04-03 14:28:43.726+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:43.727+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:43.727+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:28:43.727+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:43.727+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:28:44.205+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 60% completed +2024-04-03 14:28:44.205+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 70% completed +2024-04-03 14:28:44.206+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 80% completed +2024-04-03 14:28:44.206+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 90% completed +2024-04-03 14:28:44.206+0000 INFO [o.n.k.r.Recovery] [neo4j/fefd0874] 100% completed +2024-04-03 14:28:44.207+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Recovery in 'full' mode completed. Observed transactions range [first:61, last:61]: 1 transactions applied, 0 not completed transactions rolled back, skipped applying 0 previously rolled back transactions. Time spent: 798ms. +2024-04-03 14:28:44.213+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:28:44.215+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 61 checkpoint started... +2024-04-03 14:28:44.639+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] [neo4j/fefd0874] Checkpoint triggered by "Recovery completed." @ txId: 61 checkpoint completed in 423ms. Checkpoint flushed 401 pages (0% of total available pages), in 42 IOs. Checkpoint performed with IO limit: unlimited, paused in total 0 times( 0 millis). +2024-04-03 14:28:44.643+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] [neo4j/fefd0874] No log version pruned. The strategy used was '2 days'. +2024-04-03 14:28:44.933+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:44.960+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:28:44.960+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:28:45.195+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 108516110336 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:28:23.865+0000 - 781.6KiB + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:28:45.141+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:28:45.166+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:28:45.104+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:28:45.095+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:28:44.593+0000 - 736.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:28:44.975+0000 - 96.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:28:44.962+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:28:44.610+0000 - 1.969MiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:28:45.028+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:28:45.042+0000 - 96.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:28:45.001+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:28:44.988+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:28:45.015+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:28:45.128+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:28:45.153+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:28:45.055+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:28:45.083+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:28:45.068+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:28:45.117+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:28:44.645+0000 - 104.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 104.0KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:28:44.656+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 4.466MiB + [neo4j/fefd0874] Total size of mapped files: 2.914MiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 61 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 25.57MiB + [neo4j/fefd0874] - total size of files: 25.57MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=26816874}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=2912}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=3144}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=3144}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=61, checksum=1300269007, commitTimestamp=1712154502651, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 61, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=50003 high=50002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=50011 high=50010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:28:45.228+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 30ms +2024-04-03 14:28:45.230+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:28:45.231+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:28:45.248+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:28:45.249+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:28:45.250+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:28:45.251+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:28:45.252+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:28:45.252+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:28:45.289+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:28:45.289+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:28:45.292+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:28:45.292+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:28:45.292+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 14:29:11.337+0000 INFO [o.n.g.f.m.GlobalModule] Logging config in use: Embedded default config 'default-server-logs.xml' +2024-04-03 14:29:11.562+0000 WARN [o.n.k.i.JvmChecker] The max heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 4294967296 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.max_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xmx set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:29:11.562+0000 WARN [o.n.k.i.JvmChecker] The initial heap memory has not been configured. It is recommended that it is always explicitly configured, to ensure the system has a balanced configuration. Until then, a JVM computed heuristic of 268435456 bytes is used instead. If you are running neo4j server, you need to configure server.memory.heap.initial_size in neo4j.conf. If you are running neo4j embedded, you have to launch the JVM with -Xms set to a value. You can run neo4j-admin server memory-recommendation for memory configuration suggestions. +2024-04-03 14:29:11.594+0000 WARN [o.n.i.p.PageCache] The server.memory.pagecache.size setting has not been configured. It is recommended that this setting is always explicitly configured, to ensure the system has a balanced configuration. Until then, a computed heuristic value of 6442450944 bytes will be used instead. Run `neo4j-admin memory-recommendation` for memory configuration suggestions. +2024-04-03 14:29:11.594+0000 WARN [o.n.i.p.PageCache] Reflection access to java.nio.DirectByteBuffer is not available, using fallback mode. This could have negative impact on performance and memory usage. Consider adding --add-opens=java.base/java.nio=ALL-UNNAMED to VM options. +2024-04-03 14:29:11.839+0000 INFO [o.n.i.d.DiagnosticsManager] + ******************************************************************************** + [ System diagnostics ] + ******************************************************************************** + -------------------------------------------------------------------------------- + [ System memory information ] + -------------------------------------------------------------------------------- + Total Physical memory: 16.00GiB + Free Physical memory: 1.573GiB + Committed virtual memory: 38.30GiB + Total swap space: 3.000GiB + Free swap space: 966.8MiB + + -------------------------------------------------------------------------------- + [ JVM memory information ] + -------------------------------------------------------------------------------- + Free memory: 149.2MiB + Total memory: 260.0MiB + Max memory: 4.000GiB + Garbage Collector: G1 Young Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Garbage Collector: G1 Old Generation: [G1 Eden Space, G1 Survivor Space, G1 Old Gen] + Memory Pool: CodeHeap 'non-nmethods' (Non-heap memory): committed=2.438MiB, used=1.212MiB, max=5.570MiB, threshold=0B + Memory Pool: Metaspace (Non-heap memory): committed=20.06MiB, used=19.74MiB, max=-1B, threshold=0B + Memory Pool: CodeHeap 'profiled nmethods' (Non-heap memory): committed=4.375MiB, used=4.325MiB, max=117.2MiB, threshold=0B + Memory Pool: Compressed Class Space (Non-heap memory): committed=2.313MiB, used=2.121MiB, max=1.000GiB, threshold=0B + Memory Pool: G1 Eden Space (Heap memory): committed=156.0MiB, used=82.00MiB, max=-1B, threshold=? + Memory Pool: G1 Old Gen (Heap memory): committed=100.0MiB, used=22.30MiB, max=4.000GiB, threshold=0B + Memory Pool: G1 Survivor Space (Heap memory): committed=4.000MiB, used=3.467MiB, max=-1B, threshold=? + Memory Pool: CodeHeap 'non-profiled nmethods' (Non-heap memory): committed=2.438MiB, used=1.369MiB, max=117.2MiB, threshold=0B + + -------------------------------------------------------------------------------- + [ Operating system information ] + -------------------------------------------------------------------------------- + Operating System: Mac OS X; version: 12.7.4; arch: x86_64; cpus: 8 + Max number of file descriptors: 10240 + Number of open file descriptors: 226 + Process id: 71792 + Byte order: LITTLE_ENDIAN + Local timezone: America/New_York + Memory page size: 4096 + Unaligned memory access allowed: true + + -------------------------------------------------------------------------------- + [ JVM information ] + -------------------------------------------------------------------------------- + VM Name: Java HotSpot(TM) 64-Bit Server VM + VM Vendor: Oracle Corporation + VM Version: 17.0.2+8-LTS-86 + JIT compiler: HotSpot 64-Bit Tiered Compilers + VM Arguments: [-Dvisualvm.id=83444372826747, -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=58534:/Applications/IntelliJ IDEA.app/Contents/bin, -Dfile.encoding=UTF-8] + + -------------------------------------------------------------------------------- + [ Java classpath ] + -------------------------------------------------------------------------------- + [classpath] /Users/jnr6/.m2/repository/it/unimi/dsi/fastutil/8.5.13/fastutil-8.5.13.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec-http/4.1.101.Final/netty-codec-http-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-library/2.13.11/scala-library-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-command-line/5.16.0/neo4j-command-line-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-common/4.1.101.Final/netty-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-databind/2.16.0/jackson-databind-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-consistency-check/5.16.0/neo4j-consistency-check-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-values/5.16.0/neo4j-values-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-dbms/5.16.0/neo4j-dbms-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-analysis/9.6/asm-analysis-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner/5.16.0/neo4j-cypher-planner-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/antlr/antlr4-runtime/4.8/antlr4-runtime-4.8.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-api/3.2.13/docker-java-api-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/activation/jakarta.activation-api/1.2.1/jakarta.activation-api-1.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-planner-spi/5.16.0/neo4j-cypher-planner-spi-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-resource/5.16.0/neo4j-resource-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-servlet/10.0.17/jetty-servlet-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-cache/1.13.0/shiro-cache-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-javacc-parser/5.16.0/neo4j-cypher-javacc-parser-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/istack/istack-commons-runtime/3.0.8/istack-commons-runtime-3.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-configuration2/2.9.0/commons-configuration2-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-compress/1.21/commons-compress-1.21.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet/2.34/jersey-container-servlet-2.34.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-concurrent/5.16.0/neo4j-concurrent-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/mysql/1.17.4/mysql-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/mockito/mockito-core/5.7.0/mockito-core-5.7.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher/5.16.0/neo4j-cypher-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-capabilities/5.16.0/neo4j-capabilities-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-notifications/5.16.0/neo4j-notifications-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-util/5.16.0/neo4j-import-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-config/5.16.0/neo4j-cypher-config-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/containers/jersey-container-servlet-core/2.34/jersey-container-servlet-core-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-io/5.16.0/neo4j-io-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-locator/2.6.1/hk2-locator-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-lang3/3.13.0/commons-lang3-3.13.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-core/2.16.0/jackson-core-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/mysql/mysql-connector-j/8.2.0/mysql-connector-j-8.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-epoll/4.1.101.Final/netty-transport-classes-epoll-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/objenesis/objenesis/3.3/objenesis-3.3.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-server/2.34/jersey-server-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-client/2.34/jersey-client-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ast-factory/5.16.0/neo4j-cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-handler/4.1.101.Final/netty-handler-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j/5.16.0/neo4j-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/google/code/gson/gson/2.9.0/gson-2.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-logging/5.16.0/neo4j-logging-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-webapp/10.0.17/jetty-webapp-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-core/9.8.0/lucene-core-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel-api/5.16.0/neo4j-kernel-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcutil-jdk18on/1.76/bcutil-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/bitbucket/inkytonik/kiama/kiama_2.13/2.5.1/kiama_2.13-2.5.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-common/5.16.0/neo4j-common-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/junit/junit/4.13.2/junit-4.13.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-index/5.16.0/neo4j-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport/4.1.101.Final/netty-transport-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-util/9.6/asm-util-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/jctools/jctools-core/4.0.2/jctools-core-4.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graphdb-api/5.16.0/neo4j-graphdb-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/jdbc/1.17.4/jdbc-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-runtime-util/5.16.0/neo4j-cypher-runtime-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections-api/11.1.0/eclipse-collections-api-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-unsafe/5.16.0/neo4j-unsafe-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-server/10.0.17/jetty-server-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcprov-jdk18on/1.76/bcprov-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-slotted-runtime/5.16.0/neo4j-cypher-slotted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-layout-template-json/2.20.0/log4j-layout-template-json-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fulltext-index/5.16.0/neo4j-fulltext-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/java/dev/jna/jna/5.8.0/jna-5.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-util/10.0.17/jetty-util-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-expressions/5.16.0/neo4j-expressions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport/3.2.13/docker-java-transport-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/commons-logging/commons-logging/1.2/commons-logging-1.2.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/classes + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-testkit/1.10.0/junit-platform-testkit-1.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-core/1.13.0/shiro-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-physical-planning/5.16.0/neo4j-cypher-physical-planning-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-storage-engine-util/5.16.0/neo4j-storage-engine-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ast/5.16.0/neo4j-ast-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-core/2.20.0/log4j-core-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-params/5.9.0/junit-jupiter-params-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/external/jakarta.inject/2.6.1/jakarta.inject-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/inject/jersey-hk2/2.34/jersey-hk2-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/hamcrest/hamcrest/2.2/hamcrest-2.2.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/jaxb-runtime/2.3.2/jaxb-runtime-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-logical-plans/5.16.0/neo4j-cypher-logical-plans-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-xml/10.0.17/jetty-xml-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/commons/commons-text/1.11.0/commons-text-1.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/codehaus/jettison/jettison/1.5.4/jettison-1.5.4.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/mercator_2.13/0.2.1/mercator_2.13-0.2.1.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jaxb/txw2/2.3.2/txw2-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-resolver/4.1.101.Final/netty-resolver-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar + [classpath] /Users/jnr6/.m2/repository/org/awaitility/awaitility/4.2.0/awaitility-4.2.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-codec/4.1.101.Final/netty-codec-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-buffer/4.1.101.Final/netty-buffer-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-hash/1.13.0/shiro-crypto-hash-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/info/picocli/picocli/4.7.5/picocli-4.7.5.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/jPowerShell/3.0/jPowerShell-3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-cipher/1.13.0/shiro-crypto-cipher-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-lang/1.13.0/shiro-lang-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-token-api/5.16.0/neo4j-token-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-bolt/5.16.0/neo4j-bolt-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-record-storage-engine/5.16.0/neo4j-record-storage-engine-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-epoll/4.1.101.Final/netty-transport-native-epoll-4.1.101.Final-linux-aarch_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-ir/5.16.0/neo4j-cypher-ir-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test-utils/5.15.0/test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter/5.10.0/junit-jupiter-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server-test-utils/5.15.0/neo4j-server-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/rnorth/duct-tape/duct-tape/1.0.8/duct-tape-1.0.8.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/modules/scala-collection-contrib_2.13/0.3.0/scala-collection-contrib_2.13-0.3.0.jar + [classpath] /Users/jnr6/.m2/repository/org/slf4j/slf4j-api/2.0.0/slf4j-api-2.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-analysis-common/9.8.0/lucene-analysis-common-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/com/propensive/magnolia_2.13/0.17.0/magnolia_2.13-0.17.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-event/1.13.0/shiro-event-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/logging/log4j/log4j-api/2.20.0/log4j-api-2.20.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-classes-kqueue/4.1.101.Final/netty-transport-classes-kqueue-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.9/byte-buddy-agent-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/validation/jakarta.validation-api/2.0.2/jakarta.validation-api-2.0.2.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/database-commons/1.17.4/database-commons-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-front-end/5.16.0/neo4j-front-end-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure/5.16.0/neo4j-procedure-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-import-tool/5.16.0/neo4j-import-tool-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/ws/rs/jakarta.ws.rs-api/2.1.6/jakarta.ws.rs-api-2.1.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/core/jackson-annotations/2.10.3/jackson-annotations-2.10.3.jar + [classpath] /Users/jnr6/.m2/repository/com/google/protobuf/protobuf-java/3.21.9/protobuf-java-3.21.9.jar + [classpath] /Users/jnr6/.m2/repository/io/projectreactor/reactor-core/3.6.0/reactor-core-3.6.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-wal/5.16.0/neo4j-wal-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-ssl/5.16.0/neo4j-ssl-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-unix-common/4.1.101.Final/netty-transport-native-unix-common-4.1.101.Final.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-config-core/1.13.0/shiro-config-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-codegen/5.16.0/neo4j-codegen-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm-tree/9.6/asm-tree-9.6.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-rewriting/5.16.0/neo4j-rewriting-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-backward-codecs/9.8.0/lucene-backward-codecs-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lock/5.16.0/neo4j-lock-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-schema/5.16.0/neo4j-schema-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/collections/eclipse-collections/11.1.0/eclipse-collections-11.1.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar + [classpath] /Users/jnr6/.m2/repository/commons-codec/commons-codec/1.16.0/commons-codec-1.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-json-provider/2.16.0/jackson-jaxrs-json-provider-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-expression-evaluator/5.16.0/neo4j-cypher-expression-evaluator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/testcontainers/1.17.4/testcontainers-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/test/neo4j-harness/5.15.0/neo4j-harness-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/javassist/javassist/3.25.0-GA/javassist-3.25.0-GA.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/shiro/shiro-crypto-core/1.13.0/shiro-crypto-core-1.13.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-commons/1.9.0/junit-platform-commons-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-utils/2.6.1/hk2-utils-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/io-test-utils/5.15.0/io-test-utils-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/annotations/5.16.0/annotations-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-interpreted-runtime/5.16.0/neo4j-cypher-interpreted-runtime-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-cache/5.16.0/neo4j-cypher-cache-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-layout/5.16.0/neo4j-layout-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/licensing-proxy/zstd-proxy/5.16.0/zstd-proxy-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-security/5.16.0/neo4j-security-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/jersey/core/jersey-common/2.34/jersey-common-2.34.jar + [classpath] /Users/jnr6/.m2/repository/org/scala-lang/scala-reflect/2.13.11/scala-reflect-2.13.11.jar + [classpath] /Users/jnr6/.m2/repository/org/testcontainers/junit-jupiter/1.17.4/junit-jupiter-1.17.4.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-random-values/5.15.0/neo4j-random-values-5.15.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/docker-java/docker-java-transport-zerodep/3.2.13/docker-java-transport-zerodep-3.2.13.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-diagnostics/5.16.0/neo4j-diagnostics-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-http/10.0.17/jetty-http-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/cypher-ast-factory/5.16.0/cypher-ast-factory-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-configuration/5.16.0/neo4j-configuration-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-exceptions/5.16.0/neo4j-exceptions-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-util/5.16.0/neo4j-util-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-id-generator/5.16.0/neo4j-id-generator-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/github/seancfoley/ipaddress/5.4.0/ipaddress-5.4.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-io/10.0.17/jetty-io-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/commons-io/commons-io/2.11.0/commons-io-2.11.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apache/lucene/lucene-queryparser/9.8.0/lucene-queryparser-9.8.0.jar + [classpath] /Users/jnr6/.m2/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.2/jakarta.xml.bind-api-2.3.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-kernel/5.16.0/neo4j-kernel-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-fabric/5.16.0/neo4j-fabric-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-spatial-index/5.16.0/neo4j-spatial-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-procedure-api/5.16.0/neo4j-procedure-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/sun/xml/fastinfoset/FastInfoset/1.2.16/FastInfoset-1.2.16.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-lucene-index/5.16.0/neo4j-lucene-index-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/net/bytebuddy/byte-buddy/1.14.9/byte-buddy-1.14.9.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-query-router/5.16.0/neo4j-query-router-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-csv/5.16.0/neo4j-csv-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/toolchain/jetty-servlet-api/4.0.6/jetty-servlet-api-4.0.6.jar + [classpath] /Users/jnr6/IdeaProjects/policy-machine-core/target/test-classes + [classpath] /Users/jnr6/.m2/repository/com/github/ben-manes/caffeine/caffeine/3.1.8/caffeine-3.1.8.jar + [classpath] /Users/jnr6/.m2/repository/com/profesorfalken/WMI4Java/1.6.3/WMI4Java-1.6.3.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/vintage/junit-vintage-engine/5.10.0/junit-vintage-engine-5.10.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-collections/5.16.0/neo4j-collections-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/assertj/assertj-core/3.24.2/assertj-core-3.24.2.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-graph-algo/5.16.0/neo4j-graph-algo-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-engine/5.9.0/junit-jupiter-engine-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jvnet/staxex/stax-ex/1.8.1/stax-ex-1.8.1.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/app/neo4j-server/5.16.0/neo4j-server-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-monitoring/5.16.0/neo4j-monitoring-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-cypher-macros/5.16.0/neo4j-cypher-macros-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/jprocesses/jProcesses/1.6.5/jProcesses-1.6.5.jar + [classpath] /Users/jnr6/.m2/repository/org/glassfish/hk2/hk2-api/2.6.1/hk2-api-2.6.1.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/jupiter/junit-jupiter-api/5.9.0/junit-jupiter-api-5.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/eclipse/jetty/jetty-security/10.0.17/jetty-security-10.0.17.jar + [classpath] /Users/jnr6/.m2/repository/org/bouncycastle/bcpkix-jdk18on/1.76/bcpkix-jdk18on-1.76.jar + [classpath] /Users/jnr6/.m2/repository/org/junit/platform/junit-platform-engine/1.9.0/junit-platform-engine-1.9.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-slf4j-provider/5.16.0/neo4j-slf4j-provider-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/io/netty/netty-transport-native-kqueue/4.1.101.Final/netty-transport-native-kqueue-4.1.101.Final-osx-x86_64.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-data-collector/5.16.0/neo4j-data-collector-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/server-api/5.16.0/server-api-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/neo4j/neo4j-native/5.16.0/neo4j-native-5.16.0.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/module/jackson-module-jaxb-annotations/2.16.0/jackson-module-jaxb-annotations-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/ow2/asm/asm/9.6/asm-9.6.jar + [classpath] /Users/jnr6/.m2/repository/com/fasterxml/jackson/jaxrs/jackson-jaxrs-base/2.16.0/jackson-jaxrs-base-2.16.0.jar + [classpath] /Users/jnr6/.m2/repository/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar + + -------------------------------------------------------------------------------- + [ Library path ] + -------------------------------------------------------------------------------- + /Users/jnr6/Library/Java/Extensions + /Library/Java/Extensions + /Network/Library/Java/Extensions + /System/Library/Java/Extensions + /usr/lib/java + /Users/jnr6/IdeaProjects/policy-machine-core + + -------------------------------------------------------------------------------- + [ System properties ] + -------------------------------------------------------------------------------- + sun.jnu.encoding = UTF-8 + sun.arch.data.model = 64 + user.timezone = America/New_York + visualvm.id = 83444372826747 + sun.java.launcher = SUN_STANDARD + user.country = US + sun.boot.library.path = /Library/Java/JavaVirtualMachines/jdk-17.0.2.jdk/Contents/Home/lib + sun.java.command = gov.nist.csd.pm.pap.neo4j.ImportTest + jdk.debug = release + sun.cpu.endian = little + user.home = /Users/jnr6 + user.language = en + file.separator = / + sun.management.compiler = HotSpot 64-Bit Tiered Compilers + user.name = jnr6 + path.separator = : + file.encoding = UTF-8 + jnidispatch.path = /Users/jnr6/Library/Caches/JNA/temp/jna1629976397574867923.tmp + jna.loaded = true + user.dir = /Users/jnr6/IdeaProjects/policy-machine-core + native.encoding = UTF-8 + sun.io.unicode.encoding = UnicodeBig + + -------------------------------------------------------------------------------- + [ (IANA) TimeZone database version ] + -------------------------------------------------------------------------------- + TimeZone version: 2021e (available for 601 zone identifiers) + + -------------------------------------------------------------------------------- + [ Network information ] + -------------------------------------------------------------------------------- + Interface utun2: + address: fe80:0:0:0:ce81:b1c:bd2c:69e%utun2 + Interface utun1: + address: fe80:0:0:0:bbf5:1c30:4238:57b2%utun1 + Interface utun0: + address: fe80:0:0:0:73be:4eb:3f31:a891%utun0 + Interface llw0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%llw0 + Interface awdl0: + address: fe80:0:0:0:c0a6:71ff:fe04:534c%awdl0 + Interface utun3: + address: 2610:20:6005:152:0:0:0:136%utun3 + address: fe80:0:0:0:aebc:32ff:fe94:d383%utun3 + address: 129.6.109.119 + Interface en0: + address: 192.168.1.247 + Interface lo0: + address: fe80:0:0:0:0:0:0:1%lo0 + address: 0:0:0:0:0:0:0:1%lo0 + address: 127.0.0.1 + + -------------------------------------------------------------------------------- + [ Native access information ] + -------------------------------------------------------------------------------- + Native access details: Native access is not available for current platform. + + -------------------------------------------------------------------------------- + [ DBMS config ] + -------------------------------------------------------------------------------- + DBMS provided settings: + server.bolt.enabled=true + server.bolt.listen_address=localhost:9999 + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + Directories in use: + server.directories.data=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data + server.directories.dumps.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/dumps + server.directories.import=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.lib=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/lib + server.directories.licenses=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/licenses + server.directories.logs=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/logs + server.directories.neo4j_home=/Users/jnr6/IdeaProjects/policy-machine-core/testdb + server.directories.plugins=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/plugins + server.directories.run=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/run + server.directories.script.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/scripts + server.directories.transaction.logs.root=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions + + -------------------------------------------------------------------------------- + [ Packaging ] + -------------------------------------------------------------------------------- + Could not read packaging info: java.nio.file.NoSuchFileException: /Users/jnr6/IdeaProjects/policy-machine-core/testdb/packaging_info + +2024-04-03 14:29:11.994+0000 INFO [o.n.d.i.DefaultIdentityModule] Found ServerId on disk: ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:29:11.995+0000 INFO [o.n.d.i.DefaultIdentityModule] This instance is ServerId{54490f53} (54490f53-4b94-4d0f-9604-023c3fe1be5e) +2024-04-03 14:29:12.671+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{00000000[system]}'. +2024-04-03 14:29:12.870+0000 INFO [o.n.b.BoltServer] Using connector transport KQueue +2024-04-03 14:29:12.934+0000 INFO [o.n.b.BoltServer] Configured external Bolt connector with listener address localhost/127.0.0.1:9999 +2024-04-03 14:29:12.934+0000 INFO [o.n.b.BoltServer] Bolt server loaded +2024-04-03 14:29:12.948+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{00000000[system]}'. +2024-04-03 14:29:13.158+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:29:13.200+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system +2024-04-03 14:29:13.200+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [system/00000000] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:29:13.786+0000 INFO [o.n.i.d.DiagnosticsManager] [system/00000000] + [system/00000000] ******************************************************************************** + [system/00000000] [ Database: system ] + [system/00000000] ******************************************************************************** + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Version ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] DBMS: community record-aligned-1.1 + [system/00000000] Kernel version: 5.16.0 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Store files ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Disk space on partition (Total / Free / Free %): 500068036608 / 108514705408 / 21 + [system/00000000] Storage files stored on file store: apfs + [system/00000000] Storage files: (filename : modification date - size) + [system/00000000] database_lock: 2024-04-03 04:12:32.900+0000 - 0B + [system/00000000] id-buffer.tmp.0: 2024-04-03 14:28:42.755+0000 - 0B + [system/00000000] neostore: 2024-04-03 04:12:32.662+0000 - 8.000KiB + [system/00000000] neostore.counts.db: 2024-04-03 14:29:13.625+0000 - 48.00KiB + [system/00000000] neostore.indexstats.db: 2024-04-03 14:29:13.671+0000 - 48.00KiB + [system/00000000] neostore.labeltokenstore.db: 2024-04-03 04:12:39.430+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.id: 2024-04-03 14:29:13.556+0000 - 40.00KiB + [system/00000000] neostore.labeltokenstore.db.names: 2024-04-03 04:12:39.454+0000 - 8.000KiB + [system/00000000] neostore.labeltokenstore.db.names.id: 2024-04-03 14:29:13.541+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db: 2024-04-03 04:12:39.416+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.id: 2024-04-03 14:29:13.376+0000 - 40.00KiB + [system/00000000] neostore.nodestore.db.labels: 2024-04-03 04:12:32.509+0000 - 8.000KiB + [system/00000000] neostore.nodestore.db.labels.id: 2024-04-03 14:29:13.353+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db: 2024-04-03 04:12:39.442+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays: 2024-04-03 04:12:32.565+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.arrays.id: 2024-04-03 14:29:13.445+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.id: 2024-04-03 14:29:13.463+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index: 2024-04-03 04:12:39.477+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.id: 2024-04-03 14:29:13.415+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.index.keys: 2024-04-03 04:12:39.464+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.index.keys.id: 2024-04-03 14:29:13.394+0000 - 40.00KiB + [system/00000000] neostore.propertystore.db.strings: 2024-04-03 04:12:39.367+0000 - 8.000KiB + [system/00000000] neostore.propertystore.db.strings.id: 2024-04-03 14:29:13.431+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.db: 2024-04-03 04:12:32.640+0000 - 8.000KiB + [system/00000000] neostore.relationshipgroupstore.db.id: 2024-04-03 14:29:13.588+0000 - 40.00KiB + [system/00000000] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:29:13.649+0000 - 40.00KiB + [system/00000000] neostore.relationshipstore.db: 2024-04-03 04:12:39.378+0000 - 8.000KiB + [system/00000000] neostore.relationshipstore.db.id: 2024-04-03 14:29:13.480+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db: 2024-04-03 04:12:39.405+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.id: 2024-04-03 14:29:13.518+0000 - 40.00KiB + [system/00000000] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:39.392+0000 - 8.000KiB + [system/00000000] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:29:13.500+0000 - 40.00KiB + [system/00000000] neostore.schemastore.db: 2024-04-03 04:12:39.490+0000 - 8.000KiB + [system/00000000] neostore.schemastore.db.id: 2024-04-03 14:29:13.574+0000 - 40.00KiB + [system/00000000] schema: + [system/00000000] index: + [system/00000000] range-1.0: + [system/00000000] 3: + [system/00000000] index-3: 2024-04-03 14:28:42.649+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 48.00KiB + [system/00000000] 4: + [system/00000000] index-4: 2024-04-03 14:28:42.678+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.437+0000 - 48.00KiB + [system/00000000] 7: + [system/00000000] index-7: 2024-04-03 14:28:42.703+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.907+0000 - 48.00KiB + [system/00000000] 8: + [system/00000000] index-8: 2024-04-03 14:28:42.734+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.997+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.996+0000 - 192.0KiB + [system/00000000] token-lookup-1.0: + [system/00000000] 1: + [system/00000000] index-1: 2024-04-03 14:28:42.586+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.516+0000 - 48.00KiB + [system/00000000] 2: + [system/00000000] index-2: 2024-04-03 14:28:42.611+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.409+0000 - 48.00KiB + [system/00000000] - Total: 2024-04-03 04:12:33.515+0000 - 96.00KiB + [system/00000000] - Total: 2024-04-03 04:12:34.321+0000 - 288.0KiB + [system/00000000] - Total: 2024-04-03 04:12:33.407+0000 - 288.0KiB + [system/00000000] Storage summary: + [system/00000000] Total size of store: 1.078MiB + [system/00000000] Total size of mapped files: 408.0KiB + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Transaction log ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] Transaction log files stored on file store: apfs + [system/00000000] Transaction log metadata: + [system/00000000] - current kernel version used in transactions: V5_15 + [system/00000000] - last committed transaction id: 37 + [system/00000000] Transaction log files: + [system/00000000] - existing transaction log versions: 0-0 + [system/00000000] - oldest transaction 2 found in log with version 0 + [system/00000000] - files: (filename : creation date - size) + [system/00000000] neostore.transaction.db.0: 2024-04-03 04:12:32.000+0000 - 19.26KiB + [system/00000000] - total size of files: 19.26KiB + [system/00000000] Checkpoint log files: + [system/00000000] - existing checkpoint log versions: 0-0 + [system/00000000] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=19725}, storeId=StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=360}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=592}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=592}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=37, checksum=-1026009811, commitTimestamp=1712117555154, consensusIndex=-1], reason=Checkpoint triggered by "Database shutdown" @ txId: 37, consensusIndexInCheckpoint=true] + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Id usage ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [system/00000000] NodeStore[neostore.nodestore.db]: used=6 high=5 + [system/00000000] StringPropertyStore[neostore.propertystore.db.index.keys]: used=44 high=43 + [system/00000000] PropertyIndexStore[neostore.propertystore.db.index]: used=31 high=30 + [system/00000000] StringPropertyStore[neostore.propertystore.db.strings]: used=3 high=2 + [system/00000000] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [system/00000000] PropertyStore[neostore.propertystore.db]: used=59 high=58 + [system/00000000] RelationshipStore[neostore.relationshipstore.db]: used=2 high=1 + [system/00000000] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=2 high=1 + [system/00000000] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=1 high=0 + [system/00000000] StringPropertyStore[neostore.labeltokenstore.db.names]: used=5 high=4 + [system/00000000] LabelTokenStore[neostore.labeltokenstore.db]: used=4 high=3 + [system/00000000] SchemaStore[neostore.schemastore.db]: used=11 high=10 + [system/00000000] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [system/00000000] NeoStore[neostore]: used=-1 high=-1 + [system/00000000] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] [ Metadata ] + [system/00000000] -------------------------------------------------------------------------------- + [system/00000000] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 8e4fd9af-0e04-47d8-a19c-cdb72dbda752 + [system/00000000] DATABASE_ID (The last used DatabaseId for this database): null + [system/00000000] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [system/00000000] STORE_ID (Store ID): StoreId{creationTime=1712117552660, random=4552926301767966796, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [system/00000000] +2024-04-03 14:29:13.978+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:13.979+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:13.980+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:13.981+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:14.006+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.006+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.007+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.007+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.042+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:29:14.043+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:29:14.045+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.045+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=3, name='constraint_798238d6', type='RANGE', schema=(:Label[1] {PropertyKey[11], PropertyKey[12]}), indexProvider='range-1.0', owningConstraint=6 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/3/index-3 +2024-04-03 14:29:14.072+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:29:14.072+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:29:14.073+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.074+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=4, name='constraint_8014b60a', type='RANGE', schema=(:Label[2] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=5 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/4/index-4 +2024-04-03 14:29:14.096+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:29:14.097+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:29:14.098+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.098+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=7, name='constraint_5789ae3', type='RANGE', schema=(:Label[3] {PropertyKey[11]}), indexProvider='range-1.0', owningConstraint=9 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/7/index-7 +2024-04-03 14:29:14.126+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job registered: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:29:14.127+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job started: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:29:14.128+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 184ms +2024-04-03 14:29:14.128+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job finished: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 Number of pages visited: 3, Number of tree nodes: 2, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.129+0000 INFO [o.n.k.i.i.s.RangeIndexProvider] [system/00000000] Schema index cleanup job closed: descriptor=Index( id=8, name='constraint_74fad970', type='RANGE', schema=(:Label[3] {PropertyKey[26]}), indexProvider='range-1.0', owningConstraint=10 ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/system/schema/index/range-1.0/8/index-8 +2024-04-03 14:29:14.135+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Requirement `Database unavailable` makes database system unavailable. +2024-04-03 14:29:14.136+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is unavailable. +2024-04-03 14:29:14.190+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/neostore.transaction.db.0] at version=0 +2024-04-03 14:29:14.193+0000 INFO [o.n.k.d.Database] [system/00000000] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/system/checkpoint.0] at version=0 +2024-04-03 14:29:14.194+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [system/00000000] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:29:14.197+0000 INFO [o.n.k.i.a.i.IndexingService] [system/00000000] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 6 indexes. Processed in 0ms +2024-04-03 14:29:14.225+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] Fulfilling of requirement 'Database unavailable' makes database system available. +2024-04-03 14:29:14.226+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [system/00000000] DatabaseId{00000000[system]} is ready. +2024-04-03 14:29:14.313+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Performing postInitialization step for component 'security-users' with version 4 and status CURRENT +2024-04-03 14:29:14.313+0000 INFO [o.n.s.s.s.UserSecurityGraphComponent] Updating the initial password in component 'security-users' +2024-04-03 14:29:14.325+0000 INFO [o.n.d.d.DatabaseLifecycles] Creating 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:29:14.328+0000 INFO [o.n.d.d.DatabaseLifecycles] Starting 'DatabaseId{fefd0874[neo4j]}'. +2024-04-03 14:29:14.348+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:29:14.363+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected RecordFormat:PageAlignedV5_0[aligned-1.1] record format from store /Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j +2024-04-03 14:29:14.363+0000 INFO [o.n.k.i.s.f.RecordFormatSelector] [neo4j/fefd0874] Selected format from the store files: RecordFormat:PageAlignedV5_0[aligned-1.1] +2024-04-03 14:29:14.620+0000 INFO [o.n.i.d.DiagnosticsManager] [neo4j/fefd0874] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] [ Database: neo4j ] + [neo4j/fefd0874] ******************************************************************************** + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Version ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] DBMS: community record-aligned-1.1 + [neo4j/fefd0874] Kernel version: 5.16.0 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Store files ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Disk space on partition (Total / Free / Free %): 500068036608 / 108514705408 / 21 + [neo4j/fefd0874] Storage files stored on file store: apfs + [neo4j/fefd0874] Storage files: (filename : modification date - size) + [neo4j/fefd0874] database_lock: 2024-04-03 04:12:35.327+0000 - 0B + [neo4j/fefd0874] id-buffer.tmp.0: 2024-04-03 14:28:45.230+0000 - 0B + [neo4j/fefd0874] neostore: 2024-04-03 04:12:35.301+0000 - 8.000KiB + [neo4j/fefd0874] neostore.counts.db: 2024-04-03 14:29:14.569+0000 - 48.00KiB + [neo4j/fefd0874] neostore.indexstats.db: 2024-04-03 14:29:14.593+0000 - 48.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db: 2024-04-03 04:53:01.953+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.id: 2024-04-03 14:29:14.526+0000 - 40.00KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names: 2024-04-03 04:53:01.900+0000 - 8.000KiB + [neo4j/fefd0874] neostore.labeltokenstore.db.names.id: 2024-04-03 14:29:14.510+0000 - 40.00KiB + [neo4j/fefd0874] neostore.nodestore.db: 2024-04-03 14:28:44.593+0000 - 736.0KiB + [neo4j/fefd0874] neostore.nodestore.db.id: 2024-04-03 14:29:14.380+0000 - 96.00KiB + [neo4j/fefd0874] neostore.nodestore.db.labels: 2024-04-03 04:12:35.189+0000 - 8.000KiB + [neo4j/fefd0874] neostore.nodestore.db.labels.id: 2024-04-03 14:29:14.365+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db: 2024-04-03 14:28:44.610+0000 - 1.969MiB + [neo4j/fefd0874] neostore.propertystore.db.arrays: 2024-04-03 04:12:35.234+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.arrays.id: 2024-04-03 14:29:14.440+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.id: 2024-04-03 14:29:14.453+0000 - 96.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index: 2024-04-03 04:30:28.255+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.id: 2024-04-03 14:29:14.411+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys: 2024-04-03 04:30:28.242+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.index.keys.id: 2024-04-03 14:29:14.394+0000 - 40.00KiB + [neo4j/fefd0874] neostore.propertystore.db.strings: 2024-04-03 04:12:35.222+0000 - 8.000KiB + [neo4j/fefd0874] neostore.propertystore.db.strings.id: 2024-04-03 14:29:14.425+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db: 2024-04-03 04:12:35.289+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.db.id: 2024-04-03 14:29:14.557+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipgroupstore.degrees.db: 2024-04-03 14:29:14.581+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshipstore.db: 2024-04-03 04:12:35.245+0000 - 0B + [neo4j/fefd0874] neostore.relationshipstore.db.id: 2024-04-03 14:29:14.466+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db: 2024-04-03 04:12:35.259+0000 - 0B + [neo4j/fefd0874] neostore.relationshiptypestore.db.id: 2024-04-03 14:29:14.496+0000 - 40.00KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names: 2024-04-03 04:12:35.246+0000 - 8.000KiB + [neo4j/fefd0874] neostore.relationshiptypestore.db.names.id: 2024-04-03 14:29:14.483+0000 - 40.00KiB + [neo4j/fefd0874] neostore.schemastore.db: 2024-04-03 04:12:36.054+0000 - 8.000KiB + [neo4j/fefd0874] neostore.schemastore.db.id: 2024-04-03 14:29:14.542+0000 - 40.00KiB + [neo4j/fefd0874] schema: + [neo4j/fefd0874] index: + [neo4j/fefd0874] token-lookup-1.0: + [neo4j/fefd0874] 1: + [neo4j/fefd0874] index-1: 2024-04-03 14:28:45.207+0000 - 104.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 104.0KiB + [neo4j/fefd0874] 2: + [neo4j/fefd0874] index-2: 2024-04-03 14:28:45.219+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 40.00KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.459+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] - Total: 2024-04-03 04:12:35.390+0000 - 144.0KiB + [neo4j/fefd0874] Storage summary: + [neo4j/fefd0874] Total size of store: 3.703MiB + [neo4j/fefd0874] Total size of mapped files: 2.914MiB + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Transaction log ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] Transaction log files stored on file store: apfs + [neo4j/fefd0874] Transaction log metadata: + [neo4j/fefd0874] - current kernel version used in transactions: V5_15 + [neo4j/fefd0874] - last committed transaction id: 61 + [neo4j/fefd0874] Transaction log files: + [neo4j/fefd0874] - existing transaction log versions: 0-0 + [neo4j/fefd0874] - oldest transaction 2 found in log with version 0 + [neo4j/fefd0874] - files: (filename : creation date - size) + [neo4j/fefd0874] neostore.transaction.db.0: 2024-04-03 04:12:35.000+0000 - 25.57MiB + [neo4j/fefd0874] - total size of files: 25.57MiB + [neo4j/fefd0874] Checkpoint log files: + [neo4j/fefd0874] - existing checkpoint log versions: 0-0 + [neo4j/fefd0874] - last checkpoint: CheckpointInfo[transactionLogPosition=LogPosition{logVersion=0, byteOffset=26816874}, storeId=StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1}, checkpointEntryPosition=LogPosition{logVersion=0, byteOffset=2912}, channelPositionAfterCheckpoint=LogPosition{logVersion=0, byteOffset=3144}, checkpointFilePostReadPosition=LogPosition{logVersion=0, byteOffset=3144}, kernelVersion=KernelVersion{V5_15,version=14}, kernelVersionByte=14, transactionId=TransactionId[transactionId=61, checksum=1300269007, commitTimestamp=1712154502651, consensusIndex=-1], reason=Checkpoint triggered by "Recovery completed." @ txId: 61, consensusIndexInCheckpoint=true] + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Id usage ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] ArrayPropertyStore[neostore.nodestore.db.labels]: used=1 high=0 + [neo4j/fefd0874] NodeStore[neostore.nodestore.db]: used=50003 high=50002 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.index.keys]: used=23 high=22 + [neo4j/fefd0874] PropertyIndexStore[neostore.propertystore.db.index]: used=13 high=12 + [neo4j/fefd0874] StringPropertyStore[neostore.propertystore.db.strings]: used=1 high=0 + [neo4j/fefd0874] ArrayPropertyStore[neostore.propertystore.db.arrays]: used=1 high=0 + [neo4j/fefd0874] PropertyStore[neostore.propertystore.db]: used=50011 high=50010 + [neo4j/fefd0874] RelationshipStore[neostore.relationshipstore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.relationshiptypestore.db.names]: used=1 high=0 + [neo4j/fefd0874] RelationshipTypeStore[neostore.relationshiptypestore.db]: used=0 high=-1 + [neo4j/fefd0874] StringPropertyStore[neostore.labeltokenstore.db.names]: used=8 high=7 + [neo4j/fefd0874] LabelTokenStore[neostore.labeltokenstore.db]: used=7 high=6 + [neo4j/fefd0874] SchemaStore[neostore.schemastore.db]: used=3 high=2 + [neo4j/fefd0874] RelationshipGroupStore[neostore.relationshipgroupstore.db]: used=1 high=0 + [neo4j/fefd0874] NeoStore[neostore]: used=-1 high=-1 + [neo4j/fefd0874] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] [ Metadata ] + [neo4j/fefd0874] -------------------------------------------------------------------------------- + [neo4j/fefd0874] EXTERNAL_STORE_UUID (Database identifier exposed as external store identity. Generated on creation and never updated): 485f4e4f-d438-40c9-a4ed-0bc1099d976f + [neo4j/fefd0874] DATABASE_ID (The last used DatabaseId for this database): null + [neo4j/fefd0874] LEGACY_STORE_VERSION (Legacy store format version. This field is used from 5.0 onwards only to distinguish non-migrated pre 5.0 metadata stores.): -3523014627327384477 + [neo4j/fefd0874] STORE_ID (Store ID): StoreId{creationTime=1712117555300, random=260265064831090288, storageEngineName='record', formatName='aligned', majorVersion=1, minorVersion=1} + [neo4j/fefd0874] +2024-04-03 14:29:14.647+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:14.648+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:14.650+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 Number of pages visited: 10, Number of tree nodes: 9, Number of cleaned crashed pointers: 0, Time spent: 1ms +2024-04-03 14:29:14.650+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=1, name='index_343aff4e', type='LOOKUP', schema=(:), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/1/index-1 +2024-04-03 14:29:14.670+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job registered: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.671+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.init: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 48ms +2024-04-03 14:29:14.671+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job started: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.672+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job finished: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 Number of pages visited: 2, Number of tree nodes: 1, Number of cleaned crashed pointers: 0, Time spent: 0ms +2024-04-03 14:29:14.672+0000 INFO [o.n.k.i.i.s.TokenIndexProvider] [neo4j/fefd0874] Schema index cleanup job closed: descriptor=Index( id=2, name='index_f7700477', type='LOOKUP', schema=()-[:]-(), indexProvider='token-lookup-1.0' ), indexFile=/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/databases/neo4j/schema/index/token-lookup-1.0/2/index-2 +2024-04-03 14:29:14.673+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Requirement `Database unavailable` makes database neo4j unavailable. +2024-04-03 14:29:14.673+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is unavailable. +2024-04-03 14:29:14.694+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/neostore.transaction.db.0] at version=0 +2024-04-03 14:29:14.695+0000 INFO [o.n.k.d.Database] [neo4j/fefd0874] Starting transaction log [/Users/jnr6/IdeaProjects/policy-machine-core/testdb/data/transactions/neo4j/checkpoint.0] at version=0 +2024-04-03 14:29:14.696+0000 INFO [o.n.k.i.t.l.f.c.CheckpointLogFile] [neo4j/fefd0874] Scanning log file with version 0 for checkpoint entries +2024-04-03 14:29:14.698+0000 INFO [o.n.k.i.a.i.IndexingService] [neo4j/fefd0874] IndexingService.start: indexes not specifically mentioned above are ONLINE. Total 2 indexes. Processed in 0ms +2024-04-03 14:29:14.699+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] Fulfilling of requirement 'Database unavailable' makes database neo4j available. +2024-04-03 14:29:14.700+0000 INFO [o.n.k.a.DatabaseAvailabilityGuard] [neo4j/fefd0874] DatabaseId{fefd0874[neo4j]} is ready. +2024-04-03 14:29:14.733+0000 INFO [o.n.b.p.c.c.n.SocketNettyConnector] Bolt enabled on localhost:9999. +2024-04-03 14:29:14.734+0000 INFO [o.n.b.BoltServer] Bolt server started +2024-04-03 14:29:14.736+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] id: 266B93A8C1445AE734BA77BB99FDF56964B6082641ED1A3E87435C6A5111E836 +2024-04-03 14:29:14.736+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] name: system +2024-04-03 14:29:14.736+0000 INFO [o.n.g.f.DatabaseManagementServiceFactory] creationDate: 2024-04-03T04:12:32.66Z +2024-04-03 17:00:10.655+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=304, gcTime=0, gcCount=0} +2024-04-03 17:00:10.977+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=788, gcTime=0, gcCount=0} +2024-04-03 17:00:11.630+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=414, gcTime=0, gcCount=0} +2024-04-03 17:53:15.829+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=207, gcTime=0, gcCount=0} +2024-04-03 17:53:20.066+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=241, gcTime=0, gcCount=0} +2024-04-03 17:53:20.519+0000 WARN [o.n.k.i.c.VmPauseMonitorComponent] Detected VM stop-the-world pause: {pauseTime=253, gcTime=0, gcCount=0} diff --git a/testdb/logs/http.log b/testdb/logs/http.log new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/logs/query.log b/testdb/logs/query.log new file mode 100644 index 000000000..e69de29bb diff --git a/testdb/logs/security.log b/testdb/logs/security.log new file mode 100644 index 000000000..e69de29bb