-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscripts.ffae86470b6722cc54e2.bundle.js
1 lines (1 loc) · 19.7 KB
/
scripts.ffae86470b6722cc54e2.bundle.js
1
webpackJsonp([8],{4:function(t,e,n){t.exports=n("4xbP")},"4xbP":function(t,e,n){n("KF6U")(n("lBb1"))},KF6U:function(t,e){t.exports=function(t){"undefined"!=typeof execScript?execScript(t):eval.call(null,t)}},lBb1:function(t,e){t.exports="/*!\n * smooth-scroll v11.1.0: Animate scrolling to anchor links\n * (c) 2017 Chris Ferdinandi\n * GPL-3.0 License\n * http://github.com/cferdinandi/smooth-scroll\n */\n\n(function (root, factory) {\n\tif ( typeof define === 'function' && define.amd ) {\n\t\tdefine([], factory(root));\n\t} else if ( typeof exports === 'object' ) {\n\t\tmodule.exports = factory(root);\n\t} else {\n\t\troot.smoothScroll = factory(root);\n\t}\n})(typeof global !== 'undefined' ? global : this.window || this.global, (function (root) {\n\n\t'use strict';\n\n\t//\n\t// Variables\n\t//\n\n\tvar smoothScroll = {}; // Object for public APIs\n\tvar supports = 'querySelector' in document && 'addEventListener' in root; // Feature test\n\tvar settings, anchor, toggle, fixedHeader, headerHeight, eventTimeout, animationInterval;\n\n\t// Default settings\n\tvar defaults = {\n\t\t// Selectors\n\t\tselector: '[data-scroll]',\n\t\tignore: '[data-scroll-ignore]',\n\t\tselectorHeader: null,\n\n\t\t// Speed & Easing\n\t\tspeed: 500,\n\t\toffset: 0,\n\t\teasing: 'easeInOutCubic',\n\t\teasingPatterns: {},\n\n\t\t// Callback API\n\t\tbefore: function () {},\n\t\tafter: function () {}\n\t};\n\n\n\t//\n\t// Methods\n\t//\n\n\t/**\n\t * Merge two or more objects. Returns a new object.\n\t * @private\n\t * @param {Boolean} deep If true, do a deep (or recursive) merge [optional]\n\t * @param {Object} objects The objects to merge together\n\t * @returns {Object} Merged values of defaults and options\n\t */\n\tvar extend = function () {\n\n\t\t// Variables\n\t\tvar extended = {};\n\t\tvar deep = false;\n\t\tvar i = 0;\n\t\tvar length = arguments.length;\n\n\t\t// Check if a deep merge\n\t\tif ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {\n\t\t\tdeep = arguments[0];\n\t\t\ti++;\n\t\t}\n\n\t\t// Merge the object into the extended object\n\t\tvar merge = function (obj) {\n\t\t\tfor ( var prop in obj ) {\n\t\t\t\tif ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {\n\t\t\t\t\t// If deep merge and property is an object, merge properties\n\t\t\t\t\tif ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {\n\t\t\t\t\t\textended[prop] = extend( true, extended[prop], obj[prop] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\textended[prop] = obj[prop];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Loop through each object and conduct a merge\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tvar obj = arguments[i];\n\t\t\tmerge(obj);\n\t\t}\n\n\t\treturn extended;\n\n\t};\n\n\t/**\n\t * Get the height of an element.\n\t * @private\n\t * @param {Node} elem The element to get the height of\n\t * @return {Number} The element's height in pixels\n\t */\n\tvar getHeight = function ( elem ) {\n\t\treturn Math.max( elem.scrollHeight, elem.offsetHeight, elem.clientHeight );\n\t};\n\n\t/**\n\t * Get the closest matching element up the DOM tree.\n\t * @private\n\t * @param {Element} elem Starting element\n\t * @param {String} selector Selector to match against\n\t * @return {Boolean|Element} Returns null if not match found\n\t */\n\tvar getClosest = function ( elem, selector ) {\n\n\t\t// Element.matches() polyfill\n\t\tif (!Element.prototype.matches) {\n\t\t\tElement.prototype.matches =\n\t\t\t\tElement.prototype.matchesSelector ||\n\t\t\t\tElement.prototype.mozMatchesSelector ||\n\t\t\t\tElement.prototype.msMatchesSelector ||\n\t\t\t\tElement.prototype.oMatchesSelector ||\n\t\t\t\tElement.prototype.webkitMatchesSelector ||\n\t\t\t\tfunction(s) {\n\t\t\t\t\tvar matches = (this.document || this.ownerDocument).querySelectorAll(s),\n\t\t\t\t\t\ti = matches.length;\n\t\t\t\t\twhile (--i >= 0 && matches.item(i) !== this) {}\n\t\t\t\t\treturn i > -1;\n\t\t\t\t};\n\t\t}\n\n\t\t// Get closest match\n\t\tfor ( ; elem && elem !== document; elem = elem.parentNode ) {\n\t\t\tif ( elem.matches( selector ) ) return elem;\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\t/**\n\t * Escape special characters for use with querySelector\n\t * @private\n\t * @param {String} id The anchor ID to escape\n\t * @author Mathias Bynens\n\t * @link https://github.com/mathiasbynens/CSS.escape\n\t */\n\tvar escapeCharacters = function ( id ) {\n\n\t\t// Remove leading hash\n\t\tif ( id.charAt(0) === '#' ) {\n\t\t\tid = id.substr(1);\n\t\t}\n\n\t\tvar string = String(id);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then throw an\n\t\t\t// `InvalidCharacterError` exception and terminate these steps.\n\t\t\tif (codeUnit === 0x0000) {\n\t\t\t\tthrow new InvalidCharacterError(\n\t\t\t\t\t'Invalid character: the input contains U+0000.'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex === 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit === 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// http://dev.w3.org/csswg/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit === 0x002D ||\n\t\t\t\tcodeUnit === 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// http://dev.w3.org/csswg/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\n\t\treturn '#' + result;\n\n\t};\n\n\t/**\n\t * Calculate the easing pattern\n\t * @private\n\t * @link https://gist.github.com/gre/1650294\n\t * @param {String} type Easing pattern\n\t * @param {Number} time Time animation should take to complete\n\t * @returns {Number}\n\t */\n\tvar easingPattern = function ( settings, time ) {\n\t\tvar pattern;\n\n\t\t// Default Easing Patterns\n\t\tif ( settings.easing === 'easeInQuad' ) pattern = time * time; // accelerating from zero velocity\n\t\tif ( settings.easing === 'easeOutQuad' ) pattern = time * (2 - time); // decelerating to zero velocity\n\t\tif ( settings.easing === 'easeInOutQuad' ) pattern = time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time; // acceleration until halfway, then deceleration\n\t\tif ( settings.easing === 'easeInCubic' ) pattern = time * time * time; // accelerating from zero velocity\n\t\tif ( settings.easing === 'easeOutCubic' ) pattern = (--time) * time * time + 1; // decelerating to zero velocity\n\t\tif ( settings.easing === 'easeInOutCubic' ) pattern = time < 0.5 ? 4 * time * time * time : (time - 1) * (2 * time - 2) * (2 * time - 2) + 1; // acceleration until halfway, then deceleration\n\t\tif ( settings.easing === 'easeInQuart' ) pattern = time * time * time * time; // accelerating from zero velocity\n\t\tif ( settings.easing === 'easeOutQuart' ) pattern = 1 - (--time) * time * time * time; // decelerating to zero velocity\n\t\tif ( settings.easing === 'easeInOutQuart' ) pattern = time < 0.5 ? 8 * time * time * time * time : 1 - 8 * (--time) * time * time * time; // acceleration until halfway, then deceleration\n\t\tif ( settings.easing === 'easeInQuint' ) pattern = time * time * time * time * time; // accelerating from zero velocity\n\t\tif ( settings.easing === 'easeOutQuint' ) pattern = 1 + (--time) * time * time * time * time; // decelerating to zero velocity\n\t\tif ( settings.easing === 'easeInOutQuint' ) pattern = time < 0.5 ? 16 * time * time * time * time * time : 1 + 16 * (--time) * time * time * time * time; // acceleration until halfway, then deceleration\n\n\t\t// Custom Easing Patterns\n\t\tif ( settings.easingPatterns[settings.easing] ) {\n\t\t\tpattern = settings.easingPatterns[settings.easing]( time );\n\t\t}\n\n\t\treturn pattern || time; // no easing, no acceleration\n\t};\n\n\t/**\n\t * Calculate how far to scroll\n\t * @private\n\t * @param {Element} anchor The anchor element to scroll to\n\t * @param {Number} headerHeight Height of a fixed header, if any\n\t * @param {Number} offset Number of pixels by which to offset scroll\n\t * @returns {Number}\n\t */\n\tvar getEndLocation = function ( anchor, headerHeight, offset ) {\n\t\tvar location = 0;\n\t\tif (anchor.offsetParent) {\n\t\t\tdo {\n\t\t\t\tlocation += anchor.offsetTop;\n\t\t\t\tanchor = anchor.offsetParent;\n\t\t\t} while (anchor);\n\t\t}\n\t\tlocation = Math.max(location - headerHeight - offset, 0);\n\t\treturn Math.min(location, getDocumentHeight() - getViewportHeight());\n\t};\n\n\t/**\n\t * Determine the viewport's height\n\t * @private\n\t * @returns {Number}\n\t */\n\tvar getViewportHeight = function() {\n\t\treturn Math.max( document.documentElement.clientHeight, root.innerHeight || 0 );\n\t};\n\n\t/**\n\t * Determine the document's height\n\t * @private\n\t * @returns {Number}\n\t */\n\tvar getDocumentHeight = function () {\n\t\treturn Math.max(\n\t\t\tdocument.body.scrollHeight, document.documentElement.scrollHeight,\n\t\t\tdocument.body.offsetHeight, document.documentElement.offsetHeight,\n\t\t\tdocument.body.clientHeight, document.documentElement.clientHeight\n\t\t);\n\t};\n\n\t/**\n\t * Convert data-options attribute into an object of key/value pairs\n\t * @private\n\t * @param {String} options Link-specific options as a data attribute string\n\t * @returns {Object}\n\t */\n\tvar getDataOptions = function ( options ) {\n\t\treturn !options || !(typeof JSON === 'object' && typeof JSON.parse === 'function') ? {} : JSON.parse( options );\n\t};\n\n\t/**\n\t * Get the height of the fixed header\n\t * @private\n\t * @param {Node} header The header\n\t * @return {Number} The height of the header\n\t */\n\tvar getHeaderHeight = function ( header ) {\n\t\treturn !header ? 0 : ( getHeight( header ) + header.offsetTop );\n\t};\n\n\t/**\n\t * Bring the anchored element into focus\n\t * @private\n\t */\n\tvar adjustFocus = function ( anchor, endLocation, isNum ) {\n\n\t\t// Don't run if scrolling to a number on the page\n\t\tif ( isNum ) return;\n\n\t\t// Otherwise, bring anchor element into focus\n\t\tanchor.focus();\n\t\tif ( document.activeElement.id !== anchor.id ) {\n\t\t\tanchor.setAttribute( 'tabindex', '-1' );\n\t\t\tanchor.focus();\n\t\t\tanchor.style.outline = 'none';\n\t\t}\n\t\troot.scrollTo( 0 , endLocation );\n\n\t};\n\n\t/**\n\t * Start/stop the scrolling animation\n\t * @public\n\t * @param {Node|Number} anchor The element or position to scroll to\n\t * @param {Element} toggle The element that toggled the scroll event\n\t * @param {Object} options\n\t */\n\tsmoothScroll.animateScroll = function ( anchor, toggle, options ) {\n\n\t\t// Options and overrides\n\t\tvar overrides = getDataOptions( toggle ? toggle.getAttribute('data-options') : null );\n\t\tvar animateSettings = extend( settings || defaults, options || {}, overrides ); // Merge user options with defaults\n\n\t\t// Selectors and variables\n\t\tvar isNum = Object.prototype.toString.call( anchor ) === '[object Number]' ? true : false;\n\t\tvar anchorElem = isNum || !anchor.tagName ? null : anchor;\n\t\tif ( !isNum && !anchorElem ) return;\n\t\tvar startLocation = root.pageYOffset; // Current location on the page\n\t\tif ( animateSettings.selectorHeader && !fixedHeader ) {\n\t\t\t// Get the fixed header if not already set\n\t\t\tfixedHeader = document.querySelector( animateSettings.selectorHeader );\n\t\t}\n\t\tif ( !headerHeight ) {\n\t\t\t// Get the height of a fixed header if one exists and not already set\n\t\t\theaderHeight = getHeaderHeight( fixedHeader );\n\t\t}\n\t\tvar endLocation = isNum ? anchor : getEndLocation( anchorElem, headerHeight, parseInt((typeof animateSettings.offset === 'function' ? animateSettings.offset() : animateSettings.offset), 10) ); // Location to scroll to\n\t\tvar distance = endLocation - startLocation; // distance to travel\n\t\tvar documentHeight = getDocumentHeight();\n\t\tvar timeLapsed = 0;\n\t\tvar percentage, position;\n\n\t\t/**\n\t\t * Stop the scroll animation when it reaches its target (or the bottom/top of page)\n\t\t * @private\n\t\t * @param {Number} position Current position on the page\n\t\t * @param {Number} endLocation Scroll to location\n\t\t * @param {Number} animationInterval How much to scroll on this loop\n\t\t */\n\t\tvar stopAnimateScroll = function ( position, endLocation, animationInterval ) {\n\t\t\tvar currentLocation = root.pageYOffset;\n\t\t\tif ( position == endLocation || currentLocation == endLocation || ( (root.innerHeight + currentLocation) >= documentHeight ) ) {\n\n\t\t\t\t// Clear the animation timer\n\t\t\t\tclearInterval(animationInterval);\n\n\t\t\t\t// Bring the anchored element into focus\n\t\t\t\tadjustFocus( anchor, endLocation, isNum );\n\n\t\t\t\t// Run callback after animation complete\n\t\t\t\tanimateSettings.after( anchor, toggle );\n\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Loop scrolling animation\n\t\t * @private\n\t\t */\n\t\tvar loopAnimateScroll = function () {\n\t\t\ttimeLapsed += 16;\n\t\t\tpercentage = ( timeLapsed / parseInt(animateSettings.speed, 10) );\n\t\t\tpercentage = ( percentage > 1 ) ? 1 : percentage;\n\t\t\tposition = startLocation + ( distance * easingPattern(animateSettings, percentage) );\n\t\t\troot.scrollTo( 0, Math.floor(position) );\n\t\t\tstopAnimateScroll(position, endLocation, animationInterval);\n\t\t};\n\n\t\t/**\n\t\t * Set interval timer\n\t\t * @private\n\t\t */\n\t\tvar startAnimateScroll = function () {\n\t\t\tclearInterval(animationInterval);\n\t\t\tanimationInterval = setInterval(loopAnimateScroll, 16);\n\t\t};\n\n\t\t/**\n\t\t * Reset position to fix weird iOS bug\n\t\t * @link https://github.com/cferdinandi/smooth-scroll/issues/45\n\t\t */\n\t\tif ( root.pageYOffset === 0 ) {\n\t\t\troot.scrollTo( 0, 0 );\n\t\t}\n\n\t\t// Run callback before animation starts\n\t\tanimateSettings.before( anchor, toggle );\n\n\t\t// Start scrolling animation\n\t\tstartAnimateScroll();\n\n\t};\n\n\t/**\n\t * Handle has change event\n\t * @private\n\t */\n\tvar hashChangeHandler = function (event) {\n\n\t\t// Get hash from URL\n\t\tvar hash;\n\t\ttry {\n\t\t\thash = escapeCharacters( decodeURIComponent( root.location.hash ) );\n\t\t} catch(e) {\n\t\t\thash = escapeCharacters( root.location.hash );\n\t\t}\n\n\t\t// Only run if there's an anchor element to scroll to\n\t\tif ( !anchor ) return;\n\n\t\t// Reset the anchor element's ID\n\t\tanchor.id = anchor.getAttribute( 'data-scroll-id' );\n\n\t\t// Scroll to the anchored content\n\t\tsmoothScroll.animateScroll( anchor, toggle );\n\n\t\t// Reset anchor and toggle\n\t\tanchor = null;\n\t\ttoggle = null;\n\n\t};\n\n\t/**\n\t * If smooth scroll element clicked, animate scroll\n\t * @private\n\t */\n\tvar clickHandler = function (event) {\n\n\t\t// Don't run if right-click or command/control + click\n\t\tif ( event.button !== 0 || event.metaKey || event.ctrlKey ) return;\n\n\t\t// Check if a smooth scroll link was clicked\n\t\ttoggle = getClosest( event.target, settings.selector );\n\t\tif ( !toggle || toggle.tagName.toLowerCase() !== 'a' || getClosest( event.target, settings.ignore ) ) return;\n\n\t\t// Only run if link is an anchor and points to the current page\n\t\tif ( toggle.hostname !== root.location.hostname || toggle.pathname !== root.location.pathname || !/#/.test(toggle.href) ) return;\n\n\t\t// Get the sanitized hash\n\t\tvar hash;\n\t\ttry {\n\t\t\thash = escapeCharacters( decodeURIComponent( toggle.hash ) );\n\t\t} catch(e) {\n\t\t\thash = escapeCharacters( toggle.hash );\n\t\t}\n\n\t\t// If the hash is empty, scroll to the top of the page\n\t\tif ( hash === '#' ) {\n\n\t\t\t// Prevent default link behavior\n\t\t\tevent.preventDefault();\n\n\t\t\t// Set the anchored element\n\t\t\tanchor = document.body;\n\n\t\t\t// Save or create the ID as a data attribute and remove it (prevents scroll jump)\n\t\t\tvar id = anchor.id ? anchor.id : 'smooth-scroll-top';\n\t\t\tanchor.setAttribute( 'data-scroll-id', id );\n\t\t\tanchor.id = '';\n\n\t\t\t// If no hash change event will happen, fire manually\n\t\t\t// Otherwise, update the hash\n\t\t\tif ( root.location.hash.substring(1) === id ) {\n\t\t\t\thashChangeHandler();\n\t\t\t} else {\n\t\t\t\troot.location.hash = id;\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Get the anchored element\n\t\tanchor = document.querySelector( hash );\n\n\t\t// If anchored element exists, save the ID as a data attribute and remove it (prevents scroll jump)\n\t\tif ( !anchor ) return;\n\t\tanchor.setAttribute( 'data-scroll-id', anchor.id );\n\t\tanchor.id = '';\n\n\t\t// If no hash change event will happen, fire manually\n\t\tif ( toggle.hash === root.location.hash ) {\n\t\t\tevent.preventDefault();\n\t\t\thashChangeHandler();\n\t\t}\n\n\t};\n\n\t/**\n\t * On window scroll and resize, only run events at a rate of 15fps for better performance\n\t * @private\n\t * @param {Function} eventTimeout Timeout function\n\t * @param {Object} settings\n\t */\n\tvar resizeThrottler = function (event) {\n\t\tif ( !eventTimeout ) {\n\t\t\teventTimeout = setTimeout((function() {\n\t\t\t\teventTimeout = null; // Reset timeout\n\t\t\t\theaderHeight = getHeaderHeight( fixedHeader ); // Get the height of a fixed header if one exists\n\t\t\t}), 66);\n\t\t}\n\t};\n\n\t/**\n\t * Destroy the current initialization.\n\t * @public\n\t */\n\tsmoothScroll.destroy = function () {\n\n\t\t// If plugin isn't already initialized, stop\n\t\tif ( !settings ) return;\n\n\t\t// Remove event listeners\n\t\tdocument.removeEventListener( 'click', clickHandler, false );\n\t\troot.removeEventListener( 'resize', resizeThrottler, false );\n\n\t\t// Reset varaibles\n\t\tsettings = null;\n\t\tanchor = null;\n\t\ttoggle = null;\n\t\tfixedHeader = null;\n\t\theaderHeight = null;\n\t\teventTimeout = null;\n\t\tanimationInterval = null;\n\t};\n\n\t/**\n\t * Initialize Smooth Scroll\n\t * @public\n\t * @param {Object} options User settings\n\t */\n\tsmoothScroll.init = function ( options ) {\n\n\t\t// feature test\n\t\tif ( !supports ) return;\n\n\t\t// Destroy any existing initializations\n\t\tsmoothScroll.destroy();\n\n\t\t// Selectors and variables\n\t\tsettings = extend( defaults, options || {} ); // Merge user options with defaults\n\t\tfixedHeader = settings.selectorHeader ? document.querySelector( settings.selectorHeader ) : null; // Get the fixed header\n\t\theaderHeight = getHeaderHeight( fixedHeader );\n\n\t\t// When a toggle is clicked, run the click handler\n\t\tdocument.addEventListener( 'click', clickHandler, false );\n\n\t\t// Listen for hash changes\n\t\troot.addEventListener('hashchange', hashChangeHandler, false);\n\n\t\t// If window is resized and there's a fixed header, recalculate its size\n\t\tif ( fixedHeader ) {\n\t\t\troot.addEventListener( 'resize', resizeThrottler, false );\n\t\t}\n\n\t};\n\n\n\t//\n\t// Public APIs\n\t//\n\n\treturn smoothScroll;\n\n}));"}},[4]);