Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/css-select/index.d.ts b/node_modules/css-select/index.d.ts
new file mode 100644
index 0000000..81f1f39
--- /dev/null
+++ b/node_modules/css-select/index.d.ts
@@ -0,0 +1,219 @@
+export = CSSselect;
+
+/**
+ * Alias for CSSselect.selectAll(query, elems, options).
+ * @see [CSSselect.compile] for supported selector queries.
+ */
+declare function CSSselect<Node, ElementNode extends Node>(
+    query: CSSselect.Query,
+    elems: Array<ElementNode> | ElementNode,
+    options?: CSSselect.Options<Node, ElementNode>
+  ): Array<ElementNode>;
+
+declare namespace CSSselect {
+  type Predicate<Value> = (v: Value) => boolean;
+  interface Adapter<Node, ElementNode extends Node> {
+    /**
+     *  is the node a tag?
+     */
+    isTag(node: Node): node is ElementNode;
+
+    /**
+     * Does at least one of passed element nodes pass the test predicate?
+     */
+    existsOne(test: Predicate<ElementNode>, elems: Array<ElementNode>): boolean;
+
+    /**
+     * get the attribute value.
+     */
+    getAttributeValue(elem: ElementNode, name: string): string;
+
+    /**
+     * get the node's children
+     */
+    getChildren(node: Node): Array<Node>;
+
+    /**
+     * get the name of the tag
+     */
+    getName(elem: ElementNode): string;
+
+    /**
+     * get the parent of the node
+     */
+    getParent(node: Node): Node;
+
+    /*
+      Get the siblings of the node. Note that unlike jQuery's `siblings` method,
+      this is expected to include the current node as well
+    */
+    getSiblings(node: Node): Array<Node>;
+
+    /*
+     * Get the text content of the node, and its children if it has any.
+     */
+    getText(node: Node): string;
+
+    /**
+     * Does the element have the named attribute?
+     */
+    hasAttrib(elem: ElementNode, name: string): boolean;
+
+    /**
+     * takes an array of nodes, and removes any duplicates, as well as any
+     * nodes whose ancestors are also in the array.
+     */
+    removeSubsets(nodes: Array<Node>): Array<Node>;
+
+    /**
+     * finds all of the element nodes in the array that match the test predicate,
+     * as well as any of their children that match it.
+     */
+    findAll(test: Predicate<ElementNode>, nodes: Array<Node>): Array<ElementNode>;
+
+    /**
+     * finds the first node in the array that matches the test predicate, or one
+     * of its children.
+     */
+    findOne(test: Predicate<ElementNode>, elems: Array<ElementNode>): ElementNode | undefined,
+
+    /**
+      The adapter can also optionally include an equals method, if your DOM
+      structure needs a custom equality test to compare two objects which refer
+      to the same underlying node. If not provided, `css-select` will fall back to
+      `a === b`.
+    */
+    equals?: (a: Node, b: Node) => boolean;
+
+     /**
+     * is the element in hovered state?
+     */
+    isHovered?: (elem: ElementNode) => boolean;
+
+    /**
+     * is the element in visited state?
+     */
+    isVisited?: (elem: ElementNode) => boolean;
+
+    /**
+     * is the element in active state?
+     */
+    isActive?: (elem: ElementNode) => boolean;
+  }
+
+  // TODO default types to the domutil/httpparser2 types
+  interface Options<Node, ElementNode extends Node> {
+    /**
+     * When enabled, tag names will be case-sensitive. Default: false.
+     */
+    xmlMode?: boolean;
+    /**
+     * Limits the module to only use CSS3 selectors. Default: false.
+     */
+    strict?: boolean;
+    /**
+     * The last function in the stack, will be called with the last element
+     * that's looked at. Should return true.
+     */
+    rootFunc?: (element: ElementNode) => true;
+    /**
+     * The adapter to use when interacting with the backing DOM structure. By
+     * default it uses domutils.
+     */
+    adapter?: Adapter<Node, ElementNode>;
+  }
+
+  type CompiledQuery = (node: any) => boolean;
+  type Query = string | CompiledQuery;
+
+  /**
+   * Compiles the query, returns a function.
+   * 
+   * Supported simple selectors:
+   *   * Universal (*)
+   *   * Tag (<tagname>)
+   *   * Attribute ([attr=foo]), with supported comparisons:
+   *     * [attr] (existential)
+   *     * =
+   *     * ~=
+   *     * |=
+   *     * *=
+   *     * ^=
+   *     * $=
+   *     * != 
+   *     * Can be case insensitive (E.g. [attr=foo i])
+   *   * Pseudos:
+   *     * :not
+   *     * :root
+   *     * :empty
+   *     * :[first|last]-child[-of-type]
+   *     * :only-of-type, :only-child
+   *     * :nth-[last-]child[-of-type]
+   *     * :link, :visited (the latter doesn't match any elements)
+   *     * :checked
+   *     * :enabled, :disabled
+   *     * :required, :optional
+   *   * Nonstandard Pseudos (available when strict mode is not enabled):
+   *     * `:contains`
+   *     * `:icontains` (case-insensitive version of :contains)
+   *     * `:has`
+   *     * `:parent`
+   *     * `:selected`
+   *     * `:header, :button, :input, :text, :checkbox, :file, :password, :reset, :radio etc.
+   *     * :matches
+   * 
+   * Supported Combinators:
+   * 
+   *   * Descendant (` `)
+   *   * Child (`>`)
+   *   * Parent (`<`) (when strict mode is not enabled)
+   *   * Sibling (`~`)
+   *   * Adjacent (`+`)
+   */
+  function compile(query: string): CompiledQuery;
+  /**
+   * @template Node The generic Node type for the DOM adapter being used.
+   * @template ElementNode The Node type for elements for the DOM adapter being used.
+   * @param elems Elements to query. If it is an element, its children will be queried..
+   * @param query can be either a CSS selector string or a compiled query function.
+   * @param [options] options for querying the document.
+   * @see CSSselect.compile for supported selector queries.
+   * @returns All matching elements.
+   */
+  function selectAll<Node, ElementNode extends Node>(
+    query: Query,
+    elems: Array<ElementNode> | ElementNode,
+    options?: Options<Node, ElementNode>
+  ): Array<ElementNode>;
+  /**
+   * @template Node The generic Node type for the DOM adapter being used.
+   * @template ElementNode The Node type for elements for the DOM adapter being used.
+   * @param elems Elements to query. If it is an element, its children will be queried..
+   * @param query can be either a CSS selector string or a compiled query function.
+   * @param [options] options for querying the document.
+   * @see CSSselect.compile for supported selector queries.
+   * @returns the first match, or null if there was no match.
+   */
+  function selectOne<Node, ElementNode extends Node>(
+    query: Query,
+    elems: Array<ElementNode> | ElementNode,
+    options?: Options<Node, ElementNode>
+  ): ElementNode | null;
+
+  /**
+   * Tests whether or not an element is matched by query.
+   * 
+   * @template Node The generic Node type for the DOM adapter being used.
+   * @template ElementNode The Node type for elements for the DOM adapter being used.
+   * @param elem The element to test if it matches the query.
+   * @param query can be either a CSS selector string or a compiled query function.
+   * @param [options] options for querying the document.
+   * @see CSSselect.compile for supported selector queries.
+   * @returns 
+   */
+  function is<Node, ElementNode extends Node>(
+    elem: ElementNode,
+    query: Query,
+    options?: Options<Node, ElementNode>
+  ): boolean;
+}
\ No newline at end of file