Assistant: 
User: 
    Please analyze the following code file and determine whether it belongs to any of the provided modules based on the listed module descriptions.
    Note that the provided list of modules may not be exhaustive, and some files may not belong to any of the modules. 
    If the code belongs to a module, Only output the module name, without any explanation or additional information; otherwise, return 'None' if it does not belong to any module.

    Modules : {
        "UI": "Handles the front-end user interface, consisting of HTML, CSS, and JavaScript files generated by the Angular framework. It processes user requests and interacts with the server using AJAX for data retrieval and client-side interactions."
"Test Driver": "Facilitates automated regression testing and handles transmission of test data in JSON format. It performs Java testing using TestNG and JavaScript unit-testing with Jest. It also sets up a simulated web server for servlet-level tests and automates end-to-end testing using Selenium Java."
"Logic": "Manages the business logic of TEAMMATES, including handling relationships between entities, managing transactions, input value sanitization, access control rights, and interfacing with GAE-provided or third-party APIs."
"Storage": "Performs CRUD operations on data entities, validation of data, and abstraction of GQL queries, hiding the complexities of datastore from the Logic component."
"Common": "Contains utility classes, custom exceptions, and data transfer objects used across the entire application for easy consolidation and transfer of structured data."
"E2E": "Handles end-to-end testing and load & performance testing, providing helpers, abstractions of browser pages, and test cases for E2E tests and L&P tests."
"Client": "Contains scripts for administrative tasks, such as migrating data to a new schema and calculating statistics. This module connects directly to the application back-end for administrative purposes."
    }

    Code: package teammates.e2e.pageobjects; /** * An abstract class that represents a browser-loaded page of the app and * provides ways to interact with it. Also contains methods to validate some * aspects of the page, e.g. HTML page source. * * <p>Note: We are using the Page Object pattern here. * * @see <a href="https://martinfowler.com/bliki/PageObject.html">https://martinfowler.com/bliki/PageObject.html</a> */ public abstract class AppPage { private static final String CLEAR_ELEMENT_SCRIPT; private static final String SCROLL_ELEMENT_TO_CENTER_AND_CLICK_SCRIPT; private static final String READ_TINYMCE_CONTENT_SCRIPT; private static final String WRITE_TO_TINYMCE_SCRIPT; static { try { CLEAR_ELEMENT_SCRIPT = FileHelper.readFile("src/e2e/resources/scripts/clearElementWithoutEvents.js"); SCROLL_ELEMENT_TO_CENTER_AND_CLICK_SCRIPT = FileHelper .readFile("src/e2e/resources/scripts/scrollElementToCenterAndClick.js"); READ_TINYMCE_CONTENT_SCRIPT = FileHelper.readFile("src/e2e/resources/scripts/readTinyMCEContent.js"); WRITE_TO_TINYMCE_SCRIPT = FileHelper.readFile("src/e2e/resources/scripts/writeToTinyMCE.js"); } catch (IOException e) { throw new RuntimeException(e); } } /** Browser instance the page is loaded into. */ protected Browser browser; /** Use for retrying due to transient UI issues. */ protected RetryManager uiRetryManager = new RetryManager((TestProperties.TEST_TIMEOUT + 1) / 2); /** * Used by subclasses to create a {@code AppPage} object to wrap around the * given {@code browser} object. Fails if the page content does not match * the page type, as defined by the sub-class. */ public AppPage(Browser browser) { this.browser = browser; boolean isCorrectPageType; try { isCorrectPageType = containsExpectedPageContents(); if (isCorrectPageType) { return; } } catch (Exception e) { // ignore and try again } // To minimize test failures due to eventual consistency, we try to // reload the page and compare once more. System.out.println("#### Incorrect page type: going to try reloading the page."); ThreadHelper.waitFor(2000); reloadPage(); isCorrectPageType = containsExpectedPageContents(); if (isCorrectPageType) { return; } System.out.println("######### Not in the correct page! ##########"); throw new IllegalStateException("Not in the correct page!"); } public Browser getBrowser() { return browser; } /** * Gets a new page object representation of the currently open web page in the browser. * * <p>Fails if the new page content does not match content expected in a page of * the type indicated by the parameter {@code typeOfPage}. */ public static <T extends AppPage> T getNewPageInstance(Browser currentBrowser, Class<T> typeOfPage) { waitUntilAnimationFinish(currentBrowser); try { Constructor<T> constructor = typeOfPage.getConstructor(Browser.class); T page = constructor.newInstance(currentBrowser); PageFactory.initElements(currentBrowser.driver, page); page.waitForPageToLoad(
Assistant: