diff --git a/.talismanrc b/.talismanrc new file mode 100644 index 0000000..afb4a06 --- /dev/null +++ b/.talismanrc @@ -0,0 +1 @@ +threshold: medium \ No newline at end of file diff --git a/LICENSE b/LICENSE index 3c37f9c..21b538b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright 2020 Contentstack +Copyright 2021 Contentstack Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/README.md b/README.md index e312259..b9cf9cb 100644 --- a/README.md +++ b/README.md @@ -64,15 +64,15 @@ Contentstack Utils SDK lets you interact with the Content Delivery APIs and retr To get an embedded item of a single entry, you need to provide the stack API key, environment name, content type’s UID, and entry’s UID. Then, use the `entry.fetch` function as shown below: ```python - import contentstack +import contentstack - stack = contentstack.Stack('api_key','delivery_token','environment') - content_type = stack.content_type("content_type_uid") - entry = content_type.entry("entry_uid") - result = entry.fetch() - if result is not None: - entry = result['entries'] - Utils.render(entry, ['rich_text_editor', 'some_other_text'], Option()) +stack = contentstack.Stack('api_key','delivery_token','environment') +content_type = stack.content_type("content_type_uid") +entry = content_type.entry("entry_uid") +result = entry.fetch() +if result is not None: + entry = result['entries'] + Utils.render(entry, ['rich_text_editor', 'some_other_text'], Option()) ``` @@ -81,13 +81,32 @@ To get an embedded item of a single entry, you need to provide the stack API key To get embedded items from multiple entries, you need to provide the stack API key, delivery token, environment name, and content type’s UID. ```python - import contentstack - - stack = contentstack.Stack('api_key','delivery_token','environment') - query = stack.content_type("content_type_uid").query() - result = query.find() - if result is not None and 'entries' in result: - entry = result['entries'] - for item in range: - Utils.render(item, ['rich_text_editor', 'some_other_text'], Option()) +import contentstack + +stack = contentstack.Stack('api_key','delivery_token','environment') +query = stack.content_type("content_type_uid").query() +result = query.find() +if result is not None and 'entries' in result: + entry = result['entries'] + for item in range: + option = Option() + Utils.render(item, ['rich_text_editor', 'some_other_text'], option) +``` + + +## Supercharged + +To get supercharged items from multiple entries, you need to provide the stack API key, delivery token, environment name, and content type’s UID. + +```python +import contentstack + +stack = contentstack.Stack('api_key','delivery_token','environment') +query = stack.content_type("content_type_uid").query() +result = query.find() +if result is not None and 'entries' in result: + entry = result['entries'] + for item in range: + option = Option() + Utils.json_to_html(item, ['paragraph_text'], option) ``` diff --git a/changelog.rst b/changelog.rst index afe85d1..fda7a6e 100644 --- a/changelog.rst +++ b/changelog.rst @@ -2,6 +2,18 @@ **CHANGELOG** ================ +NEW FEATURE: Supercharged RTE + +- jsonToHtml function support added + +*v0.2.0* +============ + +**Date: 02-Sept-2021** + + - Initial release of contentstack utility package + + ENHANCEMENT, NEW FEATURE, BUG RESOLVE *v0.1.0* diff --git a/contentstack_utils/__init__.py b/contentstack_utils/__init__.py index 706f081..d52bcd9 100644 --- a/contentstack_utils/__init__.py +++ b/contentstack_utils/__init__.py @@ -3,12 +3,6 @@ # coverage report -m # coverage html -d coveragereport """ -The __init__.py files are required to make Python treat the directories as containing -packages; this is done to prevent directories with a common name, such as string, -from unintentionally hiding valid modules that occur later on the module search path -Used: Safety checks your installed dependencies for known security vulnerabilities -file __init__.py contains package information like - __author__, __status__, __version__, __endpoint__ and __email__ `Your code has been rated at 10.00/10` diff --git a/contentstack_utils/embedded/item_type.py b/contentstack_utils/embedded/item_type.py index c3ebd20..021e1dc 100644 --- a/contentstack_utils/embedded/item_type.py +++ b/contentstack_utils/embedded/item_type.py @@ -10,11 +10,6 @@ class ItemType(enum.Enum): - """ - Contains Two option for ItemsType - - ENTRY - ASSET - """ + """Contains Two option for ItemsType => ENTRY and ASSET """ ENTRY = 'entry' ASSET = 'asset' diff --git a/contentstack_utils/embedded/styletype.py b/contentstack_utils/embedded/styletype.py index c68b8db..1fdc219 100644 --- a/contentstack_utils/embedded/styletype.py +++ b/contentstack_utils/embedded/styletype.py @@ -10,12 +10,7 @@ class StyleType(enum.Enum): """ This StyleType contains four options like below. - - BLOCK - INLINE - LINK - DISPLAY - DOWNLOAD + BLOCK ,INLINE ,LINK,DISPLAY,DOWNLOAD """ BLOCK = 'block' diff --git a/contentstack_utils/helper/converter.py b/contentstack_utils/helper/converter.py index b04fe4f..e18f7d8 100644 --- a/contentstack_utils/helper/converter.py +++ b/contentstack_utils/helper/converter.py @@ -12,4 +12,3 @@ def convert_style(style) -> StyleType: return StyleType.DISPLAY elif style == 'download': return StyleType.DOWNLOAD - diff --git a/contentstack_utils/helper/metadata.py b/contentstack_utils/helper/metadata.py index 53e7af3..6ed979d 100644 --- a/contentstack_utils/helper/metadata.py +++ b/contentstack_utils/helper/metadata.py @@ -38,63 +38,28 @@ def __init__(self, text: str, item_type: str, item_uid: str, @property def get_text(self): - """text for embedded objects - - Returns: - str : text for embedded objects - """ return self.text @property def get_item_type(self): - """item_type for embedded objects - - Returns: - str : item_type for embedded objects - """ return self.item_type @property def get_item_uid(self): - """item_uid for embedded objects - - Returns: - str : item_uid for embedded objects - """ return self.item_uid @property def get_content_type_uid(self): - """content_type_uid for embedded objects - - Returns: - str : content_type_uid for embedded objects - """ return self.content_type_uid @property def get_style_type(self) -> StyleType: - """style_type for embedded objects - - Returns: - StyleType : style_type for embedded objects - """ return self.style_type @property def get_outer_html(self): - """outer_html for embedded objects - - Returns: - str : outer_html for embedded objects - """ return self.outer_html @property def get_attributes(self): - """attributes for embedded objects - - Returns: - str : attributes for embedded objects - """ return self.attributes diff --git a/contentstack_utils/helper/node_to_html.py b/contentstack_utils/helper/node_to_html.py new file mode 100644 index 0000000..58fa043 --- /dev/null +++ b/contentstack_utils/helper/node_to_html.py @@ -0,0 +1,28 @@ +from contentstack_utils.render.options import Options + + +class NodeToHtml: + + @staticmethod + def text_node_to_html(node, option: Options): + """ + accepts node type, + on the basis of the node type, generates string + :rtype: str + """ + node_text = node['text'] + if 'superscript' in node: + node_text = option.render_mark('superscript', node_text) + if 'subscript' in node: + node_text = option.render_mark('subscript', node_text) + if 'inlineCode' in node: + node_text = option.render_mark('inlineCode', node_text) + if 'strikethrough' in node: + node_text = option.render_mark('strikethrough', node_text) + if 'underline' in node: + node_text = option.render_mark('underline', node_text) + if 'italic' in node: + node_text = option.render_mark('italic', node_text) + if 'bold' in node: + node_text = option.render_mark('bold', node_text) + return node_text diff --git a/contentstack_utils/render/options.py b/contentstack_utils/render/options.py index 15733ca..1857263 100644 --- a/contentstack_utils/render/options.py +++ b/contentstack_utils/render/options.py @@ -1,46 +1,117 @@ -# pylint: disable=missing-function-docstring -# pylint: disable=missing-docstring -# pylint: disable=too-few-public-methods from contentstack_utils.helper.metadata import Metadata -def _title_or_uid(embedded_obj: dict) -> str: +def _title_or_uid(_obj: dict) -> str: _title = "" - if embedded_obj is not None: - if 'title' in embedded_obj and len(embedded_obj['title']) != 0: - _title = embedded_obj['title'] - elif 'uid' in embedded_obj: - _title = embedded_obj['uid'] + if _obj is not None: + if 'title' in _obj and len(_obj['title']) != 0: + _title = _obj['title'] + elif 'uid' in _obj: + _title = _obj['uid'] return _title -def _asset_title_or_uid(embedded_obj: dict) -> str: +def _asset_title_or_uid(_obj: dict) -> str: _title = "" - if embedded_obj is not None: - if 'title' in embedded_obj and len(embedded_obj['title']) != 0: - _title = embedded_obj['title'] - elif 'filename' in embedded_obj: - _title = embedded_obj['filename'] - elif 'uid' in embedded_obj: - _title = embedded_obj['uid'] + if _obj is not None: + if 'title' in _obj and len(_obj['title']) != 0: + _title = _obj['title'] + elif 'filename' in _obj: + _title = _obj['filename'] + elif 'uid' in _obj: + _title = _obj['uid'] return _title class Options: @staticmethod - def render_options(embedded_obj: dict, metadata: Metadata): + def render_options(_obj: dict, metadata: Metadata): if metadata.style_type.value == 'block': - return '

' + _title_or_uid(embedded_obj) \ - + '

Content type: ' + embedded_obj['_content_type_uid'] \ + return '

' + _title_or_uid(_obj) \ + + '

Content type: ' + _obj['_content_type_uid'] \ + '

' if metadata.style_type.value == 'inline': - return '' + _title_or_uid(embedded_obj) + '' + return '' + _title_or_uid(_obj) + '' if metadata.style_type.value == 'link': - return '' + _title_or_uid(embedded_obj) + '' + return '' + _title_or_uid(_obj) + '' if metadata.style_type.value == 'display': - return ' \
-                   + _asset_title_or_uid(embedded_obj) + ' + return ' \
+                   + _asset_title_or_uid(_obj) + ' if metadata.style_type.value == 'download': - return '' + _asset_title_or_uid(embedded_obj) + '' + return '' + _asset_title_or_uid(_obj) + '' + @staticmethod + def render_mark(mark_type: str, render_text: str): + if mark_type == 'superscript': + return "" + render_text + "" + if mark_type == 'subscript': + return "" + render_text + "" + if mark_type == 'inlineCode': + return "" + render_text + "" + if mark_type == 'strikethrough': + return "" + render_text + "" + if mark_type == 'underline': + return "" + render_text + "" + if mark_type == 'italic': + return "" + render_text + "" + if mark_type == 'bold': + return "" + render_text + "" + else: + return render_text + pass + + @staticmethod + def render_node(node_type, node_obj: dict, callback): + inner_html = callback(node_obj['children']) + if node_type == 'p': + return "

" + inner_html + "

" + if node_type == 'a': + return "" + inner_html + "" + if node_type == 'img': + return "" + inner_html + "" + if node_type == 'embed': + return "" + if node_type == 'h1': + return "

" + inner_html + "

" + if node_type == 'h2': + return "

" + inner_html + "

" + if node_type == 'h3': + return "

" + inner_html + "

" + if node_type == 'h4': + return "

" + inner_html + "

" + if node_type == 'h5': + return "
" + inner_html + "
" + if node_type == 'h6': + return "
" + inner_html + "
" + if node_type == 'ol': + return "
    " + inner_html + "
" + if node_type == 'ul': + return "
    " + inner_html + "
" + if node_type == 'li': + return "
  • " + inner_html + "
  • " + if node_type == 'hr': + return "
    " + if node_type == 'table': + return "" + inner_html + "
    " + if node_type == 'thead': + return "" + inner_html + "" + if node_type == 'tbody': + return "" + inner_html + "" + if node_type == 'tfoot': + return "" + inner_html + "" + if node_type == 'tr': + return "" + inner_html + "" + + if node_type == 'th': + return "" + inner_html + "" + if node_type == 'td': + return "" + inner_html + "" + if node_type == 'blockquote': + return "
    " + inner_html + "
    " + if node_type == 'code': + return "" + inner_html + "" + if node_type in ['doc', 'reference']: + return inner_html + else: + return inner_html diff --git a/contentstack_utils/utils.py b/contentstack_utils/utils.py index c4b9ac7..ca08a16 100644 --- a/contentstack_utils/utils.py +++ b/contentstack_utils/utils.py @@ -9,75 +9,17 @@ import json from lxml import etree - +from contentstack_utils.helper.converter import convert_style from contentstack_utils.helper.metadata import Metadata +from contentstack_utils.helper.node_to_html import NodeToHtml from contentstack_utils.render.options import Options -from contentstack_utils.helper.converter import convert_style - - -def _is_json(file): - try: - json.dumps(file) - return True - except ValueError: - return False - - -def extract_keys(_embedded_items): - available_keys: list = _embedded_items.keys() - return available_keys - - -def find_embedded_entry(json_array: list, metadata: Metadata): - for obj in json_array: - if obj['uid'] == metadata.get_item_uid: - return obj - return None - - -def get_metadata(elements): - for element in elements: - content_type = None - typeof = element.attrib['type'] - if typeof == 'asset': - uid = element.attrib['data-sys-asset-uid'] - else: - uid = element.attrib['data-sys-entry-uid'] - content_type = element.attrib['data-sys-content-type-uid'] - style = element.attrib['sys-style-type'] - outer_html = etree.tostring(element).decode('utf-8') - attributes = element.attrib - style = convert_style(style) - metadata = Metadata(element.text, typeof, uid, content_type, style, outer_html, attributes) - return metadata - - -def get_html_doc(embedded_obj, metadata, callback, html_doc): - if '_embedded_items' in embedded_obj: - keys = extract_keys(embedded_obj['_embedded_items']) - for key in keys: - items_array = embedded_obj['_embedded_items'][key] - item = find_embedded_entry(items_array, metadata) - if item is not None: - replaceable_str = callback.render_options(item, metadata) - html_doc = html_doc.replace(metadata.outer_html, replaceable_str) - break - return html_doc class Utils: - """ - render staticmethod, that accepts entry/entries, key path and render_object - entry_obj: [list] or [dict] that contains list or dic object - key_path: list of key_path - Raises: - FileNotFoundError: if file not found or invalid resource received - """ @staticmethod def render(entry_obj, key_path: list, option: Options): - valid = _is_json(entry_obj) - + valid = Utils.__is_json(entry_obj) if not valid: raise FileNotFoundError('Invalid file found') @@ -86,61 +28,202 @@ def render(entry_obj, key_path: list, option: Options): Utils.render(entry, key_path, option) if isinstance(entry_obj, dict): - Utils._get_embedded_keys(entry_obj, key_path, option) + Utils.__get_embedded_keys(entry_obj, key_path, option, render_callback=Utils.render_content) @staticmethod - def _get_embedded_keys(entry, key_path, option: Options): - + def __get_embedded_keys(entry, key_path, option: Options, render_callback): if '_embedded_items' in entry: if key_path is not None: for path in key_path: - Utils._find_embed_keys(entry, path, option) + Utils.__find_embed_keys(entry, path, option, render_callback) else: _embedded_items = entry['_embedded_items'] available_keys: list = _embedded_items.keys() for path in available_keys: - Utils._find_embed_keys(entry, path, option) + Utils.__find_embed_keys(entry, path, option, render_callback) @staticmethod - def _find_embed_keys(entry, path, option: Options): + def __find_embed_keys(entry, path, option: Options, render_callback): keys = path.split('.') - Utils._get_content(keys, entry, option) + Utils.__get_content(keys, entry, option, render_callback) @staticmethod - def _get_content(keys_array: list, entry, option: Options): + def __get_content(keys_array, entry, option: Options, render_callback): if keys_array is not None and len(keys_array) > 0: key = keys_array[0] if len(keys_array) == 1 and keys_array[0] in entry: var_content = entry[key] - if isinstance(var_content, (list, str)): - entry[key] = Utils.render_content(var_content, entry, option) + if isinstance(var_content, (list, str, dict)): + entry[key] = render_callback(var_content, entry, option) else: keys_array.remove(key) if key in entry and isinstance(entry[key], dict): - Utils._get_content(keys_array, entry[key], option) + Utils.__get_content(keys_array, entry[key], option, render_callback) elif key in entry and isinstance(entry[key], list): list_json = entry[key] for node in list_json: - Utils._get_content(keys_array, node, option) + Utils.__get_content(keys_array, node, option, render_callback) @staticmethod def render_content(rte_content, embed_obj: dict, callback: Options) -> object: if isinstance(rte_content, str): - return get_embedded_objects(rte_content, embed_obj, callback) + return Utils.__get_embedded_objects(rte_content, embed_obj, callback) elif isinstance(rte_content, list): - temp = [] + render_callback = [] for rte in rte_content: - temp.append(Utils.render_content(rte, embed_obj, callback)) - return temp + render_callback.append(Utils.render_content(rte, embed_obj, callback)) + return render_callback return rte_content + @staticmethod + def __get_embedded_objects(html_doc, embedded_obj, callback): + import re + document = f"{html_doc}" + tag = etree.fromstring(document) + html_doc = etree.tostring(tag).decode('utf-8') + html_doc = re.sub('(?ms)<%s[^>]*>(.*)' % (tag.tag, tag.tag), '\\1', html_doc) + elements = tag.xpath("//*[contains(@class, 'embedded-asset') or contains(@class, 'embedded-entry')]") + metadata = Utils.__get_metadata(elements) + return Utils.__get_html_doc(embedded_obj, metadata, callback, html_doc) + + @staticmethod + def __get_html_doc(embedded_obj, metadata, callback, html_doc): + if '_embedded_items' in embedded_obj: + keys = embedded_obj['_embedded_items'].keys() + for key in keys: + items_array = embedded_obj['_embedded_items'][key] + item = Utils.__find_embedded_entry(items_array, metadata) + if item is not None: + replaceable_str = callback.render_options(item, metadata) + html_doc = html_doc.replace(metadata.outer_html, replaceable_str) + break + return html_doc -def get_embedded_objects(html_doc, embedded_obj, callback): - import re - document = f"{html_doc}" - tag = etree.fromstring(document) - html_doc = etree.tostring(tag).decode('utf-8') - html_doc = re.sub('(?ms)<%s[^>]*>(.*)' % (tag.tag, tag.tag), '\\1', html_doc) - elements = tag.xpath("//*[contains(@class, 'embedded-asset') or contains(@class, 'embedded-entry')]") - metadata = get_metadata(elements) - return get_html_doc(embedded_obj, metadata, callback, html_doc) + @staticmethod + def __get_metadata(elements): + for element in elements: + content_type = None + typeof = element.attrib['type'] + if typeof == 'asset': + uid = element.attrib['data-sys-asset-uid'] + else: + uid = element.attrib['data-sys-entry-uid'] + content_type = element.attrib['data-sys-content-type-uid'] + style = element.attrib['sys-style-type'] + outer_html = etree.tostring(element).decode('utf-8') + attributes = element.attrib + style = convert_style(style) + metadata = Metadata(element.text, typeof, uid, content_type, style, outer_html, attributes) + return metadata + + #################################################### + # SUPERCHARGED # + #################################################### + + @staticmethod + def __is_json(file): + try: + json.dumps(file) + return True + except ValueError: + return False + + @staticmethod + def json_to_html(entry_obj, key_path: list, option: Options): + if not Utils.__is_json(entry_obj): + raise FileNotFoundError('Could not process invalid content') + if isinstance(entry_obj, list): + for entry in entry_obj: + return Utils.json_to_html(entry, key_path, option) + if isinstance(entry_obj, dict): + render_callback = Utils.__enumerate_content + if key_path is not None: + for path in key_path: + Utils.__find_embed_keys(entry_obj, path, option, render_callback) + + @staticmethod + def __enumerate_content(content, entry, option): + if len(content) > 0: + if isinstance(content, list): + array_content = [] + for item in content: + result = Utils.__enumerate_content(item, entry, option) + array_content.append(result) + return array_content + if isinstance(content, dict): + if 'type' and 'children' in content: + if content['type'] == 'doc': + return Utils.__raw_processing(content['children'], entry, option) + return '' + + @staticmethod + def __raw_processing(children, entry, option): + array_container = [] + for item in children: + if isinstance(item, dict): + array_container.append(Utils.__extract_keys(item, entry, option)) + temp = ''.join(array_container) + return temp + + @staticmethod + def __extract_keys(item, entry, option: Options): + if 'type' not in item.keys() and 'text' in item.keys(): + return NodeToHtml.text_node_to_html(item, option) + + elif 'type' in item.keys(): + node_style = item['type'] + if node_style == 'reference': + metadata = Utils.__return_metadata(item, node_style) + if '_embedded_items' in entry: + keys = entry['_embedded_items'].keys() + for key in keys: + items_array = entry['_embedded_items'][key] + content = Utils.__find_embedded_entry(items_array, metadata) + return Utils.__get_string_option(option, metadata, content) + else: + def call(children): + return Utils.__raw_processing(children, entry, option) + + return option.render_node(node_style, item, callback=call) + return '' + + @staticmethod + def __find_embedded_entry(list_json: list, metadata: Metadata): + for obj in list_json: + if obj['uid'] == metadata.get_item_uid: + return obj + return None + + @staticmethod + def __get_string_option(option: Options, metadata: Metadata, content: dict): + string_option = option.render_options(content, metadata) + if string_option is None: + string_option = Options().render_options(content, metadata) + return string_option + + @staticmethod + def __return_metadata(item, node_style): + attr = item['attrs'] + text = Utils.__get_child_text(item) + style = convert_style(attr['display-type']) + if attr['type'] == 'asset': + return Metadata(text, node_style, + attr['asset-uid'], + 'sys-asset', + style, '', '') + else: + return Metadata(text, node_style, + attr['entry-uid'], + attr['content-type-uid'], + style, '', '') + + @staticmethod + def __get_child_text(item): + text = '' + if 'children' in item.keys() and len(item['children']) > 0: + children = item['children'] + for child in children: + if text in child.keys(): + text = child['text'] + break + return text diff --git a/coverage/contentstack_utils___init___py.html b/coverage/contentstack_utils___init___py.html deleted file mode 100644 index 0159334..0000000 --- a/coverage/contentstack_utils___init___py.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Coverage for contentstack_utils/__init__.py: 100% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1# pip install -r requirements.txt 

    -

    2# pytest --html=tests/report/test-report.html 

    -

    3# coverage report -m 

    -

    4# coverage html -d coveragereport 

    -

    5""" 

    -

    6The __init__.py files are required to make Python treat the directories as containing 

    -

    7packages; this is done to prevent directories with a common name, such as string, 

    -

    8from unintentionally hiding valid modules that occur later on the module search path 

    -

    9Used: Safety checks your installed dependencies for known security vulnerabilities 

    -

    10file __init__.py contains package information like 

    -

    11 

    -

    12__author__, __status__, __version__, __endpoint__ and __email__ 

    -

    13 

    -

    14`Your code has been rated at 10.00/10` 

    -

    15""" 

    -

    16 

    -

    17from contentstack_utils.embedded.item_type import ItemType 

    -

    18from contentstack_utils.embedded.styletype import StyleType 

    -

    19from contentstack_utils.helper.metadata import Metadata 

    -

    20from contentstack_utils.render.options import Options 

    -

    21from contentstack_utils.utils import Utils 

    -

    22 

    -

    23__title__ = 'contentstack_utils' 

    -

    24__author__ = 'contentstack' 

    -

    25__status__ = 'debug' 

    -

    26__version__ = '0.0.1' 

    -

    27__endpoint__ = 'cdn.contentstack.io' 

    -

    28__contact__ = 'support@contentstack.com' 

    -
    - - - diff --git a/coverage/contentstack_utils_embedded_item_type_py.html b/coverage/contentstack_utils_embedded_item_type_py.html deleted file mode 100644 index cd68bd4..0000000 --- a/coverage/contentstack_utils_embedded_item_type_py.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - Coverage for contentstack_utils/embedded/item_type.py: 100% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1""" 

    -

    2ItemType is Enumeration class that conatains two options for ItemType: 

    -

    3 

    -

    4ASSET 

    -

    5 

    -

    6ENTRY 

    -

    7""" 

    -

    8 

    -

    9import enum 

    -

    10 

    -

    11 

    -

    12class ItemType(enum.Enum): 

    -

    13 """ 

    -

    14 Contains Two option for ItemsType 

    -

    15 

    -

    16 ENTRY 

    -

    17 ASSET 

    -

    18 """ 

    -

    19 ENTRY = 'entry' 

    -

    20 ASSET = 'asset' 

    -
    - - - diff --git a/coverage/contentstack_utils_embedded_styletype_py.html b/coverage/contentstack_utils_embedded_styletype_py.html deleted file mode 100644 index 0f3e848..0000000 --- a/coverage/contentstack_utils_embedded_styletype_py.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - Coverage for contentstack_utils/embedded/styletype.py: 100% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1"""" 

    -

    2There are two types StyleType ENTRY and ASSETS 

    -

    3For `Entry`: StyleType.BLOCK, StyleType.INLINE, StyleType.LINKED, 

    -

    4For `Assets`: StyleType.DISPLAY, StyleType.DOWNLOADABLE 

    -

    5 """ 

    -

    6import enum 

    -

    7 

    -

    8 

    -

    9class StyleType(enum.Enum): 

    -

    10 

    -

    11 """ 

    -

    12 This StyleType contains four options like below. 

    -

    13 

    -

    14 BLOCK 

    -

    15 INLINE 

    -

    16 LINK 

    -

    17 DISPLAY 

    -

    18 DOWNLOAD 

    -

    19 """ 

    -

    20 

    -

    21 BLOCK = 'block' 

    -

    22 INLINE = 'inline' 

    -

    23 LINK = 'link' 

    -

    24 DISPLAY = 'display' 

    -

    25 DOWNLOAD = 'download' 

    -
    - - - diff --git a/coverage/contentstack_utils_helper_converter_py.html b/coverage/contentstack_utils_helper_converter_py.html deleted file mode 100644 index 9edf3c6..0000000 --- a/coverage/contentstack_utils_helper_converter_py.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - Coverage for contentstack_utils/helper/converter.py: 67% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1from contentstack_utils.embedded.styletype import StyleType 

    -

    2 

    -

    3 

    -

    4def convert_style(style) -> StyleType: 

    -

    5 if style == 'block': 

    -

    6 return StyleType.BLOCK 

    -

    7 elif style == 'inline': 

    -

    8 return StyleType.INLINE 

    -

    9 elif style == 'link': 

    -

    10 return StyleType.LINK 

    -

    11 elif style == 'display': 

    -

    12 return StyleType.DISPLAY 

    -

    13 elif style == 'download': 

    -

    14 return StyleType.DOWNLOAD 

    -

    15 

    -
    - - - diff --git a/coverage/contentstack_utils_helper_metadata_py.html b/coverage/contentstack_utils_helper_metadata_py.html deleted file mode 100644 index 67f32ad..0000000 --- a/coverage/contentstack_utils_helper_metadata_py.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - Coverage for contentstack_utils/helper/metadata.py: 100% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1""" 

    -

    2 Metadata is the model class for embedded objects 

    -

    3 

    -

    4 Returns: 

    -

    5 str: text, item_type, item_uid, type_uid, style_type, outer_html and attributes 

    -

    6""" 

    -

    7 

    -

    8from contentstack_utils.embedded.styletype import StyleType 

    -

    9 

    -

    10 

    -

    11class Metadata: 

    -

    12 """ 

    -

    13 model helper class to set and get value 

    -

    14 """ 

    -

    15 

    -

    16 def __init__(self, text: str, item_type: str, item_uid: str, 

    -

    17 content_type_uid: str, style_type: StyleType, 

    -

    18 outer_html: str, attributes: str): 

    -

    19 """ 

    -

    20 Used to set the value to the variables 

    -

    21 

    -

    22 Args: 

    -

    23 text (str): text for embedded objects 

    -

    24 item_type (str): item_type for embedded objects 

    -

    25 item_uid (str): item_uid for embedded objects 

    -

    26 content_type_uid (str): content_type_uid for embedded objects 

    -

    27 style_type (StyleType): style_type for embedded objects 

    -

    28 outer_html (str): outer_html for embedded objects 

    -

    29 attributes (str): attributes for embedded objects 

    -

    30 """ 

    -

    31 self.text = text 

    -

    32 self.item_type = item_type 

    -

    33 self.item_uid = item_uid 

    -

    34 self.content_type_uid = content_type_uid 

    -

    35 self.style_type = style_type 

    -

    36 self.outer_html = outer_html 

    -

    37 self.attributes = attributes 

    -

    38 

    -

    39 @property 

    -

    40 def get_text(self): 

    -

    41 """text for embedded objects 

    -

    42 

    -

    43 Returns: 

    -

    44 str : text for embedded objects 

    -

    45 """ 

    -

    46 return self.text 

    -

    47 

    -

    48 @property 

    -

    49 def get_item_type(self): 

    -

    50 """item_type for embedded objects 

    -

    51 

    -

    52 Returns: 

    -

    53 str : item_type for embedded objects 

    -

    54 """ 

    -

    55 return self.item_type 

    -

    56 

    -

    57 @property 

    -

    58 def get_item_uid(self): 

    -

    59 """item_uid for embedded objects 

    -

    60 

    -

    61 Returns: 

    -

    62 str : item_uid for embedded objects 

    -

    63 """ 

    -

    64 return self.item_uid 

    -

    65 

    -

    66 @property 

    -

    67 def get_content_type_uid(self): 

    -

    68 """content_type_uid for embedded objects 

    -

    69 

    -

    70 Returns: 

    -

    71 str : content_type_uid for embedded objects 

    -

    72 """ 

    -

    73 return self.content_type_uid 

    -

    74 

    -

    75 @property 

    -

    76 def get_style_type(self) -> StyleType: 

    -

    77 """style_type for embedded objects 

    -

    78 

    -

    79 Returns: 

    -

    80 StyleType : style_type for embedded objects 

    -

    81 """ 

    -

    82 return self.style_type 

    -

    83 

    -

    84 @property 

    -

    85 def get_outer_html(self): 

    -

    86 """outer_html for embedded objects 

    -

    87 

    -

    88 Returns: 

    -

    89 str : outer_html for embedded objects 

    -

    90 """ 

    -

    91 return self.outer_html 

    -

    92 

    -

    93 @property 

    -

    94 def get_attributes(self): 

    -

    95 """attributes for embedded objects 

    -

    96 

    -

    97 Returns: 

    -

    98 str : attributes for embedded objects 

    -

    99 """ 

    -

    100 return self.attributes 

    -
    - - - diff --git a/coverage/contentstack_utils_helper_parser_py.html b/coverage/contentstack_utils_helper_parser_py.html deleted file mode 100644 index 9237c13..0000000 --- a/coverage/contentstack_utils_helper_parser_py.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - Coverage for contentstack_utils/helper/parser.py: 46% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1from html.parser import HTMLParser 

    -

    2 

    -

    3 

    -

    4class Parse(HTMLParser): 

    -

    5 def __init__(self): 

    -

    6 # Since Python 3, we need to call the __init__() function 

    -

    7 # of the parent class 

    -

    8 super().__init__() 

    -

    9 self.reset() 

    -

    10 

    -

    11 # Defining what the methods should output when called by HTMLParser. 

    -

    12 def handle_starttag(self, tag, attrs): 

    -

    13 print("Start tag: ", tag) 

    -

    14 for a in attrs: 

    -

    15 print("Attributes of the tag: ", a) 

    -

    16 

    -

    17 def handle_data(self, data): 

    -

    18 print("Here's the data: ", data) 

    -

    19 

    -

    20 def handle_endtag(self, tag): 

    -

    21 print("End tag: ", tag) 

    -
    - - - diff --git a/coverage/contentstack_utils_render_default_options_py.html b/coverage/contentstack_utils_render_default_options_py.html deleted file mode 100644 index 4ac2bdf..0000000 --- a/coverage/contentstack_utils_render_default_options_py.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - Coverage for contentstack_utils/render/default_options.py: 97% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1# pylint: disable=missing-function-docstring 

    -

    2# pylint: disable=missing-docstring 

    -

    3# pylint: disable=too-few-public-methods 

    -

    4from contentstack_utils.helper.metadata import Metadata 

    -

    5 

    -

    6 

    -

    7def _title_or_uid(embedded_obj: dict) -> str: 

    -

    8 _title = "" 

    -

    9 if embedded_obj is not None: 

    -

    10 if 'title' in embedded_obj and len(embedded_obj['title']) != 0: 

    -

    11 _title = embedded_obj['title'] 

    -

    12 elif 'uid' in embedded_obj: 

    -

    13 _title = embedded_obj['uid'] 

    -

    14 return _title 

    -

    15 

    -

    16 

    -

    17def _asset_title_or_uid(embedded_obj: dict) -> str: 

    -

    18 _title = "" 

    -

    19 if embedded_obj is not None: 

    -

    20 if 'title' in embedded_obj and len(embedded_obj['title']) != 0: 

    -

    21 _title = embedded_obj['title'] 

    -

    22 elif 'filename' in embedded_obj: 

    -

    23 _title = embedded_obj['filename'] 

    -

    24 elif 'uid' in embedded_obj: 

    -

    25 _title = embedded_obj['uid'] 

    -

    26 return _title 

    -

    27 

    -

    28 

    -

    29class DefaultOptions: 

    -

    30 

    -

    31 @staticmethod 

    -

    32 def render_options(embedded_obj: dict, metadata: Metadata) -> str: 

    -

    33 if metadata.style_type.value == 'block': 

    -

    34 return '<div><p>' + _title_or_uid(embedded_obj) \ 

    -

    35 + '</p><div><p>Content type: <span>' + embedded_obj['_content_type_uid'] \ 

    -

    36 + '</span></p></div>' 

    -

    37 if metadata.style_type.value == 'inline': 

    -

    38 return '<span>' + _title_or_uid(embedded_obj) + '</span>' 

    -

    39 if metadata.style_type.value == 'link': 

    -

    40 return '<a href=' + embedded_obj['url'] + '>' + _title_or_uid(embedded_obj) + '</a>' 

    -

    41 if metadata.style_type.value == 'display': 

    -

    42 return '<img src=' + embedded_obj['url'] + ' alt=' \ 

    -

    43 + _asset_title_or_uid(embedded_obj) + '/>' 

    -

    44 if metadata.style_type.value == 'doanloadable': 

    -

    45 return '<a href=' + embedded_obj['url'] + '>' + _asset_title_or_uid(embedded_obj) + '</a>' 

    -

    46 return '' 

    -
    - - - diff --git a/coverage/contentstack_utils_render_options_py.html b/coverage/contentstack_utils_render_options_py.html deleted file mode 100644 index 373035e..0000000 --- a/coverage/contentstack_utils_render_options_py.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - Coverage for contentstack_utils/render/options.py: 100% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1# pylint: disable=missing-function-docstring 

    -

    2# pylint: disable=missing-docstring 

    -

    3# pylint: disable=too-few-public-methods 

    -

    4from contentstack_utils.helper.metadata import Metadata 

    -

    5 

    -

    6 

    -

    7def _title_or_uid(embedded_obj: dict) -> str: 

    -

    8 _title = "" 

    -

    9 if embedded_obj is not None: 

    -

    10 if 'title' in embedded_obj and len(embedded_obj['title']) != 0: 

    -

    11 _title = embedded_obj['title'] 

    -

    12 elif 'uid' in embedded_obj: 

    -

    13 _title = embedded_obj['uid'] 

    -

    14 return _title 

    -

    15 

    -

    16 

    -

    17def _asset_title_or_uid(embedded_obj: dict) -> str: 

    -

    18 _title = "" 

    -

    19 if embedded_obj is not None: 

    -

    20 if 'title' in embedded_obj and len(embedded_obj['title']) != 0: 

    -

    21 _title = embedded_obj['title'] 

    -

    22 elif 'filename' in embedded_obj: 

    -

    23 _title = embedded_obj['filename'] 

    -

    24 elif 'uid' in embedded_obj: 

    -

    25 _title = embedded_obj['uid'] 

    -

    26 return _title 

    -

    27 

    -

    28 

    -

    29class Options: 

    -

    30 

    -

    31 @staticmethod 

    -

    32 def render_options(embedded_obj: dict, metadata: Metadata): 

    -

    33 if metadata.style_type.value == 'block': 

    -

    34 return '<div><p>' + _title_or_uid(embedded_obj) \ 

    -

    35 + '</p><div><p>Content type: <span>' + embedded_obj['_content_type_uid'] \ 

    -

    36 + '</span></p></div>' 

    -

    37 if metadata.style_type.value == 'inline': 

    -

    38 return '<span>' + _title_or_uid(embedded_obj) + '</span>' 

    -

    39 if metadata.style_type.value == 'link': 

    -

    40 return '<a href=' + embedded_obj['url'] + '>' + _title_or_uid(embedded_obj) + '</a>' 

    -

    41 if metadata.style_type.value == 'display': 

    -

    42 return '<img src=' + embedded_obj['url'] + ' alt=' \ 

    -

    43 + _asset_title_or_uid(embedded_obj) + '/>' 

    -

    44 if metadata.style_type.value == 'download': 

    -

    45 return '<a href=' + embedded_obj['url'] + '>' + _asset_title_or_uid(embedded_obj) + '</a>' 

    -

    46 

    -
    - - - diff --git a/coverage/contentstack_utils_utils_py.html b/coverage/contentstack_utils_utils_py.html deleted file mode 100644 index 6ddc432..0000000 --- a/coverage/contentstack_utils_utils_py.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - - Coverage for contentstack_utils/utils.py: 92% - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - r - m - x - p   toggle line displays -

    -

    - j - k   next/prev highlighted chunk -

    -

    - 0   (zero) top of page -

    -

    - 1   (one) first highlighted chunk -

    -
    -
    -
    -

    1# pylint: disable=missing-function-docstring 

    -

    2""" 

    -

    3Utils module helps to get access of public functions like: 

    -

    4 render 

    -

    5 render_content 

    -

    6 get_embedded_objects 

    -

    7 get_embedded_entry 

    -

    8""" 

    -

    9 

    -

    10import json 

    -

    11from lxml import etree 

    -

    12 

    -

    13from contentstack_utils.helper.metadata import Metadata 

    -

    14from contentstack_utils.render.options import Options 

    -

    15from contentstack_utils.helper.converter import convert_style 

    -

    16 

    -

    17 

    -

    18def _is_json(file): 

    -

    19 try: 

    -

    20 json.dumps(file) 

    -

    21 return True 

    -

    22 except ValueError: 

    -

    23 return False 

    -

    24 

    -

    25 

    -

    26def extract_keys(_embedded_items): 

    -

    27 available_keys: list = _embedded_items.keys() 

    -

    28 return available_keys 

    -

    29 

    -

    30 

    -

    31def find_embedded_entry(json_array: list, metadata: Metadata): 

    -

    32 for obj in json_array: 

    -

    33 if obj['uid'] == metadata.get_item_uid: 

    -

    34 return obj 

    -

    35 return None 

    -

    36 

    -

    37 

    -

    38def get_metadata(elements): 

    -

    39 for element in elements: 

    -

    40 content_type = None 

    -

    41 typeof = element.attrib['type'] 

    -

    42 if typeof == 'asset': 

    -

    43 uid = element.attrib['data-sys-asset-uid'] 

    -

    44 else: 

    -

    45 uid = element.attrib['data-sys-entry-uid'] 

    -

    46 content_type = element.attrib['data-sys-content-type-uid'] 

    -

    47 style = element.attrib['sys-style-type'] 

    -

    48 outer_html = etree.tostring(element).decode('utf-8') 

    -

    49 attributes = element.attrib 

    -

    50 style = convert_style(style) 

    -

    51 metadata = Metadata(element.text, typeof, uid, content_type, style, outer_html, attributes) 

    -

    52 return metadata 

    -

    53 

    -

    54 

    -

    55def get_html_doc(embedded_obj, metadata, callback, html_doc): 

    -

    56 if '_embedded_items' in embedded_obj: 

    -

    57 keys = extract_keys(embedded_obj['_embedded_items']) 

    -

    58 for key in keys: 

    -

    59 items_array = embedded_obj['_embedded_items'][key] 

    -

    60 item = find_embedded_entry(items_array, metadata) 

    -

    61 if item is not None: 

    -

    62 replaceable_str = callback.render_options(item, metadata) 

    -

    63 html_doc = html_doc.replace(metadata.outer_html, replaceable_str) 

    -

    64 break 

    -

    65 return html_doc 

    -

    66 

    -

    67 

    -

    68class Utils: 

    -

    69 """ 

    -

    70 render staticmethod, that accepts entry/entries, key path and render_object 

    -

    71 entry_obj: [list] or [dict] that contains list or dic object 

    -

    72 key_path: list of key_path 

    -

    73 Raises: 

    -

    74 FileNotFoundError: if file not found or invalid resource received 

    -

    75 """ 

    -

    76 

    -

    77 @staticmethod 

    -

    78 def render(entry_obj, key_path: list, option: Options): 

    -

    79 valid = _is_json(entry_obj) 

    -

    80 

    -

    81 if not valid: 

    -

    82 raise FileNotFoundError('Invalid file found') 

    -

    83 

    -

    84 if isinstance(entry_obj, list): 

    -

    85 for entry in entry_obj: 

    -

    86 Utils.render(entry, key_path, option) 

    -

    87 

    -

    88 if isinstance(entry_obj, dict): 

    -

    89 Utils._get_embedded_keys(entry_obj, key_path, option) 

    -

    90 

    -

    91 @staticmethod 

    -

    92 def _get_embedded_keys(entry, key_path, option: Options): 

    -

    93 

    -

    94 if '_embedded_items' in entry: 

    -

    95 if key_path is not None: 

    -

    96 for path in key_path: 

    -

    97 Utils._find_embed_keys(entry, path, option) 

    -

    98 else: 

    -

    99 _embedded_items = entry['_embedded_items'] 

    -

    100 available_keys: list = _embedded_items.keys() 

    -

    101 for path in available_keys: 

    -

    102 Utils._find_embed_keys(entry, path, option) 

    -

    103 

    -

    104 @staticmethod 

    -

    105 def _find_embed_keys(entry, path, option: Options): 

    -

    106 keys = path.split('.') 

    -

    107 Utils._get_content(keys, entry, option) 

    -

    108 

    -

    109 @staticmethod 

    -

    110 def _get_content(keys_array: list, entry, option: Options): 

    -

    111 if keys_array is not None and len(keys_array) > 0: 

    -

    112 key = keys_array[0] 

    -

    113 if len(keys_array) == 1 and keys_array[0] in entry: 

    -

    114 var_content = entry[key] 

    -

    115 if isinstance(var_content, (list, str)): 

    -

    116 entry[key] = Utils.render_content(var_content, entry, option) 

    -

    117 else: 

    -

    118 keys_array.remove(key) 

    -

    119 if key in entry and isinstance(entry[key], dict): 

    -

    120 Utils._get_content(keys_array, entry[key], option) 

    -

    121 elif key in entry and isinstance(entry[key], list): 

    -

    122 list_json = entry[key] 

    -

    123 for node in list_json: 

    -

    124 Utils._get_content(keys_array, node, option) 

    -

    125 

    -

    126 @staticmethod 

    -

    127 def render_content(rte_content, embed_obj: dict, callback: Options) -> object: 

    -

    128 if isinstance(rte_content, str): 

    -

    129 return get_embedded_objects(rte_content, embed_obj, callback) 

    -

    130 elif isinstance(rte_content, list): 

    -

    131 temp = [] 

    -

    132 for rte in rte_content: 

    -

    133 temp.append(Utils.render_content(rte, embed_obj, callback)) 

    -

    134 return temp 

    -

    135 return rte_content 

    -

    136 

    -

    137 

    -

    138def get_embedded_objects(html_doc, embedded_obj, callback): 

    -

    139 import re 

    -

    140 document = f"<items>{html_doc}</items>" 

    -

    141 tag = etree.fromstring(document) 

    -

    142 html_doc = etree.tostring(tag).decode('utf-8') 

    -

    143 html_doc = re.sub('(?ms)<%s[^>]*>(.*)</%s>' % (tag.tag, tag.tag), '\\1', html_doc) 

    -

    144 elements = tag.xpath("//*[contains(@class, 'embedded-asset') or contains(@class, 'embedded-entry')]") 

    -

    145 metadata = get_metadata(elements) 

    -

    146 return get_html_doc(embedded_obj, metadata, callback, html_doc) 

    -

    147 

    -

    148 # if '_embedded_items' in embedded_obj: 

    -

    149 # keys = extract_keys(embedded_obj['_embedded_items']) 

    -

    150 # for key in keys: 

    -

    151 # items_array = embedded_obj['_embedded_items'][key] 

    -

    152 # item = find_embedded_entry(items_array, metadata) 

    -

    153 # if item is not None: 

    -

    154 # replaceable_str = callback.render_options(item, metadata) 

    -

    155 # html_doc = html_doc.replace(metadata.outer_html, replaceable_str) 

    -

    156 # break 

    -

    157 # return html_doc 

    -

    158 

    -

    159 # for element in elements: 

    -

    160 # content_type = None 

    -

    161 # typeof = element.attrib['type'] 

    -

    162 # if typeof == 'asset': 

    -

    163 # uid = element.attrib['data-sys-asset-uid'] 

    -

    164 # else: 

    -

    165 # uid = element.attrib['data-sys-entry-uid'] 

    -

    166 # content_type = element.attrib['data-sys-content-type-uid'] 

    -

    167 # style = element.attrib['sys-style-type'] 

    -

    168 # outer_html = etree.tostring(element).decode('utf-8') 

    -

    169 # attributes = element.attrib 

    -

    170 # style = Utils.convert_style(style) 

    -

    171 # metadata = Metadata(element.text, typeof, uid, content_type, style, outer_html, attributes) 

    -
    - - - diff --git a/coverage/coverage_html.js b/coverage/coverage_html.js deleted file mode 100644 index 27b49b3..0000000 --- a/coverage/coverage_html.js +++ /dev/null @@ -1,616 +0,0 @@ -// Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0 -// For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt - -// Coverage.py HTML report browser code. -/*jslint browser: true, sloppy: true, vars: true, plusplus: true, maxerr: 50, indent: 4 */ -/*global coverage: true, document, window, $ */ - -coverage = {}; - -// Find all the elements with shortkey_* class, and use them to assign a shortcut key. -coverage.assign_shortkeys = function () { - $("*[class*='shortkey_']").each(function (i, e) { - $.each($(e).attr("class").split(" "), function (i, c) { - if (/^shortkey_/.test(c)) { - $(document).bind('keydown', c.substr(9), function () { - $(e).click(); - }); - } - }); - }); -}; - -// Create the events for the help panel. -coverage.wire_up_help_panel = function () { - $("#keyboard_icon").click(function () { - // Show the help panel, and position it so the keyboard icon in the - // panel is in the same place as the keyboard icon in the header. - $(".help_panel").show(); - var koff = $("#keyboard_icon").offset(); - var poff = $("#panel_icon").position(); - $(".help_panel").offset({ - top: koff.top-poff.top, - left: koff.left-poff.left - }); - }); - $("#panel_icon").click(function () { - $(".help_panel").hide(); - }); -}; - -// Create the events for the filter box. -coverage.wire_up_filter = function () { - // Cache elements. - var table = $("table.index"); - var table_rows = table.find("tbody tr"); - var table_row_names = table_rows.find("td.name a"); - var no_rows = $("#no_rows"); - - // Create a duplicate table footer that we can modify with dynamic summed values. - var table_footer = $("table.index tfoot tr"); - var table_dynamic_footer = table_footer.clone(); - table_dynamic_footer.attr('class', 'total_dynamic hidden'); - table_footer.after(table_dynamic_footer); - - // Observe filter keyevents. - $("#filter").on("keyup change", $.debounce(150, function (event) { - var filter_value = $(this).val(); - - if (filter_value === "") { - // Filter box is empty, remove all filtering. - table_rows.removeClass("hidden"); - - // Show standard footer, hide dynamic footer. - table_footer.removeClass("hidden"); - table_dynamic_footer.addClass("hidden"); - - // Hide placeholder, show table. - if (no_rows.length > 0) { - no_rows.hide(); - } - table.show(); - - } - else { - // Filter table items by value. - var hidden = 0; - var shown = 0; - - // Hide / show elements. - $.each(table_row_names, function () { - var element = $(this).parents("tr"); - - if ($(this).text().indexOf(filter_value) === -1) { - // hide - element.addClass("hidden"); - hidden++; - } - else { - // show - element.removeClass("hidden"); - shown++; - } - }); - - // Show placeholder if no rows will be displayed. - if (no_rows.length > 0) { - if (shown === 0) { - // Show placeholder, hide table. - no_rows.show(); - table.hide(); - } - else { - // Hide placeholder, show table. - no_rows.hide(); - table.show(); - } - } - - // Manage dynamic header: - if (hidden > 0) { - // Calculate new dynamic sum values based on visible rows. - for (var column = 2; column < 20; column++) { - // Calculate summed value. - var cells = table_rows.find('td:nth-child(' + column + ')'); - if (!cells.length) { - // No more columns...! - break; - } - - var sum = 0, numer = 0, denom = 0; - $.each(cells.filter(':visible'), function () { - var ratio = $(this).data("ratio"); - if (ratio) { - var splitted = ratio.split(" "); - numer += parseInt(splitted[0], 10); - denom += parseInt(splitted[1], 10); - } - else { - sum += parseInt(this.innerHTML, 10); - } - }); - - // Get footer cell element. - var footer_cell = table_dynamic_footer.find('td:nth-child(' + column + ')'); - - // Set value into dynamic footer cell element. - if (cells[0].innerHTML.indexOf('%') > -1) { - // Percentage columns use the numerator and denominator, - // and adapt to the number of decimal places. - var match = /\.([0-9]+)/.exec(cells[0].innerHTML); - var places = 0; - if (match) { - places = match[1].length; - } - var pct = numer * 100 / denom; - footer_cell.text(pct.toFixed(places) + '%'); - } - else { - footer_cell.text(sum); - } - } - - // Hide standard footer, show dynamic footer. - table_footer.addClass("hidden"); - table_dynamic_footer.removeClass("hidden"); - } - else { - // Show standard footer, hide dynamic footer. - table_footer.removeClass("hidden"); - table_dynamic_footer.addClass("hidden"); - } - } - })); - - // Trigger change event on setup, to force filter on page refresh - // (filter value may still be present). - $("#filter").trigger("change"); -}; - -// Loaded on index.html -coverage.index_ready = function ($) { - // Look for a localStorage item containing previous sort settings: - var sort_list = []; - var storage_name = "COVERAGE_INDEX_SORT"; - var stored_list = undefined; - try { - stored_list = localStorage.getItem(storage_name); - } catch(err) {} - - if (stored_list) { - sort_list = JSON.parse('[[' + stored_list + ']]'); - } - - // Create a new widget which exists only to save and restore - // the sort order: - $.tablesorter.addWidget({ - id: "persistentSort", - - // Format is called by the widget before displaying: - format: function (table) { - if (table.config.sortList.length === 0 && sort_list.length > 0) { - // This table hasn't been sorted before - we'll use - // our stored settings: - $(table).trigger('sorton', [sort_list]); - } - else { - // This is not the first load - something has - // already defined sorting so we'll just update - // our stored value to match: - sort_list = table.config.sortList; - } - } - }); - - // Configure our tablesorter to handle the variable number of - // columns produced depending on report options: - var headers = []; - var col_count = $("table.index > thead > tr > th").length; - - headers[0] = { sorter: 'text' }; - for (i = 1; i < col_count-1; i++) { - headers[i] = { sorter: 'digit' }; - } - headers[col_count-1] = { sorter: 'percent' }; - - // Enable the table sorter: - $("table.index").tablesorter({ - widgets: ['persistentSort'], - headers: headers - }); - - coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); - coverage.wire_up_filter(); - - // Watch for page unload events so we can save the final sort settings: - $(window).on("unload", function () { - try { - localStorage.setItem(storage_name, sort_list.toString()) - } catch(err) {} - }); -}; - -// -- pyfile stuff -- - -coverage.LINE_FILTERS_STORAGE = "COVERAGE_LINE_FILTERS"; - -coverage.pyfile_ready = function ($) { - // If we're directed to a particular line number, highlight the line. - var frag = location.hash; - if (frag.length > 2 && frag[1] === 't') { - $(frag).addClass('highlight'); - coverage.set_sel(parseInt(frag.substr(2), 10)); - } - else { - coverage.set_sel(0); - } - - $(document) - .bind('keydown', 'j', coverage.to_next_chunk_nicely) - .bind('keydown', 'k', coverage.to_prev_chunk_nicely) - .bind('keydown', '0', coverage.to_top) - .bind('keydown', '1', coverage.to_first_chunk) - ; - - $(".button_toggle_run").click(function (evt) {coverage.toggle_lines(evt.target, "run");}); - $(".button_toggle_exc").click(function (evt) {coverage.toggle_lines(evt.target, "exc");}); - $(".button_toggle_mis").click(function (evt) {coverage.toggle_lines(evt.target, "mis");}); - $(".button_toggle_par").click(function (evt) {coverage.toggle_lines(evt.target, "par");}); - - coverage.filters = undefined; - try { - coverage.filters = localStorage.getItem(coverage.LINE_FILTERS_STORAGE); - } catch(err) {} - - if (coverage.filters) { - coverage.filters = JSON.parse(coverage.filters); - } - else { - coverage.filters = {run: false, exc: true, mis: true, par: true}; - } - - for (cls in coverage.filters) { - coverage.set_line_visibilty(cls, coverage.filters[cls]); - } - - coverage.assign_shortkeys(); - coverage.wire_up_help_panel(); - - coverage.init_scroll_markers(); - - // Rebuild scroll markers when the window height changes. - $(window).resize(coverage.build_scroll_markers); -}; - -coverage.toggle_lines = function (btn, cls) { - var onoff = !$(btn).hasClass("show_" + cls); - coverage.set_line_visibilty(cls, onoff); - coverage.build_scroll_markers(); - coverage.filters[cls] = onoff; - try { - localStorage.setItem(coverage.LINE_FILTERS_STORAGE, JSON.stringify(coverage.filters)); - } catch(err) {} -}; - -coverage.set_line_visibilty = function (cls, onoff) { - var show = "show_" + cls; - var btn = $(".button_toggle_" + cls); - if (onoff) { - $("#source ." + cls).addClass(show); - btn.addClass(show); - } - else { - $("#source ." + cls).removeClass(show); - btn.removeClass(show); - } -}; - -// Return the nth line div. -coverage.line_elt = function (n) { - return $("#t" + n); -}; - -// Return the nth line number div. -coverage.num_elt = function (n) { - return $("#n" + n); -}; - -// Set the selection. b and e are line numbers. -coverage.set_sel = function (b, e) { - // The first line selected. - coverage.sel_begin = b; - // The next line not selected. - coverage.sel_end = (e === undefined) ? b+1 : e; -}; - -coverage.to_top = function () { - coverage.set_sel(0, 1); - coverage.scroll_window(0); -}; - -coverage.to_first_chunk = function () { - coverage.set_sel(0, 1); - coverage.to_next_chunk(); -}; - -// Return a string indicating what kind of chunk this line belongs to, -// or null if not a chunk. -coverage.chunk_indicator = function (line_elt) { - var klass = line_elt.attr('class'); - if (klass) { - var m = klass.match(/\bshow_\w+\b/); - if (m) { - return m[0]; - } - } - return null; -}; - -coverage.to_next_chunk = function () { - var c = coverage; - - // Find the start of the next colored chunk. - var probe = c.sel_end; - var chunk_indicator, probe_line; - while (true) { - probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - if (chunk_indicator) { - break; - } - probe++; - } - - // There's a next chunk, `probe` points to it. - var begin = probe; - - // Find the end of this chunk. - var next_indicator = chunk_indicator; - while (next_indicator === chunk_indicator) { - probe++; - probe_line = c.line_elt(probe); - next_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(begin, probe); - c.show_selection(); -}; - -coverage.to_prev_chunk = function () { - var c = coverage; - - // Find the end of the prev colored chunk. - var probe = c.sel_begin-1; - var probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - var chunk_indicator = c.chunk_indicator(probe_line); - while (probe > 0 && !chunk_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - return; - } - chunk_indicator = c.chunk_indicator(probe_line); - } - - // There's a prev chunk, `probe` points to its last line. - var end = probe+1; - - // Find the beginning of this chunk. - var prev_indicator = chunk_indicator; - while (prev_indicator === chunk_indicator) { - probe--; - probe_line = c.line_elt(probe); - prev_indicator = c.chunk_indicator(probe_line); - } - c.set_sel(probe+1, end); - c.show_selection(); -}; - -// Return the line number of the line nearest pixel position pos -coverage.line_at_pos = function (pos) { - var l1 = coverage.line_elt(1), - l2 = coverage.line_elt(2), - result; - if (l1.length && l2.length) { - var l1_top = l1.offset().top, - line_height = l2.offset().top - l1_top, - nlines = (pos - l1_top) / line_height; - if (nlines < 1) { - result = 1; - } - else { - result = Math.ceil(nlines); - } - } - else { - result = 1; - } - return result; -}; - -// Returns 0, 1, or 2: how many of the two ends of the selection are on -// the screen right now? -coverage.selection_ends_on_screen = function () { - if (coverage.sel_begin === 0) { - return 0; - } - - var top = coverage.line_elt(coverage.sel_begin); - var next = coverage.line_elt(coverage.sel_end-1); - - return ( - (top.isOnScreen() ? 1 : 0) + - (next.isOnScreen() ? 1 : 0) - ); -}; - -coverage.to_next_chunk_nicely = function () { - coverage.finish_scrolling(); - if (coverage.selection_ends_on_screen() === 0) { - // The selection is entirely off the screen: select the top line on - // the screen. - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop())); - } - coverage.to_next_chunk(); -}; - -coverage.to_prev_chunk_nicely = function () { - coverage.finish_scrolling(); - if (coverage.selection_ends_on_screen() === 0) { - var win = $(window); - coverage.select_line_or_chunk(coverage.line_at_pos(win.scrollTop() + win.height())); - } - coverage.to_prev_chunk(); -}; - -// Select line number lineno, or if it is in a colored chunk, select the -// entire chunk -coverage.select_line_or_chunk = function (lineno) { - var c = coverage; - var probe_line = c.line_elt(lineno); - if (probe_line.length === 0) { - return; - } - var the_indicator = c.chunk_indicator(probe_line); - if (the_indicator) { - // The line is in a highlighted chunk. - // Search backward for the first line. - var probe = lineno; - var indicator = the_indicator; - while (probe > 0 && indicator === the_indicator) { - probe--; - probe_line = c.line_elt(probe); - if (probe_line.length === 0) { - break; - } - indicator = c.chunk_indicator(probe_line); - } - var begin = probe + 1; - - // Search forward for the last line. - probe = lineno; - indicator = the_indicator; - while (indicator === the_indicator) { - probe++; - probe_line = c.line_elt(probe); - indicator = c.chunk_indicator(probe_line); - } - - coverage.set_sel(begin, probe); - } - else { - coverage.set_sel(lineno); - } -}; - -coverage.show_selection = function () { - var c = coverage; - - // Highlight the lines in the chunk - $(".linenos .highlight").removeClass("highlight"); - for (var probe = c.sel_begin; probe > 0 && probe < c.sel_end; probe++) { - c.num_elt(probe).addClass("highlight"); - } - - c.scroll_to_selection(); -}; - -coverage.scroll_to_selection = function () { - // Scroll the page if the chunk isn't fully visible. - if (coverage.selection_ends_on_screen() < 2) { - // Need to move the page. The html,body trick makes it scroll in all - // browsers, got it from http://stackoverflow.com/questions/3042651 - var top = coverage.line_elt(coverage.sel_begin); - var top_pos = parseInt(top.offset().top, 10); - coverage.scroll_window(top_pos - 30); - } -}; - -coverage.scroll_window = function (to_pos) { - $("html,body").animate({scrollTop: to_pos}, 200); -}; - -coverage.finish_scrolling = function () { - $("html,body").stop(true, true); -}; - -coverage.init_scroll_markers = function () { - var c = coverage; - // Init some variables - c.lines_len = $('#source p').length; - c.body_h = $('body').height(); - c.header_h = $('div#header').height(); - - // Build html - c.build_scroll_markers(); -}; - -coverage.build_scroll_markers = function () { - var c = coverage, - min_line_height = 3, - max_line_height = 10, - visible_window_h = $(window).height(); - - c.lines_to_mark = $('#source').find('p.show_run, p.show_mis, p.show_exc, p.show_exc, p.show_par'); - $('#scroll_marker').remove(); - // Don't build markers if the window has no scroll bar. - if (c.body_h <= visible_window_h) { - return; - } - - $("body").append("
     
    "); - var scroll_marker = $('#scroll_marker'), - marker_scale = scroll_marker.height() / c.body_h, - line_height = scroll_marker.height() / c.lines_len; - - // Line height must be between the extremes. - if (line_height > min_line_height) { - if (line_height > max_line_height) { - line_height = max_line_height; - } - } - else { - line_height = min_line_height; - } - - var previous_line = -99, - last_mark, - last_top, - offsets = {}; - - // Calculate line offsets outside loop to prevent relayouts - c.lines_to_mark.each(function() { - offsets[this.id] = $(this).offset().top; - }); - c.lines_to_mark.each(function () { - var id_name = $(this).attr('id'), - line_top = Math.round(offsets[id_name] * marker_scale), - line_number = parseInt(id_name.substring(1, id_name.length)); - - if (line_number === previous_line + 1) { - // If this solid missed block just make previous mark higher. - last_mark.css({ - 'height': line_top + line_height - last_top - }); - } - else { - // Add colored line in scroll_marker block. - scroll_marker.append('
    '); - last_mark = $('#m' + line_number); - last_mark.css({ - 'height': line_height, - 'top': line_top - }); - last_top = line_top; - } - - previous_line = line_number; - }); -}; diff --git a/coverage/favicon_32.png b/coverage/favicon_32.png deleted file mode 100644 index 8649f04..0000000 Binary files a/coverage/favicon_32.png and /dev/null differ diff --git a/coverage/index.html b/coverage/index.html deleted file mode 100644 index f8883f2..0000000 --- a/coverage/index.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - Coverage report - - - - - - - - - - - -
    - Hide keyboard shortcuts -

    Hot-keys on this page

    -
    -

    - n - s - m - x - c   change column sorting -

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Modulestatementsmissingexcludedcoverage
    Total20212094%
    contentstack_utils/__init__.py1200100%
    contentstack_utils/embedded/item_type.py400100%
    contentstack_utils/embedded/styletype.py700100%
    contentstack_utils/helper/converter.py124067%
    contentstack_utils/helper/metadata.py3100100%
    contentstack_utils/render/options.py3200100%
    contentstack_utils/utils.py1048092%
    -

    - No items found using the specified filter. -

    -
    - - - diff --git a/coverage/jquery.ba-throttle-debounce.min.js b/coverage/jquery.ba-throttle-debounce.min.js deleted file mode 100644 index 648fe5d..0000000 --- a/coverage/jquery.ba-throttle-debounce.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/* - * jQuery throttle / debounce - v1.1 - 3/7/2010 - * http://benalman.com/projects/jquery-throttle-debounce-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); diff --git a/coverage/jquery.hotkeys.js b/coverage/jquery.hotkeys.js deleted file mode 100644 index 09b21e0..0000000 --- a/coverage/jquery.hotkeys.js +++ /dev/null @@ -1,99 +0,0 @@ -/* - * jQuery Hotkeys Plugin - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * - * Based upon the plugin by Tzury Bar Yochay: - * http://github.com/tzuryby/hotkeys - * - * Original idea by: - * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ -*/ - -(function(jQuery){ - - jQuery.hotkeys = { - version: "0.8", - - specialKeys: { - 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", - 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", - 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", - 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", - 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", - 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", - 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" - }, - - shiftNums: { - "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", - "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", - ".": ">", "/": "?", "\\": "|" - } - }; - - function keyHandler( handleObj ) { - // Only care when a possible input has been specified - if ( typeof handleObj.data !== "string" ) { - return; - } - - var origHandler = handleObj.handler, - keys = handleObj.data.toLowerCase().split(" "); - - handleObj.handler = function( event ) { - // Don't fire in text-accepting inputs that we didn't directly bind to - if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || - event.target.type === "text") ) { - return; - } - - // Keypress represents characters, not special keys - var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], - character = String.fromCharCode( event.which ).toLowerCase(), - key, modif = "", possible = {}; - - // check combinations (alt|ctrl|shift+anything) - if ( event.altKey && special !== "alt" ) { - modif += "alt+"; - } - - if ( event.ctrlKey && special !== "ctrl" ) { - modif += "ctrl+"; - } - - // TODO: Need to make sure this works consistently across platforms - if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { - modif += "meta+"; - } - - if ( event.shiftKey && special !== "shift" ) { - modif += "shift+"; - } - - if ( special ) { - possible[ modif + special ] = true; - - } else { - possible[ modif + character ] = true; - possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; - - // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" - if ( modif === "shift+" ) { - possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; - } - } - - for ( var i = 0, l = keys.length; i < l; i++ ) { - if ( possible[ keys[i] ] ) { - return origHandler.apply( this, arguments ); - } - } - }; - } - - jQuery.each([ "keydown", "keyup", "keypress" ], function() { - jQuery.event.special[ this ] = { add: keyHandler }; - }); - -})( jQuery ); diff --git a/coverage/jquery.isonscreen.js b/coverage/jquery.isonscreen.js deleted file mode 100644 index 0182ebd..0000000 --- a/coverage/jquery.isonscreen.js +++ /dev/null @@ -1,53 +0,0 @@ -/* Copyright (c) 2010 - * @author Laurence Wheway - * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) - * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. - * - * @version 1.2.0 - */ -(function($) { - jQuery.extend({ - isOnScreen: function(box, container) { - //ensure numbers come in as intgers (not strings) and remove 'px' is it's there - for(var i in box){box[i] = parseFloat(box[i])}; - for(var i in container){container[i] = parseFloat(container[i])}; - - if(!container){ - container = { - left: $(window).scrollLeft(), - top: $(window).scrollTop(), - width: $(window).width(), - height: $(window).height() - } - } - - if( box.left+box.width-container.left > 0 && - box.left < container.width+container.left && - box.top+box.height-container.top > 0 && - box.top < container.height+container.top - ) return true; - return false; - } - }) - - - jQuery.fn.isOnScreen = function (container) { - for(var i in container){container[i] = parseFloat(container[i])}; - - if(!container){ - container = { - left: $(window).scrollLeft(), - top: $(window).scrollTop(), - width: $(window).width(), - height: $(window).height() - } - } - - if( $(this).offset().left+$(this).width()-container.left > 0 && - $(this).offset().left < container.width+container.left && - $(this).offset().top+$(this).height()-container.top > 0 && - $(this).offset().top < container.height+container.top - ) return true; - return false; - } -})(jQuery); diff --git a/coverage/jquery.min.js b/coverage/jquery.min.js deleted file mode 100644 index d1608e3..0000000 --- a/coverage/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; -if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
    a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:k.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("