diff --git a/build-output/_multiple-bundles/readium-shared-js.js b/build-output/_multiple-bundles/readium-shared-js.js index 6cb0cd14c..3a2c72b54 100644 --- a/build-output/_multiple-bundles/readium-shared-js.js +++ b/build-output/_multiple-bundles/readium-shared-js.js @@ -1299,6 +1299,16 @@ var SpineItem = function(itemData, index, spine){ */ this.href = itemData.href; + /** + * The package level CFI of the spine item, i.e. the CFI path to the spine item + * element in the package document. + * + * @property cfi + * @type String + * @default None + */ + this.cfi = itemData.cfi; + /** * A flag indicating whether the spineItem has the attribute linear, which * is either yes or no. Default is yes. @@ -1822,7 +1832,7 @@ SpineItem.alternateSpread = function(spread) { // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/helpers',["./globals", 'underscore', "jquery", "jquerySizes", "./models/spine_item"], function(Globals, _, $, JQuerySizes, SpineItem) { +define('readium_shared_js/helpers',["./globals", 'underscore', "jquery", "jquerySizes", "./models/spine_item", 'URIjs'], function(Globals, _, $, JQuerySizes, SpineItem, URI) { (function() { @@ -1889,13 +1899,13 @@ Helpers.getEbookUrlFilePath = function(ebookURL) { }; /** - * + * @param initialQuery: (optional) initial query string * @returns object (map between URL query parameter names and corresponding decoded / unescaped values) */ -Helpers.getURLQueryParams = function() { +Helpers.getURLQueryParams = function(initialQuery) { var params = {}; - var query = window.location.search; + var query = initialQuery || window.location.search; if (query && query.length) { query = query.substring(1); var keyParams = query.split('&'); @@ -1913,57 +1923,64 @@ Helpers.getURLQueryParams = function() { /** - * @param urlpath: string corresponding a URL without query parameters (i.e. the part before the '?' question mark in index.html?param=value). If undefined/null, the default window.location is used. - * @param overrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) - * @returns a string corresponding to a URL obtained by concatenating the given URL with the given query parameters (and those already in window.location) + * @param initialUrl: string corresponding a URL. If undefined/null, the default window.location is used. + * @param queryStringOverrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) + * @returns string corresponding to a URL obtained by concatenating the given URL with the given query parameters */ -Helpers.buildUrlQueryParameters = function(urlpath, overrides) { - - if (!urlpath) { - urlpath = - window.location ? ( - window.location.protocol - + "//" - + window.location.hostname - + (window.location.port ? (':' + window.location.port) : '') - + window.location.pathname - ) : 'index.html'; - } +Helpers.buildUrlQueryParameters = function(initialUrl, queryStringOverrides) { + var uriInstance = new URI(initialUrl || window.location); + var startingQueryString = uriInstance.search(); + var urlFragment = uriInstance.hash(); + var urlPath = uriInstance.search('').hash('').toString(); - var paramsString = ""; - - for (var key in overrides) { - if (!overrides.hasOwnProperty(key)) continue; - - if (!overrides[key]) continue; - - var val = overrides[key].trim(); - if (!val) continue; - - console.debug("URL QUERY PARAM OVERRIDE: " + key + " = " + val); + var newQueryString = ""; + + for (var overrideKey in queryStringOverrides) { + if (!queryStringOverrides.hasOwnProperty(overrideKey)) continue; + + if (!queryStringOverrides[overrideKey]) continue; + + var overrideEntry = queryStringOverrides[overrideKey]; + if (_.isString(overrideEntry)) { + overrideEntry = overrideEntry.trim(); + } + + if (!overrideEntry) continue; + + if (overrideEntry.verbatim) { + overrideEntry = overrideEntry.value; // grab value from entry as object + } else { + overrideEntry = encodeURIComponent(overrideEntry); + } + + console.debug("URL QUERY PARAM OVERRIDE: " + overrideKey + " = " + overrideEntry); - paramsString += (key + "=" + encodeURIComponent(val)); - paramsString += "&"; + newQueryString += (overrideKey + "=" + overrideEntry); + newQueryString += "&"; } - - var urlParams = Helpers.getURLQueryParams(); - for (var key in urlParams) { - if (!urlParams.hasOwnProperty(key)) continue; - - if (!urlParams[key]) continue; - - if (overrides[key]) continue; - var val = urlParams[key].trim(); - if (!val) continue; - - console.debug("URL QUERY PARAM PRESERVED: " + key + " = " + val); - paramsString += (key + "=" + encodeURIComponent(val)); - paramsString += "&"; + var parsedQueryString = Helpers.getURLQueryParams(startingQueryString); + for (var parsedKey in parsedQueryString) { + if (!parsedQueryString.hasOwnProperty(parsedKey)) continue; + + if (!parsedQueryString[parsedKey]) continue; + + if (queryStringOverrides[parsedKey]) continue; + + var parsedValue = parsedQueryString[parsedKey].trim(); + if (!parsedValue) continue; + + console.debug("URL QUERY PARAM PRESERVED: " + parsedKey + " = " + parsedValue); + + newQueryString += (parsedKey + "=" + encodeURIComponent(parsedValue)); + newQueryString += "&"; } - - return urlpath + "?" + paramsString; + + // remove trailing "&" + newQueryString = newQueryString.slice(0, -1); + + return urlPath + "?" + newQueryString + urlFragment; }; @@ -7347,7 +7364,7 @@ var FixedView = function(options, reader){ // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/views/iframe_loader',["jquery", "underscore"], function($, _) { +define('readium_shared_js/views/iframe_loader',["jquery", "underscore", 'URIjs'], function($, _, URI) { /** * * @constructor @@ -7486,7 +7503,7 @@ return IFrameLoader; // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js'], function($, Helpers, epubCfi) { +define('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js', 'URIjs'], function($, Helpers, epubCfi, URI) { /** * * @param reader @@ -17652,16 +17669,31 @@ define('readium_shared_js/views/external_agent_support',["../globals", "undersco } } + function determineCanonicalLinkHref(contentWindow) { + // Only grab the href if there's no potential cross-domain violation + // and the reader application URL has a CFI value in a 'goto' query param. + var isSameDomain = Object.keys(contentWindow).indexOf('document') !== -1; + if (isSameDomain && contentWindow.location.search.match(/goto=.*cfi/i)) { + return contentWindow.location.href.split("#")[0]; + } + } + + function getContentDocumentCanonicalLink(contentDocument) { + var contentDocWindow = contentDocument.defaultView; + if (contentDocWindow && (contentDocWindow.parent|| contentDocWindow.top)) { + var parentWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.parent); + var topWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.top); + return topWindowCanonicalHref || parentWindowCanonicalHref; + } + } + function injectAppUrlAsCanonicalLink(contentDocument, spineItem) { if (contentDocument.defaultView && contentDocument.defaultView.parent) { - var parentWindow = contentDocument.defaultView.parent; - var isParentInSameDomain = Object.keys(parentWindow).indexOf('document') !== -1; - // Only do this if there's no potential cross-domain violation - // and the reader application URL has a CFI value in a 'goto' query param. - if (isParentInSameDomain && parentWindow.location.search.match(/goto=.*cfi/i)) { + var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument); + if (canonicalLinkHref) { var link = contentDocument.createElement('link'); link.setAttribute('rel', 'canonical'); - link.setAttribute('href', parentWindow.location.href); + link.setAttribute('href', canonicalLinkHref); contentDocument.head.appendChild(link); contentDocumentStates[spineItem.idref].canonicalLinkElement = link; } @@ -17737,13 +17769,10 @@ define('readium_shared_js/views/external_agent_support',["../globals", "undersco if (contentDocument && state) { - if (state.canonicalLinkElement && - contentDocument.defaultView && - contentDocument.defaultView.parent) { - var parentWindow = contentDocument.defaultView.parent; - var isParentInDifferentDomain = 'document' in Object.keys(parentWindow); - if (!isParentInDifferentDomain) { - state.canonicalLinkElement.setAttribute('href', parentWindow.location.href); + if (state.canonicalLinkElement) { + var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument); + if (canonicalLinkHref) { + state.canonicalLinkElement.setAttribute('href', canonicalLinkHref); } } diff --git a/build-output/_multiple-bundles/readium-shared-js.js.map b/build-output/_multiple-bundles/readium-shared-js.js.map index 3a2298a62..0f046ab25 100644 --- a/build-output/_multiple-bundles/readium-shared-js.js.map +++ b/build-output/_multiple-bundles/readium-shared-js.js.map @@ -42,7 +42,7 @@ "../../../../../../../../../module-insertRequire.js" ], "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7uDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9nCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC33BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACz7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/wDA;AACA;AACA,ACFA;AACA;AACA", + "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChkCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7uDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9nCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC33BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACz7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/wDA;AACA;AACA,ACFA;AACA;AACA", "file": "readium-shared-js.js", "sourcesContent": [ "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/globals',['jquery','eventEmitter'], function($, EventEmitter) {\n \n var DEBUG = false;\n \n/**\n * Top level ReadiumSDK namespace\n * @namespace\n */\nvar Globals = {\n\n /**\n * Current version of the JS SDK\n * @static\n * @return {string} version\n */\n version: function () {\n return \"0.8.0\";\n },\n /**\n * @namespace\n */\n Views: {\n /**\n * Landscape Orientation\n */\n ORIENTATION_LANDSCAPE: \"orientation_landscape\",\n /**\n * Portrait Orientation\n */\n ORIENTATION_PORTRAIT: \"orientation_portrait\"\n },\n /**\n * @namespace\n */\n Events: {\n /**\n * @event\n */\n READER_INITIALIZED: \"ReaderInitialized\",\n /**\n * This gets triggered on every page turnover. It includes spine information and such.\n * @event\n */\n PAGINATION_CHANGED: \"PaginationChanged\",\n /**\n * @event\n */\n SETTINGS_APPLIED: \"SettingsApplied\",\n /**\n * @event\n */\n FXL_VIEW_RESIZED: \"FXLViewResized\",\n /**\n * @event\n */\n READER_VIEW_CREATED: \"ReaderViewCreated\",\n /**\n * @event\n */\n READER_VIEW_DESTROYED: \"ReaderViewDestroyed\",\n /**\n * @event\n */\n CONTENT_DOCUMENT_LOAD_START: \"ContentDocumentLoadStart\",\n /**\n * @event\n */\n CONTENT_DOCUMENT_LOADED: \"ContentDocumentLoaded\",\n /**\n * @event\n */\n CONTENT_DOCUMENT_UNLOADED: \"ContentDocumentUnloaded\",\n /**\n * @event\n */\n MEDIA_OVERLAY_STATUS_CHANGED: \"MediaOverlayStatusChanged\",\n /**\n * @event\n */\n MEDIA_OVERLAY_TTS_SPEAK: \"MediaOverlayTTSSpeak\",\n /**\n * @event\n */\n MEDIA_OVERLAY_TTS_STOP: \"MediaOverlayTTSStop\",\n /**\n * @event\n */\n PLUGINS_LOADED: \"PluginsLoaded\"\n },\n /**\n * Internal Events\n *\n * @desc Should not be triggered outside of {@link Views.ReaderView}.\n * @namespace\n */\n InternalEvents: {\n /**\n * @event\n */\n CURRENT_VIEW_PAGINATION_CHANGED: \"CurrentViewPaginationChanged\",\n },\n \n logEvent: function(eventName, eventType, eventSource) {\n if (DEBUG) {\n console.debug(\"#### ReadiumSDK.Events.\" + eventName + \" - \"+eventType+\" - \" + eventSource);\n }\n }\n};\n$.extend(Globals, new EventEmitter());\n\nreturn Globals;\n\n});\n\n//This is default implementation of reading system object that will be available for the publication's javascript to analyze at runtime\n//To extend/modify/replace this object reading system should subscribe Globals.Events.READER_INITIALIZED and apply changes in reaction to this event\nnavigator.epubReadingSystem = {\n name: \"\",\n version: \"0.0.0\",\n layoutStyle: \"paginated\",\n\n hasFeature: function (feature, version) {\n\n // for now all features must be version 1.0 so fail fast if the user has asked for something else\n if (version && version !== \"1.0\") {\n return false;\n }\n\n if (feature === \"dom-manipulation\") {\n // Scripts may make structural changes to the document???s DOM (applies to spine-level scripting only).\n return true;\n }\n if (feature === \"layout-changes\") {\n // Scripts may modify attributes and CSS styles that affect content layout (applies to spine-level scripting only).\n return true;\n }\n if (feature === \"touch-events\") {\n // The device supports touch events and the Reading System passes touch events to the content.\n return false;\n }\n if (feature === \"mouse-events\") {\n // The device supports mouse events and the Reading System passes mouse events to the content.\n return true;\n }\n if (feature === \"keyboard-events\") {\n // The device supports keyboard events and the Reading System passes keyboard events to the content.\n return true;\n }\n\n if (feature === \"spine-scripting\") {\n //Spine-level scripting is supported.\n return true;\n }\n\n return false;\n }\n};\n", @@ -52,16 +52,16 @@ "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/bookmark_data',[],function() {\n/**\n * @class Models.BookmarkData\n */\nvar BookmarkData = function(idref, contentCFI) {\n\n var self = this;\n\n /**\n * spine item idref\n * @property idref\n * @type {string}\n */\n\n this.idref = idref;\n\n /**\n * cfi of the first visible element\n * @property contentCFI\n * @type {string}\n */\n \n this.contentCFI = contentCFI;\n\n /**\n * serialize to string\n * @return JSON string representation\n */\n \n this.toString = function(){\n return JSON.stringify(self);\n }\n\n};\n\n/**\n * Deserialize from string\n * @param str\n * @returns {ReadiumSDK.Models.BookmarkData}\n */\nBookmarkData.fromString = function(str) {\n var obj = JSON.parse(str);\n return new BookmarkData(obj.idref,obj.contentCFI);\n};\nreturn BookmarkData;\n});\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/current_pages_info',[],function() {\n\n/**\n * Used to report pagination state back to the host application\n *\n * @class Models.CurrentPagesInfo\n *\n * @constructor\n *\n * @param {Models.Spine} spine\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\n * @return CurrentPagesInfo\n*/\n\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\n\n\n /**\n * The reading direction\n *\n * @property isRightToLeft\n * @type bool\n */\n\n this.isRightToLeft = spine.isRightToLeft();\n \n /**\n * Is the ebook fixed layout or not?\n *\n * @property isFixedLayout\n * @type bool\n */\n\n this.isFixedLayout = isFixedLayout;\n \n /**\n * Counts the number of spine items\n *\n * @property spineItemCount\n * @type number\n */ \n\n this.spineItemCount = spine.items.length\n \n /**\n * returns an array of open pages, each array item is a data structure (plain JavaScript object) with the following fields: spineItemPageIndex, spineItemPageCount, idref, spineItemIndex (as per the parameters of the addOpenPage() function below)\n *\n * @property openPages\n * @type array\n */\n\n this.openPages = [];\n\n /**\n * Adds an page item to the openPages array\n *\n * @method addOpenPage\n * @param {number} spineItemPageIndex\n * @param {number} spineItemPageCount\n * @param {string} idref\n * @param {number} spineItemIndex \n */\n\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\n\n this.sort();\n };\n\n /**\n * Checks if navigation to the page on the left is possible (depending on page-progression-direction: previous page in LTR mode, next page in RTL mode)\n *\n * @method canGoLeft\n * @return bool true if turning to the left page is possible \n */\n\n this.canGoLeft = function () {\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\n };\n\n /**\n * Checks if navigation to the page on the right is possible (depending on page-progression-direction: next page in LTR mode, previous page in RTL mode)\n *\n * @method canGoRight\n * @return bool true if turning to the right page is possible \n */\n\n this.canGoRight = function () {\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\n };\n\n /**\n * Checks if navigation to the next page is possible (depending on page-progression-direction: right page in LTR mode, left page in RTL mode)\n *\n * @method canGoNext\n * @return bool true if turning to the next page is possible \n */\n\n this.canGoNext = function() {\n\n if(this.openPages.length == 0)\n return false;\n\n var lastOpenPage = this.openPages[this.openPages.length - 1];\n\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\n // See https://github.com/readium/readium-shared-js/issues/26\n\n // Removed, needs to be implemented properly as per above.\n // See https://github.com/readium/readium-shared-js/issues/108\n // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex))\n // return false;\n\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\n };\n\n /**\n * Checks if navigation to the previous page is possible (depending on page-progression-direction: left page in LTR mode, right page in RTL mode)\n *\n * @method canGoPrev\n * @return bool true if turning to the previous page is possible \n */\n\n this.canGoPrev = function() {\n\n if(this.openPages.length == 0)\n return false;\n\n var firstOpenPage = this.openPages[0];\n\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\n // See https://github.com/readium/readium-shared-js/issues/26\n\n // Removed, needs to be implemented properly as per above.\n // //https://github.com/readium/readium-shared-js/issues/108\n // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex))\n // return false;\n\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\n };\n\n /**\n * Sorts the openPages array based on spineItemIndex and spineItemPageIndex\n *\n * @method sort\n */\n\n this.sort = function() {\n\n this.openPages.sort(function(a, b) {\n\n if(a.spineItemIndex != b.spineItemIndex) {\n return a.spineItemIndex - b.spineItemIndex;\n }\n\n return a.spineItemPageIndex - b.spineItemPageIndex;\n\n });\n\n };\n\n};\n\nreturn CurrentPagesInfo;\n});\n", " // Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/fixed_page_spread',[],function() {\n/**\n * Spread the page \n *\n * @class Models.Spread\n * @constructor\n * @param spine \n * @param {Boolean} isSyntheticSpread \n *\n */\nvar Spread = function(spine, isSyntheticSpread) {\n\n var self = this;\n\n this.spine = spine;\n \n this.leftItem = undefined;\n this.rightItem = undefined;\n this.centerItem = undefined;\n\n var _isSyntheticSpread = isSyntheticSpread;\n\n /**\n * Sets whether or not this is a synthetic spread\n *\n * @method setSyntheticSpread\n * @param {Bool} isSyntheticSpread\n */\n\n this.setSyntheticSpread = function(isSyntheticSpread) {\n _isSyntheticSpread = isSyntheticSpread;\n };\n\n /**\n * Checks out if the spread is synthetic\n *\n * @method isSyntheticSpread\n * @return {Bool} true if this is a 2-page synthetic spread\n */\n\n this.isSyntheticSpread = function() {\n return _isSyntheticSpread;\n };\n\n /**\n * Opens the first spine item (FXL page)\n *\n * @method openFirst\n */\n\n this.openFirst = function() {\n\n if( this.spine.items.length == 0 ) {\n resetItems();\n }\n else {\n this.openItem(this.spine.first());\n }\n };\n\n /**\n * Opens the last spine item (FXL page)\n *\n * @method openLast\n */\n\n this.openLast = function() {\n\n if( this.spine.items.length == 0 ) {\n resetItems();\n }\n else {\n this.openItem(this.spine.last());\n }\n };\n\n /**\n * Opens a spine item (FXL page)\n *\n * @method openItem\n * @param {Models.SpineItem} item\n */\n\n this.openItem = function(item) {\n\n resetItems();\n\n var position = getItemPosition(item);\n setItemToPosition(item, position);\n\n if(position != Spread.POSITION_CENTER && this.spine.isValidLinearItem(item.index)) { // && item.isRenditionSpreadAllowed() not necessary, see getItemPosition() below\n var neighbour = getNeighbourItem(item);\n if(neighbour) {\n var neighbourPos = getItemPosition(neighbour);\n if(neighbourPos != position\n && neighbourPos != Spread.POSITION_CENTER\n && !neighbour.isReflowable()\n && neighbour.isRenditionSpreadAllowed()) {\n setItemToPosition(neighbour, neighbourPos);\n }\n }\n }\n };\n\n /**\n * Resets the spine items (FXL pages, left + right + center) to undefined\n *\n * @method resetItems\n */\n\n function resetItems() {\n\n self.leftItem = undefined;\n self.rightItem = undefined;\n self.centerItem = undefined;\n }\n\n /**\n * Sets the spine item (FXL page) to a position (left, right or center)\n *\n * @method setItemToPosition\n * @param {Models.SpineItem} item\n * @param {Spread.POSITION_CENTER | Spread.POSITION_LEFT | Spread.POSITION_RIGHT} position\n */\n\n function setItemToPosition(item, position) {\n\n if(position == Spread.POSITION_LEFT) {\n self.leftItem = item;\n }\n else if (position == Spread.POSITION_RIGHT) {\n self.rightItem = item;\n }\n else {\n\n if(position != Spread.POSITION_CENTER) {\n console.error(\"Unrecognized position value\");\n }\n\n self.centerItem = item;\n }\n }\n\n /**\n * Returns the position of a spine item / FXL page (left, center or right)\n *\n * @method getItemPosition\n * @param {Models.SpineItem} item\n * @return {Spread.POSITION_CENTER | Spread.POSITION_LEFT | Spread.POSITION_RIGHT}\n */\n\n function getItemPosition(item) {\n \n // includes !item.isRenditionSpreadAllowed() (\"rendition:spread-none\") ==> force center position\n if(!_isSyntheticSpread) {\n return Spread.POSITION_CENTER;\n }\n\n if(item.isLeftPage()) {\n return Spread.POSITION_LEFT;\n }\n\n if (item.isRightPage()) {\n return Spread.POSITION_RIGHT;\n }\n\n return Spread.POSITION_CENTER;\n }\n\n /**\n * Opens the next item\n *\n * @method openNext\n */ \n\n this.openNext = function() {\n\n var items = this.validItems();\n\n if(items.length == 0) {\n\n this.openFirst();\n }\n else {\n\n var nextItem = this.spine.nextItem(items[items.length - 1]);\n if(nextItem) {\n\n this.openItem(nextItem);\n }\n }\n };\n\n /**\n * Opens the previous item\n *\n * @method openPrev\n */ \n\n this.openPrev = function() {\n\n var items = this.validItems();\n\n if(items.length == 0) {\n this.openLast();\n }\n else {\n\n var prevItem = this.spine.prevItem(items[0]);\n if(prevItem) {\n\n this.openItem(prevItem);\n\n }\n }\n };\n\n /**\n * Returns an sorrted array of spine items (as per their order in the spine) that are currently in the FXL page layout\n *\n * @method validItems\n * @return {array} \n */ \n\n this.validItems = function() {\n\n var arr = [];\n\n if(this.leftItem) arr.push(this.leftItem);\n if(this.rightItem) arr.push(this.rightItem);\n if(this.centerItem) arr.push(this.centerItem);\n\n arr.sort(function(a, b) {\n return a.index - b.index;\n });\n\n return arr;\n };\n\n /**\n * Gets the neighbour spine item in the FXL page layout (on left or right of the current item)\n *\n * @method getNeighbourItem\n * @param {Models.SpineItem} item\n * @return {Models.SpineItem} item\n */ \n\n function getNeighbourItem(item) {\n\n if(item.isLeftPage()) {\n return self.spine.isRightToLeft() ? self.spine.prevItem(item) : self.spine.nextItem(item);\n }\n\n if(item.isRightPage()) {\n return self.spine.isRightToLeft() ? self.spine.nextItem(item) : self.spine.prevItem(item);\n }\n\n return undefined;\n }\n\n};\n\nSpread.POSITION_LEFT = \"left\";\nSpread.POSITION_RIGHT = \"right\";\nSpread.POSITION_CENTER = \"center\";\n\nreturn Spread;\n});\n", - "// Created by Boris Schneiderman.\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/spine_item',[], function() {\n\n/**\n * Wrapper of the SpineItem object received from the host application\n *\n * @class Models.SpineItem\n * @constructor\n * @param itemData container for spine item properties\n * @param {Number} index index of this spine item in the parent spine \n * @param {Models.Spine} spine parent spine\n *\n */\nvar SpineItem = function(itemData, index, spine){\n\n var self = this;\n\n /**\n * The idref of the spine item, i.e. the ID-based pointer to the actual \n * manifest item that the spine item references\n *\n * @property idref\n * @type String\n * @default None\n */\n this.idref = itemData.idref;\n\n /**\n * The href of the spine item, i.e. the URI to the resource in the EPUB\n * which the spineitem will render\n *\n * @property href\n * @type String\n * @default None\n */\n this.href = itemData.href;\n\n /**\n * A flag indicating whether the spineItem has the attribute linear, which \n * is either yes or no. Default is yes.\n *\n * @property linear\n * @type String\n * @default yes\n */\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\n\n /**\n * A variable indicating the type of synthetic spread for this specific\n * spine item, where page:spread-* can be left, right or center or auto\n *\n * @property page_spread\n * @type String\n * @default auto\n */\n this.page_spread = itemData.page_spread;\n \n /**\n * A string specifying the height and width from the rendition:viewport tag.\n * Note: This is deprecated in EPUB 3.1\n *\n * @property rendition_viewport\n * @type String\n * @default None\n */\n this.rendition_viewport = itemData.rendition_viewport;\n \n /**\n * A string specifying the type of synthetic spread for ALL spine items, where\n * where rendtion:spread-* can be left, right or center or auto\n *\n * @property rendition_spread\n * @type String\n * @default auto\n */\n this.rendition_spread = itemData.rendition_spread;\n\n /**\n * A string specifying desired orientation for ALL spine items. Possible values are\n * rendition-orientation-*, which can be none, landscape, portrait, both or auto\n *\n * Note: Not yet implemented.\n *\n * @property rendition_orientation\n * @type String\n * @default auto\n */\n this.rendition_orientation = itemData.rendition_orientation;\n\n /**\n * A string indicating the type of document layout, either prepaginated or reflowable\n *\n * @property rendition_layout\n * @type String\n * @default reflowable\n */\n this.rendition_layout = itemData.rendition_layout;\n \n /**\n * A string specifying how \"overflow\" content that exceeds the current viewport should\n * be laid out. Possible values are paginated, scrolled-continuous, scrolled-doc or auto\n *\n * @property rendition_flow\n * @type String\n * @default auto\n */\n this.rendition_flow = itemData.rendition_flow;\n \n /**\n * The ID, if any, of the root SMIL element of the media overlay for the document.\n *\n * @property media_overlay_id\n * @type String\n * @default None\n */\n this.media_overlay_id = itemData.media_overlay_id;\n\n /**\n * The mimetype of this specific spine item.\n *\n * @property media_type\n * @type String\n * @default None\n */\n this.media_type = itemData.media_type;\n\n /**\n * The index of this spine item in the parent spine .\n * \n * @property index\n * @type String\n * @default None\n */\n this.index = index;\n\n /**\n * The object which is the actual spine of which this spineItem is a child.\n *\n * @property spine\n * @type Models.Spine\n * @default None\n */\n this.spine = spine;\n\n validateSpread();\n\n /**\n * Sets a new page spread and checks its validity\n *\n * @method setSpread\n * @param {String} spread the new page spread \n */\n this.setSpread = function(spread) {\n this.page_spread = spread;\n\n validateSpread();\n };\n\n /* private method (validateSpread) */\n function validateSpread() {\n\n if(!self.page_spread) {\n return;\n }\n\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\n self.page_spread != SpineItem.SPREAD_RIGHT &&\n self.page_spread != SpineItem.SPREAD_CENTER ) {\n\n console.error(self.page_spread + \" is not a recognized spread type\");\n }\n };\n\n /**\n * Checks to see if the manifest has specified a spread property of \"none\"\n *\n * @method isRenditionSpreadAllowed\n * @return {Boolean} TRUE if spread=none has NOT been specified, else FALSE\n */\n this.isRenditionSpreadAllowed = function() {\n \n var rendition_spread = self.getRenditionSpread();\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_LEFT\n *\n * @method isLeftPage\n * @return {Boolean} \n */\n this.isLeftPage = function() {\n return self.page_spread == SpineItem.SPREAD_LEFT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_RIGHT\n *\n * @method isRightPage\n * @return {Boolean} \n */\n this.isRightPage = function() {\n return self.page_spread == SpineItem.SPREAD_RIGHT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_CENTER\n *\n * @method isCenterPage\n * @return {Boolean} \n */\n this.isCenterPage = function() {\n return self.page_spread == SpineItem.SPREAD_CENTER;\n };\n\n /**\n * Checks to see if the parent package of this spineIem is\n * reflowable\n *\n * @method isReflowable\n * @return {Boolean} \n */\n this.isReflowable = function() {\n return !self.isFixedLayout();\n };\n\n /**\n * Checks to see if the parent package of to this spineIem is\n * fixed layout\n *\n * @method isFixedLayout\n * @return {Boolean} \n */\n this.isFixedLayout = function() {\n \n // cannot use isPropertyValueSetForItemOrPackage() here!\n\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\n\n if(isLayoutExplicitlyDefined) {\n\n if (self.rendition_layout)\n {\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\n }\n\n return self.spine.package.isFixedLayout();\n }\n\n // if image or svg use fixed layout\n return self.media_type.indexOf(\"image/\") >= 0;\n };\n\n /**\n * Returns a string indicating the type of layout for viewport overflow, \n * i.e. scrolldoc, scroll-continuous, paginated or auto. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned\n *\n * @method getRenditionFlow\n * @return {String} \n */\n this.getRenditionFlow = function() {\n\n if(self.rendition_flow) {\n return self.rendition_flow;\n }\n\n return self.spine.package.rendition_flow;\n };\n \n /**\n * Returns the rendition:viewport, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n * Note that this attribute is deprecated in EPUB 3.1\n *\n * @method getRenditionViewport\n * @return {Boolean} \n */\n this.getRenditionViewport = function() {\n\n if(self.rendition_viewport) {\n return self.rendition_viewport;\n }\n\n return self.spine.package.rendition_viewport;\n };\n\n /**\n * Returns the rendition:spread, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionSpread\n * @return {Boolean} \n */\n this.getRenditionSpread = function() {\n\n if(self.rendition_spread) {\n return self.rendition_spread;\n }\n\n return self.spine.package.rendition_spread;\n };\n\n /**\n * Returns the rendition:orientation, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionOrientation\n * @return {Boolean} \n */\n this.getRenditionOrientation = function() {\n\n if(self.rendition_orientation) {\n return self.rendition_orientation;\n }\n\n return self.spine.package.rendition_orientation;\n };\n\n /**\n * Returns the rendition:layout, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionLayout\n * @return {String} \n */\n this.getRenditionLayout = function() {\n\n if(self.rendition_layout) {\n return self.rendition_layout;\n }\n\n return self.spine.package.rendition_layout;\n };\n\n /**\n * Checks to see if the specified property is set in this spineItem and\n * matches the supplied value. If the property is NOT set in the spineItem\n * then the the package is checked. If not set in either place then \n * the function returns FALSE.\n *\n * @method isPropertyValueSetForItemOrPackage\n * @param {String} propName The name of the property to be checked\n * @param {String} propValue The value of the property to be checked\n * @return {Boolean} \n */\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\n\n if(self[propName]) {\n return self[propName] === propValue;\n }\n\n if(self.spine.package[propName]) {\n return self.spine.package[propName] === propValue;\n }\n\n return false;\n }\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-continuous.\n *\n * @method isFlowScrolledContinuous\n * @return {Boolean} \n */\n this.isFlowScrolledContinuous = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\n };\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-doc.\n *\n * @method isFlowScrolledDoc\n * @return {Boolean} \n */\n this.isFlowScrolledDoc = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\n };\n};\n\n/** \n * @property RENDITION_LAYOUT_REFLOWABLE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\n\n/** \n * @property RENDITION_LAYOUT_PREPAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\n\n/** \n * @property RENDITION_ORIENTATION_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_ORIENTATION_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\n/** \n * @property RENDITION_ORIENTATION_AUTO\n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\n\n/** \n * @property SPREAD_LEFT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\n\n/** \n * @property SPREAD_RIGHT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\n\n/** \n * @property SPREAD_CENTER \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\n\n/** \n * @property RENDITION_SPREAD_NONE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\n\n/** \n * @property RENDITION_SPREAD_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_SPREAD_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\n\n/** \n * @property RENDITION_SPREAD_BOTH \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\n\n/** \n * @property RENDITION_SPREAD_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\n\n/** \n * @property RENDITION_FLOW_PAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_CONTINUOUS \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_DOC \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\n\n/** \n * @property RENDITION_FLOW_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\n\n/**\n * Returns the inversion of the spineItem's SPREAD property. i.e\n * if the page-spread is right it returns LEFT and vice versa. If \n * the spread is center then it returns CENTER\n *\n * @method alternateSpread\n * @return {String} \n */\nSpineItem.alternateSpread = function(spread) {\n\n if(spread === SpineItem.SPREAD_LEFT) {\n return SpineItem.SPREAD_RIGHT;\n }\n\n if(spread === SpineItem.SPREAD_RIGHT) {\n return SpineItem.SPREAD_LEFT;\n }\n\n return spread;\n\n};\n return SpineItem;\n});\n\n\n\n", - "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/helpers',[\"./globals\", 'underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\"], function(Globals, _, $, JQuerySizes, SpineItem) {\n \n(function()\n{\n/* jshint strict: true */\n/* jshint -W034 */\n \"use strict\";\n \n if(window.performance)\n {\n if (window.performance.now)\n {\n return;\n }\n \n var vendors = ['webkitNow', 'mozNow', 'msNow', 'oNow'];\n \n for (var i = 0; i < vendors.length; i++)\n {\n if (vendors[i] in window.performance)\n {\n window.performance.now = window.performance[vendors[i]];\n return;\n }\n }\n }\n else\n {\n window.performance = {};\n \n }\n \n if(Date.now)\n {\n window.performance.now = function()\n {\n return Date.now();\n };\n return;\n }\n \n window.performance.now = function()\n {\n return +(new Date());\n };\n})();\n\nvar Helpers = {};\n\n/**\n *\n * @param ebookURL URL string, or Blob (possibly File)\n * @returns string representing the file path / name from which the asset referenced by this URL originates\n */\nHelpers.getEbookUrlFilePath = function(ebookURL) {\n if (!window.Blob || !window.File) return ebookURL;\n\n if (ebookURL instanceof File) {\n return ebookURL.name;\n } else if (ebookURL instanceof Blob) {\n return \"readium-ebook.epub\";\n } else {\n return ebookURL;\n }\n};\n\n/**\n *\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\n */\nHelpers.getURLQueryParams = function() {\n var params = {};\n\n var query = window.location.search;\n if (query && query.length) {\n query = query.substring(1);\n var keyParams = query.split('&');\n for (var x = 0; x < keyParams.length; x++)\n {\n var keyVal = keyParams[x].split('=');\n if (keyVal.length > 1) {\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\n }\n }\n }\n\n return params;\n};\n\n\n/**\n * @param urlpath: string corresponding a URL without query parameters (i.e. the part before the '?' question mark in index.html?param=value). If undefined/null, the default window.location is used.\n * @param overrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) \n * @returns a string corresponding to a URL obtained by concatenating the given URL with the given query parameters (and those already in window.location)\n */\nHelpers.buildUrlQueryParameters = function(urlpath, overrides) {\n \n if (!urlpath) {\n urlpath =\n window.location ? (\n window.location.protocol\n + \"//\"\n + window.location.hostname\n + (window.location.port ? (':' + window.location.port) : '')\n + window.location.pathname\n ) : 'index.html';\n }\n\n var paramsString = \"\";\n \n for (var key in overrides) {\n if (!overrides.hasOwnProperty(key)) continue;\n \n if (!overrides[key]) continue;\n \n var val = overrides[key].trim();\n if (!val) continue;\n \n console.debug(\"URL QUERY PARAM OVERRIDE: \" + key + \" = \" + val);\n\n paramsString += (key + \"=\" + encodeURIComponent(val));\n paramsString += \"&\";\n }\n \n var urlParams = Helpers.getURLQueryParams();\n for (var key in urlParams) {\n if (!urlParams.hasOwnProperty(key)) continue;\n \n if (!urlParams[key]) continue;\n \n if (overrides[key]) continue;\n\n var val = urlParams[key].trim();\n if (!val) continue;\n \n console.debug(\"URL QUERY PARAM PRESERVED: \" + key + \" = \" + val);\n\n paramsString += (key + \"=\" + encodeURIComponent(val));\n paramsString += \"&\";\n }\n \n return urlpath + \"?\" + paramsString;\n};\n\n\n/**\n *\n * @param left\n * @param top\n * @param width\n * @param height\n * @constructor\n */\nHelpers.Rect = function (left, top, width, height) {\n\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n\n this.right = function () {\n return this.left + this.width;\n };\n\n this.bottom = function () {\n return this.top + this.height;\n };\n\n this.isOverlap = function (rect, tolerance) {\n\n if (tolerance == undefined) {\n tolerance = 0;\n }\n\n return !(rect.right() < this.left + tolerance ||\n rect.left > this.right() - tolerance ||\n rect.bottom() < this.top + tolerance ||\n rect.top > this.bottom() - tolerance);\n }\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\n// reflows between columns this is inconstant and difficult to analyze .\nHelpers.Rect.fromElement = function ($element) {\n\n var e;\n if (_.isArray($element) || $element instanceof jQuery)\n e = $element[0];\n else\n e = $element;\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\n if (e.nodeType === 3) {\n e = $element.parent()[0];\n }\n\n\n var offsetLeft = e.offsetLeft;\n var offsetTop = e.offsetTop;\n var offsetWidth = e.offsetWidth;\n var offsetHeight = e.offsetHeight;\n\n while (e = e.offsetParent) {\n offsetLeft += e.offsetLeft;\n offsetTop += e.offsetTop;\n }\n\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\n};\n/**\n *\n * @param $epubHtml: The html that is to have font attributes added.\n * @param fontSize: The font size that is to be added to the element at all locations.\n * @param fontObj: The font Object containing at minimum the URL, and fontFamilyName (In fields url and fontFamily) respectively. Pass in null's on the object's fields to signal no font.\n * @param callback: function invoked when \"done\", which means that if there are asynchronous operations such as font-face loading via injected stylesheets, then the UpdateHtmlFontAttributes() function returns immediately but the caller should wait for the callback function call if fully-loaded font-face *stylesheets* are required on the caller's side (note that the caller's side may still need to detect *actual font loading*, via the FontLoader API or some sort of ResizeSensor to indicate that the updated font-family has been used to render the document). \n */\n\nHelpers.UpdateHtmlFontAttributes = function ($epubHtml, fontSize, fontObj, callback) {\n\n\n var FONT_FAMILY_ID = \"readium_font_family_link\";\n\n var docHead = $(\"head\", $epubHtml);\n var link = $(\"#\" + FONT_FAMILY_ID, docHead);\n\n const NOTHING = 0, ADD = 1, REMOVE = 2; //Types for css font family.\n var changeFontFamily = NOTHING;\n\n var fontLoadCallback = function() {\n \n var perf = false;\n\n // TODO: very slow on Firefox!\n // See https://github.com/readium/readium-shared-js/issues/274\n if (perf) var time1 = window.performance.now();\n\n\n\n if (changeFontFamily != NOTHING) {\n var fontFamilyStyle = $(\"style#readium-fontFamily\", docHead);\n\n if (fontFamilyStyle && fontFamilyStyle[0]) {\n // REMOVE, or ADD (because we remove before re-adding from scratch)\n docHead[0].removeChild(fontFamilyStyle[0]);\n }\n if (changeFontFamily == ADD) {\n var style = $epubHtml[0].ownerDocument.createElement('style');\n style.setAttribute(\"id\", \"readium-fontFamily\");\n style.appendChild($epubHtml[0].ownerDocument.createTextNode('html * { font-family: \"'+fontObj.fontFamily+'\" !important; }')); // this technique works for text-align too (e.g. text-align: justify !important;)\n\n docHead[0].appendChild(style);\n\n //fontFamilyStyle = $(style);\n }\n }\n \n // The code below does not work because jQuery $element.css() on html.body somehow \"resets\" the font: CSS directive by removing it entirely (font-family: works with !important, but unfortunately further deep inside the DOM there may be CSS applied with the font: directive, which somehow seems to take precedence! ... as shown in Chrome's developer tools)\n // ...thus why we use the above routine instead, to insert a new head>style element\n // // var doc = $epubHtml[0].ownerDocument;\n // // var body = doc.body;\n // var $body = $(\"body\", $epubHtml);\n // // $body.css({\n // // \"font-size\" : fontSize + \"%\",\n // // \"font-family\" : \"\"\n // // });\n // $body.css(\"font-family\", \"\");\n // if (changeFontFamily == ADD) {\n \n // var existing = $body.attr(\"style\");\n // $body[0].setAttribute(\"style\",\n // existing + \" ; font-family: '\" + fontObj.fontFamily + \"' !important ;\" + \" ; font: regular 100% '\" + fontObj.fontFamily + \"' !important ;\");\n // }\n\n\n var factor = fontSize / 100;\n var win = $epubHtml[0].ownerDocument.defaultView;\n if (!win) {\n console.log(\"NIL $epubHtml[0].ownerDocument.defaultView\");\n return;\n }\n\n // TODO: is this a complete list? Is there a better way to do this?\n //https://github.com/readium/readium-shared-js/issues/336\n // Note that font-family is handled differently, using an injected stylesheet with a catch-all selector that pushes an \"!important\" CSS value in the document's cascade.\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre, dt, dd, code, a', $epubHtml); // excludes section, body etc.\n\n // need to do two passes because it is possible to have nested text blocks.\n // If you change the font size of the parent this will then create an inaccurate\n // font size for any children.\n for (var i = 0; i < $textblocks.length; i++) {\n\n var ele = $textblocks[i];\n \n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n if (fontSizeAttr) {\n // early exit, original values already set.\n break;\n }\n\n var style = win.getComputedStyle(ele);\n \n var originalFontSize = parseInt(style.fontSize);\n ele.setAttribute('data-original-font-size', originalFontSize);\n\n var originalLineHeight = parseInt(style.lineHeight);\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\n if (originalLineHeight) {\n ele.setAttribute('data-original-line-height', originalLineHeight);\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // if (!fontFamilyAttr) {\n // var originalFontFamily = style.fontFamily;\n // if (originalFontFamily) {\n // ele.setAttribute('data-original-font-family', originalFontFamily);\n // }\n // }\n }\n\n for (var i = 0; i < $textblocks.length; i++) {\n var ele = $textblocks[i];\n\n // TODO: group the 3x potential $(ele).css() calls below to avoid multiple jQuery style mutations \n\n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n var originalFontSize = Number(fontSizeAttr);\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\n\n var lineHeightAttr = ele.getAttribute('data-original-line-height');\n var originalLineHeight = lineHeightAttr ? Number(lineHeightAttr) : 0;\n if (originalLineHeight) {\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // switch(changeFontFamily){\n // case NOTHING:\n // break;\n // case ADD:\n // $(ele).css(\"font-family\", fontObj.fontFamily);\n // break;\n // case REMOVE:\n // $(ele).css(\"font-family\", fontFamilyAttr);\n // break;\n // }\n }\n\n $epubHtml.css(\"font-size\", fontSize + \"%\");\n\n \n \n if (perf) {\n var time2 = window.performance.now();\n \n // Firefox: 80+\n // Chrome: 4-10\n // Edge: 15-34\n // IE: 10-15\n // https://readium.firebase.com/?epub=..%2Fepub_content%2Faccessible_epub_3&goto=%7B%22idref%22%3A%22id-id2635343%22%2C%22elementCfi%22%3A%22%2F4%2F2%5Bbuilding_a_better_epub%5D%2F10%2F44%2F6%2C%2F1%3A334%2C%2F1%3A335%22%7D\n \n var diff = time2-time1;\n console.log(diff);\n \n // setTimeout(function(){\n // alert(diff);\n // }, 2000);\n }\n\n callback();\n };\n var fontLoadCallback_ = _.once(fontLoadCallback);\n\n if(fontObj.fontFamily && fontObj.url){\n var dataFontFamily = link.length ? link.attr(\"data-fontfamily\") : undefined;\n\n if(!link.length){\n changeFontFamily = ADD;\n\n setTimeout(function(){\n \n link = $(\"\", {\n \"id\" : FONT_FAMILY_ID,\n \"data-fontfamily\" : fontObj.fontFamily,\n \"rel\" : \"stylesheet\",\n \"type\" : \"text/css\"\n });\n docHead.append(link);\n \n link.attr({\n \"href\" : fontObj.url\n });\n }, 0);\n }\n else if(dataFontFamily != fontObj.fontFamily){\n changeFontFamily = ADD;\n \n link.attr({\n \"data-fontfamily\" : fontObj.fontFamily,\n \"href\" : fontObj.url\n });\n } else {\n changeFontFamily = NOTHING;\n }\n }\n else{\n changeFontFamily = REMOVE;\n if(link.length) link.remove();\n }\n\n if (changeFontFamily == ADD) {\n // just in case the link@onload does not trigger, we set a timeout\n setTimeout(function(){\n fontLoadCallback_();\n }, 100);\n }\n else { // REMOVE, NOTHING\n fontLoadCallback_();\n }\n};\n\n\n/**\n *\n * @param contentRef\n * @param sourceFileHref\n * @returns {string}\n * @constructor\n */\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\n\n if (!sourceFileHref) {\n return contentRef;\n }\n\n var sourceParts = sourceFileHref.split(\"/\");\n sourceParts.pop(); //remove source file name\n\n var pathComponents = contentRef.split(\"/\");\n\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\n\n sourceParts.pop();\n pathComponents.splice(0, 1);\n }\n\n var combined = sourceParts.concat(pathComponents);\n\n return combined.join(\"/\");\n\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.EndsWith = function (str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.BeginsWith = function (str, suffix) {\n\n return str.indexOf(suffix) === 0;\n};\n\n/**\n *\n * @param str\n * @param toRemove\n * @returns {string}\n * @static\n */\nHelpers.RemoveFromString = function (str, toRemove) {\n\n var startIx = str.indexOf(toRemove);\n\n if (startIx == -1) {\n return str;\n }\n\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\n};\n\n/**\n *\n * @param margin\n * @param border\n * @param padding\n * @constructor\n */\nHelpers.Margins = function (margin, border, padding) {\n\n this.margin = margin;\n this.border = border;\n this.padding = padding;\n\n this.left = this.margin.left + this.border.left + this.padding.left;\n this.right = this.margin.right + this.border.right + this.padding.right;\n this.top = this.margin.top + this.border.top + this.padding.top;\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\n\n this.width = function () {\n return this.left + this.right;\n };\n\n this.height = function () {\n return this.top + this.bottom;\n }\n};\n\n/**\n *\n * @param $iframe\n */\nHelpers.triggerLayout = function ($iframe) {\n\n var doc = $iframe[0].contentDocument;\n\n if (!doc) {\n return;\n }\n\n var ss = undefined;\n try {\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\n if (!ss) {\n var style = doc.createElement('style');\n doc.head.appendChild(style);\n style.appendChild(doc.createTextNode(''));\n ss = style.sheet;\n }\n\n if (ss) {\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\n if (ss.cssRules) {\n ss.insertRule(cssRule, ss.cssRules.length);\n } else {\n ss.insertRule(cssRule, 0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n try {\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\n el.appendChild(doc.createTextNode(\"*{}\"));\n doc.body.appendChild(el);\n doc.body.removeChild(el);\n\n if (ss) {\n if (ss.cssRules) {\n ss.deleteRule(ss.cssRules.length - 1);\n } else {\n ss.deleteRule(0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n if (doc.body) {\n var val = doc.body.offsetTop; // triggers layout\n }\n\n};\n\n/**\n *\n * @param $viewport\n * @param spineItem\n * @param settings\n * @returns {boolean}\n */\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\n// Returns falsy and truthy\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\n\n if (!$viewport || $viewport.length == 0) {\n return 0; // non-forced\n }\n\n //http://www.idpf.org/epub/fxl/#property-spread-values\n\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\n return false; // forced\n\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\n }\n\n if (settings.syntheticSpread == \"double\") {\n return true; // forced\n }\n else if (settings.syntheticSpread == \"single\") {\n return false; // forced\n }\n\n if (!spineItem) {\n return 0; // non-forced\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\n return true; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\n }\n\n var orientation = Helpers.getOrientation($viewport);\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\n }\n\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\n // if no spread set in document and user didn't set in in setting we will do double for landscape\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\n return landscape ? 1 : 0; // non-forced\n\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\n }\n\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\n return 0; // non-forced\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.fromElement = function ($element) {\n return new this($element.margin(), $element.border(), $element.padding());\n};\n\n/**\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.empty = function () {\n\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n });\n\n};\n\n/**\n *\n * @param name\n * @param params\n * @returns {Helpers.loadTemplate.cache}\n */\nHelpers.loadTemplate = function (name, params) {\n return Helpers.loadTemplate.cache[name];\n};\n\n/**\n *\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\n */\nHelpers.loadTemplate.cache = {\n \"fixed_book_frame\": '
',\n \"single_page_frame\": '
',\n //\"single_page_frame\" : '
',\n\n \"scrolled_book_frame\": '
',\n \"reflowable_book_frame\": '
',\n \"reflowable_book_page_frame\": '
'\n /***\n * The `enable-annotation` attribute on an iframe helps detect the content frames for annotating tools such as Hypothesis\n * See here for more details:\n * https://h.readthedocs.io/projects/client/en/latest/publishers/embedding/\n * https://github.com/hypothesis/client/pull/533\n ***/\n};\n\n/**\n *\n * @param styles\n * @param $element\n */\nHelpers.setStyles = function (styles, $element) {\n\n var count = styles.length;\n\n if (!count) {\n return;\n }\n\n var stylingGlobal = \"\";\n var stylings = [];\n var elementIsDocument = ($element && $element.createTextNode) ? true : false;\n\n for (var i = 0; i < count; i++) {\n var style = styles[i];\n\n if (elementIsDocument) {\n if (!style.selector || style.selector == \"\" || style.selector == \"html\" || style.selector == \"body\" || style.selector == \"*\") {\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n\n stylingGlobal += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n } else {\n //$(style.selector, $($element.doumentElement)).css(style.declarations);\n\n var cssProperties = \"\";\n\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n cssProperties += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n\n stylings.push({selector: style.selector, cssProps: cssProperties});\n }\n \n } else { // HTML element\n if (style.selector) {\n $(style.selector, $element).css(style.declarations);\n }\n else {\n $element.css(style.declarations);\n }\n }\n }\n\n if (elementIsDocument) { // HTML document\n\n var doc = $element;\n\n var bookStyleElement = $(\"style#readium-bookStyles\", doc.head);\n\n if (bookStyleElement && bookStyleElement[0]) {\n // we remove before re-adding from scratch\n doc.head.removeChild(bookStyleElement[0]);\n }\n \n var cssStylesheet = \"\";\n\n if (stylingGlobal.length > 0) {\n cssStylesheet += ' body, body::after, body::before, body *, body *::after, body *::before { ' + stylingGlobal + ' } ';\n }\n\n if (stylings.length > 0) {\n for (var i = 0; i < stylings.length; i++) {\n var styling = stylings[i];\n\n cssStylesheet += ' ' + styling.selector + ' { ' + styling.cssProps + ' } ';\n }\n }\n\n if (cssStylesheet.length > 0) {\n\n var styleElement = doc.createElement('style');\n styleElement.setAttribute(\"id\", \"readium-bookStyles\");\n styleElement.appendChild(doc.createTextNode(cssStylesheet));\n\n doc.head.appendChild(styleElement);\n\n //bookStyleElement = $(styleElement);\n }\n }\n};\n\n/**\n *\n * @param iframe\n * @returns {boolean}\n */\nHelpers.isIframeAlive = function (iframe) {\n var w = undefined;\n var d = undefined;\n try {\n w = iframe.contentWindow;\n d = iframe.contentDocument;\n }\n catch (ex) {\n console.error(ex);\n return false;\n }\n\n return w && d;\n};\n\n/**\n *\n * @param $viewport\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\n */\nHelpers.getOrientation = function ($viewport) {\n\n var viewportWidth = $viewport.width();\n var viewportHeight = $viewport.height();\n\n if (!viewportWidth || !viewportHeight) {\n return undefined;\n }\n\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\n};\n\n/**\n *\n * @param item\n * @param orientation\n * @returns {boolean}\n */\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\n\n var rendition_spread = item.getRenditionSpread();\n\n return !rendition_spread\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\n};\n\nHelpers.CSSTransition = function ($el, trans) {\n\n // does not work!\n //$el.css('transition', trans);\n\n var css = {};\n // empty '' prefix FIRST!\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\n css[prefix + 'transition'] = prefix + trans;\n });\n $el.css(css);\n}\n\n//scale, left, top, angle, origin\nHelpers.CSSTransformString = function (options) {\n var enable3D = options.enable3D ? true : false;\n\n var translate, scale, rotation,\n origin = options.origin;\n\n if (options.left || options.top) {\n var left = options.left || 0,\n top = options.top || 0;\n\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\n }\n if (options.scale) {\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\n }\n if (options.angle) {\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\n }\n\n if (!(translate || scale || rotation)) {\n return {};\n }\n\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\n if (rotation) {\n transformString = transformString + \" \" + rotation;\n //transformString = rotation + \" \" + transformString;\n }\n\n var css = {};\n css['transform'] = transformString;\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\n return css;\n};\n\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\n if (!tickRate) tickRate = 250;\n if (!waitThreshold) waitThreshold = tickRate;\n\n var first = true,\n last,\n deferTimer;\n\n return function () {\n var ctx = context || this,\n now = (Date.now && Date.now()) || new Date().getTime(),\n args = arguments;\n\n if (!(last && now < last + tickRate)) {\n last = now;\n if (first) {\n startCb.apply(ctx, args);\n first = false;\n } else {\n tickCb.apply(ctx, args);\n }\n }\n\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n first = true;\n endCb.apply(ctx, args);\n }, waitThreshold);\n };\n};\n\n\n//TODO: consider using CSSOM escape() or polyfill\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\n//http://mathiasbynens.be/notes/css-escapes\n/**\n *\n * @param sel\n * @returns {string}\n */\nHelpers.escapeJQuerySelector = function (sel) {\n //http://api.jquery.com/category/selectors/\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\n // double backslash escape\n\n if (!sel) return undefined;\n\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\n\n // if (selector !== sel)\n // {\n // console.debug(\"---- SELECTOR ESCAPED\");\n // console.debug(\"1: \" + sel);\n // console.debug(\"2: \" + selector);\n // }\n // else\n // {\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\n // }\n\n return selector;\n};\n\nHelpers.polyfillCaretRangeFromPoint = function(document) {\n //Derived from css-regions-polyfill:\n // https://github.com/FremyCompany/css-regions-polyfill/blob/bfbb6445ec2a2a883005ab8801d8463fa54b5701/src/range-extensions.js\n //Copyright (c) 2013 François REMY\n //Copyright (c) 2013 Adobe Systems Inc.\n //Licensed under the Apache License, Version 2.0\n if (!document.caretRangeFromPoint) {\n if (document.caretPositionFromPoint) {\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n var r = document.createRange();\n var p = document.caretPositionFromPoint(x, y);\n if (!p) return null;\n if (p.offsetNode) {\n r.setStart(p.offsetNode, p.offset);\n r.setEnd(p.offsetNode, p.offset);\n }\n return r;\n }\n } else if ((document.body || document.createElement('body')).createTextRange) {\n //\n // we may want to convert TextRange to Range\n //\n\n //TextRangeUtils, taken from: https://code.google.com/p/ierange/\n //Copyright (c) 2009 Tim Cameron Ryan\n //Released under the MIT/X License\n var TextRangeUtils = {\n convertToDOMRange: function(textRange, document) {\n var adoptBoundary = function(domRange, textRangeInner, bStart) {\n // iterate backwards through parent element to find anchor location\n var cursorNode = document.createElement('a'),\n cursor = textRangeInner.duplicate();\n cursor.collapse(bStart);\n var parent = cursor.parentElement();\n do {\n parent.insertBefore(cursorNode, cursorNode.previousSibling);\n cursor.moveToElementText(cursorNode);\n } while (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) > 0 && cursorNode.previousSibling);\n // when we exceed or meet the cursor, we've found the node\n if (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) == -1 && cursorNode.nextSibling) {\n // data node\n cursor.setEndPoint(bStart ? 'EndToStart' : 'EndToEnd', textRangeInner);\n domRange[bStart ? 'setStart' : 'setEnd'](cursorNode.nextSibling, cursor.text.length);\n } else {\n // element\n domRange[bStart ? 'setStartBefore' : 'setEndBefore'](cursorNode);\n }\n cursorNode.parentNode.removeChild(cursorNode);\n };\n // return a DOM range\n var domRange = document.createRange();\n adoptBoundary(domRange, textRange, true);\n adoptBoundary(domRange, textRange, false);\n return domRange;\n }\n };\n\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n // the accepted number of vertical backtracking, in CSS pixels\n var IYDepth = 40;\n // try to create a text range at the specified location\n var tr = document.body.createTextRange();\n for (var iy = IYDepth; iy; iy = iy - 4) {\n try {\n tr.moveToPoint(x, iy + y - IYDepth);\n return TextRangeUtils.convertToDOMRange(tr, document);\n } catch (ex) {\n }\n }\n // if that fails, return the location just after the element located there\n try {\n var elem = document.elementFromPoint(x - 1, y - 1);\n var r = document.createRange();\n r.setStartAfter(elem);\n return r;\n } catch (ex) {\n return null;\n }\n }\n }\n }\n};\n\nreturn Helpers;\n});\n\n", + "// Created by Boris Schneiderman.\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/spine_item',[], function() {\n\n/**\n * Wrapper of the SpineItem object received from the host application\n *\n * @class Models.SpineItem\n * @constructor\n * @param itemData container for spine item properties\n * @param {Number} index index of this spine item in the parent spine \n * @param {Models.Spine} spine parent spine\n *\n */\nvar SpineItem = function(itemData, index, spine){\n\n var self = this;\n\n /**\n * The idref of the spine item, i.e. the ID-based pointer to the actual \n * manifest item that the spine item references\n *\n * @property idref\n * @type String\n * @default None\n */\n this.idref = itemData.idref;\n\n /**\n * The href of the spine item, i.e. the URI to the resource in the EPUB\n * which the spineitem will render\n *\n * @property href\n * @type String\n * @default None\n */\n this.href = itemData.href;\n\n /**\n * The package level CFI of the spine item, i.e. the CFI path to the spine item\n * element in the package document.\n *\n * @property cfi\n * @type String\n * @default None\n */\n this.cfi = itemData.cfi;\n\n /**\n * A flag indicating whether the spineItem has the attribute linear, which \n * is either yes or no. Default is yes.\n *\n * @property linear\n * @type String\n * @default yes\n */\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\n\n /**\n * A variable indicating the type of synthetic spread for this specific\n * spine item, where page:spread-* can be left, right or center or auto\n *\n * @property page_spread\n * @type String\n * @default auto\n */\n this.page_spread = itemData.page_spread;\n \n /**\n * A string specifying the height and width from the rendition:viewport tag.\n * Note: This is deprecated in EPUB 3.1\n *\n * @property rendition_viewport\n * @type String\n * @default None\n */\n this.rendition_viewport = itemData.rendition_viewport;\n \n /**\n * A string specifying the type of synthetic spread for ALL spine items, where\n * where rendtion:spread-* can be left, right or center or auto\n *\n * @property rendition_spread\n * @type String\n * @default auto\n */\n this.rendition_spread = itemData.rendition_spread;\n\n /**\n * A string specifying desired orientation for ALL spine items. Possible values are\n * rendition-orientation-*, which can be none, landscape, portrait, both or auto\n *\n * Note: Not yet implemented.\n *\n * @property rendition_orientation\n * @type String\n * @default auto\n */\n this.rendition_orientation = itemData.rendition_orientation;\n\n /**\n * A string indicating the type of document layout, either prepaginated or reflowable\n *\n * @property rendition_layout\n * @type String\n * @default reflowable\n */\n this.rendition_layout = itemData.rendition_layout;\n \n /**\n * A string specifying how \"overflow\" content that exceeds the current viewport should\n * be laid out. Possible values are paginated, scrolled-continuous, scrolled-doc or auto\n *\n * @property rendition_flow\n * @type String\n * @default auto\n */\n this.rendition_flow = itemData.rendition_flow;\n \n /**\n * The ID, if any, of the root SMIL element of the media overlay for the document.\n *\n * @property media_overlay_id\n * @type String\n * @default None\n */\n this.media_overlay_id = itemData.media_overlay_id;\n\n /**\n * The mimetype of this specific spine item.\n *\n * @property media_type\n * @type String\n * @default None\n */\n this.media_type = itemData.media_type;\n\n /**\n * The index of this spine item in the parent spine .\n * \n * @property index\n * @type String\n * @default None\n */\n this.index = index;\n\n /**\n * The object which is the actual spine of which this spineItem is a child.\n *\n * @property spine\n * @type Models.Spine\n * @default None\n */\n this.spine = spine;\n\n validateSpread();\n\n /**\n * Sets a new page spread and checks its validity\n *\n * @method setSpread\n * @param {String} spread the new page spread \n */\n this.setSpread = function(spread) {\n this.page_spread = spread;\n\n validateSpread();\n };\n\n /* private method (validateSpread) */\n function validateSpread() {\n\n if(!self.page_spread) {\n return;\n }\n\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\n self.page_spread != SpineItem.SPREAD_RIGHT &&\n self.page_spread != SpineItem.SPREAD_CENTER ) {\n\n console.error(self.page_spread + \" is not a recognized spread type\");\n }\n };\n\n /**\n * Checks to see if the manifest has specified a spread property of \"none\"\n *\n * @method isRenditionSpreadAllowed\n * @return {Boolean} TRUE if spread=none has NOT been specified, else FALSE\n */\n this.isRenditionSpreadAllowed = function() {\n \n var rendition_spread = self.getRenditionSpread();\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_LEFT\n *\n * @method isLeftPage\n * @return {Boolean} \n */\n this.isLeftPage = function() {\n return self.page_spread == SpineItem.SPREAD_LEFT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_RIGHT\n *\n * @method isRightPage\n * @return {Boolean} \n */\n this.isRightPage = function() {\n return self.page_spread == SpineItem.SPREAD_RIGHT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_CENTER\n *\n * @method isCenterPage\n * @return {Boolean} \n */\n this.isCenterPage = function() {\n return self.page_spread == SpineItem.SPREAD_CENTER;\n };\n\n /**\n * Checks to see if the parent package of this spineIem is\n * reflowable\n *\n * @method isReflowable\n * @return {Boolean} \n */\n this.isReflowable = function() {\n return !self.isFixedLayout();\n };\n\n /**\n * Checks to see if the parent package of to this spineIem is\n * fixed layout\n *\n * @method isFixedLayout\n * @return {Boolean} \n */\n this.isFixedLayout = function() {\n \n // cannot use isPropertyValueSetForItemOrPackage() here!\n\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\n\n if(isLayoutExplicitlyDefined) {\n\n if (self.rendition_layout)\n {\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\n }\n\n return self.spine.package.isFixedLayout();\n }\n\n // if image or svg use fixed layout\n return self.media_type.indexOf(\"image/\") >= 0;\n };\n\n /**\n * Returns a string indicating the type of layout for viewport overflow, \n * i.e. scrolldoc, scroll-continuous, paginated or auto. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned\n *\n * @method getRenditionFlow\n * @return {String} \n */\n this.getRenditionFlow = function() {\n\n if(self.rendition_flow) {\n return self.rendition_flow;\n }\n\n return self.spine.package.rendition_flow;\n };\n \n /**\n * Returns the rendition:viewport, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n * Note that this attribute is deprecated in EPUB 3.1\n *\n * @method getRenditionViewport\n * @return {Boolean} \n */\n this.getRenditionViewport = function() {\n\n if(self.rendition_viewport) {\n return self.rendition_viewport;\n }\n\n return self.spine.package.rendition_viewport;\n };\n\n /**\n * Returns the rendition:spread, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionSpread\n * @return {Boolean} \n */\n this.getRenditionSpread = function() {\n\n if(self.rendition_spread) {\n return self.rendition_spread;\n }\n\n return self.spine.package.rendition_spread;\n };\n\n /**\n * Returns the rendition:orientation, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionOrientation\n * @return {Boolean} \n */\n this.getRenditionOrientation = function() {\n\n if(self.rendition_orientation) {\n return self.rendition_orientation;\n }\n\n return self.spine.package.rendition_orientation;\n };\n\n /**\n * Returns the rendition:layout, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionLayout\n * @return {String} \n */\n this.getRenditionLayout = function() {\n\n if(self.rendition_layout) {\n return self.rendition_layout;\n }\n\n return self.spine.package.rendition_layout;\n };\n\n /**\n * Checks to see if the specified property is set in this spineItem and\n * matches the supplied value. If the property is NOT set in the spineItem\n * then the the package is checked. If not set in either place then \n * the function returns FALSE.\n *\n * @method isPropertyValueSetForItemOrPackage\n * @param {String} propName The name of the property to be checked\n * @param {String} propValue The value of the property to be checked\n * @return {Boolean} \n */\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\n\n if(self[propName]) {\n return self[propName] === propValue;\n }\n\n if(self.spine.package[propName]) {\n return self.spine.package[propName] === propValue;\n }\n\n return false;\n }\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-continuous.\n *\n * @method isFlowScrolledContinuous\n * @return {Boolean} \n */\n this.isFlowScrolledContinuous = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\n };\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-doc.\n *\n * @method isFlowScrolledDoc\n * @return {Boolean} \n */\n this.isFlowScrolledDoc = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\n };\n};\n\n/** \n * @property RENDITION_LAYOUT_REFLOWABLE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\n\n/** \n * @property RENDITION_LAYOUT_PREPAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\n\n/** \n * @property RENDITION_ORIENTATION_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_ORIENTATION_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\n/** \n * @property RENDITION_ORIENTATION_AUTO\n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\n\n/** \n * @property SPREAD_LEFT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\n\n/** \n * @property SPREAD_RIGHT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\n\n/** \n * @property SPREAD_CENTER \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\n\n/** \n * @property RENDITION_SPREAD_NONE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\n\n/** \n * @property RENDITION_SPREAD_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_SPREAD_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\n\n/** \n * @property RENDITION_SPREAD_BOTH \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\n\n/** \n * @property RENDITION_SPREAD_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\n\n/** \n * @property RENDITION_FLOW_PAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_CONTINUOUS \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_DOC \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\n\n/** \n * @property RENDITION_FLOW_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\n\n/**\n * Returns the inversion of the spineItem's SPREAD property. i.e\n * if the page-spread is right it returns LEFT and vice versa. If \n * the spread is center then it returns CENTER\n *\n * @method alternateSpread\n * @return {String} \n */\nSpineItem.alternateSpread = function(spread) {\n\n if(spread === SpineItem.SPREAD_LEFT) {\n return SpineItem.SPREAD_RIGHT;\n }\n\n if(spread === SpineItem.SPREAD_RIGHT) {\n return SpineItem.SPREAD_LEFT;\n }\n\n return spread;\n\n};\n return SpineItem;\n});\n\n\n\n", + "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/helpers',[\"./globals\", 'underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", 'URIjs'], function(Globals, _, $, JQuerySizes, SpineItem, URI) {\n \n(function()\n{\n/* jshint strict: true */\n/* jshint -W034 */\n \"use strict\";\n \n if(window.performance)\n {\n if (window.performance.now)\n {\n return;\n }\n \n var vendors = ['webkitNow', 'mozNow', 'msNow', 'oNow'];\n \n for (var i = 0; i < vendors.length; i++)\n {\n if (vendors[i] in window.performance)\n {\n window.performance.now = window.performance[vendors[i]];\n return;\n }\n }\n }\n else\n {\n window.performance = {};\n \n }\n \n if(Date.now)\n {\n window.performance.now = function()\n {\n return Date.now();\n };\n return;\n }\n \n window.performance.now = function()\n {\n return +(new Date());\n };\n})();\n\nvar Helpers = {};\n\n/**\n *\n * @param ebookURL URL string, or Blob (possibly File)\n * @returns string representing the file path / name from which the asset referenced by this URL originates\n */\nHelpers.getEbookUrlFilePath = function(ebookURL) {\n if (!window.Blob || !window.File) return ebookURL;\n\n if (ebookURL instanceof File) {\n return ebookURL.name;\n } else if (ebookURL instanceof Blob) {\n return \"readium-ebook.epub\";\n } else {\n return ebookURL;\n }\n};\n\n/**\n * @param initialQuery: (optional) initial query string\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\n */\nHelpers.getURLQueryParams = function(initialQuery) {\n var params = {};\n\n var query = initialQuery || window.location.search;\n if (query && query.length) {\n query = query.substring(1);\n var keyParams = query.split('&');\n for (var x = 0; x < keyParams.length; x++)\n {\n var keyVal = keyParams[x].split('=');\n if (keyVal.length > 1) {\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\n }\n }\n }\n\n return params;\n};\n\n\n/**\n * @param initialUrl: string corresponding a URL. If undefined/null, the default window.location is used.\n * @param queryStringOverrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is)\n * @returns string corresponding to a URL obtained by concatenating the given URL with the given query parameters\n */\nHelpers.buildUrlQueryParameters = function(initialUrl, queryStringOverrides) {\n var uriInstance = new URI(initialUrl || window.location);\n var startingQueryString = uriInstance.search();\n var urlFragment = uriInstance.hash();\n var urlPath = uriInstance.search('').hash('').toString();\n\n var newQueryString = \"\";\n\n for (var overrideKey in queryStringOverrides) {\n if (!queryStringOverrides.hasOwnProperty(overrideKey)) continue;\n\n if (!queryStringOverrides[overrideKey]) continue;\n\n var overrideEntry = queryStringOverrides[overrideKey];\n if (_.isString(overrideEntry)) {\n overrideEntry = overrideEntry.trim();\n }\n\n if (!overrideEntry) continue;\n\n if (overrideEntry.verbatim) {\n overrideEntry = overrideEntry.value; // grab value from entry as object\n } else {\n overrideEntry = encodeURIComponent(overrideEntry);\n }\n\n console.debug(\"URL QUERY PARAM OVERRIDE: \" + overrideKey + \" = \" + overrideEntry);\n\n newQueryString += (overrideKey + \"=\" + overrideEntry);\n newQueryString += \"&\";\n }\n\n\n var parsedQueryString = Helpers.getURLQueryParams(startingQueryString);\n for (var parsedKey in parsedQueryString) {\n if (!parsedQueryString.hasOwnProperty(parsedKey)) continue;\n\n if (!parsedQueryString[parsedKey]) continue;\n\n if (queryStringOverrides[parsedKey]) continue;\n\n var parsedValue = parsedQueryString[parsedKey].trim();\n if (!parsedValue) continue;\n\n console.debug(\"URL QUERY PARAM PRESERVED: \" + parsedKey + \" = \" + parsedValue);\n\n newQueryString += (parsedKey + \"=\" + encodeURIComponent(parsedValue));\n newQueryString += \"&\";\n }\n\n // remove trailing \"&\"\n newQueryString = newQueryString.slice(0, -1);\n\n return urlPath + \"?\" + newQueryString + urlFragment;\n};\n\n\n/**\n *\n * @param left\n * @param top\n * @param width\n * @param height\n * @constructor\n */\nHelpers.Rect = function (left, top, width, height) {\n\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n\n this.right = function () {\n return this.left + this.width;\n };\n\n this.bottom = function () {\n return this.top + this.height;\n };\n\n this.isOverlap = function (rect, tolerance) {\n\n if (tolerance == undefined) {\n tolerance = 0;\n }\n\n return !(rect.right() < this.left + tolerance ||\n rect.left > this.right() - tolerance ||\n rect.bottom() < this.top + tolerance ||\n rect.top > this.bottom() - tolerance);\n }\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\n// reflows between columns this is inconstant and difficult to analyze .\nHelpers.Rect.fromElement = function ($element) {\n\n var e;\n if (_.isArray($element) || $element instanceof jQuery)\n e = $element[0];\n else\n e = $element;\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\n if (e.nodeType === 3) {\n e = $element.parent()[0];\n }\n\n\n var offsetLeft = e.offsetLeft;\n var offsetTop = e.offsetTop;\n var offsetWidth = e.offsetWidth;\n var offsetHeight = e.offsetHeight;\n\n while (e = e.offsetParent) {\n offsetLeft += e.offsetLeft;\n offsetTop += e.offsetTop;\n }\n\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\n};\n/**\n *\n * @param $epubHtml: The html that is to have font attributes added.\n * @param fontSize: The font size that is to be added to the element at all locations.\n * @param fontObj: The font Object containing at minimum the URL, and fontFamilyName (In fields url and fontFamily) respectively. Pass in null's on the object's fields to signal no font.\n * @param callback: function invoked when \"done\", which means that if there are asynchronous operations such as font-face loading via injected stylesheets, then the UpdateHtmlFontAttributes() function returns immediately but the caller should wait for the callback function call if fully-loaded font-face *stylesheets* are required on the caller's side (note that the caller's side may still need to detect *actual font loading*, via the FontLoader API or some sort of ResizeSensor to indicate that the updated font-family has been used to render the document). \n */\n\nHelpers.UpdateHtmlFontAttributes = function ($epubHtml, fontSize, fontObj, callback) {\n\n\n var FONT_FAMILY_ID = \"readium_font_family_link\";\n\n var docHead = $(\"head\", $epubHtml);\n var link = $(\"#\" + FONT_FAMILY_ID, docHead);\n\n const NOTHING = 0, ADD = 1, REMOVE = 2; //Types for css font family.\n var changeFontFamily = NOTHING;\n\n var fontLoadCallback = function() {\n \n var perf = false;\n\n // TODO: very slow on Firefox!\n // See https://github.com/readium/readium-shared-js/issues/274\n if (perf) var time1 = window.performance.now();\n\n\n\n if (changeFontFamily != NOTHING) {\n var fontFamilyStyle = $(\"style#readium-fontFamily\", docHead);\n\n if (fontFamilyStyle && fontFamilyStyle[0]) {\n // REMOVE, or ADD (because we remove before re-adding from scratch)\n docHead[0].removeChild(fontFamilyStyle[0]);\n }\n if (changeFontFamily == ADD) {\n var style = $epubHtml[0].ownerDocument.createElement('style');\n style.setAttribute(\"id\", \"readium-fontFamily\");\n style.appendChild($epubHtml[0].ownerDocument.createTextNode('html * { font-family: \"'+fontObj.fontFamily+'\" !important; }')); // this technique works for text-align too (e.g. text-align: justify !important;)\n\n docHead[0].appendChild(style);\n\n //fontFamilyStyle = $(style);\n }\n }\n \n // The code below does not work because jQuery $element.css() on html.body somehow \"resets\" the font: CSS directive by removing it entirely (font-family: works with !important, but unfortunately further deep inside the DOM there may be CSS applied with the font: directive, which somehow seems to take precedence! ... as shown in Chrome's developer tools)\n // ...thus why we use the above routine instead, to insert a new head>style element\n // // var doc = $epubHtml[0].ownerDocument;\n // // var body = doc.body;\n // var $body = $(\"body\", $epubHtml);\n // // $body.css({\n // // \"font-size\" : fontSize + \"%\",\n // // \"font-family\" : \"\"\n // // });\n // $body.css(\"font-family\", \"\");\n // if (changeFontFamily == ADD) {\n \n // var existing = $body.attr(\"style\");\n // $body[0].setAttribute(\"style\",\n // existing + \" ; font-family: '\" + fontObj.fontFamily + \"' !important ;\" + \" ; font: regular 100% '\" + fontObj.fontFamily + \"' !important ;\");\n // }\n\n\n var factor = fontSize / 100;\n var win = $epubHtml[0].ownerDocument.defaultView;\n if (!win) {\n console.log(\"NIL $epubHtml[0].ownerDocument.defaultView\");\n return;\n }\n\n // TODO: is this a complete list? Is there a better way to do this?\n //https://github.com/readium/readium-shared-js/issues/336\n // Note that font-family is handled differently, using an injected stylesheet with a catch-all selector that pushes an \"!important\" CSS value in the document's cascade.\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre, dt, dd, code, a', $epubHtml); // excludes section, body etc.\n\n // need to do two passes because it is possible to have nested text blocks.\n // If you change the font size of the parent this will then create an inaccurate\n // font size for any children.\n for (var i = 0; i < $textblocks.length; i++) {\n\n var ele = $textblocks[i];\n \n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n if (fontSizeAttr) {\n // early exit, original values already set.\n break;\n }\n\n var style = win.getComputedStyle(ele);\n \n var originalFontSize = parseInt(style.fontSize);\n ele.setAttribute('data-original-font-size', originalFontSize);\n\n var originalLineHeight = parseInt(style.lineHeight);\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\n if (originalLineHeight) {\n ele.setAttribute('data-original-line-height', originalLineHeight);\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // if (!fontFamilyAttr) {\n // var originalFontFamily = style.fontFamily;\n // if (originalFontFamily) {\n // ele.setAttribute('data-original-font-family', originalFontFamily);\n // }\n // }\n }\n\n for (var i = 0; i < $textblocks.length; i++) {\n var ele = $textblocks[i];\n\n // TODO: group the 3x potential $(ele).css() calls below to avoid multiple jQuery style mutations \n\n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n var originalFontSize = Number(fontSizeAttr);\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\n\n var lineHeightAttr = ele.getAttribute('data-original-line-height');\n var originalLineHeight = lineHeightAttr ? Number(lineHeightAttr) : 0;\n if (originalLineHeight) {\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // switch(changeFontFamily){\n // case NOTHING:\n // break;\n // case ADD:\n // $(ele).css(\"font-family\", fontObj.fontFamily);\n // break;\n // case REMOVE:\n // $(ele).css(\"font-family\", fontFamilyAttr);\n // break;\n // }\n }\n\n $epubHtml.css(\"font-size\", fontSize + \"%\");\n\n \n \n if (perf) {\n var time2 = window.performance.now();\n \n // Firefox: 80+\n // Chrome: 4-10\n // Edge: 15-34\n // IE: 10-15\n // https://readium.firebase.com/?epub=..%2Fepub_content%2Faccessible_epub_3&goto=%7B%22idref%22%3A%22id-id2635343%22%2C%22elementCfi%22%3A%22%2F4%2F2%5Bbuilding_a_better_epub%5D%2F10%2F44%2F6%2C%2F1%3A334%2C%2F1%3A335%22%7D\n \n var diff = time2-time1;\n console.log(diff);\n \n // setTimeout(function(){\n // alert(diff);\n // }, 2000);\n }\n\n callback();\n };\n var fontLoadCallback_ = _.once(fontLoadCallback);\n\n if(fontObj.fontFamily && fontObj.url){\n var dataFontFamily = link.length ? link.attr(\"data-fontfamily\") : undefined;\n\n if(!link.length){\n changeFontFamily = ADD;\n\n setTimeout(function(){\n \n link = $(\"\", {\n \"id\" : FONT_FAMILY_ID,\n \"data-fontfamily\" : fontObj.fontFamily,\n \"rel\" : \"stylesheet\",\n \"type\" : \"text/css\"\n });\n docHead.append(link);\n \n link.attr({\n \"href\" : fontObj.url\n });\n }, 0);\n }\n else if(dataFontFamily != fontObj.fontFamily){\n changeFontFamily = ADD;\n \n link.attr({\n \"data-fontfamily\" : fontObj.fontFamily,\n \"href\" : fontObj.url\n });\n } else {\n changeFontFamily = NOTHING;\n }\n }\n else{\n changeFontFamily = REMOVE;\n if(link.length) link.remove();\n }\n\n if (changeFontFamily == ADD) {\n // just in case the link@onload does not trigger, we set a timeout\n setTimeout(function(){\n fontLoadCallback_();\n }, 100);\n }\n else { // REMOVE, NOTHING\n fontLoadCallback_();\n }\n};\n\n\n/**\n *\n * @param contentRef\n * @param sourceFileHref\n * @returns {string}\n * @constructor\n */\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\n\n if (!sourceFileHref) {\n return contentRef;\n }\n\n var sourceParts = sourceFileHref.split(\"/\");\n sourceParts.pop(); //remove source file name\n\n var pathComponents = contentRef.split(\"/\");\n\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\n\n sourceParts.pop();\n pathComponents.splice(0, 1);\n }\n\n var combined = sourceParts.concat(pathComponents);\n\n return combined.join(\"/\");\n\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.EndsWith = function (str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.BeginsWith = function (str, suffix) {\n\n return str.indexOf(suffix) === 0;\n};\n\n/**\n *\n * @param str\n * @param toRemove\n * @returns {string}\n * @static\n */\nHelpers.RemoveFromString = function (str, toRemove) {\n\n var startIx = str.indexOf(toRemove);\n\n if (startIx == -1) {\n return str;\n }\n\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\n};\n\n/**\n *\n * @param margin\n * @param border\n * @param padding\n * @constructor\n */\nHelpers.Margins = function (margin, border, padding) {\n\n this.margin = margin;\n this.border = border;\n this.padding = padding;\n\n this.left = this.margin.left + this.border.left + this.padding.left;\n this.right = this.margin.right + this.border.right + this.padding.right;\n this.top = this.margin.top + this.border.top + this.padding.top;\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\n\n this.width = function () {\n return this.left + this.right;\n };\n\n this.height = function () {\n return this.top + this.bottom;\n }\n};\n\n/**\n *\n * @param $iframe\n */\nHelpers.triggerLayout = function ($iframe) {\n\n var doc = $iframe[0].contentDocument;\n\n if (!doc) {\n return;\n }\n\n var ss = undefined;\n try {\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\n if (!ss) {\n var style = doc.createElement('style');\n doc.head.appendChild(style);\n style.appendChild(doc.createTextNode(''));\n ss = style.sheet;\n }\n\n if (ss) {\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\n if (ss.cssRules) {\n ss.insertRule(cssRule, ss.cssRules.length);\n } else {\n ss.insertRule(cssRule, 0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n try {\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\n el.appendChild(doc.createTextNode(\"*{}\"));\n doc.body.appendChild(el);\n doc.body.removeChild(el);\n\n if (ss) {\n if (ss.cssRules) {\n ss.deleteRule(ss.cssRules.length - 1);\n } else {\n ss.deleteRule(0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n if (doc.body) {\n var val = doc.body.offsetTop; // triggers layout\n }\n\n};\n\n/**\n *\n * @param $viewport\n * @param spineItem\n * @param settings\n * @returns {boolean}\n */\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\n// Returns falsy and truthy\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\n\n if (!$viewport || $viewport.length == 0) {\n return 0; // non-forced\n }\n\n //http://www.idpf.org/epub/fxl/#property-spread-values\n\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\n return false; // forced\n\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\n }\n\n if (settings.syntheticSpread == \"double\") {\n return true; // forced\n }\n else if (settings.syntheticSpread == \"single\") {\n return false; // forced\n }\n\n if (!spineItem) {\n return 0; // non-forced\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\n return true; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\n }\n\n var orientation = Helpers.getOrientation($viewport);\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\n }\n\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\n // if no spread set in document and user didn't set in in setting we will do double for landscape\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\n return landscape ? 1 : 0; // non-forced\n\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\n }\n\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\n return 0; // non-forced\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.fromElement = function ($element) {\n return new this($element.margin(), $element.border(), $element.padding());\n};\n\n/**\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.empty = function () {\n\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n });\n\n};\n\n/**\n *\n * @param name\n * @param params\n * @returns {Helpers.loadTemplate.cache}\n */\nHelpers.loadTemplate = function (name, params) {\n return Helpers.loadTemplate.cache[name];\n};\n\n/**\n *\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\n */\nHelpers.loadTemplate.cache = {\n \"fixed_book_frame\": '
',\n \"single_page_frame\": '
',\n //\"single_page_frame\" : '
',\n\n \"scrolled_book_frame\": '
',\n \"reflowable_book_frame\": '
',\n \"reflowable_book_page_frame\": '
'\n /***\n * The `enable-annotation` attribute on an iframe helps detect the content frames for annotating tools such as Hypothesis\n * See here for more details:\n * https://h.readthedocs.io/projects/client/en/latest/publishers/embedding/\n * https://github.com/hypothesis/client/pull/533\n ***/\n};\n\n/**\n *\n * @param styles\n * @param $element\n */\nHelpers.setStyles = function (styles, $element) {\n\n var count = styles.length;\n\n if (!count) {\n return;\n }\n\n var stylingGlobal = \"\";\n var stylings = [];\n var elementIsDocument = ($element && $element.createTextNode) ? true : false;\n\n for (var i = 0; i < count; i++) {\n var style = styles[i];\n\n if (elementIsDocument) {\n if (!style.selector || style.selector == \"\" || style.selector == \"html\" || style.selector == \"body\" || style.selector == \"*\") {\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n\n stylingGlobal += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n } else {\n //$(style.selector, $($element.doumentElement)).css(style.declarations);\n\n var cssProperties = \"\";\n\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n cssProperties += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n\n stylings.push({selector: style.selector, cssProps: cssProperties});\n }\n \n } else { // HTML element\n if (style.selector) {\n $(style.selector, $element).css(style.declarations);\n }\n else {\n $element.css(style.declarations);\n }\n }\n }\n\n if (elementIsDocument) { // HTML document\n\n var doc = $element;\n\n var bookStyleElement = $(\"style#readium-bookStyles\", doc.head);\n\n if (bookStyleElement && bookStyleElement[0]) {\n // we remove before re-adding from scratch\n doc.head.removeChild(bookStyleElement[0]);\n }\n \n var cssStylesheet = \"\";\n\n if (stylingGlobal.length > 0) {\n cssStylesheet += ' body, body::after, body::before, body *, body *::after, body *::before { ' + stylingGlobal + ' } ';\n }\n\n if (stylings.length > 0) {\n for (var i = 0; i < stylings.length; i++) {\n var styling = stylings[i];\n\n cssStylesheet += ' ' + styling.selector + ' { ' + styling.cssProps + ' } ';\n }\n }\n\n if (cssStylesheet.length > 0) {\n\n var styleElement = doc.createElement('style');\n styleElement.setAttribute(\"id\", \"readium-bookStyles\");\n styleElement.appendChild(doc.createTextNode(cssStylesheet));\n\n doc.head.appendChild(styleElement);\n\n //bookStyleElement = $(styleElement);\n }\n }\n};\n\n/**\n *\n * @param iframe\n * @returns {boolean}\n */\nHelpers.isIframeAlive = function (iframe) {\n var w = undefined;\n var d = undefined;\n try {\n w = iframe.contentWindow;\n d = iframe.contentDocument;\n }\n catch (ex) {\n console.error(ex);\n return false;\n }\n\n return w && d;\n};\n\n/**\n *\n * @param $viewport\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\n */\nHelpers.getOrientation = function ($viewport) {\n\n var viewportWidth = $viewport.width();\n var viewportHeight = $viewport.height();\n\n if (!viewportWidth || !viewportHeight) {\n return undefined;\n }\n\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\n};\n\n/**\n *\n * @param item\n * @param orientation\n * @returns {boolean}\n */\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\n\n var rendition_spread = item.getRenditionSpread();\n\n return !rendition_spread\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\n};\n\nHelpers.CSSTransition = function ($el, trans) {\n\n // does not work!\n //$el.css('transition', trans);\n\n var css = {};\n // empty '' prefix FIRST!\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\n css[prefix + 'transition'] = prefix + trans;\n });\n $el.css(css);\n}\n\n//scale, left, top, angle, origin\nHelpers.CSSTransformString = function (options) {\n var enable3D = options.enable3D ? true : false;\n\n var translate, scale, rotation,\n origin = options.origin;\n\n if (options.left || options.top) {\n var left = options.left || 0,\n top = options.top || 0;\n\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\n }\n if (options.scale) {\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\n }\n if (options.angle) {\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\n }\n\n if (!(translate || scale || rotation)) {\n return {};\n }\n\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\n if (rotation) {\n transformString = transformString + \" \" + rotation;\n //transformString = rotation + \" \" + transformString;\n }\n\n var css = {};\n css['transform'] = transformString;\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\n return css;\n};\n\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\n if (!tickRate) tickRate = 250;\n if (!waitThreshold) waitThreshold = tickRate;\n\n var first = true,\n last,\n deferTimer;\n\n return function () {\n var ctx = context || this,\n now = (Date.now && Date.now()) || new Date().getTime(),\n args = arguments;\n\n if (!(last && now < last + tickRate)) {\n last = now;\n if (first) {\n startCb.apply(ctx, args);\n first = false;\n } else {\n tickCb.apply(ctx, args);\n }\n }\n\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n first = true;\n endCb.apply(ctx, args);\n }, waitThreshold);\n };\n};\n\n\n//TODO: consider using CSSOM escape() or polyfill\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\n//http://mathiasbynens.be/notes/css-escapes\n/**\n *\n * @param sel\n * @returns {string}\n */\nHelpers.escapeJQuerySelector = function (sel) {\n //http://api.jquery.com/category/selectors/\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\n // double backslash escape\n\n if (!sel) return undefined;\n\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\n\n // if (selector !== sel)\n // {\n // console.debug(\"---- SELECTOR ESCAPED\");\n // console.debug(\"1: \" + sel);\n // console.debug(\"2: \" + selector);\n // }\n // else\n // {\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\n // }\n\n return selector;\n};\n\nHelpers.polyfillCaretRangeFromPoint = function(document) {\n //Derived from css-regions-polyfill:\n // https://github.com/FremyCompany/css-regions-polyfill/blob/bfbb6445ec2a2a883005ab8801d8463fa54b5701/src/range-extensions.js\n //Copyright (c) 2013 François REMY\n //Copyright (c) 2013 Adobe Systems Inc.\n //Licensed under the Apache License, Version 2.0\n if (!document.caretRangeFromPoint) {\n if (document.caretPositionFromPoint) {\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n var r = document.createRange();\n var p = document.caretPositionFromPoint(x, y);\n if (!p) return null;\n if (p.offsetNode) {\n r.setStart(p.offsetNode, p.offset);\n r.setEnd(p.offsetNode, p.offset);\n }\n return r;\n }\n } else if ((document.body || document.createElement('body')).createTextRange) {\n //\n // we may want to convert TextRange to Range\n //\n\n //TextRangeUtils, taken from: https://code.google.com/p/ierange/\n //Copyright (c) 2009 Tim Cameron Ryan\n //Released under the MIT/X License\n var TextRangeUtils = {\n convertToDOMRange: function(textRange, document) {\n var adoptBoundary = function(domRange, textRangeInner, bStart) {\n // iterate backwards through parent element to find anchor location\n var cursorNode = document.createElement('a'),\n cursor = textRangeInner.duplicate();\n cursor.collapse(bStart);\n var parent = cursor.parentElement();\n do {\n parent.insertBefore(cursorNode, cursorNode.previousSibling);\n cursor.moveToElementText(cursorNode);\n } while (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) > 0 && cursorNode.previousSibling);\n // when we exceed or meet the cursor, we've found the node\n if (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) == -1 && cursorNode.nextSibling) {\n // data node\n cursor.setEndPoint(bStart ? 'EndToStart' : 'EndToEnd', textRangeInner);\n domRange[bStart ? 'setStart' : 'setEnd'](cursorNode.nextSibling, cursor.text.length);\n } else {\n // element\n domRange[bStart ? 'setStartBefore' : 'setEndBefore'](cursorNode);\n }\n cursorNode.parentNode.removeChild(cursorNode);\n };\n // return a DOM range\n var domRange = document.createRange();\n adoptBoundary(domRange, textRange, true);\n adoptBoundary(domRange, textRange, false);\n return domRange;\n }\n };\n\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n // the accepted number of vertical backtracking, in CSS pixels\n var IYDepth = 40;\n // try to create a text range at the specified location\n var tr = document.body.createTextRange();\n for (var iy = IYDepth; iy; iy = iy - 4) {\n try {\n tr.moveToPoint(x, iy + y - IYDepth);\n return TextRangeUtils.convertToDOMRange(tr, document);\n } catch (ex) {\n }\n }\n // if that fails, return the location just after the element located there\n try {\n var elem = document.elementFromPoint(x - 1, y - 1);\n var r = document.createRange();\n r.setStartAfter(elem);\n return r;\n } catch (ex) {\n return null;\n }\n }\n }\n }\n};\n\nreturn Helpers;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\n/**\n* CFI navigation helper class\n*\n* @param options Additional settings for NavigationLogic object\n* - paginationInfo Layout details, used by clientRect-based geometry\n* - visibleContentOffsets Function that returns offsets. If supplied it is used instead of the inferred offsets\n* - frameDimensions Function that returns an object with width and height properties. Needs to be set.\n* - $iframe Iframe reference, and needs to be set.\n* @constructor\n*/\ndefine('readium_shared_js/views/cfi_navigation_logic',[\"jquery\", \"underscore\", \"../helpers\", 'readium_cfi_js'], function($, _, Helpers, epubCfi) {\n\nvar CfiNavigationLogic = function (options) {\n var self = this;\n options = options || {};\n\n var _DEBUG = ReadiumSDK.DEBUG_MODE;\n if (_DEBUG) {\n window.top._DEBUG_visibleTextRangeOffsetsRuns = window.top._DEBUG_visibleTextRangeOffsetsRuns || [];\n }\n\n this.getRootElement = function () {\n if (!options.$iframe) {\n return null;\n }\n\n return options.$iframe[0].contentDocument.documentElement;\n };\n\n this.getBodyElement = function () {\n var rootDocument = this.getRootDocument();\n if (rootDocument && rootDocument.body) {\n return rootDocument.body;\n } else {\n // In SVG documents the root element can be considered the body.\n return this.getRootElement();\n }\n };\n\n this.getClassBlacklist = function () {\n return options.classBlacklist || [];\n };\n\n this.getIdBlacklist = function () {\n return options.idBlacklist || [];\n };\n\n this.getElementBlacklist = function () {\n return options.elementBlacklist || [];\n };\n\n this.getRootDocument = function () {\n if (!options.$iframe) {\n return null;\n }\n\n return options.$iframe[0].contentDocument;\n };\n\n function createRange() {\n return self.getRootDocument().createRange();\n }\n\n function createRangeFromNode(textnode) {\n var documentRange = createRange();\n documentRange.selectNodeContents(textnode);\n return documentRange;\n }\n\n function getNodeClientRect(node) {\n var range = createRange();\n range.selectNode(node);\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n\n function getNodeContentsClientRect(node) {\n var range = createRange();\n range.selectNodeContents(node);\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n\n function getNodeRangeClientRect(startNode, startOffset, endNode, endOffset) {\n var range = createRange();\n range.setStart(startNode, startOffset ? startOffset : 0);\n if (endNode.nodeType === Node.ELEMENT_NODE) {\n range.setEnd(endNode, endOffset ? endOffset : endNode.childNodes.length);\n } else if (endNode.nodeType === Node.TEXT_NODE) {\n range.setEnd(endNode, endOffset ? endOffset : 0);\n }\n\n // Webkit has a bug where collapsed ranges provide an empty rect with getBoundingClientRect()\n // https://bugs.webkit.org/show_bug.cgi?id=138949\n // Thankfully it implements getClientRects() properly...\n // A collapsed text range may still have geometry!\n if (range.collapsed) {\n return normalizeRectangle(range.getClientRects()[0], 0, 0);\n } else {\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n }\n\n function getNodeClientRectList(node, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n var range = createRange();\n range.selectNode(node);\n return getRangeClientRectList(range, visibleContentOffsets);\n }\n\n function getRangeClientRectList(range, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n //noinspection JSUnresolvedFunction\n\n return _.map(range.getClientRects(), function (rect) {\n\n return normalizeRectangle(rect, visibleContentOffsets.left, visibleContentOffsets.top);\n });\n }\n\n function getFrameDimensions() {\n if (options.frameDimensionsGetter) {\n return options.frameDimensionsGetter();\n }\n\n console.error('CfiNavigationLogic: No frame dimensions specified!');\n return null;\n }\n\n function getCaretRangeFromPoint(x, y, document) {\n document = document || self.getRootDocument();\n Helpers.polyfillCaretRangeFromPoint(document); //only polyfills once, no-op afterwards\n return document.caretRangeFromPoint(x, y);\n }\n\n function isPaginatedView() {\n return !!options.paginationInfo;\n }\n\n /**\n * @private\n * Checks whether or not pages are rendered right-to-left\n *\n * @returns {boolean}\n */\n function isPageProgressionRightToLeft() {\n return options.paginationInfo && !!options.paginationInfo.rightToLeft;\n }\n\n /**\n * @private\n * Checks whether or not pages are rendered with vertical writing mode\n *\n * @returns {boolean}\n */\n function isVerticalWritingMode() {\n return options.paginationInfo && !!options.paginationInfo.isVerticalWritingMode;\n }\n\n\n /**\n * @private\n * Checks whether or not a (fully adjusted) rectangle is visible\n *\n * @param {Object} rect\n * @param {boolean} [ignorePartiallyVisible]\n * @param {Object} [frameDimensions]\n * @returns {boolean}\n */\n function isRectVisible(rect, ignorePartiallyVisible, frameDimensions) {\n\n frameDimensions = frameDimensions || getFrameDimensions();\n\n //Text nodes without printable text dont have client rectangles\n if (!rect) {\n return false;\n }\n //Sometimes we get client rects that are \"empty\" and aren't supposed to be visible\n if (rect.left == 0 && rect.right == 0 && rect.top == 0 && rect.bottom == 0) {\n return false;\n }\n\n if (isPaginatedView() && !isVerticalWritingMode()) {\n return (rect.left >= 0 && rect.left < frameDimensions.width) ||\n (!ignorePartiallyVisible && rect.left < 0 && rect.right > 0);\n } else {\n return (rect.top >= 0 && rect.top < frameDimensions.height) ||\n (!ignorePartiallyVisible && rect.top < 0 && rect.bottom > 0);\n }\n\n }\n\n /**\n * @private\n * Retrieves _current_ full width of a column (including its gap)\n *\n * @returns {number} Full width of a column in pixels\n */\n function getColumnFullWidth() {\n\n if (!options.paginationInfo || isVerticalWritingMode()) {\n return options.$iframe.width();\n }\n\n return options.paginationInfo.columnWidth + options.paginationInfo.columnGap;\n }\n\n /**\n * @private\n *\n * Retrieves _current_ offset of a viewport\n * (relational to the beginning of the chapter)\n *\n * @returns {Object}\n */\n function getVisibleContentOffsets() {\n if (options.visibleContentOffsetsGetter) {\n return options.visibleContentOffsetsGetter();\n }\n\n if (isVerticalWritingMode() && options.paginationOffsetsGetter) {\n return options.paginationOffsetsGetter();\n }\n\n return {\n top: 0,\n left: 0\n };\n }\n\n function getPaginationOffsets() {\n if (options.paginationOffsetsGetter) {\n return options.paginationOffsetsGetter();\n }\n\n return {\n top: 0,\n left: 0\n };\n }\n\n /**\n * New (rectangle-based) algorithm, useful in multi-column layouts\n *\n * Note: the second param (props) is ignored intentionally\n * (no need to use those in normalization)\n *\n * @param {jQuery} $element\n * @param {boolean} shouldCalculateVisibilityPercentage\n * @param {Object} [visibleContentOffsets]\n * @param {Object} [frameDimensions]\n * @returns {number|null}\n * 0 for non-visible elements,\n * 0 < n <= 100 for visible elements\n * (will just give 100, if `shouldCalculateVisibilityPercentage` => false)\n * null for elements with display:none\n */\n function checkVisibilityByRectangles($element, shouldCalculateVisibilityPercentage, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var clientRectangles = getNormalizedRectangles($element, visibleContentOffsets);\n if (clientRectangles.length === 0) { // elements with display:none, etc.\n return null;\n }\n\n var visibilityPercentage = 0;\n\n if (clientRectangles.length === 1) {\n var adjustedRect = clientRectangles[0];\n\n if (isPaginatedView()) {\n if (adjustedRect.bottom > frameDimensions.height || adjustedRect.top < 0) {\n // because of webkit inconsistency, that single rectangle should be adjusted\n // until it hits the end OR will be based on the FIRST column that is visible\n adjustRectangle(adjustedRect, true, frameDimensions);\n }\n }\n\n if (isRectVisible(adjustedRect, false, frameDimensions)) {\n if (shouldCalculateVisibilityPercentage && adjustedRect.top < 0) {\n visibilityPercentage =\n Math.floor(100 * (adjustedRect.height + adjustedRect.top) / adjustedRect.height);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.bottom > frameDimensions.height) {\n visibilityPercentage =\n Math.floor(100 * (frameDimensions.height - adjustedRect.top) / adjustedRect.height);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.left < 0 && adjustedRect.right > 0) {\n visibilityPercentage =\n Math.floor(100 * adjustedRect.right / adjustedRect.width);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.left < 0 && adjustedRect.right > 0) {\n visibilityPercentage =\n Math.floor(100 * adjustedRect.right / adjustedRect.width);\n } else {\n visibilityPercentage = 100;\n }\n }\n } else {\n // for an element split between several CSS columns,z\n // both Firefox and IE produce as many client rectangles;\n // each of those should be checked\n for (var i = 0, l = clientRectangles.length; i < l; ++i) {\n if (isRectVisible(clientRectangles[i], false, frameDimensions)) {\n visibilityPercentage = shouldCalculateVisibilityPercentage\n ? measureVisibilityPercentageByRectangles(clientRectangles, i)\n : 100;\n break;\n }\n }\n }\n\n return visibilityPercentage;\n }\n\n /**\n * Finds a page index (0-based) delta for a specific element.\n * Calculations are based on rectangles retrieved with getClientRects() method.\n *\n * @param {jQuery} $element\n * @returns {number|null}\n */\n function findPageIndexDeltaByRectangles($element) {\n\n var visibleContentOffsets = getVisibleContentOffsets();\n\n var clientRectangles = getNormalizedRectangles($element, visibleContentOffsets);\n if (clientRectangles.length === 0) { // elements with display:none, etc.\n return null;\n }\n\n return calculatePageIndexDeltaByRectangles(clientRectangles);\n }\n\n /**\n * @private\n * Calculate a page index (0-based) delta for given client rectangles.\n *\n * @param {object[]} clientRectangles\n * @param {object} [frameDimensions]\n * @param {number} [columnFullWidth]\n * @returns {number|null}\n */\n function calculatePageIndexDeltaByRectangles(clientRectangles, frameDimensions, columnFullWidth) {\n var isRtl = isPageProgressionRightToLeft();\n var isVwm = isVerticalWritingMode();\n columnFullWidth = columnFullWidth || getColumnFullWidth();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var firstRectangle = _.first(clientRectangles);\n if (clientRectangles.length === 1) {\n adjustRectangle(firstRectangle, false, frameDimensions, columnFullWidth, isRtl, isVwm);\n }\n\n var pageIndex;\n\n if (isVwm) {\n var topOffset = firstRectangle.top;\n pageIndex = Math.round(topOffset / frameDimensions.height);\n } else {\n var leftOffset = firstRectangle.left;\n if (isRtl) {\n leftOffset = (columnFullWidth * (options.paginationInfo ? options.paginationInfo.visibleColumnCount : 1)) - leftOffset;\n }\n pageIndex = Math.round(leftOffset / columnFullWidth);\n }\n\n return pageIndex;\n }\n\n /**\n * Finds a page index (0-based) delta for a specific client rectangle.\n * Calculations are based on viewport dimensions, offsets, and rectangle coordinates\n *\n * @param {ClientRect} clientRectangle\n * @param {Object} [visibleContentOffsets]\n * @param {Object} [frameDimensions]\n * @returns {number|null}\n */\n function findPageIndexDeltaBySingleRectangle(clientRectangle, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var normalizedRectangle = normalizeRectangle(\n clientRectangle, visibleContentOffsets.left, visibleContentOffsets.top);\n\n return calculatePageIndexDeltaByRectangles([normalizedRectangle], frameDimensions);\n }\n\n /**\n * @private\n * Calculates the visibility offset percentage based on ClientRect dimensions\n *\n * @param {Array} clientRectangles (should already be normalized)\n * @param {number} firstVisibleRectIndex\n * @returns {number} - visibility percentage (0 < n <= 100)\n */\n function measureVisibilityPercentageByRectangles(clientRectangles, firstVisibleRectIndex) {\n\n var heightTotal = 0;\n var heightVisible = 0;\n\n if (clientRectangles.length > 1) {\n _.each(clientRectangles, function (rect, index) {\n heightTotal += rect.height;\n if (index >= firstVisibleRectIndex) {\n // in this case, all the rectangles after the first visible\n // should be counted as visible\n heightVisible += rect.height;\n }\n });\n }\n else {\n // should already be normalized and adjusted\n heightTotal = clientRectangles[0].height;\n heightVisible = clientRectangles[0].height - Math.max(\n 0, -clientRectangles[0].top);\n }\n return heightVisible === heightTotal\n ? 100 // trivial case: element is 100% visible\n : Math.floor(100 * heightVisible / heightTotal);\n }\n\n /**\n * @private\n * Retrieves the position of $element in multi-column layout\n *\n * @param {jQuery} $el\n * @param {Object} [visibleContentOffsets]\n * @returns {Object[]}\n */\n function getNormalizedRectangles($el, visibleContentOffsets) {\n\n visibleContentOffsets = visibleContentOffsets || {};\n var leftOffset = visibleContentOffsets.left || 0;\n var topOffset = visibleContentOffsets.top || 0;\n\n var isTextNode = ($el[0].nodeType === Node.TEXT_NODE);\n var clientRectList;\n\n if (isTextNode) {\n var range = createRange();\n range.selectNode($el[0]);\n //noinspection JSUnresolvedFunction\n clientRectList = range.getClientRects();\n } else {\n //noinspection JSUnresolvedFunction\n clientRectList = $el[0].getClientRects();\n }\n\n // all the separate rectangles (for detecting position of the element\n // split between several columns)\n var clientRectangles = [];\n for (var i = 0, l = clientRectList.length; i < l; ++i) {\n if (clientRectList[i].height > 0 || clientRectList.length === 1) {\n // Firefox sometimes gets it wrong,\n // adding literally empty (height = 0) client rectangle preceding the real one,\n // that empty client rectanle shouldn't be retrieved\n clientRectangles.push(\n normalizeRectangle(clientRectList[i], leftOffset, topOffset));\n }\n }\n\n return clientRectangles;\n }\n\n function getNormalizedBoundingRect($el, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || {};\n var leftOffset = visibleContentOffsets.left || 0;\n var topOffset = visibleContentOffsets.top || 0;\n\n var isTextNode = ($el[0].nodeType === Node.TEXT_NODE);\n var boundingClientRect;\n\n if (isTextNode) {\n var range = createRange();\n range.selectNode($el[0]);\n boundingClientRect = range.getBoundingClientRect();\n } else {\n boundingClientRect = $el[0].getBoundingClientRect();\n }\n\n // union of all rectangles wrapping the element\n return normalizeRectangle(boundingClientRect, leftOffset, topOffset);\n }\n\n /**\n * @private\n * Converts TextRectangle object into a plain object,\n * taking content offsets (=scrolls, position shifts etc.) into account\n *\n * @param {Object} textRect\n * @param {number} leftOffset\n * @param {number} topOffset\n * @returns {Object}\n */\n function normalizeRectangle(textRect, leftOffset, topOffset) {\n\n var plainRectObject = {\n left: textRect.left,\n right: textRect.right,\n top: textRect.top,\n bottom: textRect.bottom,\n width: textRect.right - textRect.left,\n height: textRect.bottom - textRect.top\n };\n leftOffset = leftOffset || 0;\n topOffset = topOffset || 0;\n offsetRectangle(plainRectObject, leftOffset, topOffset);\n return plainRectObject;\n }\n\n /**\n * @private\n * Offsets plain object (which represents a TextRectangle).\n *\n * @param {Object} rect\n * @param {number} leftOffset\n * @param {number} topOffset\n */\n function offsetRectangle(rect, leftOffset, topOffset) {\n\n rect.left += leftOffset;\n rect.right += leftOffset;\n rect.top += topOffset;\n rect.bottom += topOffset;\n }\n\n /**\n * @private\n *\n * When element is spilled over two or more columns,\n * most of the time Webkit-based browsers\n * still assign a single clientRectangle to it, setting its `top` property to negative value\n * (so it looks like it's rendered based on the second column)\n * Alas, sometimes they decide to continue the leftmost column - from _below_ its real height.\n * In this case, `bottom` property is actually greater than element's height and had to be adjusted accordingly.\n *\n * Ugh.\n *\n * @param {Object} rect\n * @param {boolean} [shouldLookForFirstVisibleColumn]\n * If set, there'll be two-phase adjustment\n * (to align a rectangle with a viewport)\n * @param {Object} [frameDimensions]\n * @param {number} [columnFullWidth]\n * @param {boolean} [isRtl]\n * @param {boolean} [isVwm] isVerticalWritingMode\n */\n function adjustRectangle(rect, shouldLookForFirstVisibleColumn, frameDimensions, columnFullWidth, isRtl, isVwm) {\n\n frameDimensions = frameDimensions || getFrameDimensions();\n columnFullWidth = columnFullWidth || getColumnFullWidth();\n isRtl = isRtl || isPageProgressionRightToLeft();\n isVwm = isVwm || isVerticalWritingMode();\n\n // Rectangle adjustment is not needed in VWM since it does not deal with columns\n if (isVwm) {\n return;\n }\n\n if (isRtl) {\n columnFullWidth *= -1; // horizontal shifts are reverted in RTL mode\n }\n\n // first we go left/right (rebasing onto the very first column available)\n while (rect.top < 0) {\n offsetRectangle(rect, -columnFullWidth, frameDimensions.height);\n }\n\n // ... then, if necessary (for visibility offset checks),\n // each column is tried again (now in reverse order)\n // the loop will be stopped when the column is aligned with a viewport\n // (i.e., is the first visible one).\n if (shouldLookForFirstVisibleColumn) {\n while (rect.bottom >= frameDimensions.height) {\n if (isRectVisible(rect, false, frameDimensions)) {\n break;\n }\n offsetRectangle(rect, columnFullWidth, -frameDimensions.height);\n }\n }\n }\n\n this.getCfiForElement = function (element) {\n\n var cfi = EPUBcfi.Generator.generateElementCFIComponent(element,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (cfi[0] == \"!\") {\n cfi = cfi.substring(1);\n }\n return cfi;\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint) {\n var document = self.getRootDocument();\n var firstVisibleCaretRange = getCaretRangeFromPoint(x, y, document);\n var elementFromPoint = document.elementFromPoint(x, y);\n var invalidElementFromPoint = !elementFromPoint || elementFromPoint === document.documentElement;\n\n if (precisePoint) {\n if (!elementFromPoint || invalidElementFromPoint) {\n return null;\n }\n var testRect = getNodeContentsClientRect(elementFromPoint);\n if (!isRectVisible(testRect, false)) {\n return null;\n }\n if ((x < testRect.left || x > testRect.right) || (y < testRect.top || y > testRect.bottom)) {\n return null;\n }\n }\n\n if (!firstVisibleCaretRange) {\n if (invalidElementFromPoint) {\n console.error(\"Could not generate CFI no visible element on page\");\n return null;\n }\n firstVisibleCaretRange = createRange();\n firstVisibleCaretRange.selectNode(elementFromPoint);\n }\n\n var range = firstVisibleCaretRange;\n var cfi;\n //if we get a text node we need to get an approximate range for the first visible character offsets.\n var node = range.startContainer;\n var startOffset, endOffset;\n if (node.nodeType === Node.TEXT_NODE) {\n if (precisePoint && node.parentNode !== elementFromPoint) {\n return null;\n }\n if (node.length === 1 && range.startOffset === 1) {\n startOffset = 0;\n endOffset = 1;\n } else if (range.startOffset === node.length) {\n startOffset = range.startOffset - 1;\n endOffset = range.startOffset;\n } else {\n startOffset = range.startOffset;\n endOffset = range.startOffset + 1;\n }\n var wrappedRange = {\n startContainer: node,\n endContainer: node,\n startOffset: startOffset,\n endOffset: endOffset,\n commonAncestorContainer: range.commonAncestorContainer\n };\n\n if (_DEBUG) {\n drawDebugOverlayFromDomRange(wrappedRange);\n }\n\n cfi = generateCfiFromDomRange(wrappedRange);\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n node =\n range.startContainer.childNodes[range.startOffset] ||\n range.startContainer.childNodes[0] ||\n range.startContainer;\n if (precisePoint && node !== elementFromPoint) {\n return null;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n cfi = generateCfiFromDomRange(range);\n } else {\n cfi = self.getCfiForElement(node);\n }\n } else {\n if (precisePoint && node !== elementFromPoint) {\n return null;\n }\n\n cfi = self.getCfiForElement(elementFromPoint);\n }\n\n //This should not happen but if it does print some output, just in case\n if (cfi && cfi.indexOf('NaN') !== -1) {\n console.log('Did not generate a valid CFI:' + cfi);\n return undefined;\n }\n return cfi;\n };\n\n this.getRangeCfiFromPoints = function (startX, startY, endX, endY) {\n var document = self.getRootDocument();\n var start = getCaretRangeFromPoint(startX, startY, document),\n end = getCaretRangeFromPoint(endX, endY, document),\n range = createRange();\n range.setStart(start.startContainer, start.startOffset);\n range.setEnd(end.startContainer, end.startOffset);\n // if we're looking at a text node create a nice range (n, n+1)\n if (start.startContainer === start.endContainer && start.startContainer.nodeType === Node.TEXT_NODE && end.startContainer.length > end.startOffset + 1) {\n range.setEnd(end.startContainer, end.startOffset + 1);\n }\n return generateCfiFromDomRange(range);\n };\n\n function determineSplit(range, division) {\n var percent = division / 100;\n return Math.round((range.endOffset - range.startOffset ) * percent);\n }\n\n function splitRange(range, division) {\n if (range.endOffset - range.startOffset === 1) {\n return [range];\n }\n var length = determineSplit(range, division);\n var textNode = range.startContainer;\n var leftNodeRange = range.cloneRange();\n leftNodeRange.setStart(textNode, range.startOffset);\n leftNodeRange.setEnd(textNode, range.startOffset + length);\n var rightNodeRange = range.cloneRange();\n rightNodeRange.setStart(textNode, range.startOffset + length);\n rightNodeRange.setEnd(textNode, range.endOffset);\n\n return [leftNodeRange, rightNodeRange];\n\n }\n\n // create Range from target node and search for visibleOutput Range\n function getVisibleTextRangeOffsets(textNode, pickerFunc, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n var nodeRange = createRangeFromNode(textNode);\n var nodeClientRects = getRangeClientRectList(nodeRange, visibleContentOffsets);\n var splitRatio = deterministicSplit(nodeClientRects, pickerFunc([0, 1]));\n return getTextRangeOffset(splitRange(nodeRange, splitRatio), visibleContentOffsets,\n pickerFunc([0, 1]), splitRatio,\n function (rect) {\n return (isVerticalWritingMode() ? rect.height : rect.width) && isRectVisible(rect, false, frameDimensions);\n });\n }\n\n function deterministicSplit(rectList, directionBit) {\n var split = 0;\n // Calculate total cumulative Height for both visible portions and invisible portions and find the split\n var visibleRects = _.filter(rectList, function (rect) {\n return (isVerticalWritingMode() ? rect.height : rect.width) && isRectVisible(rect, false, getFrameDimensions());\n });\n var visibleRectHeight = calculateCumulativeHeight(visibleRects);\n var invisibleRectHeight = totalHeight - visibleRectHeight;\n var totalHeight = calculateCumulativeHeight(rectList);\n\n if (visibleRectHeight === totalHeight) {\n // either all visible or split\n // heuristic: slight bias to increase likelihood of hits\n return directionBit ? 55 : 45;\n } else {\n split = 100 * (visibleRectHeight / totalHeight);\n return invisibleRectHeight > visibleRectHeight ? split + 5 : split - 5;\n }\n }\n\n function rectTopHash (rectList) {\n // sort the rectangles by top value\n var sortedList = rectList.sort(function (a, b) {\n return a.top < b.top;\n });\n var lineMap = [];\n _.each(sortedList, function (rect) {\n var key = rect.top;\n if (!lineMap[key]) {\n lineMap[key] = [rect.height];\n } else {\n var currentLine = lineMap[key];\n currentLine.push(rect.height);\n lineMap[key] = currentLine;\n }\n });\n }\n\n function calculateCumulativeHeight (rectList) {\n var lineMap = rectTopHash(rectList);\n var height = 0;\n _.each(lineMap, function (line) {\n height = height + Math.max.apply(null, line);\n });\n return height;\n }\n\n function getTextRangeOffset(startingSet, visibleContentOffsets, directionBit, splitRatio, filterFunc) {\n var runCount = 0;\n var currRange = startingSet;\n //begin iterative binary search, each iteration will check Range length and visibility\n while (currRange.length !== 1) {\n runCount++;\n var currTextNodeFragments = getRangeClientRectList(currRange[directionBit], visibleContentOffsets);\n if (hasVisibleFragments(currTextNodeFragments, filterFunc)) {\n currRange = splitRange(currRange[directionBit], splitRatio);\n }\n // No visible fragment Look in other half\n else {\n currRange = splitRange(currRange[directionBit ? 0 : 1], splitRatio);\n }\n }\n if (_DEBUG) {\n console.debug('getVisibleTextRangeOffsets:getTextRangeOffset:runCount', runCount);\n window.top._DEBUG_visibleTextRangeOffsetsRuns.push(runCount);\n }\n var resultRange = currRange[0];\n if (resultRange) {\n resultRange.collapse(!directionBit);\n }\n return resultRange;\n }\n\n function hasVisibleFragments(fragments, filterFunc) {\n var visibleFragments = _.filter(fragments, filterFunc);\n return !!visibleFragments.length;\n }\n\n function findVisibleLeafNodeCfi(visibleLeafNode, pickerFunc, visibleContentOffsets, frameDimensions) {\n if (!visibleLeafNode) {\n return null;\n }\n\n var element = visibleLeafNode.element;\n var textNode = visibleLeafNode.textNode;\n\n //if a valid text node is found, try to generate a CFI with range offsets\n if (textNode && isValidTextNode(textNode)) {\n var visibleRange = getVisibleTextRangeOffsets(textNode, pickerFunc, visibleContentOffsets, frameDimensions);\n if (!visibleRange) {\n if (_DEBUG) console.warn(\"findVisibleLeafNodeCfi: failed to find text range offset\");\n return null;\n }\n return generateCfiFromDomRange(visibleRange);\n } else {\n //if not then generate a CFI for the element\n return self.getCfiForElement(element);\n }\n }\n\n function getLastVisibleTextRangeCfi(visibleContentOffsets, frameDimensions) {\n var visibleLeafNode = self.findLastVisibleElement(visibleContentOffsets, frameDimensions);\n return findVisibleLeafNodeCfi(visibleLeafNode, _.last, visibleContentOffsets, frameDimensions);\n }\n\n function getFirstVisibleTextRangeCfi(visibleContentOffsets, frameDimensions) {\n var visibleLeafNode = self.findFirstVisibleElement(visibleContentOffsets, frameDimensions);\n return findVisibleLeafNodeCfi(visibleLeafNode, _.first, visibleContentOffsets, frameDimensions);\n }\n\n this.getFirstVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return getFirstVisibleTextRangeCfi(visibleContentOffsets, frameDimensions);\n };\n\n this.getLastVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return getLastVisibleTextRangeCfi(visibleContentOffsets, frameDimensions);\n };\n\n function generateCfiFromDomRange(range) {\n if (range.collapsed && range.startContainer.nodeType === Node.TEXT_NODE) {\n return EPUBcfi.generateCharacterOffsetCFIComponent(\n range.startContainer, range.startOffset,\n ['cfi-marker'], [], [\"MathJax_Message\", \"MathJax_SVG_Hidden\"]);\n } else if (range.collapsed) {\n return self.getCfiForElement(range.startContainer);\n } else {\n return EPUBcfi.generateRangeComponent(\n range.startContainer, range.startOffset,\n range.endContainer, range.endOffset,\n self.getClassBlacklist(), self.getElementBlacklist(), self.getIdBlacklist());\n }\n }\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var range = createRange();\n\n if (!rangeCfi2) {\n if (self.isRangeCfi(rangeCfi)) {\n var rangeInfo = self.getNodeRangeInfoFromCfi(rangeCfi);\n range.setStart(rangeInfo.startInfo.node, rangeInfo.startInfo.offset);\n range.setEnd(rangeInfo.endInfo.node, rangeInfo.endInfo.offset);\n } else {\n var element = self.getElementByCfi(rangeCfi,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.selectNode(element);\n }\n } else {\n if (self.isRangeCfi(rangeCfi)) {\n var rangeInfo1 = self.getNodeRangeInfoFromCfi(rangeCfi);\n range.setStart(rangeInfo1.startInfo.node, rangeInfo1.startInfo.offset);\n } else {\n var startElement = self.getElementByCfi(rangeCfi,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.setStart(startElement, 0);\n }\n\n if (self.isRangeCfi(rangeCfi2)) {\n var rangeInfo2 = self.getNodeRangeInfoFromCfi(rangeCfi2);\n if (inclusive) {\n range.setEnd(rangeInfo2.endInfo.node, rangeInfo2.endInfo.offset);\n } else {\n range.setEnd(rangeInfo2.startInfo.node, rangeInfo2.startInfo.offset);\n }\n } else {\n var endElement = self.getElementByCfi(rangeCfi2,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.setEnd(endElement, endElement.childNodes.length);\n }\n }\n return range;\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n return generateCfiFromDomRange(domRange);\n };\n\n function getWrappedCfi(partialCfi) {\n return \"epubcfi(/99!\" + partialCfi + \")\";\n }\n\n this.isRangeCfi = function (partialCfi) {\n return _isRangeCfi(partialCfi) || _hasTextTerminus(partialCfi);\n };\n\n function _isRangeCfi(partialCfi) {\n return EPUBcfi.Interpreter.isRangeCfi(getWrappedCfi(partialCfi));\n }\n\n function _hasTextTerminus(partialCfi) {\n return EPUBcfi.Interpreter.hasTextTerminus(getWrappedCfi(partialCfi));\n }\n\n this.getPageIndexDeltaForCfi = function (partialCfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n if (this.isRangeCfi(partialCfi)) {\n //if given a range cfi the exact page index needs to be calculated by getting node info from the range cfi\n var nodeRangeInfoFromCfi = this.getNodeRangeInfoFromCfi(partialCfi);\n //the page index is calculated from the node's client rectangle\n return findPageIndexDeltaBySingleRectangle(nodeRangeInfoFromCfi.clientRect);\n }\n\n var $element = getElementByPartialCfi(partialCfi, classBlacklist, elementBlacklist, idBlacklist);\n\n if (!$element) {\n return -1;\n }\n\n return this.getPageIndexDeltaForElement($element);\n };\n\n function getElementByPartialCfi(cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n var contentDoc = self.getRootDocument();\n\n var wrappedCfi = getWrappedCfi(cfi);\n\n try {\n //noinspection JSUnresolvedVariable\n var $element = EPUBcfi.getTargetElement(wrappedCfi, contentDoc, classBlacklist, elementBlacklist, idBlacklist);\n\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!$element || $element.length == 0) {\n console.log(\"Can't find element for CFI: \" + cfi);\n return undefined;\n }\n\n return $element;\n }\n\n this.getElementFromPoint = function (x, y) {\n\n var document = self.getRootDocument();\n return document.elementFromPoint(x, y);\n };\n\n this.getNodeRangeInfoFromCfi = function (cfi) {\n var contentDoc = self.getRootDocument();\n\n var wrappedCfi = getWrappedCfi(cfi);\n if (_isRangeCfi(cfi)) {\n\n try {\n //noinspection JSUnresolvedVariable\n var nodeResult = EPUBcfi.Interpreter.getRangeTargetElements(wrappedCfi, contentDoc,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (_DEBUG) {\n console.log(nodeResult);\n }\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!nodeResult) {\n console.log(\"Can't find nodes for range CFI: \" + cfi);\n return undefined;\n }\n\n var startRangeInfo = {node: nodeResult.startElement, offset: nodeResult.startOffset};\n var endRangeInfo = {node: nodeResult.endElement, offset: nodeResult.endOffset};\n var nodeRangeClientRect =\n startRangeInfo && endRangeInfo ?\n getNodeRangeClientRect(\n startRangeInfo.node,\n startRangeInfo.offset,\n endRangeInfo.node,\n endRangeInfo.offset)\n : null;\n\n if (_DEBUG) {\n console.log(nodeRangeClientRect);\n addOverlayRect(nodeRangeClientRect, 'purple', contentDoc);\n }\n\n return {startInfo: startRangeInfo, endInfo: endRangeInfo, clientRect: nodeRangeClientRect};\n } else if (_hasTextTerminus(cfi)) {\n\n try {\n //noinspection JSUnresolvedVariable\n var textTerminusResult = EPUBcfi.Interpreter.getTextTerminusInfo(wrappedCfi, contentDoc,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (_DEBUG) {\n console.log(textTerminusResult);\n }\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!textTerminusResult) {\n console.log(\"Can't find node for text term CFI: \" + cfi);\n return undefined;\n }\n\n var textTermRangeInfo = {node: textTerminusResult.textNode, offset: textTerminusResult.textOffset};\n var textTermClientRect =\n getNodeRangeClientRect(\n textTermRangeInfo.node,\n textTermRangeInfo.offset,\n textTermRangeInfo.node,\n textTermRangeInfo.offset);\n if (_DEBUG) {\n console.log(textTermClientRect);\n addOverlayRect(textTermClientRect, 'purple', contentDoc);\n }\n\n return {startInfo: textTermRangeInfo, endInfo: textTermRangeInfo, clientRect: textTermClientRect};\n } else {\n var $element = self.getElementByCfi(cfi,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n var visibleContentOffsets = getVisibleContentOffsets();\n return {\n startInfo: null,\n endInfo: null,\n clientRect: getNormalizedBoundingRect($element, visibleContentOffsets)\n };\n }\n };\n\n this.isNodeFromRangeCfiVisible = function (cfi) {\n var nodeRangeInfo = this.getNodeRangeInfoFromCfi(cfi);\n if (nodeRangeInfo) {\n return isRectVisible(nodeRangeInfo.clientRect, false);\n } else {\n return undefined;\n }\n };\n\n this.getNearestCfiFromElement = function (element) {\n var collapseToStart;\n var chosenNode;\n var isTextNode;\n\n var siblingTextNodesAndSelf = _.filter(element.parentNode.childNodes, function (n) {\n return n === element || isValidTextNode(n);\n });\n\n var indexOfSelf = siblingTextNodesAndSelf.indexOf(element);\n var nearestNode = siblingTextNodesAndSelf[indexOfSelf - 1];\n if (!nearestNode) {\n nearestNode = siblingTextNodesAndSelf[indexOfSelf + 1];\n collapseToStart = true;\n }\n if (!nearestNode) {\n nearestNode = _.last(this.getLeafNodeElements($(element.previousElementSibling)));\n if (!nearestNode) {\n collapseToStart = true;\n nearestNode = _.first(this.getLeafNodeElements($(element.nextElementSibling)));\n }\n }\n\n // Prioritize text node use\n if (isValidTextNode(nearestNode)) {\n chosenNode = nearestNode;\n isTextNode = true;\n } else if (isElementNode(nearestNode)) {\n chosenNode = nearestNode;\n } else if (isElementNode(element.previousElementSibling)) {\n chosenNode = element.previousElementSibling;\n } else if (isElementNode(element.nextElementSibling)) {\n chosenNode = element.nextElementSibling;\n } else {\n chosenNode = element.parentNode;\n }\n\n if (isTextNode) {\n var range = chosenNode.ownerDocument.createRange();\n range.selectNodeContents(chosenNode);\n range.collapse(collapseToStart);\n return this.getRangeCfiFromDomRange(range);\n } else {\n return this.getCfiForElement(chosenNode);\n }\n };\n\n this.getElementByCfi = function (partialCfi, classBlacklist, elementBlacklist, idBlacklist) {\n return getElementByPartialCfi(partialCfi, classBlacklist, elementBlacklist, idBlacklist);\n };\n\n this.getPageIndexDeltaForElement = function ($element) {\n\n // first try to get delta by rectangles\n var pageIndex = findPageIndexDeltaByRectangles($element);\n\n // for hidden elements (e.g., page breaks) there are no rectangles\n if (pageIndex === null) {\n\n // get CFI of the nearest (to hidden) element, and then get CFI's element\n var nearestVisibleElement = this.getElementByCfi(this.getNearestCfiFromElement($element[0]));\n\n // find page index by rectangles again, for the nearest element\n return findPageIndexDeltaByRectangles(nearestVisibleElement);\n }\n return pageIndex;\n };\n\n this.getElementById = function (id) {\n\n var contentDoc = this.getRootDocument();\n\n var $element = $(contentDoc.getElementById(id));\n //$(\"#\" + Helpers.escapeJQuerySelector(id), contentDoc);\n\n if ($element.length == 0) {\n return undefined;\n }\n\n return $element;\n };\n\n this.getPageIndexDeltaForElementId = function (id) {\n\n var $element = this.getElementById(id);\n if (!$element) {\n return -1;\n }\n\n return this.getPageIndexDeltaForElement($element);\n };\n\n // returns raw DOM element (not $ jQuery-wrapped)\n this.getFirstVisibleMediaOverlayElement = function (visibleContentOffsets) {\n var $root = $(this.getBodyElement());\n if (!$root || !$root.length || !$root[0]) return undefined;\n\n var that = this;\n\n var firstPartial = undefined;\n\n function traverseArray(arr) {\n if (!arr || !arr.length) return undefined;\n\n for (var i = 0, count = arr.length; i < count; i++) {\n var item = arr[i];\n if (!item) continue;\n\n var $item = $(item);\n\n if ($item.data(\"mediaOverlayData\")) {\n var visible = that.getElementVisibility($item, visibleContentOffsets);\n if (visible) {\n if (!firstPartial) firstPartial = item;\n\n if (visible == 100) return item;\n }\n }\n else {\n var elem = traverseArray(item.children);\n if (elem) return elem;\n }\n }\n\n return undefined;\n }\n\n var el = traverseArray([$root[0]]);\n if (!el) el = firstPartial;\n return el;\n\n // var $elements = this.getMediaOverlayElements($root);\n // return this.getVisibleElements($elements, visibleContentOffsets);\n };\n\n this.getElementVisibility = function ($element, visibleContentOffsets) {\n return checkVisibilityByRectangles($element, true, visibleContentOffsets);\n };\n\n\n this.isElementVisible = this.getElementVisibility;\n\n this.getVisibleElementsWithFilter = function (visibleContentOffsets, filterFunction) {\n var $elements = this.getElementsWithFilter($(this.getBodyElement()), filterFunction);\n return this.getVisibleElements($elements, visibleContentOffsets);\n };\n\n this.getAllElementsWithFilter = function (filterFunction) {\n return this.getElementsWithFilter($(this.getBodyElement()), filterFunction);\n };\n\n this.getAllVisibleElementsWithSelector = function (selector, visibleContentOffset) {\n var elements = $(selector, this.getRootElement());\n var $newElements = [];\n $.each(elements, function () {\n $newElements.push($(this));\n });\n return this.getVisibleElements($newElements, visibleContentOffset);\n };\n\n this.getVisibleElements = function ($elements, visibleContentOffsets, frameDimensions) {\n\n var visibleElements = [];\n\n _.each($elements, function ($node) {\n var isTextNode = ($node[0].nodeType === Node.TEXT_NODE);\n var $element = isTextNode ? $node.parent() : $node;\n var visibilityPercentage = checkVisibilityByRectangles(\n $node, true, visibleContentOffsets, frameDimensions);\n\n if (visibilityPercentage) {\n visibleElements.push({\n element: $element[0], // DOM Element is pushed\n textNode: isTextNode ? $node[0] : null,\n percentVisible: visibilityPercentage\n\n });\n }\n });\n\n return visibleElements;\n };\n\n this.getVisibleLeafNodes = function (visibleContentOffsets, frameDimensions) {\n\n if (_cacheEnabled) {\n var cacheKey = (options.paginationInfo || {}).currentSpreadIndex || 0;\n var fromCache = _cache.visibleLeafNodes.get(cacheKey);\n if (fromCache) {\n return fromCache;\n }\n }\n\n var $elements = this.getLeafNodeElements($(this.getBodyElement()));\n\n var visibleElements = this.getVisibleElements($elements, visibleContentOffsets, frameDimensions);\n if (_cacheEnabled) {\n _cache.visibleLeafNodes.set(cacheKey, visibleElements);\n }\n\n return visibleElements;\n };\n\n function getBaseCfiSelectedByFunc(pickerFunc) {\n var $elements = self.getLeafNodeElements($(self.getBodyElement()));\n var $selectedNode = pickerFunc($elements);\n var collapseToStart = pickerFunc([true, false]);\n var range = createRange();\n range.selectNodeContents($selectedNode[0]);\n range.collapse(collapseToStart);\n return generateCfiFromDomRange(range);\n }\n\n this.getStartCfi = function () {\n return getBaseCfiSelectedByFunc(_.first);\n };\n\n\n this.getEndCfi = function () {\n return getBaseCfiSelectedByFunc(_.last);\n };\n\n this.getElementsWithFilter = function ($root, filterFunction) {\n\n var $elements = [];\n\n function traverseCollection(elements) {\n\n if (elements == undefined) return;\n\n for (var i = 0, count = elements.length; i < count; i++) {\n\n var $element = $(elements[i]);\n\n if (filterFunction($element)) {\n $elements.push($element);\n }\n else {\n traverseCollection($element[0].children);\n }\n\n }\n }\n\n traverseCollection([$root[0]]);\n\n return $elements;\n };\n\n function isElementBlacklisted(element) {\n var classAttribute = element.className;\n // check for SVGAnimatedString\n if (classAttribute && typeof classAttribute.animVal !== \"undefined\") {\n classAttribute = classAttribute.animVal;\n } else if (classAttribute && typeof classAttribute.baseVal !== \"undefined\") {\n classAttribute = classAttribute.baseVal;\n }\n var classList = classAttribute ? classAttribute.split(' ') : [];\n var id = element.id;\n\n var classBlacklist = self.getClassBlacklist();\n if (classList.length === 1 && _.contains(classBlacklist, classList[0])) {\n return true;\n } else if (classList.length && _.intersection(classBlacklist, classList).length) {\n return true;\n }\n\n if (id && id.length && _.contains(self.getIdBlacklist(), id)) {\n return true;\n }\n\n return false;\n }\n\n this.getLeafNodeElements = function ($root) {\n\n if (_cacheEnabled) {\n var fromCache = _cache.leafNodeElements.get($root);\n if (fromCache) {\n return fromCache;\n }\n }\n\n //noinspection JSUnresolvedVariable,JSCheckFunctionSignatures\n var nodeIterator = document.createNodeIterator(\n $root[0],\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function () {\n //noinspection JSUnresolvedVariable\n return NodeFilter.FILTER_ACCEPT;\n },\n false\n );\n\n var $leafNodeElements = [];\n\n var node;\n while ((node = nodeIterator.nextNode())) {\n var isLeafNode = node.nodeType === Node.ELEMENT_NODE && !node.childElementCount && !isValidTextNodeContent(node.textContent);\n if (isLeafNode || isValidTextNode(node)){\n var element = (node.nodeType === Node.TEXT_NODE) ? node.parentNode : node;\n if (!isElementBlacklisted(element)) {\n $leafNodeElements.push($(node));\n }\n }\n }\n\n if (_cacheEnabled) {\n _cache.leafNodeElements.set($root, $leafNodeElements);\n }\n return $leafNodeElements;\n };\n\n function isElementNode(node) {\n if (!node) {\n return false;\n }\n else {\n return node.nodeType === Node.ELEMENT_NODE;\n }\n }\n\n function isValidTextNode(node) {\n if (!node) {\n return false;\n }\n if (node.nodeType === Node.TEXT_NODE) {\n\n return isValidTextNodeContent(node.nodeValue);\n }\n\n return false;\n\n }\n\n function isValidTextNodeContent(text) {\n // Heuristic to find a text node with actual text\n // If we don't do this, we may get a reference to a node that doesn't get rendered\n // (such as for example a node that has tab character and a bunch of spaces)\n // this is would be bad! ask me why.\n return !!text.trim().length;\n }\n\n this.getElements = function (selector) {\n if (!selector) {\n return $(this.getRootElement()).children();\n }\n return $(selector, this.getRootElement());\n };\n\n this.getElement = function (selector) {\n\n var $element = this.getElements(selector);\n\n if ($element.length > 0) {\n return $element;\n }\n\n return undefined;\n };\n\n function Cache() {\n var that = this;\n\n //true = survives invalidation\n var props = {\n leafNodeElements: true,\n visibleLeafNodes: false\n };\n\n _.each(props, function (val, key) {\n that[key] = new Map();\n });\n\n this._invalidate = function () {\n _.each(props, function (val, key) {\n if (!val) {\n that[key] = new Map();\n }\n });\n }\n }\n\n var _cache = new Cache();\n\n var _cacheEnabled = false;\n\n this.invalidateCache = function () {\n _cache._invalidate();\n };\n\n //if (_DEBUG) {\n\n var $debugOverlays = [];\n\n //used for visual debug atm\n function getRandomColor() {\n var letters = '0123456789ABCDEF'.split('');\n var color = '#';\n for (var i = 0; i < 6; i++) {\n color += letters[Math.round(Math.random() * 15)];\n }\n return color;\n }\n\n //used for visual debug atm\n function addOverlayRect(rects, color, doc) {\n var random = getRandomColor();\n if (!(rects instanceof Array)) {\n rects = [rects];\n }\n for (var i = 0; i != rects.length; i++) {\n var rect = rects[i];\n var overlayDiv = doc.createElement('div');\n overlayDiv.style.position = 'absolute';\n $(overlayDiv).css('z-index', '1000');\n $(overlayDiv).css('pointer-events', 'none');\n $(overlayDiv).css('opacity', '0.4');\n overlayDiv.style.border = '1px solid white';\n if (!color && !random) {\n overlayDiv.style.background = 'purple';\n } else if (random && !color) {\n overlayDiv.style.background = random;\n } else {\n if (color === true) {\n color = 'red';\n }\n overlayDiv.style.border = '1px dashed ' + color;\n overlayDiv.style.background = 'yellow';\n }\n\n overlayDiv.style.margin = overlayDiv.style.padding = '0';\n overlayDiv.style.top = (rect.top ) + 'px';\n overlayDiv.style.left = (rect.left ) + 'px';\n // we want rect.width to be the border width, so content width is 2px less.\n overlayDiv.style.width = (rect.width - 2) + 'px';\n overlayDiv.style.height = (rect.height - 2) + 'px';\n doc.documentElement.appendChild(overlayDiv);\n $debugOverlays.push($(overlayDiv));\n }\n }\n\n function drawDebugOverlayFromRect(rect) {\n var offsets = getPaginationOffsets();\n\n addOverlayRect({\n left: rect.left + offsets.left,\n top: rect.top + offsets.top,\n width: rect.width,\n height: rect.height\n }, true, self.getRootDocument());\n }\n\n function drawDebugOverlayFromDomRange(range) {\n var rect = getNodeRangeClientRect(\n range.startContainer,\n range.startOffset,\n range.endContainer,\n range.endOffset);\n drawDebugOverlayFromRect(rect);\n return rect;\n }\n\n function drawDebugOverlayFromNode(node) {\n drawDebugOverlayFromRect(getNodeClientRect(node));\n }\n\n function clearDebugOverlays() {\n _.each($debugOverlays, function ($el) {\n $el.remove();\n });\n $debugOverlays = [];\n }\n\n ReadiumSDK._DEBUG_CfiNavigationLogic = {\n clearDebugOverlays: clearDebugOverlays,\n drawDebugOverlayFromRect: drawDebugOverlayFromRect,\n drawDebugOverlayFromDomRange: drawDebugOverlayFromDomRange,\n drawDebugOverlayFromNode: drawDebugOverlayFromNode,\n debugVisibleCfis: function () {\n console.log(JSON.stringify(ReadiumSDK.reader.getPaginationInfo().openPages));\n\n var cfi1 = ReadiumSDK.reader.getFirstVisibleCfi();\n var range1 = ReadiumSDK.reader.getDomRangeFromRangeCfi(cfi1);\n console.log(cfi1, range1, drawDebugOverlayFromDomRange(range1));\n\n var cfi2 = ReadiumSDK.reader.getLastVisibleCfi();\n var range2 = ReadiumSDK.reader.getDomRangeFromRangeCfi(cfi2);\n console.log(cfi2, range2, drawDebugOverlayFromDomRange(range2));\n },\n visibleTextRangeOffsetsRunsAvg: function () {\n var arr = window.top._DEBUG_visibleTextRangeOffsetsRuns;\n return arr.reduce(function (a, b) {\n return a + b;\n }) / arr.length;\n }\n };\n\n //\n // }\n\n this.findFirstVisibleElement = function (visibleContentOffsets, frameDimensions) {\n\n var bodyElement = this.getBodyElement();\n\n if (!bodyElement) {\n return null;\n }\n\n var firstVisibleElement;\n var percentVisible = 0;\n var textNode;\n\n var treeWalker = document.createTreeWalker(\n bodyElement,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function(node) {\n if (node.nodeType === Node.ELEMENT_NODE && isElementBlacklisted(node))\n return NodeFilter.FILTER_REJECT;\n\n if (node.nodeType === Node.TEXT_NODE && !isValidTextNode(node))\n return NodeFilter.FILTER_REJECT;\n\n var visibilityResult = checkVisibilityByRectangles($(node), true, visibleContentOffsets, frameDimensions);\n return visibilityResult ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n false\n );\n\n while (treeWalker.nextNode()) {\n var node = treeWalker.currentNode;\n\n if (node.nodeType === Node.TEXT_NODE) {\n firstVisibleElement = node.parentNode;\n textNode = node;\n percentVisible = 100; // not really used, assume this value unless otherwise\n break;\n }\n\n var hasChildElements = false;\n var hasChildTextNodes = false;\n\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.ELEMENT_NODE) {\n hasChildElements = true;\n break;\n }\n if (childNode.nodeType === Node.TEXT_NODE)\n hasChildTextNodes = true;\n }\n\n // potentially stop tree traversal when first element hit with no child element nodes\n if (!hasChildElements && hasChildTextNodes) {\n for (var i=node.childNodes.length-1; i>=0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.TEXT_NODE && isValidTextNode(childNode)) {\n var visibilityResult = checkVisibilityByRectangles($(childNode), true, visibleContentOffsets, frameDimensions);\n if (visibilityResult) {\n firstVisibleElement = node;\n textNode = childNode;\n percentVisible = visibilityResult;\n break;\n }\n }\n }\n } else if (!hasChildElements) {\n firstVisibleElement = node;\n percentVisible = 100;\n textNode = null;\n break;\n }\n }\n\n if (!firstVisibleElement) {\n return null;\n }\n return {\n element: firstVisibleElement,\n textNode: textNode,\n percentVisible: percentVisible\n };\n };\n\n this.findLastVisibleElement = function (visibleContentOffsets, frameDimensions) {\n\n var bodyElement = this.getBodyElement();\n\n if (!bodyElement) {\n return null;\n }\n\n var firstVisibleElement;\n var percentVisible = 0;\n var textNode;\n\n var treeWalker = document.createTreeWalker(\n bodyElement,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function(node) {\n if (node.nodeType === Node.ELEMENT_NODE && isElementBlacklisted(node))\n return NodeFilter.FILTER_REJECT;\n\n if (node.nodeType === Node.TEXT_NODE && !isValidTextNode(node))\n return NodeFilter.FILTER_REJECT;\n\n var visibilityResult = checkVisibilityByRectangles($(node), true, visibleContentOffsets, frameDimensions);\n return visibilityResult ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n false\n );\n\n while (treeWalker.lastChild()) { }\n\n do {\n var node = treeWalker.currentNode;\n\n if (node.nodeType === Node.TEXT_NODE) {\n firstVisibleElement = node.parentNode;\n textNode = node;\n percentVisible = 100; // not really used, assume this value unless otherwise\n break;\n }\n\n var hasChildElements = false;\n var hasChildTextNodes = false;\n\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.ELEMENT_NODE) {\n hasChildElements = true;\n break;\n }\n if (childNode.nodeType === Node.TEXT_NODE)\n hasChildTextNodes = true;\n }\n\n // potentially stop tree traversal when first element hit with no child element nodes\n if (!hasChildElements && hasChildTextNodes) {\n for (var i=node.childNodes.length-1; i>=0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.TEXT_NODE && isValidTextNode(childNode)) {\n var visibilityResult = checkVisibilityByRectangles($(childNode), true, visibleContentOffsets, frameDimensions);\n if (visibilityResult) {\n firstVisibleElement = node;\n textNode = childNode;\n percentVisible = visibilityResult;\n break;\n }\n }\n }\n } else if (!hasChildElements) {\n firstVisibleElement = node;\n percentVisible = 100;\n textNode = null;\n break;\n }\n } while (treeWalker.previousNode());\n\n if (!firstVisibleElement) {\n return null;\n }\n return {\n element: firstVisibleElement,\n textNode: textNode,\n percentVisible: percentVisible\n };\n };\n\n };\nreturn CfiNavigationLogic;\n});\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/viewer_settings',[], function() {\n/**\n *\n * @param settingsData\n * @constructor\n */\nvar ViewerSettings = function(settingsData) {\n\n var self = this;\n\n /** Set to \"auto\"\n *\n * @property syntheticSpread\n * @type \n */\n\n this.syntheticSpread = \"auto\";\n\n /** \n *\n * @property fontSelection\n * @type number\n */\n \n this.fontSelection = 0;\n\n /** \n *\n * @property fontSize\n * @type number\n */\n\n this.fontSize = 100;\n\n /** \n *\n * @property columnGap\n * @type number\n */\n\n this.columnGap = 20;\n \n /** \n *\n * @property columnMaxWidth\n * @type number\n */\n\n this.columnMaxWidth = 700;\n\n /** \n *\n * @property columnMinWidth\n * @type number\n */\n\n this.columnMinWidth = 400;\n\n /** \n *\n * @property mediaOverlaysPreservePlaybackWhenScroll\n * @type bool\n */\n\n this.mediaOverlaysPreservePlaybackWhenScroll = false;\n\n /** \n *\n * @property mediaOverlaysSkipSkippables\n * @type bool\n */\n\n this.mediaOverlaysSkipSkippables = false;\n\n /** \n *\n * @property mediaOverlaysEscapables\n * @type bool\n */\n\n this.mediaOverlaysEscapeEscapables = true;\n\n /** \n *\n * @property mediaOverlaysSkippables\n * @type array\n */\n\n this.mediaOverlaysSkippables = [];\n \n /** \n *\n * @property mediaOverlaysEscapables\n * @type array\n */\n\n this.mediaOverlaysEscapables = [];\n\n /** \n *\n * @property mediaOverlaysEnableClick\n * @type bool\n */\n \n this.mediaOverlaysEnableClick = true;\n\n /** \n *\n * @property mediaOverlaysRate\n * @type number\n */\n\n this.mediaOverlaysRate = 1;\n\n /** \n *\n * @property mediaOverlaysVolume\n * @type number\n */\n\n this.mediaOverlaysVolume = 100;\n\n /** \n *\n * @property mediaOverlaysSynchronizationGranularity\n * @type string\n */\n \n this.mediaOverlaysSynchronizationGranularity = \"\";\n\n /** \n *\n * @property mediaOverlaysAutomaticPageTurn\n * @type bool\n */ \n\n this.mediaOverlaysAutomaticPageTurn = true;\n\n /** \n *\n * @property enableGPUHardwareAccelerationCSS3D\n * @type bool\n */ \n\n\n this.enableGPUHardwareAccelerationCSS3D = false;\n\n // -1 ==> disable\n // [0...n] ==> index of transition in pre-defined array\n \n /** \n *\n * @property pageTransition\n * @type number\n */ \n\n this.pageTransition = -1;\n \n /** \n *\n * @property scroll\n * @type string\n */ \n\n this.scroll = \"auto\";\n\n /**\n * Builds an array\n *\n * @method buildArray\n * @param {string} str\n * @return {array} retArr\n */\n\n function buildArray(str)\n {\n var retArr = [];\n var arr = str.split(/[\\s,;]+/); //','\n for (var i = 0; i < arr.length; i++)\n {\n var item = arr[i].trim();\n if (item !== \"\")\n {\n retArr.push(item);\n }\n }\n return retArr;\n }\n\n /**\n * Maps the properties to the settings\n *\n * @method mapProperty\n * @param {string} propName\n * @param settingsData\n * @param functionToApply\n */\n\n function mapProperty(propName, settingsData, functionToApply) {\n\n if(settingsData[propName] !== undefined) {\n if(functionToApply) {\n\n self[propName] = functionToApply(settingsData[propName]);\n }\n else {\n self[propName] = settingsData[propName];\n }\n }\n\n }\n\n /**\n * Updates the settings' new values\n *\n * @method update\n * @param settingsData\n */\n\n this.update = function(settingsData) {\n\n mapProperty(\"columnGap\", settingsData);\n mapProperty(\"columnMaxWidth\", settingsData);\n mapProperty(\"columnMinWidth\", settingsData);\n mapProperty(\"fontSize\", settingsData);\n mapProperty(\"fontSelection\", settingsData);\n mapProperty(\"mediaOverlaysPreservePlaybackWhenScroll\", settingsData);\n mapProperty(\"mediaOverlaysSkipSkippables\", settingsData);\n mapProperty(\"mediaOverlaysEscapeEscapables\", settingsData);\n mapProperty(\"mediaOverlaysSkippables\", settingsData, buildArray);\n mapProperty(\"mediaOverlaysEscapables\", settingsData, buildArray);\n mapProperty(\"mediaOverlaysEnableClick\", settingsData);\n mapProperty(\"mediaOverlaysRate\", settingsData);\n mapProperty(\"mediaOverlaysVolume\", settingsData);\n mapProperty(\"mediaOverlaysSynchronizationGranularity\", settingsData);\n mapProperty(\"mediaOverlaysAutomaticPageTurn\", settingsData);\n mapProperty(\"scroll\", settingsData);\n mapProperty(\"syntheticSpread\", settingsData);\n mapProperty(\"pageTransition\", settingsData);\n mapProperty(\"enableGPUHardwareAccelerationCSS3D\", settingsData);\n };\n\n this.update(settingsData);\n};\n return ViewerSettings;\n});\n\n", "/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n;\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define('ResizeSensor',factory);\n } else if (typeof exports === \"object\") {\n module.exports = factory();\n } else {\n root.ResizeSensor = factory();\n }\n}(typeof window !== 'undefined' ? window : this, function () {\n\n // Make sure it does not throw in a SSR (Server Side Rendering) situation\n if (typeof window === \"undefined\") {\n return null;\n }\n // Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.\n // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n // would generate too many unnecessary events.\n var requestAnimationFrame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function (fn) {\n return window.setTimeout(fn, 20);\n };\n\n /**\n * Iterate over each of the provided element(s).\n *\n * @param {HTMLElement|HTMLElement[]} elements\n * @param {Function} callback\n */\n function forEachElement(elements, callback){\n var elementsType = Object.prototype.toString.call(elements);\n var isCollectionTyped = ('[object Array]' === elementsType\n || ('[object NodeList]' === elementsType)\n || ('[object HTMLCollection]' === elementsType)\n || ('[object Object]' === elementsType)\n || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n );\n var i = 0, j = elements.length;\n if (isCollectionTyped) {\n for (; i < j; i++) {\n callback(elements[i]);\n }\n } else {\n callback(elements);\n }\n }\n\n /**\n * Class for dimension change detection.\n *\n * @param {Element|Element[]|Elements|jQuery} element\n * @param {Function} callback\n *\n * @constructor\n */\n var ResizeSensor = function(element, callback) {\n /**\n *\n * @constructor\n */\n function EventQueue() {\n var q = [];\n this.add = function(ev) {\n q.push(ev);\n };\n\n var i, j;\n this.call = function() {\n for (i = 0, j = q.length; i < j; i++) {\n q[i].call();\n }\n };\n\n this.remove = function(ev) {\n var newQueue = [];\n for(i = 0, j = q.length; i < j; i++) {\n if(q[i] !== ev) newQueue.push(q[i]);\n }\n q = newQueue;\n }\n\n this.length = function() {\n return q.length;\n }\n }\n\n /**\n *\n * @param {HTMLElement} element\n * @param {Function} resized\n */\n function attachResizeEvent(element, resized) {\n if (!element) return;\n if (element.resizedAttached) {\n element.resizedAttached.add(resized);\n return;\n }\n\n element.resizedAttached = new EventQueue();\n element.resizedAttached.add(resized);\n\n element.resizeSensor = document.createElement('div');\n element.resizeSensor.className = 'resize-sensor';\n var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';\n var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';\n\n element.resizeSensor.style.cssText = style;\n element.resizeSensor.innerHTML =\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n element.appendChild(element.resizeSensor);\n\n if (element.resizeSensor.offsetParent !== element) {\n element.style.position = 'relative';\n }\n\n var expand = element.resizeSensor.childNodes[0];\n var expandChild = expand.childNodes[0];\n var shrink = element.resizeSensor.childNodes[1];\n var dirty, rafId, newWidth, newHeight;\n var lastWidth = element.offsetWidth;\n var lastHeight = element.offsetHeight;\n\n var reset = function() {\n expandChild.style.width = '100000px';\n expandChild.style.height = '100000px';\n\n expand.scrollLeft = 100000;\n expand.scrollTop = 100000;\n\n shrink.scrollLeft = 100000;\n shrink.scrollTop = 100000;\n };\n\n reset();\n\n var onResized = function() {\n rafId = 0;\n\n if (!dirty) return;\n\n lastWidth = newWidth;\n lastHeight = newHeight;\n\n if (element.resizedAttached) {\n element.resizedAttached.call();\n }\n };\n\n var onScroll = function() {\n newWidth = element.offsetWidth;\n newHeight = element.offsetHeight;\n dirty = newWidth != lastWidth || newHeight != lastHeight;\n\n if (dirty && !rafId) {\n rafId = requestAnimationFrame(onResized);\n }\n\n reset();\n };\n\n var addEvent = function(el, name, cb) {\n if (el.attachEvent) {\n el.attachEvent('on' + name, cb);\n } else {\n el.addEventListener(name, cb);\n }\n };\n\n addEvent(expand, 'scroll', onScroll);\n addEvent(shrink, 'scroll', onScroll);\n }\n\n forEachElement(element, function(elem){\n attachResizeEvent(elem, callback);\n });\n\n this.detach = function(ev) {\n ResizeSensor.detach(element, ev);\n };\n };\n\n ResizeSensor.detach = function(element, ev) {\n forEachElement(element, function(elem){\n if (!elem) return\n if(elem.resizedAttached && typeof ev == \"function\"){\n elem.resizedAttached.remove(ev);\n if(elem.resizedAttached.length()) return;\n }\n if (elem.resizeSensor) {\n if (elem.contains(elem.resizeSensor)) {\n elem.removeChild(elem.resizeSensor);\n }\n delete elem.resizeSensor;\n delete elem.resizedAttached;\n }\n });\n };\n\n return ResizeSensor;\n\n}));\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\ndefine('readium_shared_js/views/one_page_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"./cfi_navigation_logic\", \"../helpers\", \"../models/viewer_settings\", \"../models/bookmark_data\", \"ResizeSensor\"],\n function (Globals, $, _, EventEmitter, CfiNavigationLogic, Helpers, ViewerSettings, BookmarkData, ResizeSensor) {\n\n/**\n * Renders one page of fixed layout spread\n *\n * @param options\n * @param classes\n * @param enableBookStyleOverrides\n * @constructor\n */\nvar OnePageView = function (options, classes, enableBookStyleOverrides, reader) {\n\n $.extend(this, new EventEmitter());\n\n var self = this;\n\n var _$epubHtml;\n var _$epubBody;\n var _$el;\n var _$iframe;\n var _currentSpineItem;\n var _spine = options.spine;\n var _iframeLoader = options.iframeLoader;\n var _navigationLogic = undefined;\n var _bookStyles = options.bookStyles;\n\n var _$viewport = options.$viewport;\n\n var _isIframeLoaded = false;\n\n var _$scaler;\n\n var _lastBodySize = {\n width: undefined,\n height: undefined\n };\n\n var PageTransitionHandler = function (opts) {\n var PageTransition = function (begin, end) {\n this.begin = begin;\n this.end = end;\n };\n\n var _pageTransition_OPACITY = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"transform\", \"none\");\n\n Helpers.CSSTransition($el, \"opacity 150ms ease-out\");\n\n $el.css(\"opacity\", \"1\");\n }\n );\n\n var _pageTransition_TRANSLATE = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 0.8 * (pageSwitchDir === 2 ? 1 : -1);\n var move = Helpers.CSSTransformString({\n left: Math.round(initialLeft),\n origin: \"50% 50% 0\",\n enable3D: _enable3D\n });\n $el.css(move);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 150ms ease-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransition_ROTATE = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 1.7 * (pageSwitchDir === 2 ? 1 : -1);\n var trans = Helpers.CSSTransformString({\n left: Math.round(initialLeft),\n angle: (pageSwitchDir === 2 ? -1 : 1) * 30,\n origin: \"50% 50% 0\",\n enable3D: _enable3D\n }); //(pageSwitchDir === 2 ? '0% 0%' : '100% 0%')\n $el.css(trans);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 300ms ease-in-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransition_SWING = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n // SUPER HACKY!! (just for demo)\n var isLeft = false;\n var isCenter = false;\n var isRight = false;\n for (var i = 0; i < classes.length; i++) {\n var c = classes[i].toLowerCase();\n if (c.indexOf(\"left\") >= 0) {\n isLeft = true;\n break;\n }\n if (c.indexOf(\"right\") >= 0) {\n isRight = true;\n break;\n }\n if (c.indexOf(\"center\") >= 0) {\n isCenter = true;\n break;\n }\n }\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 0.5 * ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1);\n var trans = Helpers.CSSTransformString({\n scale: 0.2,\n left: Math.round(initialLeft),\n angle: ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1) * 30,\n origin: '50% 50% 0',\n enable3D: _enable3D\n });\n $el.css(trans);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 400ms ease-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransitions = [];\n _pageTransitions.push(_pageTransition_OPACITY); // 0\n _pageTransitions.push(_pageTransition_TRANSLATE); // 1\n _pageTransitions.push(_pageTransition_ROTATE); // 2\n _pageTransitions.push(_pageTransition_SWING); // 3\n\n var _disablePageTransitions = opts.disablePageTransitions || false;\n \n // TODO: page transitions are broken, sp we disable them to avoid nasty visual artefacts\n _disablePageTransitions = true;\n\n var _pageTransition = -1;\n\n var _enable3D = new ViewerSettings({}).enableGPUHardwareAccelerationCSS3D;\n\n var _viewerSettings = undefined;\n this.updateOptions = function (o) {\n _viewerSettings = o;\n\n var settings = _viewerSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n _enable3D = true;\n }\n\n if (o.pageTransition !== null && typeof o.pageTransition !== \"undefined\") {\n _pageTransition = o.pageTransition;\n }\n };\n this.updateOptions(opts);\n\n var _pageSwitchDir = 0;\n var _pageSwitchActuallyChanged = false;\n var _pageSwitchActuallyChanged_IFRAME_LOAD = false;\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.updatePageSwitchDir = function (dir, hasChanged) {\n if (_pageSwitchActuallyChanged_IFRAME_LOAD) {\n return;\n }\n\n _pageSwitchDir = dir;\n _pageSwitchActuallyChanged = hasChanged;\n };\n\n this.onIFrameLoad = function () {\n _pageSwitchActuallyChanged_IFRAME_LOAD = true; // second pass, but initial display for transition\n };\n\n this.transformContentImmediate_BEGIN = function ($el, scale, left, top) {\n var pageSwitchActuallyChanged = _pageSwitchActuallyChanged || _pageSwitchActuallyChanged_IFRAME_LOAD;\n _pageSwitchActuallyChanged_IFRAME_LOAD = false;\n\n if (_disablePageTransitions || _pageTransition === -1) return;\n\n Helpers.CSSTransition($el, \"all 0 ease 0\");\n\n if (!pageSwitchActuallyChanged) return;\n\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\n\n if (_pageSwitchDir === 0 || !pageTransition) {\n $el.css(\"opacity\", \"0\");\n }\n else {\n pageTransition.begin(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\n }\n };\n\n this.transformContentImmediate_END = function ($el, scale, left, top) {\n if (_disablePageTransitions || _pageTransition === -1) {\n $el.css(\"transform\", \"none\");\n return;\n }\n\n setTimeout(function () {\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\n\n if (_pageSwitchDir === 0 || !pageTransition) {\n $el.css(\"transform\", \"none\");\n\n Helpers.CSSTransition($el, \"opacity 250ms linear\");\n\n $el.css(\"opacity\", \"1\");\n }\n else {\n pageTransition.end(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\n }\n\n }, 10);\n };\n };\n var _pageTransitionHandler = new PageTransitionHandler(options);\n\n\n // fixed layout does not apply user styles to publisher content, but reflowable scroll view does\n var _enableBookStyleOverrides = enableBookStyleOverrides || false;\n\n var _meta_size = {\n width: 0,\n height: 0\n };\n\n this.element = function () {\n return _$el;\n };\n\n this.meta_height = function () {\n return _meta_size.height;\n };\n\n this.meta_width = function () {\n return _meta_size.width;\n };\n\n this.isDisplaying = function () {\n\n return _isIframeLoaded; //_$iframe && _$iframe[0] && _$epubHtml\n };\n\n this.render = function () {\n\n var template = Helpers.loadTemplate(\"single_page_frame\", {});\n\n _$el = $(template);\n\n _$scaler = $(\"#scaler\", _$el);\n\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\n\n _$el.css(\"transform\", \"none\");\n\n var settings = reader.viewerSettings();\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n\n // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\n _$el.css(\"transform\", \"translateZ(0)\");\n }\n\n _$el.css(\"height\", \"100%\");\n _$el.css(\"width\", \"100%\");\n\n for (var i = 0, count = classes.length; i < count; i++) {\n _$el.addClass(classes[i]);\n }\n\n _$iframe = $(\"iframe\", _$el);\n\n return this;\n };\n\n\n this.decorateIframe = function () {\n if (!_$iframe || !_$iframe.length) return;\n\n _$iframe.css(\"border-bottom\", \"1px dashed silver\");\n _$iframe.css(\"border-top\", \"1px dashed silver\");\n };\n\n this.remove = function () {\n this.clear();\n \n _currentSpineItem = undefined;\n \n if (_$el && _$el[0]) {\n _$el.remove();\n }\n \n _$el = undefined;\n _$scaler = undefined;\n _$iframe = undefined;\n };\n\n this.clear = function () {\n _isIframeLoaded = false;\n \n if (_$iframe && _$iframe[0]) {\n _$iframe[0].src = \"\";\n }\n };\n\n this.currentSpineItem = function () {\n\n return _currentSpineItem;\n };\n\n function onIFrameLoad(success) {\n\n if (success) {\n _isIframeLoaded = true;\n var epubContentDocument = _$iframe[0].contentDocument;\n _$epubHtml = $(\"html\", epubContentDocument);\n if (!_$epubHtml || _$epubHtml.length == 0) {\n _$epubHtml = $(\"svg\", epubContentDocument);\n _$epubBody = undefined;\n } else {\n _$epubBody = $(\"body\", _$epubHtml);\n }\n\n //_$epubHtml.css(\"overflow\", \"hidden\");\n\n if (_enableBookStyleOverrides) { // not fixed layout (reflowable in scroll view)\n self.applyBookStyles();\n }\n\n updateMetaSize();\n\n initResizeSensor();\n\n _pageTransitionHandler.onIFrameLoad();\n }\n }\n\n function initResizeSensor() {\n\n if (_$epubBody // undefined with SVG spine items\n && _enableBookStyleOverrides // not fixed layout (reflowable in scroll view)\n ) {\n\n var bodyElement = _$epubBody[0];\n if (bodyElement.resizeSensor) {\n return;\n }\n\n // We need to make sure the content has indeed be resized, especially\n // the first time it is triggered\n _lastBodySize.width = $(bodyElement).width();\n _lastBodySize.height = $(bodyElement).height();\n\n bodyElement.resizeSensor = new ResizeSensor(bodyElement, function() {\n\n var newBodySize = {\n width: $(bodyElement).width(),\n height: $(bodyElement).height()\n };\n\n console.debug(\"OnePageView content resized ...\", newBodySize.width, newBodySize.height, _currentSpineItem.idref);\n \n if (newBodySize.width != _lastBodySize.width || newBodySize.height != _lastBodySize.height) {\n _lastBodySize.width = newBodySize.width;\n _lastBodySize.height = newBodySize.height;\n\n console.debug(\"... updating pagination.\");\n\n var src = _spine.package.resolveRelativeUrl(_currentSpineItem.href);\n\n Globals.logEvent(\"OnePageView.Events.CONTENT_SIZE_CHANGED\", \"EMIT\", \"one_page_view.js [ \" + _currentSpineItem.href + \" -- \" + src + \" ]\");\n \n self.emit(OnePageView.Events.CONTENT_SIZE_CHANGED, _$iframe, _currentSpineItem);\n \n //updatePagination();\n } else {\n console.debug(\"... ignored (identical dimensions).\");\n }\n });\n }\n }\n \n var _viewSettings = undefined;\n this.setViewSettings = function (settings, docWillChange) {\n\n _viewSettings = settings;\n\n if (_enableBookStyleOverrides // not fixed layout (reflowable in scroll view)\n && !docWillChange) {\n self.applyBookStyles();\n }\n\n updateMetaSize();\n\n _pageTransitionHandler.updateOptions(settings);\n };\n\n function updateHtmlFontInfo() {\n\n if (!_enableBookStyleOverrides) return; // fixed layout (not reflowable in scroll view)\n\n if (_$epubHtml && _viewSettings) {\n var i = _viewSettings.fontSelection;\n var useDefault = !reader.fonts || !reader.fonts.length || i <= 0 || (i-1) >= reader.fonts.length;\n var font = (useDefault ?\n {} :\n reader.fonts[i - 1]);\n Helpers.UpdateHtmlFontAttributes(_$epubHtml, _viewSettings.fontSize, font, function() {});\n }\n }\n\n this.applyBookStyles = function () {\n\n if (!_enableBookStyleOverrides) return; // fixed layout (not reflowable in scroll view)\n\n if (_$epubHtml) {\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\n updateHtmlFontInfo();\n }\n };\n\n //this is called by scroll_view for fixed spine item\n this.scaleToWidth = function (width) {\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n if (_meta_size.width <= 0) return; // resize event too early!\n\n var scale = width / _meta_size.width;\n self.transformContentImmediate(scale, 0, 0);\n };\n\n //this is called by scroll_view for reflowable spine item\n this.resizeIFrameToContent = function () {\n var contHeight = getContentDocHeight();\n //console.log(\"resizeIFrameToContent: \" + contHeight);\n\n self.setHeight(contHeight);\n\n self.showIFrame();\n };\n\n this.setHeight = function (height) {\n\n _$scaler.css(\"height\", height + \"px\");\n _$el.css(\"height\", height + \"px\");\n\n// _$iframe.css(\"height\", height + \"px\");\n };\n\n var _useCSSTransformToHideIframe = true;\n\n this.showIFrame = function () {\n\n _$iframe.css(\"visibility\", \"visible\");\n\n if (_useCSSTransformToHideIframe) {\n _$iframe.css(\"transform\", \"none\");\n\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n _$iframe.css(\"transform\", \"translateZ(0)\");\n }\n }\n else {\n _$iframe.css({left: \"0px\", top: \"0px\"});\n }\n };\n\n this.hideIFrame = function () {\n\n _$iframe.css(\"visibility\", \"hidden\");\n\n // With some books, despite the iframe and its containing div wrapper being hidden,\n // the iframe's contentWindow / contentDocument is still visible!\n // Thus why we translate the iframe out of view instead.\n\n if (_useCSSTransformToHideIframe) {\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n }\n\n var css = Helpers.CSSTransformString({left: \"10000\", top: \"10000\", enable3D: enable3D});\n _$iframe.css(css);\n }\n else {\n _$iframe.css({left: \"10000px\", top: \"10000px\"});\n }\n };\n\n function getContentDocHeight() {\n\n if (!_$iframe || !_$iframe.length) {\n return 0;\n }\n\n if (Helpers.isIframeAlive(_$iframe[0])) {\n var win = _$iframe[0].contentWindow;\n var doc = _$iframe[0].contentDocument;\n\n var height = Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height)); //body can be shorter!\n return height;\n }\n else if (_$epubHtml) {\n console.error(\"getContentDocHeight ??\");\n\n var jqueryHeight = _$epubHtml.height();\n return jqueryHeight;\n }\n\n return 0;\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.updatePageSwitchDir = function (dir, hasChanged) {\n _pageTransitionHandler.updatePageSwitchDir(dir, hasChanged);\n };\n\n\n this.transformContentImmediate = function (scale, left, top) {\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n var elWidth = Math.ceil(_meta_size.width * scale);\n var elHeight = Math.floor(_meta_size.height * scale);\n\n _pageTransitionHandler.transformContentImmediate_BEGIN(_$el, scale, left, top);\n\n _$el.css(\"left\", left + \"px\");\n _$el.css(\"top\", top + \"px\");\n _$el.css(\"width\", elWidth + \"px\");\n _$el.css(\"height\", elHeight + \"px\");\n\n if (!_$epubHtml) {\n// debugger;\n return;\n }\n\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n }\n \n if (_$epubBody // not SVG spine item (otherwise fails in Safari OSX)\n && reader.needsFixedLayoutScalerWorkAround()) {\n\n var css1 = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\n \n // See https://github.com/readium/readium-shared-js/issues/285 \n css1[\"min-width\"] = _meta_size.width;\n css1[\"min-height\"] = _meta_size.height;\n \n _$epubHtml.css(css1);\n\n // Ensures content dimensions matches viewport meta (authors / production tools should do this in their CSS...but unfortunately some don't).\n if (_$epubBody && _$epubBody.length) {\n _$epubBody.css({width:_meta_size.width, height:_meta_size.height});\n }\n\n var css2 = Helpers.CSSTransformString({scale : 1, enable3D: enable3D});\n css2[\"width\"] = _meta_size.width * scale;\n css2[\"height\"] = _meta_size.height * scale;\n\n _$scaler.css(css2);\n }\n else {\n var css = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\n css[\"width\"] = _meta_size.width;\n css[\"height\"] = _meta_size.height;\n _$scaler.css(css);\n }\n\n // Chrome workaround: otherwise text is sometimes invisible (probably a rendering glitch due to the 3D transform graphics backend?)\n //_$epubHtml.css(\"visibility\", \"hidden\"); // \"flashing\" in two-page spread mode is annoying :(\n _$epubHtml.css(\"opacity\", \"0.999\");\n\n self.showIFrame();\n\n setTimeout(function () {\n //_$epubHtml.css(\"visibility\", \"visible\");\n _$epubHtml.css(\"opacity\", \"1\");\n }, 0);\n \n // TODO: the CSS transitions do not work anymore, tested on Firefox and Chrome.\n // The line of code below still needs to be invoked, but the logic in _pageTransitionHandler probably need adjusting to work around the animation timing issue.\n // PS: opacity=1 above seems to interfere with the fade-in transition, probably a browser issue with mixing inner-iframe effects with effects applied to the iframe parent/ancestors.\n _pageTransitionHandler.transformContentImmediate_END(_$el, scale, left, top);\n };\n\n this.getCalculatedPageHeight = function () {\n return _$el.height();\n };\n\n this.transformContent = _.bind(_.debounce(this.transformContentImmediate, 50), self);\n\n function updateMetaSize() {\n\n _meta_size.width = 0;\n _meta_size.height = 0;\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n var size = undefined;\n\n var isFallbackDimension = false;\n var widthPercent = undefined;\n var heightPercent = undefined;\n\n var contentDocument = _$iframe[0].contentDocument;\n\n // first try to read viewport size\n var content = $('meta[name=viewport]', contentDocument).attr(\"content\");\n\n // if not found try viewbox (used for SVG)\n if (!content) {\n content = $('meta[name=viewbox]', contentDocument).attr(\"content\");\n }\n\n if (content) {\n size = parseMetaSize(content);\n }\n\n if (!size) {\n\n //var $svg = $(contentDocument).find('svg');\n // if($svg.length > 0) {\n if (contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\n\n var width = undefined;\n var height = undefined;\n\n var wAttr = contentDocument.documentElement.getAttribute(\"width\");\n var isWidthPercent = wAttr && wAttr.length >= 1 && wAttr[wAttr.length - 1] == '%';\n if (wAttr) {\n try {\n width = parseInt(wAttr, 10);\n }\n catch (err) {}\n }\n if (width && isWidthPercent) {\n widthPercent = width;\n width = undefined;\n }\n\n var hAttr = contentDocument.documentElement.getAttribute(\"height\");\n var isHeightPercent = hAttr && hAttr.length >= 1 && hAttr[hAttr.length - 1] == '%';\n if (hAttr) {\n try {\n height = parseInt(hAttr, 10);\n }\n catch (err) {}\n }\n if (height && isHeightPercent) {\n heightPercent = height;\n height = undefined;\n }\n\n if (width && height) {\n size = {\n width: width,\n height: height\n }\n }\n else {\n /// DISABLED (not a satisfactory fallback)\n // content = $svg.attr('viewBox');\n // if(content) {\n // size = parseViewBoxSize(content);\n // }\n //\n // if (size) {\n // console.warn(\"Viewport SVG: using viewbox!\");\n // }\n }\n }\n }\n\n if (!size && _currentSpineItem) {\n content = _currentSpineItem.getRenditionViewport();\n\n if (content) {\n size = parseMetaSize(content);\n if (size) {\n console.log(\"Viewport: using rendition:viewport dimensions\");\n }\n }\n }\n\n if (!size) {\n // Image fallback (auto-generated HTML template when WebView / iFrame is fed with image media type)\n var $img = $(contentDocument).find('img');\n if ($img.length > 0) {\n size = {\n width: $img.width(),\n height: $img.height()\n };\n\n var isImage = _currentSpineItem && _currentSpineItem.media_type && _currentSpineItem.media_type.length && _currentSpineItem.media_type.indexOf(\"image/\") == 0;\n if (!isImage) {\n console.warn(\"Viewport: using img dimensions!\");\n }\n }\n else {\n $img = $(contentDocument).find('image');\n if ($img.length > 0) {\n var width = undefined;\n var height = undefined;\n\n var wAttr = $img[0].getAttribute(\"width\");\n if (wAttr) {\n try {\n width = parseInt(wAttr, 10);\n }\n catch (err) {}\n }\n var hAttr = $img[0].getAttribute(\"height\");\n if (hAttr) {\n try {\n height = parseInt(hAttr, 10);\n }\n catch (err) {}\n }\n\n\n if (width && height) {\n size = {\n width: width,\n height: height\n };\n\n isFallbackDimension = true;\n\n console.warn(\"Viewport: using image dimensions!\");\n }\n }\n }\n }\n\n if (!size) {\n // Not a great fallback, as it has the aspect ratio of the full window, but it is better than no display at all.\n width = _$viewport.width();\n height = _$viewport.height();\n\n // hacky method to determine the actual available horizontal space (half the two-page spread is a reasonable approximation, this means that whatever the size of the other iframe / one_page_view, the aspect ratio of this one exactly corresponds to half the viewport rendering surface)\n var isTwoPageSyntheticSpread = $(\"iframe.iframe-fixed\", _$viewport).length > 1;\n if (isTwoPageSyntheticSpread) width *= 0.5;\n\n // the original SVG width/height might have been specified as a percentage of the containing viewport\n if (widthPercent) {\n width *= (widthPercent / 100);\n }\n if (heightPercent) {\n height *= (heightPercent / 100);\n }\n\n size = {\n width: width,\n height: height\n };\n\n isFallbackDimension = true;\n\n console.warn(\"Viewport: using browser / e-reader viewport dimensions!\");\n }\n\n if (size) {\n _meta_size.width = size.width;\n _meta_size.height = size.height;\n\n // Not strictly necessary, let's preserve the percentage values\n // if (isFallbackDimension && contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\n // contentDocument.documentElement.setAttribute(\"width\", size.width + \"px\");\n // contentDocument.documentElement.setAttribute(\"height\", size.height + \"px\");\n // }\n }\n }\n\n function onUnload (spineItem) {\n if (spineItem) {\n \n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"one_page_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, _$iframe, spineItem);\n }\n }\n\n this.onUnload = function () {\n onUnload(_currentSpineItem);\n };\n\n //expected callback signature: function(success, $iframe, spineItem, isNewlyLoaded, context)\n this.loadSpineItem = function (spineItem, callback, context) {\n\n if (_currentSpineItem != spineItem) {\n\n var prevSpineItem = _currentSpineItem;\n _currentSpineItem = spineItem;\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\n\n // both fixed layout and reflowable documents need hiding due to flashing during layout/rendering\n //hide iframe until content is scaled\n self.hideIFrame();\n\n onUnload(prevSpineItem);\n\n\n Globals.logEvent(\"OnePageView.Events.SPINE_ITEM_OPEN_START\", \"EMIT\", \"one_page_view.js [ \" + spineItem.href + \" -- \" + src + \" ]\");\n self.emit(OnePageView.Events.SPINE_ITEM_OPEN_START, _$iframe, _currentSpineItem);\n \n _iframeLoader.loadIframe(_$iframe[0], src, function (success) {\n\n if (success && callback) {\n var func = function () {\n callback(success, _$iframe, _currentSpineItem, true, context);\n };\n\n if (Helpers.isIframeAlive(_$iframe[0])) {\n onIFrameLoad(success); // applies styles\n\n func();\n }\n else {\n console.error(\"onIFrameLoad !! doc && win + TIMEOUT\");\n console.debug(spineItem.href);\n\n onIFrameLoad(success);\n\n setTimeout(func, 500);\n }\n }\n else {\n onIFrameLoad(success);\n }\n\n }, self, {spineItem: _currentSpineItem});\n }\n else {\n if (callback) {\n callback(true, _$iframe, _currentSpineItem, false, context);\n }\n }\n };\n //\n // function parseViewBoxSize(viewBoxString) {\n //\n // var parts = viewBoxString.split(' ');\n //\n // if(parts.length < 4) {\n // console.warn(viewBoxString + \" value is not valid viewBox size\")\n // return undefined;\n // }\n //\n // var width = parseInt(parts[2]);\n // var height = parseInt(parts[3]);\n //\n // if(!isNaN(width) && !isNaN(height)) {\n // return { width: width, height: height} ;\n // }\n //\n // return undefined;\n // }\n\n function parseMetaSize(content) {\n\n var pairs = content.replace(/\\s/g, '').split(\",\");\n\n var dict = {};\n\n for (var i = 0; i < pairs.length; i++) {\n var nameVal = pairs[i].split(\"=\");\n if (nameVal.length == 2) {\n\n dict[nameVal[0]] = nameVal[1];\n }\n }\n\n var width = Number.NaN;\n var height = Number.NaN;\n\n if (dict[\"width\"]) {\n width = parseInt(dict[\"width\"]);\n }\n\n if (dict[\"height\"]) {\n height = parseInt(dict[\"height\"]);\n }\n\n if (!isNaN(width) && !isNaN(height)) {\n return {width: width, height: height};\n }\n\n return undefined;\n }\n\n function getVisibleContentOffsets() {\n return {\n top: -_$el.parent().scrollTop(),\n left: 0\n };\n }\n \n function getFrameDimensions() {\n if (reader.needsFixedLayoutScalerWorkAround()) {\n var parentEl = _$el.parent()[0];\n return {\n width: parentEl.clientWidth,\n height: parentEl.clientHeight\n };\n }\n return {\n width: _meta_size.width,\n height: _meta_size.height\n };\n }\n \n this.getNavigator = function () {\n return new CfiNavigationLogic({\n $iframe: _$iframe,\n frameDimensionsGetter: getFrameDimensions,\n visibleContentOffsetsGetter: getVisibleContentOffsets,\n classBlacklist: [\"cfi-marker\", \"mo-cfi-highlight\", \"resize-sensor\", \"resize-sensor-expand\", \"resize-sensor-shrink\", \"resize-sensor-inner\"],\n elementBlacklist: [],\n idBlacklist: [\"MathJax_Message\", \"MathJax_SVG_Hidden\"]\n });\n };\n\n this.getElementByCfi = function (spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n if (spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\n };\n\n this.getElementById = function (spineItemIdref, id) {\n\n if (spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElementById(id);\n };\n\n this.getElement = function (spineItemIdref, selector) {\n\n if(spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElement(selector);\n };\n\n this.getFirstVisibleMediaOverlayElement = function() {\n var navigation = self.getNavigator();\n return navigation.getFirstVisibleMediaOverlayElement();\n };\n\n this.offset = function () {\n if (_$iframe) {\n return _$iframe.offset();\n }\n return undefined;\n };\n\n this.getVisibleElementsWithFilter = function (filterFunction) {\n var navigation = self.getNavigator();\n var elements = navigation.getVisibleElementsWithFilter(null, filterFunction);\n return elements;\n };\n\n this.getVisibleElements = function (selector) {\n\n var navigation = self.getNavigator();\n var elements = navigation.getAllVisibleElementsWithSelector(selector);\n return elements;\n };\n\n this.getAllElementsWithFilter = function (filterFunction, outsideBody) {\n var navigation = self.getNavigator();\n var elements = navigation.getAllElementsWithFilter(filterFunction, outsideBody);\n return elements;\n };\n\n this.getElements = function(spineItemIdref, selector) {\n\n if(spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n\n return navigation.getElements(selector);\n };\n\n this.getNodeRangeInfoFromCfi = function (spineIdRef, partialCfi) {\n if (spineIdRef != _currentSpineItem.idref) {\n console.warn(\"spine item is not loaded\");\n return undefined;\n }\n var navigation = self.getNavigator();\n\n return navigation.getNodeRangeInfoFromCfi(partialCfi);\n };\n\n function createBookmarkFromCfi(cfi) {\n if (!_currentSpineItem) {\n return null;\n }\n\n return new BookmarkData(_currentSpineItem.idref, cfi);\n }\n\n this.getLoadedContentFrames = function () {\n return [{spineItem: _currentSpineItem, $iframe: _$iframe}];\n };\n\n this.getFirstVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return createBookmarkFromCfi(self.getNavigator().getFirstVisibleCfi(visibleContentOffsets, frameDimensions));\n };\n\n this.getLastVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return createBookmarkFromCfi(self.getNavigator().getLastVisibleCfi(visibleContentOffsets, frameDimensions));\n };\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n return self.getNavigator().getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n return createBookmarkFromCfi(self.getNavigator().getRangeCfiFromDomRange(domRange));\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint) {\n return createBookmarkFromCfi(self.getNavigator().getVisibleCfiFromPoint(x, y, precisePoint));\n };\n\n this.getRangeCfiFromPoints = function(startX, startY, endX, endY) {\n return createBookmarkFromCfi(self.getNavigator().getRangeCfiFromPoints(startX, startY, endX, endY));\n };\n\n this.getCfiForElement = function(element) {\n return createBookmarkFromCfi(self.getNavigator().getCfiForElement(element));\n };\n\n this.getElementFromPoint = function (x, y) {\n return self.getNavigator().getElementFromPoint(x, y);\n };\n\n this.getStartCfi = function () {\n return createBookmarkFromCfi(self.getNavigator().getStartCfi());\n };\n\n this.getEndCfi = function () {\n return createBookmarkFromCfi(self.getNavigator().getEndCfi());\n };\n\n this.getNearestCfiFromElement = function(element) {\n return createBookmarkFromCfi(self.getNavigator().getNearestCfiFromElement(element));\n };\n};\n\nOnePageView.Events = {\n SPINE_ITEM_OPEN_START: \"SpineItemOpenStart\",\n CONTENT_SIZE_CHANGED: \"ContentSizeChanged\"\n};\nreturn OnePageView;\n});\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/page_open_request',[],function() {\n/**\n * Representation of opening page request\n * Provides the spine item to be opened and one of the following properties:\n * spineItemPageIndex {Number},\n * elementId {String},\n * elementCfi {String},\n * firstPage {bool},\n * lastPage {bool}\n *\n * @class Models.PageOpenRequest\n * @constructor\n * @param {Models.SpineItem} spineItem\n * @param {object} [initiator]\n *\n\n */\nvar PageOpenRequest = function(spineItem, initiator) {\n\n this.spineItem = spineItem;\n this.spineItemPageIndex = undefined;\n this.elementId = undefined;\n this.elementCfi = undefined;\n this.firstVisibleCfi = undefined;\n this.lastVisibleCfi = undefined;\n this.firstPage = false;\n this.lastPage = false;\n this.initiator = initiator;\n\n /**\n * Resets the reading system\n *\n * @method reset\n */\n\n this.reset = function() {\n this.spineItemPageIndex = undefined;\n this.elementId = undefined;\n this.elementCfi = undefined;\n this.firstPage = false;\n this.lastPage = false;\n };\n\n /**\n * Sets the first page of the book\n *\n * @method setFirstPage\n */\n\n this.setFirstPage = function() {\n this.reset();\n this.firstPage = true;\n };\n\n /**\n * Sets the last page of the book\n *\n * @method setLastPage\n */\n\n this.setLastPage = function() {\n this.reset();\n this.lastPage = true;\n };\n\n /**\n * Sets the index of the book\n *\n * @method setPageIndex\n * @param pageIndex\n */\n\n this.setPageIndex = function(pageIndex) {\n this.reset();\n this.spineItemPageIndex = pageIndex;\n };\n\n /**\n * Sets the ID of the current element\n *\n * @method setElementId\n * @param {number} elementId \n */\n\n this.setElementId = function(elementId) {\n this.reset();\n this.elementId = elementId;\n };\n \n /**\n * Sets the CFI of the current element\n *\n * @method setElementCfi\n * @param elementCfi\n */\n\n this.setElementCfi = function(elementCfi) {\n this.reset();\n this.elementCfi = elementCfi;\n };\n\n // Used by ReflowView to better keep track of the current page\n // using just a bookmark to firstVisibleElement makes the current\n // page gradually shift to the beginning of the chapter. By bookmarking\n // both the first and last visible elements, we can keep track of the \n // \"middle\" of the visible area.\n this.setFirstAndLastVisibleCfi = function(firstVisibleCfi, lastVisibleCfi) {\n this.reset();\n this.firstVisibleCfi = firstVisibleCfi;\n this.lastVisibleCfi = lastVisibleCfi;\n }\n\n};\n\nreturn PageOpenRequest;\n});\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine ('readium_shared_js/views/fixed_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"../models/current_pages_info\",\n \"../models/fixed_page_spread\", \"./one_page_view\", \"../models/page_open_request\", \"../helpers\"],\n function(Globals, $, _, EventEmitter, BookmarkData, CurrentPagesInfo,\n Spread, OnePageView, PageOpenRequest, Helpers) {\n/**\n * View for rendering fixed layout page spread\n * @param options\n * @param reader\n * @constructor\n */\nvar FixedView = function(options, reader){\n\n $.extend(this, new EventEmitter());\n\n var self = this;\n\n var _$el;\n var _$viewport = options.$viewport;\n var _spine = options.spine;\n var _userStyles = options.userStyles;\n var _bookStyles = options.bookStyles;\n var _zoom = options.zoom || {style: 'default'};\n var _currentScale;\n var _iframeLoader = options.iframeLoader;\n var _viewSettings = undefined;\n\n var _leftPageView = createOnePageView(\"fixed-page-frame-left\");\n var _rightPageView = createOnePageView(\"fixed-page-frame-right\");\n var _centerPageView = createOnePageView(\"fixed-page-frame-center\");\n\n var _pageViews = [];\n _pageViews.push(_leftPageView);\n _pageViews.push(_rightPageView);\n _pageViews.push(_centerPageView);\n\n var _spread = new Spread(_spine, false);\n var _bookMargins;\n var _contentMetaSize;\n var _isRedrowing = false;\n var _redrawRequest = false;\n\n function createOnePageView(elementClass) {\n\n var pageView = new OnePageView(options,\n [elementClass],\n false, //enableBookStyleOverrides\n reader\n );\n\n\n pageView.on(OnePageView.Events.SPINE_ITEM_OPEN_START, function($iframe, spineItem) {\n \n Globals.logEvent(\"OnePageView.Events.SPINE_ITEM_OPEN_START\", \"ON\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOAD_START\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\n });\n\n pageView.on(Globals.Events.CONTENT_DOCUMENT_UNLOADED, function($iframe, spineItem) {\n\n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"ON\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n\n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, $iframe, spineItem);\n });\n\n return pageView;\n }\n\n this.isReflowable = function() {\n return false;\n };\n\n this.setZoom = function(zoom){\n _zoom = zoom;\n\n resizeBook(false); \n }\n\n this.render = function(){\n\n var template = Helpers.loadTemplate(\"fixed_book_frame\", {});\n\n _$el = $(template);\n\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\n \n _$el.css(\"overflow\", \"hidden\");\n \n // Removed, see one_page_view@render()\n // var settings = reader.viewerSettings();\n // if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\n // {\n // //defaults\n // settings = new Globals.Models.ViewerSettings({});\n // }\n // if (settings.enableGPUHardwareAccelerationCSS3D) {\n //\n // // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\n // _$el.css(\"transform\", \"translateZ(0)\");\n // }\n \n _$viewport.append(_$el);\n\n self.applyStyles();\n\n return this;\n };\n\n this.remove = function() {\n\n _$el.remove();\n };\n\n\n this.setViewSettings = function(settings, docWillChange) {\n \n _viewSettings = settings;\n \n _spread.setSyntheticSpread(Helpers.deduceSyntheticSpread(_$viewport, getFirstVisibleItem(), _viewSettings) == true); // force boolean value (from truthy/falsey return value)\n\n var views = getDisplayingViews();\n for(var i = 0, count = views.length; i < count; i++) {\n views[i].setViewSettings(settings, docWillChange);\n }\n };\n\n function getFirstVisibleItem() {\n\n var visibleItems = _spread.validItems();\n return visibleItems[0];\n }\n\n function redraw(initiator, paginationRequest) {\n\n if(_isRedrowing) {\n _redrawRequest = {initiator: initiator, paginationRequest: paginationRequest};\n return;\n }\n\n _isRedrowing = true;\n\n var context = {isElementAdded : false};\n\n var pageLoadDeferrals = createPageLoadDeferrals([\n {pageView: _leftPageView, spineItem: _spread.leftItem, context: context},\n {pageView: _rightPageView, spineItem: _spread.rightItem, context: context},\n {pageView: _centerPageView, spineItem: _spread.centerItem, context: context}]);\n\n $.when.apply($, pageLoadDeferrals).done(function(){\n _isRedrowing = false;\n\n if(_redrawRequest) {\n var p1 = _redrawRequest.initiator;\n var p2 = _redrawRequest.paginationRequest;\n _redrawRequest = undefined;\n redraw(p1, p2);\n }\n else {\n \n if(context.isElementAdded) {\n //self.applyStyles();\n \n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\n updateBookMargins();\n // updateContentMetaSize() and resizeBook() are invoked in onPagesLoaded below\n }\n\n if (paginationRequest)\n {\n onPagesLoaded(initiator, paginationRequest.spineItem, paginationRequest.elementId)\n }\n else\n {\n onPagesLoaded(initiator);\n }\n }\n\n });\n\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n var updatePageSwitchDir = function(dir, hasChanged)\n {\n // irrespective of display state\n if (_leftPageView) _leftPageView.updatePageSwitchDir(dir, hasChanged);\n if (_rightPageView) _rightPageView.updatePageSwitchDir(dir, hasChanged);\n if (_centerPageView) _centerPageView.updatePageSwitchDir(dir, hasChanged);\n\n // var views = getDisplayingViews();\n // for(var i = 0, count = views.length; i < count; i++) {\n // views[i].updatePageSwitchDir(dir, hasChanged);\n // }\n };\n \n\n this.applyStyles = function() {\n\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\n updateBookMargins();\n \n updateContentMetaSize();\n resizeBook();\n };\n\n this.applyBookStyles = function() {\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n views[i].applyBookStyles();\n }\n };\n\n function createPageLoadDeferrals(viewItemPairs) {\n\n var pageLoadDeferrals = [];\n\n for(var i = 0; i < viewItemPairs.length; i++) {\n\n var dfd = updatePageViewForItem(viewItemPairs[i].pageView, viewItemPairs[i].spineItem, viewItemPairs[i].context);\n pageLoadDeferrals.push(dfd);\n }\n\n return pageLoadDeferrals;\n\n }\n\n function onPagesLoaded(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\n \n updateContentMetaSize();\n resizeBook();\n \n window.setTimeout(function () {\n \n Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"EMIT\", \"fixed_view.js\");\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\n paginationInfo: self.getPaginationInfo(),\n initiator: initiator,\n spineItem: paginationRequest_spineItem,\n elementId: paginationRequest_elementId\n });\n }, 60);\n //this delay of 60ms is to ensure that it triggers\n // after any other 10-50ms timers that defer the pagination process in OnePageView\n }\n\n this.onViewportResize = function() {\n\n //because change of the viewport orientation can alter pagination behaviour we have to check if\n //visible content stays same\n\n var firstVisibleItem = getFirstVisibleItem();\n if(!firstVisibleItem) {\n return;\n }\n\n var isSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, firstVisibleItem, _viewSettings) == true; // force boolean value (from truthy/falsey return value)\n\n if(isSpreadChanged(firstVisibleItem, isSyntheticSpread)) {\n _spread.setSyntheticSpread(isSyntheticSpread);\n var paginationRequest = new PageOpenRequest(firstVisibleItem, self);\n self.openPage(paginationRequest);\n }\n else {\n resizeBook(true);\n }\n };\n\n function isSpreadChanged(firstVisibleItem, isSyntheticSpread) {\n\n var tmpSpread = new Spread(_spine, isSyntheticSpread);\n tmpSpread.openItem(firstVisibleItem);\n\n return _spread.leftItem != tmpSpread.leftItem || _spread.rightItem != tmpSpread.rightItem || _spread.centerItem != tmpSpread.centerItem;\n }\n\n this.getViewScale = function(){\n return _currentScale;\n };\n\n function isContentRendered() {\n\n if(!_contentMetaSize || !_bookMargins) {\n return false;\n }\n\n var viewportWidth = _$viewport.width();\n var viewportHeight = _$viewport.height();\n\n return viewportWidth && viewportHeight;\n }\n\n function resizeBook(viewportIsResizing) {\n\n updatePageSwitchDir(0, false);\n \n if(!isContentRendered()) {\n return;\n }\n\n var viewportWidth = _$viewport.width();\n var viewportHeight = _$viewport.height();\n\n var leftPageMargins = _leftPageView.isDisplaying() ? Helpers.Margins.fromElement(_leftPageView.element()) : Helpers.Margins.empty();\n var rightPageMargins = _rightPageView.isDisplaying() ? Helpers.Margins.fromElement(_rightPageView.element()) : Helpers.Margins.empty();\n var centerPageMargins = _centerPageView.isDisplaying() ? Helpers.Margins.fromElement(_centerPageView.element()) : Helpers.Margins.empty();\n\n var pageMargins = getMaxPageMargins(leftPageMargins, rightPageMargins, centerPageMargins);\n\n var potentialTargetElementSize = { width: viewportWidth - _bookMargins.width(),\n height: viewportHeight - _bookMargins.height()};\n\n var potentialContentSize = { width: potentialTargetElementSize.width - pageMargins.width(),\n height: potentialTargetElementSize.height - pageMargins.height() };\n\n if(potentialTargetElementSize.width <= 0 || potentialTargetElementSize.height <= 0) {\n return;\n }\n\n var horScale = potentialContentSize.width / _contentMetaSize.width;\n var verScale = potentialContentSize.height / _contentMetaSize.height;\n \n _$viewport.css(\"overflow\", \"auto\");\n \n var scale;\n if (_zoom.style == 'fit-width'){\n scale = horScale;\n }\n else if (_zoom.style == 'fit-height'){\n scale = verScale;\n }\n else if (_zoom.style == 'user'){\n scale = _zoom.scale;\n }\n else{\n scale = Math.min(horScale, verScale);\n\n // no need for pan during \"viewport fit\" zoom\n _$viewport.css(\"overflow\", \"hidden\");\n }\n\n _currentScale = scale;\n\n var contentSize = { width: _contentMetaSize.width * scale,\n height: _contentMetaSize.height * scale };\n\n var targetElementSize = { width: contentSize.width + pageMargins.width(),\n height: contentSize.height + pageMargins.height() };\n\n var bookSize = { width: targetElementSize.width + _bookMargins.width(),\n height: targetElementSize.height + _bookMargins.height() };\n\n\n var bookLeft = Math.floor((viewportWidth - bookSize.width) / 2);\n var bookTop = Math.floor((viewportHeight - bookSize.height) / 2);\n\n if(bookLeft < 0) bookLeft = 0;\n if(bookTop < 0) bookTop = 0;\n \n _$el.css(\"left\", bookLeft + \"px\");\n _$el.css(\"top\", bookTop + \"px\");\n _$el.css(\"width\", targetElementSize.width + \"px\");\n _$el.css(\"height\", targetElementSize.height + \"px\");\n\n var left = _bookMargins.padding.left;\n var top = _bookMargins.padding.top;\n\n var transFunc = viewportIsResizing ? \"transformContentImmediate\" : \"transformContent\";\n\n if(_leftPageView.isDisplaying()) {\n\n _leftPageView[transFunc](scale, left, top);\n }\n\n if(_rightPageView.isDisplaying()) {\n\n left += _contentMetaSize.separatorPosition * scale;\n\n if(_leftPageView.isDisplaying()) {\n left += leftPageMargins.left;\n }\n\n _rightPageView[transFunc](scale, left, top);\n }\n\n if(_centerPageView.isDisplaying()) {\n\n _centerPageView[transFunc](scale, left, top);\n }\n \n Globals.logEvent(\"FXL_VIEW_RESIZED\", \"EMIT\", \"fixed_view.js\");\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\n }\n\n function getMaxPageMargins(leftPageMargins, rightPageMargins, centerPageMargins) {\n\n var sumMargin = {\n left: Math.max(leftPageMargins.margin.left, rightPageMargins.margin.left, centerPageMargins.margin.left),\n right: Math.max(leftPageMargins.margin.right, rightPageMargins.margin.right, centerPageMargins.margin.right),\n top: Math.max(leftPageMargins.margin.top, rightPageMargins.margin.top, centerPageMargins.margin.top),\n bottom: Math.max(leftPageMargins.margin.bottom, rightPageMargins.margin.bottom, centerPageMargins.margin.bottom)\n };\n\n var sumBorder = {\n left: Math.max(leftPageMargins.border.left, rightPageMargins.border.left, centerPageMargins.border.left),\n right: Math.max(leftPageMargins.border.right, rightPageMargins.border.right, centerPageMargins.border.right),\n top: Math.max(leftPageMargins.border.top, rightPageMargins.border.top, centerPageMargins.border.top),\n bottom: Math.max(leftPageMargins.border.bottom, rightPageMargins.border.bottom, centerPageMargins.border.bottom)\n };\n\n var sumPAdding = {\n left: Math.max(leftPageMargins.padding.left, rightPageMargins.padding.left, centerPageMargins.padding.left),\n right: Math.max(leftPageMargins.padding.right, rightPageMargins.padding.right, centerPageMargins.padding.right),\n top: Math.max(leftPageMargins.padding.top, rightPageMargins.padding.top, centerPageMargins.padding.top),\n bottom: Math.max(leftPageMargins.padding.bottom, rightPageMargins.padding.bottom, centerPageMargins.padding.bottom)\n };\n\n return new Helpers.Margins(sumMargin, sumBorder, sumPAdding);\n\n }\n\n function updateContentMetaSize() {\n\n _contentMetaSize = {};\n\n if(_centerPageView.isDisplaying()) {\n _contentMetaSize.width = _centerPageView.meta_width();\n _contentMetaSize.height = _centerPageView.meta_height();\n _contentMetaSize.separatorPosition = 0;\n }\n else if(_leftPageView.isDisplaying() && _rightPageView.isDisplaying()) {\n if(_leftPageView.meta_height() == _rightPageView.meta_height()) {\n _contentMetaSize.width = _leftPageView.meta_width() + _rightPageView.meta_width();\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n else {\n //normalize by height\n _contentMetaSize.width = _leftPageView.meta_width() + _rightPageView.meta_width() * (_leftPageView.meta_height() / _rightPageView.meta_height());\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n }\n else if(_leftPageView.isDisplaying()) {\n _contentMetaSize.width = _leftPageView.meta_width() * 2;\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n else if(_rightPageView.isDisplaying()) {\n _contentMetaSize.width = _rightPageView.meta_width() * 2;\n _contentMetaSize.height = _rightPageView.meta_height();\n _contentMetaSize.separatorPosition = _rightPageView.meta_width();\n }\n else {\n _contentMetaSize = undefined;\n }\n\n }\n\n function updateBookMargins() {\n _bookMargins = Helpers.Margins.fromElement(_$el);\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.openPage = function(paginationRequest, dir) {\n\n if(!paginationRequest.spineItem) {\n return;\n }\n\n var leftItem = _spread.leftItem;\n var rightItem = _spread.rightItem;\n var centerItem = _spread.centerItem;\n\n var isSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, paginationRequest.spineItem, _viewSettings) == true; // force boolean value (from truthy/falsey return value)\n _spread.setSyntheticSpread(isSyntheticSpread);\n _spread.openItem(paginationRequest.spineItem);\n \n var hasChanged = leftItem !== _spread.leftItem || rightItem !== _spread.rightItem || centerItem !== _spread.centerItem;\n \n if (dir === null || typeof dir === \"undefined\") dir = 0;\n \n updatePageSwitchDir(dir === 0 ? 0 : (_spread.spine.isRightToLeft() ? (dir === 1 ? 2 : 1) : dir), hasChanged);\n \n redraw(paginationRequest.initiator, paginationRequest);\n };\n\n\n this.openPagePrev = function(initiator) {\n\n _spread.openPrev();\n \n updatePageSwitchDir(_spread.spine.isRightToLeft() ? 2 : 1, true);\n \n redraw(initiator, undefined);\n };\n\n this.openPageNext = function(initiator) {\n\n _spread.openNext();\n \n updatePageSwitchDir(_spread.spine.isRightToLeft() ? 1 : 2, true);\n \n redraw(initiator, undefined);\n };\n\n function updatePageViewForItem(pageView, item, context) {\n\n var dfd = $.Deferred();\n\n if(!item) {\n if(pageView.isDisplaying()) {\n pageView.remove();\n }\n\n dfd.resolve();\n }\n else {\n\n //if(pageView.isDisplaying()) { // always DO (no iframe reuse, as this creates problems with BlobURIs, and navigator history ... just like the reflowable view, we re-create an iframe from the template whenever needed for a new spine item URI)\n pageView.remove();\n \n //if(!pageView.isDisplaying()) { // always TRUE\n _$el.append(pageView.render().element());\n context.isElementAdded = true;\n \n\n pageView.loadSpineItem(item, function(success, $iframe, spineItem, isNewContentDocumentLoaded, context){\n\n if(success && isNewContentDocumentLoaded) {\n\n //if we a re loading fixed view meta size should be defined\n if(!pageView.meta_height() || !pageView.meta_width()) {\n console.error(\"Invalid document \" + spineItem.href + \": viewport is not specified!\");\n }\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\n }\n\n dfd.resolve();\n\n }, context);\n }\n\n return dfd.promise();\n }\n\n this.getPaginationInfo = function() {\n\n var paginationInfo = new CurrentPagesInfo(_spine, true);\n\n var spreadItems = [_spread.leftItem, _spread.rightItem, _spread.centerItem];\n\n for(var i = 0; i < spreadItems.length; i++) {\n\n var spreadItem = spreadItems[i];\n\n if(spreadItem) {\n paginationInfo.addOpenPage(0, 1, spreadItem.idref, spreadItem.index);\n }\n }\n\n return paginationInfo;\n };\n\n this.bookmarkCurrentPage = function() {\n\n var views = getDisplayingViews();\n var loadedSpineItems = this.getLoadedSpineItems();\n\n if (views.length > 0) {\n return views[0].getFirstVisibleCfi();\n } else if (loadedSpineItems.length > 0) {\n return new BookmarkData(this.getLoadedSpineItems()[0].idref, null);\n }\n\n return undefined;\n };\n\n function getDisplayingViews() {\n\n var viewsToCheck = [];\n\n if( _spine.isLeftToRight() ) {\n viewsToCheck = [_leftPageView, _centerPageView, _rightPageView];\n }\n else {\n viewsToCheck = [_rightPageView, _centerPageView, _leftPageView];\n }\n\n var views = [];\n\n for(var i = 0, count = viewsToCheck.length; i < count; i++) {\n if(viewsToCheck[i].isDisplaying()) {\n views.push(viewsToCheck[i]);\n }\n }\n\n return views;\n }\n\n this.getLoadedSpineItems = function() {\n\n return _spread.validItems();\n };\n\n function callOnPageView(spineItemIdref, fn) {\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.currentSpineItem().idref == spineItemIdref) {\n return fn(view);\n }\n }\n\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n this.getElement = function (spineItemIdref, selector) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElement(spineItemIdref, selector);\n });\n };\n\n this.getElementById = function (spineItemIdref, id) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementById(spineItemIdref, id);\n });\n };\n\n\n this.getElementByCfi = function(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementByCfi(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist);\n });\n };\n \n this.getFirstVisibleMediaOverlayElement = function() {\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n var el = views[i].getFirstVisibleMediaOverlayElement();\n if (el) return el;\n }\n\n return undefined;\n };\n\n this.insureElementVisibility = function(spineItemId, element, initiator) {\n\n //TODO: during zoom+pan, playing element might not actually be visible\n\n };\n \n this.getElements = function(spineItemIdref, selector) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElements(spineItemIdref, selector);\n });\n };\n \n this.isElementVisible = function($element){\n\n //for now we assume that for fixed layouts, elements are always visible\n return true;\n };\n \n this.getVisibleElementsWithFilter = function(filterFunction, includeSpineItems) {\n\n var elements = [];\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n //for now we assume that for fixed layouts, elements are always visible\n elements.push(views[i].getAllElementsWithFilter(filterFunction, includeSpineItems));\n }\n\n return elements;\n };\n\n this.getVisibleElements = function (selector, includeSpineItems) {\n\n var elements = [];\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n //for now we assume that for fixed layouts, elements are always visible\n if (includeSpineItems) {\n elements.push({elements: views[i].getElements(views[i].currentSpineItem().idref, selector), spineItem: views[i].currentSpineItem()});\n } else {\n elements.push(views[i].getElements(views[i].currentSpineItem().idref, selector));\n }\n }\n\n return elements;\n };\n\n this.isElementVisible = function($element){\n\n //for now we assume that for fixed layouts, elements are always visible\n return true;\n };\n \n this.isVisibleSpineItemElementCfi = function (spineItemIdref, partialCfi) {\n\n return callOnPageView(spineItemIdref, function (view) {\n //for now we assume that for fixed layouts, everything is always visible\n return true;\n });\n };\n\n this.getNodeRangeInfoFromCfi = function (spineItemIdref, partialCfi) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getNodeRangeInfoFromCfi(spineItemIdref, partialCfi);\n });\n };\n\n\n this.getFirstVisibleCfi = function () {\n var views = getDisplayingViews();\n if (views.length > 0) {\n return views[0].getFirstVisibleCfi();\n }\n return undefined;\n };\n\n this.getLastVisibleCfi = function () {\n var views = getDisplayingViews();\n if (views.length > 0) {\n return views[views.length - 1].getLastVisibleCfi();\n }\n return undefined;\n };\n\n this.getDomRangesFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var views = getDisplayingViews();\n if (rangeCfi2 && rangeCfi.idref !== rangeCfi2.idref) {\n var ranges = [];\n for (var i = 0, count = views.length; i < count; i++) {\n var view = views[i];\n if (view.currentSpineItem().idref === rangeCfi.idref) {\n var last = view.getLastVisibleCfi();\n ranges.push(view.getDomRangeFromRangeCfi(rangeCfi.contentCFI, last.contentCFI, inclusive));\n } else if (view.currentSpineItem().idref === rangeCfi2.idref) {\n var first = view.getFirstVisibleCfi();\n ranges.push(view.getDomRangeFromRangeCfi(first.contentCFI, rangeCfi2.contentCFI, inclusive));\n }\n }\n return ranges;\n }\n\n return [this.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n },\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var views = getDisplayingViews();\n if (rangeCfi2 && rangeCfi.idref !== rangeCfi2.idref) {\n console.error(\"getDomRangeFromRangeCfi: both CFIs must be scoped under the same spineitem idref\");\n return undefined;\n }\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.currentSpineItem().idref === rangeCfi.idref) {\n return view.getDomRangeFromRangeCfi(rangeCfi.contentCFI, rangeCfi2 ? rangeCfi2.contentCFI : null, inclusive);\n }\n }\n\n return undefined;\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === domRange.startContainer.ownerDocument) {\n return view.getRangeCfiFromDomRange(domRange);\n }\n }\n\n return undefined;\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getVisibleCfiFromPoint: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getVisibleCfiFromPoint(x,y, precisePoint);\n });\n };\n\n this.getRangeCfiFromPoints = function (startX, startY, endX, endY, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getRangeCfiFromPoints: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getRangeCfiFromPoints(startX, startY, endX, endY);\n });\n };\n\n this.getCfiForElement = function (element) {\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === element.ownerDocument) {\n return view.getCfiForElement(element);\n }\n }\n\n return undefined;\n };\n\n this.getElementFromPoint = function (x, y, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getElementFromPoint: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementFromPoint(x,y);\n });\n };\n\n this.getStartCfi = function () {\n return getDisplayingViews()[0].getStartCfi();\n };\n\n this.getEndCfi = function () {\n return getDisplayingViews()[0].getEndCfi();\n };\n\n this.getNearestCfiFromElement = function(element) {\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === element.ownerDocument) {\n return view.getNearestCfiFromElement(element);\n }\n }\n\n };\n\n};\n return FixedView;\n});\n\n", - "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/iframe_loader',[\"jquery\", \"underscore\"], function($, _) {\n/**\n *\n * @constructor\n */\nvar IFrameLoader = function() {\n\n var self = this;\n var eventListeners = {};\n\n\n this.addIFrameEventListener = function (eventName, callback, context) {\n\n if (eventListeners[eventName] == undefined) {\n eventListeners[eventName] = [];\n }\n\n eventListeners[eventName].push({callback: callback, context: context});\n };\n\n this.updateIframeEvents = function (iframe) {\n\n _.each(eventListeners, function (value, key) {\n $(iframe.contentWindow).off(key);\n for (var i = 0, count = value.length; i < count; i++) {\n $(iframe.contentWindow).on(key, value[i].callback, value[i].context);\n }\n });\n };\n\n this.loadIframe = function (iframe, src, callback, context, attachedData) {\n\n if (!iframe.baseURI) {\n if (typeof location !== 'undefined') {\n iframe.baseURI = location.href + \"\";\n }\n console.error(\"!iframe.baseURI => \" + iframe.baseURI);\n }\n \n console.log(\"EPUB doc iframe src:\");\n console.log(src);\n console.log(\"EPUB doc iframe base URI:\");\n console.log(iframe.baseURI);\n \n iframe.setAttribute(\"data-baseUri\", iframe.baseURI);\n iframe.setAttribute(\"data-src\", src);\n\n var loadedDocumentUri = new URI(src).absoluteTo(iframe.baseURI).search('').hash('').toString();\n\n self._loadIframeWithUri(iframe, attachedData, loadedDocumentUri, function () {\n \n callback.call(context, true, attachedData);\n });\n };\n\n this._loadIframeWithUri = function (iframe, attachedData, contentUri, callback) {\n\n iframe.onload = function () {\n\n var doc = iframe.contentDocument || iframe.contentWindow.document;\n $('svg', doc).on(\"load\", function(){\n console.log('SVG loaded');\n });\n \n self.updateIframeEvents(iframe);\n\n var mathJax = iframe.contentWindow.MathJax;\n if (mathJax) {\n \n console.log(\"MathJax VERSION: \" + mathJax.cdnVersion + \" // \" + mathJax.fileversion + \" // \" + mathJax.version);\n \n var useFontCache = true; // default in MathJax\n \n // Firefox fails to render SVG otherwise\n if (mathJax.Hub.Browser.isFirefox) {\n useFontCache = false;\n }\n \n // Chrome 49+ fails to render SVG otherwise\n // https://github.com/readium/readium-js/issues/138\n if (mathJax.Hub.Browser.isChrome) {\n useFontCache = false;\n }\n \n // Edge fails to render SVG otherwise\n // https://github.com/readium/readium-js-viewer/issues/394#issuecomment-185382196\n if (window.navigator.userAgent.indexOf(\"Edge\") > 0) {\n useFontCache = false;\n }\n \n mathJax.Hub.Config({showMathMenu:false, messageStyle: \"none\", showProcessingMessages: true, SVG:{useFontCache:useFontCache}});\n \n // If MathJax is being used, delay the callback until it has completed rendering\n var mathJaxCallback = _.once(callback);\n try {\n mathJax.Hub.Queue(mathJaxCallback);\n } catch (err) {\n console.error(\"MathJax fail!\");\n callback();\n }\n // Or at an 8 second timeout, which ever comes first\n //window.setTimeout(mathJaxCallback, 8000);\n } else {\n callback();\n }\n };\n\n iframe.setAttribute(\"src\", contentUri);\n };\n\n};\n\nreturn IFrameLoader;\n});\n\n", - "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js'], function($, Helpers, epubCfi) {\n/**\n *\n * @param reader\n * @constructor\n */\nvar InternalLinksSupport = function(reader) {\n\n var self = this;\n\n function splitCfi(fullCfi) {\n\n var startIx = fullCfi.indexOf(\"(\");\n var bungIx = fullCfi.indexOf(\"!\");\n var endIx = fullCfi.indexOf(\")\");\n\n if(bungIx == -1) {\n return undefined;\n }\n\n if(endIx == -1) {\n endIx = fullCfi.length;\n }\n\n return {\n\n spineItemCfi: fullCfi.substring(startIx + 1, bungIx),\n elementCfi: fullCfi.substring(bungIx + 1, endIx)\n }\n }\n\n function getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem) {\n\n var fullPath = reader.package().resolveRelativeUrl(spineItem.href);\n\n var absUrl = hrefUri.absoluteTo(fullPath);\n\n return absUrl;\n }\n\n function processDeepLink(hrefUri, spineItem) {\n\n var absoluteOpfUri = getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem);\n\n if(!absoluteOpfUri) {\n console.error(\"Unable to resolve \" + hrefUri.href())\n return;\n }\n\n var fullCfi = hrefUri.fragment();\n\n var absPath = absoluteOpfUri.toString();\n\n absPath = Helpers.RemoveFromString(absPath, \"#\" + fullCfi);\n\n readOpfFile(absPath, function(opfText) {\n\n if(!opfText) {\n return;\n }\n\n var parser = new window.DOMParser;\n var packageDom = parser.parseFromString(opfText, 'text/xml');\n var cfi = splitCfi(fullCfi);\n\n if(!cfi) {\n console.warn(\"Unable to split cfi:\" + fullCfi);\n return;\n }\n\n var contentDocRef = EPUBcfi.Interpreter.getContentDocHref(\"epubcfi(\" + cfi.spineItemCfi + \")\", packageDom);\n\n if(contentDocRef) {\n\n var newSpineItem = reader.spine().getItemByHref(contentDocRef);\n if(newSpineItem) {\n\n reader.openSpineItemElementCfi(newSpineItem.idref, cfi.elementCfi, self);\n }\n else {\n console.warn(\"Unable to find spineItem with href=\" + contentDocRef);\n }\n\n }\n else {\n console.warn(\"Unable to find document ref from \" + fullCfi +\" cfi\");\n }\n\n });\n\n }\n\n function readOpfFile(path, callback) {\n\n //TODO: this should use readium-js resource fetcher (file / URI access abstraction layer), as right now this fails with packed EPUBs \n $.ajax({\n // encoding: \"UTF-8\",\n // mimeType: \"text/plain; charset=UTF-8\",\n // beforeSend: function( xhr ) {\n // xhr.overrideMimeType(\"text/plain; charset=UTF-8\");\n // },\n isLocal: path.indexOf(\"http\") === 0 ? false : true,\n url: path,\n dataType: 'text',\n async: true,\n success: function (result) {\n callback(result);\n },\n error: function (xhr, status, errorThrown) {\n console.error('Error when AJAX fetching ' + path);\n console.error(status);\n console.error(errorThrown);\n callback();\n }\n });\n }\n\n //checks if href includes path to opf file and full cfi\n function isDeepLikHref(uri) {\n\n var fileName = uri.filename();\n return fileName && Helpers.EndsWith(fileName, \".opf\");\n }\n\n function processLinkWithHash(hrefUri, spineItem) {\n\n var fileName = hrefUri.filename();\n\n var idref;\n\n //reference to another file\n if(fileName) {\n var normalizedUri = new URI(hrefUri, spineItem.href);\n \n var pathname = decodeURIComponent(normalizedUri.pathname());\n \n var newSpineItem = reader.spine().getItemByHref(pathname);\n\n if(!newSpineItem) {\n console.error(\"spine item with href=\" + pathname + \" not found\");\n return;\n }\n\n idref = newSpineItem.idref;\n }\n else { //hush in the same file\n idref = spineItem.idref;\n }\n\n var hashFrag = hrefUri.fragment();\n\n reader.openSpineItemElementId(idref, hashFrag, self);\n\n }\n\n this.processLinkElements = function($iframe, spineItem) {\n\n var epubContentDocument = $iframe[0].contentDocument;\n\n $('a', epubContentDocument).click(function (clickEvent) {\n // Check for both href and xlink:href attribute and get value\n var href;\n if (clickEvent.currentTarget.attributes[\"xlink:href\"]) {\n \n href = clickEvent.currentTarget.attributes[\"xlink:href\"].value;\n }\n else {\n href = clickEvent.currentTarget.attributes[\"href\"].value;\n }\n\n var overrideClickEvent = false;\n var hrefUri = new URI(href);\n var hrefIsRelative = hrefUri.is('relative');\n\n if (hrefIsRelative) {\n\n if(isDeepLikHref(hrefUri)) {\n processDeepLink(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n else {\n processLinkWithHash(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n\n } else {\n // It's an absolute URL to a remote site - open it in a separate window outside the reader\n window.open(href, '_blank');\n overrideClickEvent = true;\n }\n\n if (overrideClickEvent) {\n clickEvent.preventDefault();\n clickEvent.stopPropagation();\n }\n });\n\n }\n\n};\n\nreturn InternalLinksSupport;\n});\n\n", + "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/iframe_loader',[\"jquery\", \"underscore\", 'URIjs'], function($, _, URI) {\n/**\n *\n * @constructor\n */\nvar IFrameLoader = function() {\n\n var self = this;\n var eventListeners = {};\n\n\n this.addIFrameEventListener = function (eventName, callback, context) {\n\n if (eventListeners[eventName] == undefined) {\n eventListeners[eventName] = [];\n }\n\n eventListeners[eventName].push({callback: callback, context: context});\n };\n\n this.updateIframeEvents = function (iframe) {\n\n _.each(eventListeners, function (value, key) {\n $(iframe.contentWindow).off(key);\n for (var i = 0, count = value.length; i < count; i++) {\n $(iframe.contentWindow).on(key, value[i].callback, value[i].context);\n }\n });\n };\n\n this.loadIframe = function (iframe, src, callback, context, attachedData) {\n\n if (!iframe.baseURI) {\n if (typeof location !== 'undefined') {\n iframe.baseURI = location.href + \"\";\n }\n console.error(\"!iframe.baseURI => \" + iframe.baseURI);\n }\n \n console.log(\"EPUB doc iframe src:\");\n console.log(src);\n console.log(\"EPUB doc iframe base URI:\");\n console.log(iframe.baseURI);\n \n iframe.setAttribute(\"data-baseUri\", iframe.baseURI);\n iframe.setAttribute(\"data-src\", src);\n\n var loadedDocumentUri = new URI(src).absoluteTo(iframe.baseURI).search('').hash('').toString();\n\n self._loadIframeWithUri(iframe, attachedData, loadedDocumentUri, function () {\n \n callback.call(context, true, attachedData);\n });\n };\n\n this._loadIframeWithUri = function (iframe, attachedData, contentUri, callback) {\n\n iframe.onload = function () {\n\n var doc = iframe.contentDocument || iframe.contentWindow.document;\n $('svg', doc).on(\"load\", function(){\n console.log('SVG loaded');\n });\n \n self.updateIframeEvents(iframe);\n\n var mathJax = iframe.contentWindow.MathJax;\n if (mathJax) {\n \n console.log(\"MathJax VERSION: \" + mathJax.cdnVersion + \" // \" + mathJax.fileversion + \" // \" + mathJax.version);\n \n var useFontCache = true; // default in MathJax\n \n // Firefox fails to render SVG otherwise\n if (mathJax.Hub.Browser.isFirefox) {\n useFontCache = false;\n }\n \n // Chrome 49+ fails to render SVG otherwise\n // https://github.com/readium/readium-js/issues/138\n if (mathJax.Hub.Browser.isChrome) {\n useFontCache = false;\n }\n \n // Edge fails to render SVG otherwise\n // https://github.com/readium/readium-js-viewer/issues/394#issuecomment-185382196\n if (window.navigator.userAgent.indexOf(\"Edge\") > 0) {\n useFontCache = false;\n }\n \n mathJax.Hub.Config({showMathMenu:false, messageStyle: \"none\", showProcessingMessages: true, SVG:{useFontCache:useFontCache}});\n \n // If MathJax is being used, delay the callback until it has completed rendering\n var mathJaxCallback = _.once(callback);\n try {\n mathJax.Hub.Queue(mathJaxCallback);\n } catch (err) {\n console.error(\"MathJax fail!\");\n callback();\n }\n // Or at an 8 second timeout, which ever comes first\n //window.setTimeout(mathJaxCallback, 8000);\n } else {\n callback();\n }\n };\n\n iframe.setAttribute(\"src\", contentUri);\n };\n\n};\n\nreturn IFrameLoader;\n});\n\n", + "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js', 'URIjs'], function($, Helpers, epubCfi, URI) {\n/**\n *\n * @param reader\n * @constructor\n */\nvar InternalLinksSupport = function(reader) {\n\n var self = this;\n\n function splitCfi(fullCfi) {\n\n var startIx = fullCfi.indexOf(\"(\");\n var bungIx = fullCfi.indexOf(\"!\");\n var endIx = fullCfi.indexOf(\")\");\n\n if(bungIx == -1) {\n return undefined;\n }\n\n if(endIx == -1) {\n endIx = fullCfi.length;\n }\n\n return {\n\n spineItemCfi: fullCfi.substring(startIx + 1, bungIx),\n elementCfi: fullCfi.substring(bungIx + 1, endIx)\n }\n }\n\n function getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem) {\n\n var fullPath = reader.package().resolveRelativeUrl(spineItem.href);\n\n var absUrl = hrefUri.absoluteTo(fullPath);\n\n return absUrl;\n }\n\n function processDeepLink(hrefUri, spineItem) {\n\n var absoluteOpfUri = getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem);\n\n if(!absoluteOpfUri) {\n console.error(\"Unable to resolve \" + hrefUri.href())\n return;\n }\n\n var fullCfi = hrefUri.fragment();\n\n var absPath = absoluteOpfUri.toString();\n\n absPath = Helpers.RemoveFromString(absPath, \"#\" + fullCfi);\n\n readOpfFile(absPath, function(opfText) {\n\n if(!opfText) {\n return;\n }\n\n var parser = new window.DOMParser;\n var packageDom = parser.parseFromString(opfText, 'text/xml');\n var cfi = splitCfi(fullCfi);\n\n if(!cfi) {\n console.warn(\"Unable to split cfi:\" + fullCfi);\n return;\n }\n\n var contentDocRef = EPUBcfi.Interpreter.getContentDocHref(\"epubcfi(\" + cfi.spineItemCfi + \")\", packageDom);\n\n if(contentDocRef) {\n\n var newSpineItem = reader.spine().getItemByHref(contentDocRef);\n if(newSpineItem) {\n\n reader.openSpineItemElementCfi(newSpineItem.idref, cfi.elementCfi, self);\n }\n else {\n console.warn(\"Unable to find spineItem with href=\" + contentDocRef);\n }\n\n }\n else {\n console.warn(\"Unable to find document ref from \" + fullCfi +\" cfi\");\n }\n\n });\n\n }\n\n function readOpfFile(path, callback) {\n\n //TODO: this should use readium-js resource fetcher (file / URI access abstraction layer), as right now this fails with packed EPUBs \n $.ajax({\n // encoding: \"UTF-8\",\n // mimeType: \"text/plain; charset=UTF-8\",\n // beforeSend: function( xhr ) {\n // xhr.overrideMimeType(\"text/plain; charset=UTF-8\");\n // },\n isLocal: path.indexOf(\"http\") === 0 ? false : true,\n url: path,\n dataType: 'text',\n async: true,\n success: function (result) {\n callback(result);\n },\n error: function (xhr, status, errorThrown) {\n console.error('Error when AJAX fetching ' + path);\n console.error(status);\n console.error(errorThrown);\n callback();\n }\n });\n }\n\n //checks if href includes path to opf file and full cfi\n function isDeepLikHref(uri) {\n\n var fileName = uri.filename();\n return fileName && Helpers.EndsWith(fileName, \".opf\");\n }\n\n function processLinkWithHash(hrefUri, spineItem) {\n\n var fileName = hrefUri.filename();\n\n var idref;\n\n //reference to another file\n if(fileName) {\n var normalizedUri = new URI(hrefUri, spineItem.href);\n \n var pathname = decodeURIComponent(normalizedUri.pathname());\n \n var newSpineItem = reader.spine().getItemByHref(pathname);\n\n if(!newSpineItem) {\n console.error(\"spine item with href=\" + pathname + \" not found\");\n return;\n }\n\n idref = newSpineItem.idref;\n }\n else { //hush in the same file\n idref = spineItem.idref;\n }\n\n var hashFrag = hrefUri.fragment();\n\n reader.openSpineItemElementId(idref, hashFrag, self);\n\n }\n\n this.processLinkElements = function($iframe, spineItem) {\n\n var epubContentDocument = $iframe[0].contentDocument;\n\n $('a', epubContentDocument).click(function (clickEvent) {\n // Check for both href and xlink:href attribute and get value\n var href;\n if (clickEvent.currentTarget.attributes[\"xlink:href\"]) {\n \n href = clickEvent.currentTarget.attributes[\"xlink:href\"].value;\n }\n else {\n href = clickEvent.currentTarget.attributes[\"href\"].value;\n }\n\n var overrideClickEvent = false;\n var hrefUri = new URI(href);\n var hrefIsRelative = hrefUri.is('relative');\n\n if (hrefIsRelative) {\n\n if(isDeepLikHref(hrefUri)) {\n processDeepLink(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n else {\n processLinkWithHash(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n\n } else {\n // It's an absolute URL to a remote site - open it in a separate window outside the reader\n window.open(href, '_blank');\n overrideClickEvent = true;\n }\n\n if (overrideClickEvent) {\n clickEvent.preventDefault();\n clickEvent.stopPropagation();\n }\n });\n\n }\n\n};\n\nreturn InternalLinksSupport;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine ('readium_shared_js/models/smil_iterator',[\"jquery\", \"../helpers\"], function($, Helpers) {\n/**\n * Wrapper of a smil iterator object. \n * A smil iterator is used by the media overlay player, to move along text areas which have an audio overlay. \n * Such areas are specified in the smil model via parallel smil nodes (text + audio). \n *\n * @class Models.SmilIterator\n * @constructor\n * @param {Models.SmilModel} smil The current smil model\n */\nvar SmilIterator = function(smil) {\n\n /**\n * The smil model\n *\n * @property smil\n * @type Models.SmilModel\n */\n this.smil = smil;\n\n /**\n * The current parallel smil node\n *\n * @property currentPar\n * @type object\n */\n \n this.currentPar = undefined;\n\n /**\n * Resets the iterator. \n * In practice, looks for the first parallel smil node in the smil model\n *\n * @method reset\n */\n\n this.reset = function() {\n this.currentPar = findParNode(0, this.smil, false);\n };\n\n /*\n this.firstDeep = function(container) {\n var par = container.nodeType === \"par\" ? container : findParNode(0, container, false);\n\n return par;\n };\n */\n//\n// this.ensureNextValidTextElement = function()\n// {\n// if (!this.currentPar)\n// {\n// console.debug(\"Par iterator is out of range\");\n// return;\n// }\n//\n// while (this.currentPar && !this.currentPar.element)\n// {\n// this.next();\n// }\n// };\n \n /**\n * Looks for a text smil node identified by the id parameter \n * Returns true if the id param identifies a text smil node.\n *\n * @method findTextId\n * @param {Number} id A smil node identifier\n * @return {Boolean} \n */\n this.findTextId = function(id)\n {\n if (!this.currentPar)\n {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n if (!id)\n {\n return false;\n }\n\n while (this.currentPar)\n {\n if (this.currentPar.element)\n {\n if (id === this.currentPar.text.srcFragmentId) //this.currentPar.element.id\n {\n return true;\n }\n\n // OUTER match\n var parent = this.currentPar.element.parentNode;\n while(parent)\n {\n if (parent.id && parent.id == id)\n {\n return true;\n }\n\n parent = parent.parentNode;\n }\n //console.log(parent);\n\n // INNER match\n //var inside = this.currentPar.element.ownerDocument.getElementById(id);\n var inside = $(\"#\" + Helpers.escapeJQuerySelector(id), this.currentPar.element);\n if (inside && inside.length && inside[0])\n {\n return true;\n }\n }\n // moves to the next parallel smil node\n this.next();\n }\n\n return false;\n }\n\n /**\n * Looks for the next parallel smil node\n *\n * @method next \n */\n\n this.next = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n this.currentPar = findParNode(this.currentPar.index + 1, this.currentPar.parent, false);\n };\n\n /**\n * Looks for the previous parallel smil node\n *\n * @method previous\n */\n\n this.previous = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n this.currentPar = findParNode(this.currentPar.index - 1, this.currentPar.parent, true);\n };\n\n /**\n * Checks if the current parallel smil node is the last one in the smil model\n *\n * @method isLast\n * @return {Bool}\n */\n\n this.isLast = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n if (findParNode(this.currentPar.index + 1, this.currentPar.parent, false))\n {\n return false;\n }\n\n return true;\n }\n\n /**\n * Moves to the parallel smil node given as a parameter. \n *\n * @method goToPar\n * @param {Containter} par A parallel smil node\n * @return {Boolean} \n */\n\n this.goToPar = function(par) {\n\n while(this.currentPar) {\n if(this.currentPar == par) {\n break;\n }\n\n this.next();\n }\n };\n\n /**\n * Looks for a parallel smil node in the smil model.\n *\n * @method findParNode\n * @param {Number} startIndex Start index inside the container\n * @param {Models.SMilModel} container The smil model\n * @param {Boolean} previous True if search among previous nodes\n * @return {Smil.ParNode} \n */\n\n function findParNode(startIndex, container, previous) {\n\n for(var i = startIndex, count = container.children.length;\n i >= 0 && i < count;\n i += (previous ? -1 : 1)) {\n\n var node = container.children[i];\n if(node.nodeType == \"par\") {\n return node;\n }\n\n // assert(node.nodeType == \"seq\")\n node = findParNode(previous ? node.children.length - 1 : 0, node, previous);\n\n if(node) {\n return node;\n }\n }\n\n if(container.parent) {\n return findParNode(container.index + (previous ? -1 : 1), container.parent, previous);\n }\n\n return undefined;\n }\n\n this.reset();\n};\n\nreturn SmilIterator;\n});\n\n", "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine ('readium_shared_js/views/media_overlay_data_injector',[\"jquery\", \"underscore\", \"../helpers\", \"../models/smil_iterator\", \"rangy\", 'readium_cfi_js'], function($, _, Helpers, SmilIterator, rangy, epubCfi) {\n/**\n *\n * @param mediaOverlay\n * @param mediaOverlayPlayer\n * @constructor\n */\nvar MediaOverlayDataInjector = function (mediaOverlay, mediaOverlayPlayer) {\n\n this.attachMediaOverlayData = function ($iframe, spineItem, mediaOverlaySettings) {\n\n var contentDocElement = $iframe[0].contentDocument.documentElement;\n\n if (!spineItem.media_overlay_id && mediaOverlay.smil_models.length === 0) {\n return;\n }\n\n var $body = $(\"body\", contentDocElement);\n if ($body.length == 0) {\n console.error(\"! BODY ???\");\n }\n else {\n var click = $body.data(\"mediaOverlayClick\");\n if (click) {\n console.error(\"[WARN] already mediaOverlayClick\");\n }\n else {\n $body.data(\"mediaOverlayClick\", {ping: \"pong\"});\n\n var touchClickMOEventHandler = function (event)\n {\n //console.debug(\"MO TOUCH-DOWN: \"+event.type);\n \n var elem = $(this)[0]; // body\n elem = event.target; // body descendant\n\n if (!elem)\n {\n mediaOverlayPlayer.touchInit();\n return true;\n }\n\n//console.debug(\"MO CLICK: \" + elem.id);\n\n var data = undefined;\n var el = elem;\n\n var inLink = false;\n if (el.nodeName.toLowerCase() === \"a\")\n {\n inLink = true;\n }\n\n while (!(data = $(el).data(\"mediaOverlayData\")))\n {\n if (el.nodeName.toLowerCase() === \"a\")\n {\n inLink = true;\n }\n el = el.parentNode;\n if (!el)\n {\n break;\n }\n }\n \n if (data && (data.par || data.pars))\n {\n if (el !== elem)\n {\n//console.log(\"MO CLICK REDIRECT: \" + el.id);\n }\n\n if (!mediaOverlaySettings.mediaOverlaysEnableClick)\n {\nconsole.log(\"MO CLICK DISABLED\");\n mediaOverlayPlayer.touchInit();\n return true;\n }\n\n if (inLink)\n {\nconsole.log(\"MO CLICKED LINK\");\n mediaOverlayPlayer.touchInit();\n return true;\n }\n\n var par = data.par ? data.par : data.pars[0];\n\n if (data.pars && (typeof rangy !== \"undefined\"))\n {\n var wasPaused = false;\n \n // To remove highlight which may have altered DOM (and break CFI expressions)\n if (mediaOverlayPlayer.isPlayingCfi())\n {\n wasPaused = true;\n mediaOverlayPlayer.pause();\n }\n \n // /////////////////////\n // \n // var p = {x: event.pageX, y: event.pageY};\n // if (webkitConvertPointFromPageToNode)\n // {\n // p = webkitConvertPointFromPageToNode(elem.ownerDocument.body, new WebKitPoint(event.pageX, event.pageY));\n // }\n // \n // var div = elem.ownerDocument.getElementById(\"CLICKED\");\n // if (div)\n // {\n // div.parentNode.removeChild(div);\n // }\n // \n // div = elem.ownerDocument.createElementNS(\"http://www.w3.org/1999/xhtml\", 'div');\n // div.setAttribute(\"style\", \"background-color: red; position: absolute; z-index: 999; width: 50px; height: 50px; left: \" + p.x + \"px; top: \" + p.y + \"px;\");\n // div.id = \"CLICKED\";\n // div.setAttribute(\"id\", div.id);\n // var divTxt = elem.ownerDocument.createTextNode(\" \");\n // div.appendChild(divTxt);\n // elem.ownerDocument.body.appendChild(div);\n // \n // /////////////////////\n\n\n //rangy.init();\n try\n {\n// THIS WORKS (same as Rangy's method below)\n// var r;\n// if (elem.ownerDocument.caretRangeFromPoint)\n// {\n// r = elem.ownerDocument.caretRangeFromPoint(event.pageX, event.pageY);\n// }\n// else if (event.rangeParent)\n// {\n// r = elem.ownerDocument.createRange();\n// range.setStart(event.rangeParent, event.rangeOffset);\n// }\n// \n// console.log(\"------ 1\");\n// console.log(elem.ownerDocument);\n// console.log(event.pageX);\n// console.log(event.pageY);\n// console.log(r.startContainer);\n// console.log(r.startOffset);\n// console.log(\"------\");\n\n var pos = rangy.positionFromPoint(event.pageX, event.pageY, elem.ownerDocument);\n// console.log(\"------ 2\");\n// console.log(pos.node.textContent);\n// console.log(pos.offset);\n// console.log(\"------\");\n\n par = undefined;\n \n for (var iPar = 0; iPar < data.pars.length; iPar++)\n {\n var p = data.pars[iPar];\n\n var startCFI = \"epubcfi(\" + p.cfi.partialStartCfi + \")\";\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, elem.ownerDocument,\n [\"cfi-marker\", \"mo-cfi-highlight\"],\n [],\n [\"MathJax_Message\"]);\n//console.log(infoStart);\n\n var endCFI = \"epubcfi(\" + p.cfi.partialEndCfi + \")\";\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, elem.ownerDocument,\n [\"cfi-marker\", \"mo-cfi-highlight\"],\n [],\n [\"MathJax_Message\"]);\n//console.log(infoEnd);\n\n var range = rangy.createRange(elem.ownerDocument); //createNativeRange\n range.setStartAndEnd(\n infoStart.textNode, infoStart.textOffset,\n infoEnd.textNode, infoEnd.textOffset\n );\n \n if (range.isPointInRange(pos.node, pos.offset))\n {\n// console.log(p.cfi.partialStartCfi);\n// console.log(p.cfi.partialEndCfi);\n // DOUBLE CHECK WITH getClientRects ??\n \n par = p;\n break;\n }\n }\n }\n catch (e)\n {\n console.error(e);\n }\n \n if (!par)\n {\n if (wasPaused)\n {\n mediaOverlayPlayer.toggleMediaOverlay();\n }\n return true;\n }\n }\n\n\n if (el && el != elem && el.nodeName.toLowerCase() === \"body\" && par && !par.getSmil().id)\n {\n//console.debug(\"MO CLICKED BLANK BODY\");\n mediaOverlayPlayer.touchInit();\n return true;\n }\n\n mediaOverlayPlayer.playUserPar(par);\n return true;\n }\n else\n {\n var readaloud = $(elem).attr(\"ibooks:readaloud\");\n if (!readaloud)\n {\n readaloud = $(elem).attr(\"epub:readaloud\");\n }\n if (readaloud)\n {\nconsole.debug(\"MO readaloud attr: \" + readaloud);\n\n var isPlaying = mediaOverlayPlayer.isPlaying();\n if (readaloud === \"start\" && !isPlaying ||\n readaloud === \"stop\" && isPlaying ||\n readaloud === \"startstop\")\n {\n mediaOverlayPlayer.toggleMediaOverlay();\n return true;\n }\n }\n }\n\n mediaOverlayPlayer.touchInit();\n return true;\n };\n\n var touchClickMOEventHandler_ = _.debounce(touchClickMOEventHandler, 200);\n \n if ('ontouchstart' in document.documentElement)\n {\n $body[0].addEventListener(\"touchstart\", touchClickMOEventHandler_, false);\n }\n $body[0].addEventListener(\"mousedown\", touchClickMOEventHandler_, false);\n\n //var clickEvent = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click';\n //$body.bind(clickEvent, touchClickMOEventHandler);\n }\n }\n\n var smil = mediaOverlay.getSmilBySpineItem(spineItem);\n if (!smil)\n {\n console.error(\"NO SMIL?? \" + spineItem.idref + \" /// \" + spineItem.media_overlay_id);\n return;\n }\n\n var traverseSmilSeqs = function(root)\n {\n if (!root) return;\n \n if (root.nodeType && root.nodeType === \"seq\")\n {\n // if (root.element)\n // {\n // console.error(\"WARN: seq.element already set: \" + root.textref);\n // }\n \n if (root.textref)\n {\n var parts = root.textref.split('#');\n var file = parts[0];\n var fragmentId = (parts.length === 2) ? parts[1] : \"\";\n // \n // console.debug(root.textref);\n // console.debug(fragmentId);\n // console.log(\"---- SHOULD BE EQUAL:\");\n // console.debug(file);\n // console.debug(par.text.srcFile);\n // \n // if (file !== par.text.srcFile)\n // {\n // console.error(\"adjustParToSeqSyncGranularity textref.file !== par.text.srcFile ???\");\n // return par;\n // }\n // \n // if (!fragmentId)\n // {\n // console.error(\"adjustParToSeqSyncGranularity !fragmentId ???\");\n // return par;\n // }\n\n if (file && fragmentId)\n {\n var textRelativeRef = Helpers.ResolveContentRef(file, smil.href);\n var same = textRelativeRef === spineItem.href;\n if (same)\n { \n root.element = $iframe[0].contentDocument.getElementById(fragmentId);\n \n if (!root.element)\n {\n console.error(\"seq.textref !element? \" + root.textref);\n }\n\n // var selector = \"#\" + Helpers.escapeJQuerySelector(fragmentId);\n // var $element = $(selector, element.ownerDocument.documentElement);\n // if ($element)\n // {\n // seq.element = $element[0];\n // }\n }\n }\n }\n }\n \n if (root.children && root.children.length)\n {\n for (var i = 0; i < root.children.length; i++)\n {\n var child = root.children[i];\n traverseSmilSeqs(child);\n }\n }\n };\n traverseSmilSeqs(smil);\n\n//console.debug(\"[[MO ATTACH]] \" + spineItem.idref + \" /// \" + spineItem.media_overlay_id + \" === \" + smil.id);\n\n var iter = new SmilIterator(smil);\n \n var fakeOpfRoot = \"/99!\";\n var epubCfiPrefix = \"epubcfi\";\n \n while (iter.currentPar) {\n iter.currentPar.element = undefined;\n iter.currentPar.cfi = undefined;\n\n if (true) { //iter.currentPar.text.srcFragmentId (includes empty frag ID)\n\n var textRelativeRef = Helpers.ResolveContentRef(iter.currentPar.text.srcFile, iter.smil.href);\n\n var same = textRelativeRef === spineItem.href;\n if (same) {\n var selectBody = !iter.currentPar.text.srcFragmentId || iter.currentPar.text.srcFragmentId.length == 0;\n var selectId = iter.currentPar.text.srcFragmentId.indexOf(epubCfiPrefix) == 0 ? undefined : iter.currentPar.text.srcFragmentId;\n\n var $element = undefined;\n var isCfiTextRange = false;\n if (!selectBody && !selectId)\n {\n if (iter.currentPar.text.srcFragmentId.indexOf(epubCfiPrefix) === 0)\n {\n var partial = iter.currentPar.text.srcFragmentId.substr(epubCfiPrefix.length + 1, iter.currentPar.text.srcFragmentId.length - epubCfiPrefix.length - 2);\n \n if (partial.indexOf(fakeOpfRoot) === 0)\n {\n partial = partial.substr(fakeOpfRoot.length, partial.length - fakeOpfRoot.length);\n }\n//console.log(partial);\n var parts = partial.split(\",\");\n if (parts && parts.length === 3)\n {\n try\n {\n var partialStartCfi = parts[0] + parts[1];\n var startCFI = \"epubcfi(\" + partialStartCfi + \")\";\n var infoStart = EPUBcfi.getTextTerminusInfoWithPartialCFI(startCFI, $iframe[0].contentDocument,\n [\"cfi-marker\", \"mo-cfi-highlight\"],\n [],\n [\"MathJax_Message\"]);\n//console.log(infoStart);\n\n var partialEndCfi = parts[0] + parts[2];\n var endCFI = \"epubcfi(\" + partialEndCfi + \")\";\n var infoEnd = EPUBcfi.getTextTerminusInfoWithPartialCFI(endCFI, $iframe[0].contentDocument,\n [\"cfi-marker\", \"mo-cfi-highlight\"],\n [],\n [\"MathJax_Message\"]);\n//console.log(infoEnd);\n\n var cfiTextParent = infoStart.textNode.parentNode;\n\n iter.currentPar.cfi = {\n smilTextSrcCfi: iter.currentPar.text.srcFragmentId,\n partialRangeCfi: partial,\n partialStartCfi: partialStartCfi,\n partialEndCfi: partialEndCfi,\n \n cfiTextParent: cfiTextParent\n \n // textNode becomes invalid after highlighting! (dynamic span insertion/removal changes DOM)\n // cfiRangeStart: infoStart,\n // cfiRangeEnd: infoEnd\n };\n \n // TODO: not just start textNode, but all of them between start and end...\n // ...that being said, CFI text ranges likely to be used only within a single common parent,\n // so this is an acceptable implementation shortcut for this CFI experimentation (word-level text/audio synchronisation).\n isCfiTextRange = true;\n $element = $(cfiTextParent);\n var modata = $element.data(\"mediaOverlayData\");\n if (!modata)\n {\n modata = {pars: [iter.currentPar]};\n $element.data(\"mediaOverlayData\", modata);\n }\n else\n {\n if (modata.par)\n {\n console.error(\"[WARN] non-CFI MO DATA already exists!\");\n modata.par = undefined;\n }\n\n var found = false;\n if (modata.pars)\n {\n for (var iPars = 0; iPars < modata.pars.length; iPars++)\n {\n var par = modata.pars[iPars];\n\n if (par === iter.currentPar)\n {\n found = true;\n console.error(\"[WARN] mediaOverlayData CFI PAR already registered!\");\n }\n }\n }\n else\n {\n modata.pars = [];\n }\n\n if (!found)\n {\n modata.pars.push(iter.currentPar);\n }\n }\n\n }\n catch (error)\n {\n console.error(error);\n }\n }\n else\n {\n try\n {\n var cfi = \"epubcfi(\" + partial + \")\";\n $element = EPUBcfi.getTargetElementWithPartialCFI(cfi, $iframe[0].contentDocument,\n [\"cfi-marker\", \"mo-cfi-highlight\"],\n [],\n [\"MathJax_Message\"]);\n }\n catch (error)\n {\n console.error(error);\n }\n }\n }\n else \n {\n console.error(\"SMIL text@src CFI fragment identifier scheme not supported: \" + iter.currentPar.text.srcFragmentId);\n }\n }\n else\n {\n if (selectBody)\n {\n $element = $body; //$(\"body\", contentDocElement);\n }\n else\n {\n $element = $($iframe[0].contentDocument.getElementById(selectId));\n //$element = $(\"#\" + Helpers.escapeJQuerySelector(iter.currentPar.text.srcFragmentId), contentDocElement);\n }\n }\n\n if ($element && $element.length > 0) {\n\n if (!isCfiTextRange)\n {\n if (iter.currentPar.element && iter.currentPar.element !== $element[0]) {\n console.error(\"DIFFERENT ELEMENTS??! \" + iter.currentPar.text.srcFragmentId + \" /// \" + iter.currentPar.element.id);\n }\n\n var name = $element[0].nodeName ? $element[0].nodeName.toLowerCase() : undefined;\n if (name === \"audio\" || name === \"video\") {\n $element.attr(\"preload\", \"auto\");\n }\n\n iter.currentPar.element = $element[0];\n\n var modata = $element.data(\"mediaOverlayData\");\n if (modata) {\n console.error(\"[WARN] MO DATA already exists.\");\n\n if (modata.par && modata.par !== iter.currentPar) {\n console.error(\"DIFFERENT PARS??!\");\n }\n }\n\n $element.data(\"mediaOverlayData\", {par: iter.currentPar});\n\n /*\n $element.click(function() {\n var elem = $(this)[0];\n console.debug(\"MO CLICK (ELEM): \" + elem.id);\n\n var par = $(this).data(\"mediaOverlayData\").par;\n mediaOverlayPlayer.playUserPar(par);\n });\n */\n }\n }\n else {\n console.error(\"!! CANNOT FIND ELEMENT: \" + iter.currentPar.text.srcFragmentId + \" == \" + iter.currentPar.text.srcFile + \" /// \" + spineItem.href);\n }\n }\n else {\n//console.debug(\"[INFO] \" + spineItem.href + \" != \" + textRelativeRef + \" # \" + iter.currentPar.text.srcFragmentId);\n }\n }\n\n iter.next();\n }\n }\n};\n\nreturn MediaOverlayDataInjector;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck, Andrey Kavarma\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\ndefine('readium_shared_js/views/audio_player',['jquery'],function($) {\n\n /**\n *\n * @param onStatusChanged\n * @param onPositionChanged\n * @param onAudioEnded\n * @param onAudioPlay\n * @param onAudioPause\n * @constructor\n */\n var AudioPlayer = function(onStatusChanged, onPositionChanged, onAudioEnded, onAudioPlay, onAudioPause)\n {\n var _iOS = navigator.userAgent.match(/(iPad|iPhone|iPod)/g) ? true : false;\n var _Android = navigator.userAgent.toLowerCase().indexOf('android') > -1;\n var _isMobile = _iOS || _Android;\n\n //var _isReadiumJS = typeof window.requirejs !== \"undefined\";\n\n var DEBUG = false;\n\n var _audioElement = new Audio();\n \n if (DEBUG)\n {\n _audioElement.addEventListener(\"load\", function()\n {\n console.debug(\"0) load\");\n }\n );\n\n _audioElement.addEventListener(\"loadstart\", function()\n {\n console.debug(\"1) loadstart\");\n }\n );\n\n _audioElement.addEventListener(\"durationchange\", function()\n {\n console.debug(\"2) durationchange\");\n }\n );\n\n _audioElement.addEventListener(\"loadedmetadata\", function()\n {\n console.debug(\"3) loadedmetadata\");\n }\n );\n\n _audioElement.addEventListener(\"loadeddata\", function()\n {\n console.debug(\"4) loadeddata\");\n }\n );\n\n _audioElement.addEventListener(\"progress\", function()\n {\n console.debug(\"5) progress\");\n }\n );\n\n _audioElement.addEventListener(\"canplay\", function()\n {\n console.debug(\"6) canplay\");\n }\n );\n\n _audioElement.addEventListener(\"canplaythrough\", function()\n {\n console.debug(\"7) canplaythrough\");\n }\n );\n\n _audioElement.addEventListener(\"play\", function()\n {\n console.debug(\"8) play\");\n }\n );\n\n _audioElement.addEventListener(\"pause\", function()\n {\n console.debug(\"9) pause\");\n }\n );\n\n _audioElement.addEventListener(\"ended\", function()\n {\n console.debug(\"10) ended\");\n }\n );\n\n _audioElement.addEventListener(\"seeked\", function()\n {\n console.debug(\"X) seeked\");\n }\n );\n\n _audioElement.addEventListener(\"timeupdate\", function()\n {\n console.debug(\"Y) timeupdate\");\n }\n );\n\n _audioElement.addEventListener(\"seeking\", function()\n {\n console.debug(\"Z) seeking\");\n }\n );\n }\n\n var self = this;\n \n //_audioElement.setAttribute(\"preload\", \"auto\");\n \n var _currentEpubSrc = undefined;\n \n var _currentSmilSrc = undefined;\n this.currentSmilSrc = function() {\n return _currentSmilSrc;\n };\n\n var _rate = 1.0;\n this.setRate = function(rate)\n {\n _rate = rate;\n if (_rate < 0.5)\n {\n _rate = 0.5;\n }\n if (_rate > 4.0)\n {\n _rate = 4.0;\n }\n \n _audioElement.playbackRate = _rate;\n }\n self.setRate(_rate);\n this.getRate = function()\n {\n return _rate;\n }\n \n \n var _volume = 1.0;\n this.setVolume = function(volume)\n {\n _volume = volume;\n if (_volume < 0.0)\n {\n _volume = 0.0;\n }\n if (_volume > 1.0)\n {\n _volume = 1.0;\n }\n _audioElement.volume = _volume;\n }\n self.setVolume(_volume);\n this.getVolume = function()\n {\n return _volume;\n }\n \n this.play = function()\n {\n if (DEBUG)\n {\n console.error(\"this.play()\");\n }\n \n if(!_currentEpubSrc)\n {\n return false;\n }\n \n startTimer();\n \n self.setVolume(_volume);\n self.setRate(_rate);\n \n _audioElement.play();\n \n return true;\n };\n \n this.pause = function()\n {\n if (DEBUG)\n {\n console.error(\"this.pause()\");\n }\n \n stopTimer();\n \n _audioElement.pause();\n };\n \n _audioElement.addEventListener('play', onPlay, false);\n _audioElement.addEventListener('pause', onPause, false);\n _audioElement.addEventListener('ended', onEnded, false);\n \n function onPlay()\n {\n onStatusChanged({isPlaying: true});\n onAudioPlay();\n }\n \n function onPause()\n {\n onAudioPause();\n onStatusChanged({isPlaying: false});\n }\n \n function onEnded()\n {\n if (_audioElement.moSeeking)\n {\n if (DEBUG)\n {\n console.debug(\"onEnded() skipped (still seeking...)\");\n }\n \n return;\n }\n \n stopTimer();\n \n onAudioEnded();\n onStatusChanged({isPlaying: false});\n }\n \n var _intervalTimerSkips = 0;\n \n var _intervalTimer = undefined;\n function startTimer()\n {\n if(_intervalTimer)\n {\n return;\n }\n \n _intervalTimer = setInterval(\n function()\n {\n if (_audioElement.moSeeking)\n {\n if (DEBUG)\n {\n//console.debug(\"interval timer skipped (still seeking...)\");\n }\n \n _intervalTimerSkips++;\n if (_intervalTimerSkips > 1000)\n {\n _intervalTimerSkips = 0;\n stopTimer();\n }\n return;\n }\n \n var currentTime = undefined;\n try\n {\n currentTime = _audioElement.currentTime;\n }\n catch (ex)\n {\n console.error(ex.message);\n }\n \n // if (DEBUG)\n // {\n // console.debug(\"currentTime: \" + currentTime);\n // }\n \n if (currentTime)\n {\n onPositionChanged(currentTime, 1);\n }\n }, 20);\n }\n \n function stopTimer()\n {\n if (_intervalTimer)\n {\n clearInterval(_intervalTimer);\n }\n _intervalTimer = undefined;\n }\n \n this.isPlaying = function()\n {\n return _intervalTimer !== undefined;\n };\n \n this.reset = function()\n {\n if (DEBUG)\n {\n console.error(\"this.reset()\");\n }\n \n this.pause();\n \n _audioElement.moSeeking = undefined;\n \n _currentSmilSrc = undefined;\n _currentEpubSrc = undefined;\n \n setTimeout(function()\n {\n _audioElement.setAttribute(\"src\", \"\");\n }, 1);\n };\n \n\n _audioElement.addEventListener(\"loadstart\", function()\n {\n _touchInited = true;\n }\n );\n var _touchInited = false;\n this.touchInit = function()\n {\n if (!_iOS)\n {\n return false;\n }\n \n if (_touchInited)\n {\n return false;\n }\n \n _touchInited = true;\n \n _audioElement.setAttribute(\"src\", \"touch/init/html5/audio.mp3\");\n _audioElement.load();\n \n return true;\n };\n \n var _playId = 0;\n \n var _seekQueuing = 0;\n \n this.playFile = function(smilSrc, epubSrc, seekBegin) //element\n {\n _playId++;\n if (_playId > 99999)\n {\n _playId = 0;\n }\n \n var playId = _playId;\n \n if (_audioElement.moSeeking)\n {\n _seekQueuing++;\n if (_seekQueuing > MAX_SEEK_RETRIES)\n {\n _seekQueuing = 0;\n return;\n }\n \n if (DEBUG)\n {\n console.debug(\"this.playFile(\" + epubSrc + \")\" + \" @\" + seekBegin + \" (POSTPONE, SEEKING...)\");\n }\n \n setTimeout(function()\n {\n self.playFile(smilSrc, epubSrc, seekBegin);\n }, 20);\n \n return;\n }\n \n _audioElement.moSeeking = {};\n \n if (DEBUG)\n {\n console.debug(\"this.playFile(\" + epubSrc + \")\" + \" @\" + seekBegin + \" #\" + playId);\n }\n \n var audioNeedsNewSrc = !_currentEpubSrc || _currentEpubSrc !== epubSrc;\n \n if (!audioNeedsNewSrc)\n {\n if (DEBUG)\n {\n console.debug(\"this.playFile() SAME SRC\");\n }\n \n this.pause();\n \n _currentSmilSrc = smilSrc;\n _currentEpubSrc = epubSrc;\n \n playSeekCurrentTime(seekBegin, playId, false);\n \n return;\n }\n \n if (DEBUG)\n {\n console.debug(\"this.playFile() NEW SRC\");\n console.debug(\"_currentEpubSrc: \" + _currentEpubSrc);\n console.debug(\"epubSrc: \" + epubSrc);\n }\n \n this.reset();\n _audioElement.moSeeking = {};\n \n _currentSmilSrc = smilSrc;\n _currentEpubSrc = epubSrc;\n \n //element.parentNode.insertBefore(_audioElement, element); //element.parentNode.childNodes[0]);\n \n if (!_Android)\n {\n _audioElement.addEventListener('play', onPlayToForcePreload, false);\n }\n \n $(_audioElement).on(_readyEvent, {seekBegin: seekBegin, playId: playId}, onReadyToSeek);\n \n setTimeout(function()\n {\n _audioElement.setAttribute(\"src\", _currentEpubSrc);\n // _audioElement.src = _currentEpubSrc;\n // $(_audioElement).attr(\"src\", _currentEpubSrc);\n \n // if (_Android)\n // {\n // _audioElement.addEventListener('loadstart', onReadyToPlayToForcePreload, false);\n // }\n \n _audioElement.load();\n \n if (!_Android)\n {\n playToForcePreload();\n }\n }, 1);\n };\n \n // var onReadyToPlayToForcePreload = function ()\n // {\n // _audioElement.removeEventListener('loadstart', onReadyToPlayToForcePreload, false);\n // \n // if (DEBUG)\n // {\n // console.debug(\"onReadyToPlayToForcePreload\");\n // }\n // \n // playToForcePreload();\n // };\n \n var playToForcePreload = function()\n {\n if (DEBUG)\n {\n console.debug(\"playToForcePreload\");\n }\n \n //_audioElement.volume = 0;\n //_audioElement.play();\n var vol = _volume;\n _volume = 0;\n self.play();\n _volume = vol;\n };\n \n var onPlayToForcePreload = function ()\n {\n _audioElement.removeEventListener('play', onPlayToForcePreload, false);\n \n if (DEBUG)\n {\n console.debug(\"onPlayToForcePreload\");\n }\n _audioElement.pause(); // note: interval timer continues (immediately follows self.play())\n };\n \n var _readyEvent = _Android ? \"canplaythrough\" : \"canplay\";\n function onReadyToSeek_(event)\n {\n if (DEBUG)\n {\n console.debug(\"onReadyToSeek #\" + event.data.playId);\n }\n playSeekCurrentTime(event.data.seekBegin, event.data.playId, true);\n }\n function onReadyToSeek(event)\n {\n $(_audioElement).off(_readyEvent, onReadyToSeek);\n \n if (!_Android)\n {\n onReadyToSeek_(event);\n }\n else\n {\n if (DEBUG)\n {\n console.debug(\"onReadyToSeek ANDROID ... waiting a bit ... #\" + event.data.playId);\n }\n \n //self.play();\n playToForcePreload();\n \n setTimeout(function() {\n onReadyToSeek_(event);\n }, 1000);\n }\n }\n \n function playSeekCurrentTime(newCurrentTime, playId, isNewSrc)\n {\n if (DEBUG)\n {\n console.debug(\"playSeekCurrentTime() #\" + playId);\n }\n \n if (newCurrentTime == 0)\n {\n newCurrentTime = 0.01;\n }\n \n if(Math.abs(newCurrentTime - _audioElement.currentTime) < 0.3)\n {\n if (DEBUG)\n {\n console.debug(\"playSeekCurrentTime() CONTINUE\");\n }\n \n _audioElement.moSeeking = undefined;\n self.play();\n return;\n }\n \n var ev = isNewSrc ? _seekedEvent1 : _seekedEvent2;\n \n if (DEBUG)\n {\n console.debug(\"playSeekCurrentTime() NEED SEEK, EV: \" + ev);\n }\n \n self.pause();\n \n $(_audioElement).on(ev, {newCurrentTime: newCurrentTime, playId: playId, isNewSrc: isNewSrc}, onSeeked);\n \n try\n {\n _audioElement.currentTime = newCurrentTime;\n }\n catch (ex)\n {\n console.error(ex.message);\n \n setTimeout(function()\n {\n try\n {\n _audioElement.currentTime = newCurrentTime;\n }\n catch (ex)\n {\n console.error(ex.message);\n }\n }, 5);\n }\n }\n \n var MAX_SEEK_RETRIES = 10;\n var _seekedEvent1 = _iOS ? \"canplaythrough\" : \"seeked\"; //\"progress\"\n var _seekedEvent2 = _iOS ? \"timeupdate\" : \"seeked\";\n function onSeeked(event)\n {\n var ev = event.data.isNewSrc ? _seekedEvent1 : _seekedEvent2;\n \n var notRetry = event.data.seekRetries == undefined;\n \n if (notRetry || event.data.seekRetries == MAX_SEEK_RETRIES) // first retry\n {\n $(_audioElement).off(ev, onSeeked);\n }\n \n if (DEBUG)\n {\n console.debug(\"onSeeked() #\" + event.data.playId + \" FIRST? \" + notRetry + \" EV: \" + ev);\n }\n \n var curTime = _audioElement.currentTime;\n var diff = Math.abs(event.data.newCurrentTime - curTime);\n \n if((notRetry || event.data.seekRetries >= 0) &&\n diff >= 1)\n {\n if (DEBUG)\n {\n console.debug(\"onSeeked() time diff: \" + event.data.newCurrentTime + \" vs. \" + curTime + \" (\"+diff+\")\");\n }\n \n if (notRetry)\n {\n event.data.seekRetries = MAX_SEEK_RETRIES;\n \n // if (DEBUG)\n // {\n // console.debug(\"onSeeked() fail => first retry, EV: \" + _seekedEvent2);\n // }\n \n event.data.isNewSrc = false;\n //$(_audioElement).on(_seekedEvent2, event.data, onSeeked);\n }\n \n //else\n {\n event.data.seekRetries--;\n \n if (DEBUG)\n {\n console.debug(\"onSeeked() FAIL => retry again (timeout)\");\n }\n \n setTimeout(function()\n {\n onSeeked(event);\n }, _Android ? 1000 : 200);\n }\n \n setTimeout(function()\n {\n _audioElement.pause();\n try\n {\n _audioElement.currentTime = event.data.newCurrentTime;\n }\n catch (ex)\n {\n console.error(ex.message);\n \n setTimeout(function()\n {\n try\n {\n _audioElement.currentTime = event.data.newCurrentTime;\n }\n catch (ex)\n {\n console.error(ex.message);\n }\n }, 4);\n }\n }, 5);\n }\n else\n {\n if (DEBUG)\n {\n console.debug(\"onSeeked() STATE:\");\n console.debug(notRetry);\n console.debug(event.data.seekRetries);\n console.debug(diff);\n }\n \n if (diff >= 1)\n {\n if (DEBUG)\n {\n console.debug(\"onSeeked() ABORT, TRY AGAIN FROM SCRATCH!\");\n }\n \n var smilSrc = _currentSmilSrc;\n var epubSrc = _currentEpubSrc;\n var seekBegin = event.data.newCurrentTime;\n \n self.reset();\n \n setTimeout(function()\n {\n self.playFile(smilSrc, epubSrc, seekBegin);\n }, 10);\n \n return;\n }\n\n if (DEBUG)\n {\n console.debug(\"onSeeked() OKAY => play!\");\n }\n \n event.data.seekRetries = undefined;\n \n self.play();\n \n _audioElement.moSeeking = undefined;\n }\n }\n };\n\n return AudioPlayer;\n});\n\n", @@ -80,7 +80,7 @@ "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\n/** \n * Switches in the epub publication.\n * \n * @class Models.Switches\n * @constructor\n */\nvar Switches = function() {\n\n};\n\n// Description: Parse the epub \"switch\" tags and hide\n// cases that are not supported\n\n/**\n *\n * Static Switches.apply method.\n * \n * @method Switches.apply\n * @param dom\n */\n\nSwitches.apply = function(dom) {\n\n function isSupported(caseNode) {\n\n var ns = caseNode.attributes[\"required-namespace\"];\n if(!ns) {\n // the namespace was not specified, that should\n // never happen, we don't support it then\n console.log(\"Encountered a case statement with no required-namespace\");\n return false;\n }\n // all the xmlns that readium is known to support\n // TODO this is going to require maintenance\n var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\n return _.include(supportedNamespaces, ns.value);\n }\n\n var getQuery = ((window.navigator.userAgent.indexOf(\"Trident\") > 0) || (window.navigator.userAgent.indexOf(\"Edge\") > 0))\n ? function (elementName) { return 'epub\\\\:' + elementName; }\n : function (elementName) { return elementName; };\n\n _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) {\n\n // keep track of whether or now we found one\n var found = false;\n\n _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) {\n\n if( !found && isSupported(caseNode) ) {\n found = true; // we found the node, don't remove it\n }\n else {\n $(caseNode).remove(); // remove the node from the dom\n }\n\n });\n\n if (found) {\n\n // if we found a supported case, remove the default\n _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) {\n $(defaultNode).remove();\n });\n\n }\n\n });\n};\n return Switches;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/trigger',[\"jquery\", \"../helpers\"], function($, Helpers) {\n/**\n * Trigger in an epub publication.\n *\n * @class Models.Trigger\n * @constructor\n * @param domNode\n */\n\nvar Trigger = function(domNode) {\n\n var $el = $(domNode);\n \n /**\n * epub trigger action\n *\n * @property action\n * @type String\n */\n\n this.action = $el.attr(\"action\");\n \n /**\n * epub trigger ref\n *\n * @property ref\n * @type String\n */\n\n this.ref = $el.attr(\"ref\");\n \n /**\n * epub trigger event\n *\n * @property event\n * @type String\n */\n\n this.event = $el.attr(\"ev:event\");\n \n /**\n * epub trigger observer\n *\n * @property observer\n * @type String\n */\n\n this.observer = $el.attr(\"ev:observer\");\n this.ref = $el.attr(\"ref\");\n};\n\n/**\n * Static register method\n *\n * @method register\n * @param dom\n */\nTrigger.register = function(dom) {\n $('trigger', dom).each(function() {\n var trigger = new Trigger(this);\n trigger.subscribe(dom);\n });\n};\n\n/**\n * Prototype subscribe method\n *\n * @method subscribe\n * @param dom\n */\n\nTrigger.prototype.subscribe = function(dom) {\n \n var selector = \"#\" + this.observer;\n var that = this;\n $(selector, dom).on(this.event, function() {\n return that.execute(dom);\n });\n};\n\n/**\n * Prototype execute method\n *\n * @method execute\n * @param dom\n */\n\nTrigger.prototype.execute = function(dom) {\n\n var $target = $( \"#\" + Helpers.escapeJQuerySelector(this.ref), dom);\n switch(this.action)\n {\n case \"show\":\n $target.css(\"visibility\", \"visible\");\n break;\n case \"hide\":\n $target.css(\"visibility\", \"hidden\");\n break;\n case \"play\":\n $target[0].currentTime = 0;\n $target[0].play();\n break;\n case \"pause\":\n $target[0].pause();\n break;\n case \"resume\":\n $target[0].play();\n break;\n case \"mute\":\n $target[0].muted = true;\n break;\n case \"unmute\":\n $target[0].muted = false;\n break;\n default:\n console.log(\"do not no how to handle trigger \" + this.action);\n return null;\n }\n return false; // do not propagate click event; it was already handled\n\n};\n\n return Trigger;\n});\n\n", "// Created by Juan Corona\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/node_range_info',[],function () {\n\n /**\n * @class Models.NodeRangePositionInfo\n * @constructor\n * @param {Node} node The actual DOM node\n * @param {Number} offest The position offsetf for the node\n */\n var NodeRangePositionInfo = function (node, offset) {\n\n /**\n * The actual DOM node\n * @property node\n * @type Node\n */\n this.node = node;\n\n /**\n * The position offsetf for the node\n * @property offset\n * @type Number\n */\n this.offset = offset;\n\n };\n\n /**\n * @class Models.NodeRangeInfo\n * @constructor\n * @param {ClientRect} clientRect\n * @param {Models.NodeRangePositionInfo} startInfo\n * @param {Models.NodeRangePositionInfo} endInfo\n */\n var NodeRangeInfo = function (clientRect, startInfo, endInfo) {\n\n var self = this;\n /**\n * Client rectangle information for the range content bounds\n * @property clientRect\n * @type ClientRect\n */\n this.clientRect = clientRect;\n\n /**\n * Node and position information providing where and which node the range starts with\n * @property startInfo\n * @type Models.NodeRangePositionInfo\n */\n this.startInfo = startInfo;\n\n /**\n * Node and position information providing where and which node the range ends with\n * @property endInfo\n * @type Models.NodeRangePositionInfo\n */\n this.endInfo = endInfo;\n\n\n this.setStartInfo = function (info) {\n self.startInfo = new NodeRangePositionInfo(info);\n return self;\n };\n\n this.setEndInfo = function (info) {\n self.endInfo = new NodeRangePositionInfo(info);\n return self;\n };\n };\n\n return NodeRangeInfo;\n});\n", - "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/external_agent_support',[\"../globals\", \"underscore\"], function(Globals, _) {\n /**\n * This module helps external agents that interact with content documents from\n * the level of the iframe browsing context:\n *\n * - By providing a means of identifying the content through metadata\n * that's brought down from the package document level.\n *\n * - By providing a direct link (bringing down the shareable URL) that could be used\n * to load the content in the proper context with the reader app instead of the actual\n * content document asset path.\n *\n * - By responding to an event when the external agent wants to bring a\n * specific range of content into view.\n *\n * @param {Views.ReaderView} reader The Reader instance\n * @constructor\n */\n var ExternalAgentSupport = function(reader) {\n\n var contentDocumentStates = {};\n var contentDocuments = {};\n\n Globals.on(Globals.Events.PLUGINS_LOADED, function() {\n // Disable the AMD environment since it's not needed anymore at this point.\n // This is done because external agents with their own module systems (Browserify)\n // might load third-party scripts that are in the format of\n // UMD (Universal Module Definition),\n // and will mistakenly try to use Readium's AMD shim, almond.js, or require.js\n if (window.define && window.define.amd) {\n delete window.define.amd;\n }\n });\n\n function appendMetaTag(_document, property, content) {\n var tag = _document.createElement('meta');\n tag.setAttribute('name', property);\n tag.setAttribute('content', content);\n _document.head.appendChild(tag);\n }\n\n function injectDublinCoreResourceIdentifiers(contentDocument, spineItem) {\n var renditionIdentifier = reader.metadata().identifier; // the package unique identifier\n var spineItemIdentifier = spineItem.idref; // use the spine item id as an identifier too\n if (renditionIdentifier && spineItemIdentifier) {\n appendMetaTag(contentDocument, 'dc.relation.ispartof', renditionIdentifier);\n appendMetaTag(contentDocument, 'dc.identifier', spineItemIdentifier);\n }\n }\n\n function injectAppUrlAsCanonicalLink(contentDocument, spineItem) {\n if (contentDocument.defaultView && contentDocument.defaultView.parent) {\n var parentWindow = contentDocument.defaultView.parent;\n var isParentInSameDomain = Object.keys(parentWindow).indexOf('document') !== -1;\n // Only do this if there's no potential cross-domain violation\n // and the reader application URL has a CFI value in a 'goto' query param.\n if (isParentInSameDomain && parentWindow.location.search.match(/goto=.*cfi/i)) {\n var link = contentDocument.createElement('link');\n link.setAttribute('rel', 'canonical');\n link.setAttribute('href', parentWindow.location.href);\n contentDocument.head.appendChild(link);\n contentDocumentStates[spineItem.idref].canonicalLinkElement = link;\n }\n }\n }\n\n var bringIntoViewDebounced = _.debounce(function (range) {\n var target = reader.getRangeCfiFromDomRange(range);\n var contentDocumentState = contentDocumentStates[target.idref];\n\n if (contentDocumentState && contentDocumentState.isUpdated) {\n reader.openSpineItemElementCfi(target.idref, target.contentCFI);\n } else {\n contentDocumentState.pendingNavRequest = {\n idref: target.idref,\n contentCFI: target.contentCFI\n };\n }\n }, 100);\n\n function bindBringIntoViewEvent(contentDocument) {\n // 'scrolltorange' is a non-standard event that is emitted on the content frame\n // by some external tools like Hypothes.is\n contentDocument.addEventListener('scrolltorange', function (event) {\n event.preventDefault();\n\n var range = event.detail;\n bringIntoViewDebounced(range);\n });\n }\n\n function bindSelectionPopupWorkaround(contentDocument) {\n // A hack to make the Hypothes.is 'adder' context menu popup work when the content doc body is positioned.\n // When the content doc has columns and a body with position set to 'relative'\n // the adder won't be positioned properly.\n //\n // The workaround is to clear the position property when a selection is active.\n // Then restore the position property to 'relative' when the selection clears.\n contentDocument.addEventListener('selectionchange', function () {\n var selection = contentDocument.getSelection();\n if (selection && selection.isCollapsed) {\n contentDocument.body.style.position = 'relative';\n } else {\n contentDocument.body.style.position = '';\n }\n });\n }\n\n /***\n *\n * @param {Document} contentDocument Document instance with DOM tree\n * @param {Models.SpineItem} spineItem The associated spine item object\n */\n this.bindToContentDocument = function(contentDocument, spineItem) {\n contentDocuments[spineItem.idref] = contentDocument;\n contentDocumentStates[spineItem.idref] = {};\n injectDublinCoreResourceIdentifiers(contentDocument, spineItem);\n injectAppUrlAsCanonicalLink(contentDocument, spineItem);\n bindBringIntoViewEvent(contentDocument);\n\n if (spineItem.isReflowable()) {\n bindSelectionPopupWorkaround(contentDocument);\n }\n };\n\n /***\n *\n * @param {Models.SpineItem} spineItem The associated spine item object\n */\n this.updateContentDocument = function (spineItem) {\n var contentDocument = contentDocuments[spineItem.idref];\n var state = contentDocumentStates[spineItem.idref];\n\n if (contentDocument && state) {\n\n if (state.canonicalLinkElement &&\n contentDocument.defaultView &&\n contentDocument.defaultView.parent) {\n var parentWindow = contentDocument.defaultView.parent;\n var isParentInDifferentDomain = 'document' in Object.keys(parentWindow);\n if (!isParentInDifferentDomain) {\n state.canonicalLinkElement.setAttribute('href', parentWindow.location.href);\n }\n }\n\n state.isUpdated = true;\n\n var pendingNavRequest = state.pendingNavRequest;\n if (pendingNavRequest) {\n reader.openSpineItemElementCfi(pendingNavRequest.idref, pendingNavRequest.contentCFI);\n state.pendingNavRequest = null;\n }\n }\n };\n };\n\n return ExternalAgentSupport;\n});\n\n", + "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/external_agent_support',[\"../globals\", \"underscore\"], function(Globals, _) {\n /**\n * This module helps external agents that interact with content documents from\n * the level of the iframe browsing context:\n *\n * - By providing a means of identifying the content through metadata\n * that's brought down from the package document level.\n *\n * - By providing a direct link (bringing down the shareable URL) that could be used\n * to load the content in the proper context with the reader app instead of the actual\n * content document asset path.\n *\n * - By responding to an event when the external agent wants to bring a\n * specific range of content into view.\n *\n * @param {Views.ReaderView} reader The Reader instance\n * @constructor\n */\n var ExternalAgentSupport = function(reader) {\n\n var contentDocumentStates = {};\n var contentDocuments = {};\n\n Globals.on(Globals.Events.PLUGINS_LOADED, function() {\n // Disable the AMD environment since it's not needed anymore at this point.\n // This is done because external agents with their own module systems (Browserify)\n // might load third-party scripts that are in the format of\n // UMD (Universal Module Definition),\n // and will mistakenly try to use Readium's AMD shim, almond.js, or require.js\n if (window.define && window.define.amd) {\n delete window.define.amd;\n }\n });\n\n function appendMetaTag(_document, property, content) {\n var tag = _document.createElement('meta');\n tag.setAttribute('name', property);\n tag.setAttribute('content', content);\n _document.head.appendChild(tag);\n }\n\n function injectDublinCoreResourceIdentifiers(contentDocument, spineItem) {\n var renditionIdentifier = reader.metadata().identifier; // the package unique identifier\n var spineItemIdentifier = spineItem.idref; // use the spine item id as an identifier too\n if (renditionIdentifier && spineItemIdentifier) {\n appendMetaTag(contentDocument, 'dc.relation.ispartof', renditionIdentifier);\n appendMetaTag(contentDocument, 'dc.identifier', spineItemIdentifier);\n }\n }\n\n function determineCanonicalLinkHref(contentWindow) {\n // Only grab the href if there's no potential cross-domain violation\n // and the reader application URL has a CFI value in a 'goto' query param.\n var isSameDomain = Object.keys(contentWindow).indexOf('document') !== -1;\n if (isSameDomain && contentWindow.location.search.match(/goto=.*cfi/i)) {\n return contentWindow.location.href.split(\"#\")[0];\n }\n }\n\n function getContentDocumentCanonicalLink(contentDocument) {\n var contentDocWindow = contentDocument.defaultView;\n if (contentDocWindow && (contentDocWindow.parent|| contentDocWindow.top)) {\n var parentWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.parent);\n var topWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.top);\n return topWindowCanonicalHref || parentWindowCanonicalHref;\n }\n }\n\n function injectAppUrlAsCanonicalLink(contentDocument, spineItem) {\n if (contentDocument.defaultView && contentDocument.defaultView.parent) {\n var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument);\n if (canonicalLinkHref) {\n var link = contentDocument.createElement('link');\n link.setAttribute('rel', 'canonical');\n link.setAttribute('href', canonicalLinkHref);\n contentDocument.head.appendChild(link);\n contentDocumentStates[spineItem.idref].canonicalLinkElement = link;\n }\n }\n }\n\n var bringIntoViewDebounced = _.debounce(function (range) {\n var target = reader.getRangeCfiFromDomRange(range);\n var contentDocumentState = contentDocumentStates[target.idref];\n\n if (contentDocumentState && contentDocumentState.isUpdated) {\n reader.openSpineItemElementCfi(target.idref, target.contentCFI);\n } else {\n contentDocumentState.pendingNavRequest = {\n idref: target.idref,\n contentCFI: target.contentCFI\n };\n }\n }, 100);\n\n function bindBringIntoViewEvent(contentDocument) {\n // 'scrolltorange' is a non-standard event that is emitted on the content frame\n // by some external tools like Hypothes.is\n contentDocument.addEventListener('scrolltorange', function (event) {\n event.preventDefault();\n\n var range = event.detail;\n bringIntoViewDebounced(range);\n });\n }\n\n function bindSelectionPopupWorkaround(contentDocument) {\n // A hack to make the Hypothes.is 'adder' context menu popup work when the content doc body is positioned.\n // When the content doc has columns and a body with position set to 'relative'\n // the adder won't be positioned properly.\n //\n // The workaround is to clear the position property when a selection is active.\n // Then restore the position property to 'relative' when the selection clears.\n contentDocument.addEventListener('selectionchange', function () {\n var selection = contentDocument.getSelection();\n if (selection && selection.isCollapsed) {\n contentDocument.body.style.position = 'relative';\n } else {\n contentDocument.body.style.position = '';\n }\n });\n }\n\n /***\n *\n * @param {Document} contentDocument Document instance with DOM tree\n * @param {Models.SpineItem} spineItem The associated spine item object\n */\n this.bindToContentDocument = function(contentDocument, spineItem) {\n contentDocuments[spineItem.idref] = contentDocument;\n contentDocumentStates[spineItem.idref] = {};\n injectDublinCoreResourceIdentifiers(contentDocument, spineItem);\n injectAppUrlAsCanonicalLink(contentDocument, spineItem);\n bindBringIntoViewEvent(contentDocument);\n\n if (spineItem.isReflowable()) {\n bindSelectionPopupWorkaround(contentDocument);\n }\n };\n\n /***\n *\n * @param {Models.SpineItem} spineItem The associated spine item object\n */\n this.updateContentDocument = function (spineItem) {\n var contentDocument = contentDocuments[spineItem.idref];\n var state = contentDocumentStates[spineItem.idref];\n\n if (contentDocument && state) {\n\n if (state.canonicalLinkElement) {\n var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument);\n if (canonicalLinkHref) {\n state.canonicalLinkElement.setAttribute('href', canonicalLinkHref);\n }\n }\n\n state.isUpdated = true;\n\n var pendingNavRequest = state.pendingNavRequest;\n if (pendingNavRequest) {\n reader.openSpineItemElementCfi(pendingNavRequest.idref, pendingNavRequest.contentCFI);\n state.pendingNavRequest = null;\n }\n }\n };\n };\n\n return ExternalAgentSupport;\n});\n\n", "// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/reader_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\n \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/metadata\", \"../models/page_open_request\",\n \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\n \"../models/viewer_settings\", \"../models/bookmark_data\", \"../models/node_range_info\", \"./external_agent_support\"],\n function (Globals, $, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\n MediaOverlayDataInjector, MediaOverlayPlayer, Package, Metadata, PageOpenRequest,\n ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\n ViewerSettings, BookmarkData, NodeRangeInfo, ExternalAgentSupport) {\n/**\n * Options passed on the reader from the readium loader/initializer\n *\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\n * @property {jQueryElement|string} el The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\n * @property {boolean} needsFixedLayoutScalerWorkAround\n */\n\n/**\n * Top level View object. Interface for view manipulation public APIs\n * @param {Views.ReaderView.ReaderOptions} options\n * @constructor\n */\nvar ReaderView = function (options) {\n $.extend(this, new EventEmitter());\n\n var self = this;\n var _currentView = undefined;\n var _package = undefined;\n var _metadata = undefined;\n var _spine = undefined;\n var _viewerSettings = new ViewerSettings({});\n //styles applied to the container divs\n var _userStyles = new StyleCollection();\n //styles applied to the content documents\n var _bookStyles = new StyleCollection();\n var _internalLinksSupport = new InternalLinksSupport(this);\n var _externalAgentSupport = new ExternalAgentSupport(this);\n var _mediaOverlayPlayer;\n var _mediaOverlayDataInjector;\n var _iframeLoader;\n var _$el;\n\n //We will call onViewportResize after user stopped resizing window\n var lazyResize = Helpers.extendedThrottle(\n handleViewportResizeStart,\n handleViewportResizeTick,\n handleViewportResizeEnd, 250, 1000, self);\n\n $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\n\n this.fonts = options.fonts;\n\n\n if (options.el instanceof $) {\n _$el = options.el;\n console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\n } else {\n _$el = $(options.el);\n console.log(\"** EL is a string:\" + _$el.attr('id'));\n }\n\n if (options.iframeLoader) {\n _iframeLoader = options.iframeLoader;\n }\n else {\n _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\n }\n\n\n _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\n /**\n * @returns {boolean}\n */\n this.needsFixedLayoutScalerWorkAround = function () {\n return _needsFixedLayoutScalerWorkAround;\n };\n\n /**\n * Create a view based on the given view type.\n * @param {Views.ReaderView.ViewType} viewType\n * @param {Views.ReaderView.ViewCreationOptions} options\n * @returns {*}\n */\n this.createViewForType = function (viewType, options) {\n var createdView;\n\n // NOTE: _$el == options.$viewport\n _$el.css(\"overflow\", \"hidden\");\n\n switch (viewType) {\n case ReaderView.VIEW_TYPE_FIXED:\n\n _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\n\n createdView = new FixedView(options, self);\n break;\n case ReaderView.VIEW_TYPE_SCROLLED_DOC:\n createdView = new ScrollView(options, false, self);\n break;\n case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\n createdView = new ScrollView(options, true, self);\n break;\n default:\n createdView = new ReflowableView(options, self);\n break;\n }\n\n return createdView;\n };\n\n /**\n * Returns the current view type of the reader view\n * @returns {ReaderView.ViewType}\n */\n this.getCurrentViewType = function () {\n\n if (!_currentView) {\n return undefined;\n }\n\n if (_currentView instanceof ReflowableView) {\n return ReaderView.VIEW_TYPE_COLUMNIZED;\n }\n\n if (_currentView instanceof FixedView) {\n return ReaderView.VIEW_TYPE_FIXED;\n }\n\n if (_currentView instanceof ScrollView) {\n if (_currentView.isContinuousScroll()) {\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n }\n\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n }\n\n console.error(\"Unrecognized view type\");\n return undefined;\n };\n\n this.getCurrentView = function () {\n return _currentView;\n };\n\n //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\n function deduceDesiredViewType(spineItem) {\n\n //check settings\n if (_viewerSettings.scroll == \"scroll-doc\") {\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n }\n\n if (_viewerSettings.scroll == \"scroll-continuous\") {\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n }\n\n //is fixed layout ignore flow\n if (spineItem.isFixedLayout()) {\n return ReaderView.VIEW_TYPE_FIXED;\n }\n\n //flow\n if (spineItem.isFlowScrolledDoc()) {\n return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n }\n\n if (spineItem.isFlowScrolledContinuous()) {\n return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n }\n\n return ReaderView.VIEW_TYPE_COLUMNIZED;\n }\n\n // returns true is view changed\n function initViewForItem(spineItem, callback) {\n\n var desiredViewType = deduceDesiredViewType(spineItem);\n\n if (_currentView) {\n\n if (self.getCurrentViewType() == desiredViewType) {\n callback(false);\n return;\n }\n\n resetCurrentView();\n }\n\n /**\n * View creation options\n * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\n * @property {jQueryElement} $viewport The view port element the reader view has created.\n * @property {Globals.Models.Spine} spine The spine item collection object\n * @property {Globals.Collections.StyleCollection} userStyles User styles\n * @property {Globals.Collections.StyleCollection} bookStyles Book styles\n * @property {Globals.Views.IFrameLoader} iframeLoader An instance of an iframe loader or one expanding it.\n */\n var viewCreationParams = {\n $viewport: _$el,\n spine: _spine,\n userStyles: _userStyles,\n bookStyles: _bookStyles,\n iframeLoader: _iframeLoader\n };\n\n\n _currentView = self.createViewForType(desiredViewType, viewCreationParams);\n \n Globals.logEvent(\"READER_VIEW_CREATED\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\n\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\n var contentDoc = $iframe[0].contentDocument;\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"ON\", \"reader_view.js (current view) [ \" + spineItem.href + \" ]\");\n\n if (!Helpers.isIframeAlive($iframe[0])) return;\n\n // performance degrades with large DOM (e.g. word-level text-audio sync)\n _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\n\n _internalLinksSupport.processLinkElements($iframe, spineItem);\n\n _externalAgentSupport.bindToContentDocument(contentDoc, spineItem);\n\n Trigger.register(contentDoc);\n Switches.apply(contentDoc);\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\n });\n\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOAD_START\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\n });\n\n _currentView.on(Globals.Events.CONTENT_DOCUMENT_UNLOADED, function ($iframe, spineItem) {\n \n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, $iframe, spineItem);\n });\n\n _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\n \n Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"ON\", \"reader_view.js\");\n\n //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\n //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\n //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\n _mediaOverlayPlayer.onPageChanged(pageChangeData);\n\n _.defer(function () {\n Globals.logEvent(\"PAGINATION_CHANGED\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\n \n if (!pageChangeData.spineItem) return;\n _.defer(function () {\n _externalAgentSupport.updateContentDocument(pageChangeData.spineItem);\n });\n });\n });\n\n _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\n Globals.logEvent(\"FXL_VIEW_RESIZED\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\n })\n\n _currentView.render();\n\n var docWillChange = true;\n _currentView.setViewSettings(_viewerSettings, docWillChange);\n\n // we do this to wait until elements are rendered otherwise book is not able to determine view size.\n setTimeout(function () {\n\n callback(true);\n\n }, 50);\n\n }\n\n /**\n * Returns a list of the currently active spine items\n *\n * @returns {Models.SpineItem[]}\n */\n this.getLoadedSpineItems = function () {\n\n if (_currentView) {\n return _currentView.getLoadedSpineItems();\n }\n\n return [];\n };\n\n function resetCurrentView() {\n\n if (!_currentView) {\n return;\n }\n\n Globals.logEvent(\"READER_VIEW_DESTROYED\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.READER_VIEW_DESTROYED);\n\n\n Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"OFF\", \"reader_view.js\");\n _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\n \n _currentView.remove();\n _currentView = undefined;\n }\n\n /**\n * Returns the currently instanced viewer settings\n *\n * @returns {Models.ViewerSettings}\n */\n this.viewerSettings = function () {\n return _viewerSettings;\n };\n\n /**\n * Returns a data object based on the package document\n *\n * @returns {Models.Package}\n */\n this.package = function () {\n return _package;\n };\n\n /**\n * Returns a data object based on the package document metadata\n *\n * @returns {Models.Metadata}\n */\n this.metadata = function () {\n return _metadata;\n };\n\n /**\n * Returns a representation of the spine as a data object, also acts as list of spine items\n *\n * @returns {Models.Spine}\n */\n this.spine = function () {\n return _spine;\n };\n\n /**\n * Returns the user CSS styles collection\n *\n * @returns {Collections.StyleCollection}\n */\n this.userStyles = function () {\n return _userStyles;\n };\n\n /**\n * Open Book Data\n *\n * @typedef {object} Globals.Views.ReaderView.OpenBookData\n * @property {Globals.Models.Package} package - packageData (required)\n * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\n * @property {Globals.Views.ReaderView.SettingsData} [settings]\n * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\n * @todo Define missing types\n */\n\n /**\n * Triggers the process of opening the book and requesting resources specified in the packageData\n *\n * @param {Views.ReaderView.OpenBookData} openBookData Open book data object\n */\n this.openBook = function (openBookData) {\n\n var packageData = openBookData.package ? openBookData.package : openBookData;\n\n _package = new Package(packageData);\n _metadata = new Metadata(packageData.metadata);\n\n _spine = _package.spine;\n _spine.handleLinear(true);\n\n if (_mediaOverlayPlayer) {\n _mediaOverlayPlayer.reset();\n }\n\n _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\n\n _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\n\n\n resetCurrentView();\n\n if (openBookData.settings) {\n self.updateSettings(openBookData.settings);\n }\n\n if (openBookData.styles) {\n self.setStyles(openBookData.styles);\n }\n\n var pageRequestData = undefined;\n\n if (openBookData.openPageRequest && typeof(openBookData.openPageRequest) === 'function') {\n openBookData.openPageRequest = openBookData.openPageRequest();\n }\n\n if (openBookData.openPageRequest) {\n\n if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\n pageRequestData = openBookData.openPageRequest;\n }\n else {\n console.log(\"Invalid page request data: idref required!\");\n }\n }\n\n var fallback = false;\n if (pageRequestData) {\n\n pageRequestData = openBookData.openPageRequest;\n\n try {\n if (pageRequestData.idref) {\n\n if (pageRequestData.spineItemPageIndex) {\n fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\n }\n else if (pageRequestData.elementCfi) {\n fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\n }\n else {\n fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\n }\n }\n else {\n fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\n }\n } catch (err) {\n console.error(\"openPageRequest fail: fallback to first page!\")\n console.log(err);\n fallback = true;\n }\n }\n else {\n fallback = true;\n }\n\n if (fallback) {// if we where not asked to open specific page we will open the first one\n\n var spineItem = _spine.first();\n if (spineItem) {\n var pageOpenRequest = new PageOpenRequest(spineItem, self);\n pageOpenRequest.setFirstPage();\n openPage(pageOpenRequest, 0);\n }\n\n }\n\n };\n\n function onMediaPlayerStatusChanged(status) {\n\n Globals.logEvent(\"MEDIA_OVERLAY_STATUS_CHANGED\", \"EMIT\", \"reader_view.js (via MediaOverlayPlayer + AudioPlayer)\");\n self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\n }\n\n /**\n * Flips the page from left to right.\n * Takes to account the page progression direction to decide to flip to prev or next page.\n */\n this.openPageLeft = function () {\n\n if (_package.spine.isLeftToRight()) {\n self.openPagePrev();\n }\n else {\n self.openPageNext();\n }\n };\n\n /**\n * Flips the page from right to left.\n * Takes to account the page progression direction to decide to flip to prev or next page.\n */\n this.openPageRight = function () {\n\n if (_package.spine.isLeftToRight()) {\n self.openPageNext();\n }\n else {\n self.openPagePrev();\n }\n\n };\n\n /**\n * Returns if the current child view is an instance of a fixed page view\n *\n * @returns {boolean}\n */\n this.isCurrentViewFixedLayout = function () {\n return _currentView instanceof FixedView;\n };\n\n /**\n * Zoom options\n *\n * @typedef {object} Globals.Views.ReaderView.ZoomOptions\n * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\n * @property {number} scale - 0.0 to 1.0\n */\n\n /**\n * Set the zoom options.\n *\n * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\n */\n this.setZoom = function (zoom) {\n // zoom only handled by fixed layout views\n if (self.isCurrentViewFixedLayout()) {\n _currentView.setZoom(zoom);\n }\n };\n\n /**\n * Returns the current view scale as a percentage\n *\n * @returns {number}\n */\n this.getViewScale = function () {\n if (self.isCurrentViewFixedLayout()) {\n return 100 * _currentView.getViewScale();\n }\n else {\n return 100;\n }\n };\n\n /**\n * Settings Data\n *\n * @typedef {object} Globals.Views.ReaderView.SettingsData\n * @property {number} fontSize - Font size as percentage\n * @property {number} fontSelection - Font selection as the number in the list of possible fonts, where 0 is special meaning default.\n * @property {(string|boolean)} syntheticSpread - \"auto\"|\"single\"|\"double\"\n * @property {(string|boolean)} scroll - \"auto\"|true|false\n * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\n * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\n */\n\n /**\n * Updates reader view based on the settings specified in settingsData object\n *\n * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\n * @fires Globals.Events.SETTINGS_APPLIED\n */\n this.updateSettings = function (settingsData) {\n\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\n\n _viewerSettings.update(settingsData);\n\n if (_mediaOverlayPlayer) {\n _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\n }\n\n if (_currentView && !settingsData.doNotUpdateView) {\n\n var bookMark = _currentView.bookmarkCurrentPage();\n\n if (bookMark && bookMark.idref) {\n\n var wasPlaying = false;\n if (_currentView.isReflowable && _currentView.isReflowable()) {\n wasPlaying = self.isPlayingMediaOverlay();\n if (wasPlaying) {\n self.pauseMediaOverlay();\n }\n }\n\n var spineItem = _spine.getItemById(bookMark.idref);\n\n initViewForItem(spineItem, function (isViewChanged) {\n\n if (!isViewChanged) {\n var docWillChange = false;\n _currentView.setViewSettings(_viewerSettings, docWillChange);\n }\n\n self.once(ReadiumSDK.Events.PAGINATION_CHANGED, function (pageChangeData)\n {\n var cfi = new BookmarkData(bookMark.idref, bookMark.contentCFI);\n self.debugBookmarkData(cfi);\n });\n\n self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\n\n if (wasPlaying) {\n self.playMediaOverlay();\n // setTimeout(function()\n // {\n // }, 60);\n }\n\n Globals.logEvent(\"SETTINGS_APPLIED 1 (view update)\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.SETTINGS_APPLIED);\n });\n \n return;\n }\n }\n\n Globals.logEvent(\"SETTINGS_APPLIED 2 (no view update)\", \"EMIT\", \"reader_view.js\");\n self.emit(Globals.Events.SETTINGS_APPLIED);\n };\n\n /**\n * Opens the next page.\n */\n this.openPageNext = function () {\n\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\n _currentView.openPageNext(self);\n return;\n }\n\n var paginationInfo = _currentView.getPaginationInfo();\n\n if (paginationInfo.openPages.length == 0) {\n return;\n }\n\n var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\n\n if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\n _currentView.openPageNext(self);\n return;\n }\n\n var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\n\n var nextSpineItem = _spine.nextItem(currentSpineItem);\n\n if (!nextSpineItem) {\n return;\n }\n\n var openPageRequest = new PageOpenRequest(nextSpineItem, self);\n openPageRequest.setFirstPage();\n\n openPage(openPageRequest, 2);\n };\n\n /**\n * Opens the previous page.\n */\n this.openPagePrev = function () {\n\n if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\n _currentView.openPagePrev(self);\n return;\n }\n\n var paginationInfo = _currentView.getPaginationInfo();\n\n if (paginationInfo.openPages.length == 0) {\n return;\n }\n\n var firstOpenPage = paginationInfo.openPages[0];\n\n if (firstOpenPage.spineItemPageIndex > 0) {\n _currentView.openPagePrev(self);\n return;\n }\n\n var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\n\n var prevSpineItem = _spine.prevItem(currentSpineItem);\n\n if (!prevSpineItem) {\n return;\n }\n\n var openPageRequest = new PageOpenRequest(prevSpineItem, self);\n openPageRequest.setLastPage();\n\n openPage(openPageRequest, 1);\n };\n\n function getSpineItem(idref) {\n\n if (!idref) {\n\n console.log(\"idref parameter value missing!\");\n return undefined;\n }\n\n var spineItem = _spine.getItemById(idref);\n if (!spineItem) {\n console.log(\"Spine item with id \" + idref + \" not found!\");\n return undefined;\n }\n\n return spineItem;\n\n }\n\n /**\n * Opens the page of the spine item with element with provided cfi\n *\n * @param {string} idref Id of the spine item\n * @param {string} elementCfi CFI of the element to be shown\n * @param {object} initiator optional\n */\n this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\n\n var spineItem = getSpineItem(idref);\n\n if (!spineItem) {\n return false;\n }\n\n var pageData = new PageOpenRequest(spineItem, initiator);\n if (elementCfi) {\n pageData.setElementCfi(elementCfi);\n }\n\n openPage(pageData, 0);\n\n return true;\n };\n\n /**\n * Opens specified page index of the current spine item\n *\n * @param {number} pageIndex Zero based index of the page in the current spine item\n * @param {object} initiator optional\n */\n this.openPageIndex = function (pageIndex, initiator) {\n\n if (!_currentView) {\n return false;\n }\n\n var pageRequest;\n\n if (_package.isFixedLayout()) {\n var spineItem = _spine.items[pageIndex];\n if (!spineItem) {\n return false;\n }\n\n pageRequest = new PageOpenRequest(spineItem, initiator);\n pageRequest.setPageIndex(0);\n }\n else {\n\n var spineItems = this.getLoadedSpineItems();\n if (spineItems.length > 0) {\n pageRequest = new PageOpenRequest(spineItems[0], initiator);\n pageRequest.setPageIndex(pageIndex);\n }\n }\n\n openPage(pageRequest, 0);\n\n return true;\n };\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n function openPage(pageRequest, dir) {\n\n initViewForItem(pageRequest.spineItem, function (isViewChanged) {\n\n if (!isViewChanged) {\n var docWillChange = true;\n _currentView.setViewSettings(_viewerSettings, docWillChange);\n }\n\n _currentView.openPage(pageRequest, dir);\n });\n }\n\n\n /**\n * Opens page index of the spine item with idref provided\n *\n * @param {string} idref Id of the spine item\n * @param {number} pageIndex Zero based index of the page in the spine item\n * @param {object} initiator optional\n */\n this.openSpineItemPage = function (idref, pageIndex, initiator) {\n\n var spineItem = getSpineItem(idref);\n\n if (!spineItem) {\n return false;\n }\n\n var pageData = new PageOpenRequest(spineItem, initiator);\n if (pageIndex) {\n pageData.setPageIndex(pageIndex);\n }\n\n openPage(pageData, 0);\n\n return true;\n };\n\n /**\n * Set CSS Styles to the reader container\n *\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\n * @param {boolean} doNotUpdateView Whether to update the view after the styles are applied.\n */\n this.setStyles = function (styles, doNotUpdateView) {\n\n var count = styles.length;\n\n for (var i = 0; i < count; i++) {\n if (styles[i].declarations) {\n _userStyles.addStyle(styles[i].selector, styles[i].declarations);\n }\n else {\n _userStyles.removeStyle(styles[i].selector);\n }\n }\n\n applyStyles(doNotUpdateView);\n\n };\n\n /**\n * Set CSS Styles to the content documents\n *\n * @param {Collections.StyleCollection} styles Style collection containing selector property and declarations object\n */\n this.setBookStyles = function (styles) {\n\n var count = styles.length;\n\n for (var i = 0; i < count; i++) {\n if (styles[i].declarations) {\n _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\n }\n else {\n _bookStyles.removeStyle(styles[i].selector);\n }\n }\n\n if (_currentView) {\n _currentView.applyBookStyles();\n }\n\n };\n\n /**\n * Gets an element from active content documents based on a query selector.\n *\n * @param {Models.SpineItem} spineItem The spine item object associated with an active content document\n * @param {string} selector The query selector\n * @returns {HTMLElement|undefined}\n */\n this.getElement = function (spineItemIdref, selector) {\n\n if (_currentView) {\n return _currentView.getElement(spineItemIdref, selector);\n }\n\n return undefined;\n };\n\n /**\n * Gets an element from active content documents based on an element id.\n *\n * @param {string} spineItemIdref The spine item idref associated with an active content document\n * @param {string} id The element id\n * @returns {HTMLElement|undefined}\n */\n this.getElementById = function (spineItemIdref, id) {\n\n if (_currentView) {\n return _currentView.getElementById(spineItemIdref, id);\n }\n\n return undefined;\n };\n\n /**\n * Gets an element from active content documents based on a content CFI.\n *\n * @param {string} spineItemIdref The spine item idref associated with an active content document\n * @param {string} cfi The partial content CFI\n * @param {string[]} [classBlacklist]\n * @param {string[]} [elementBlacklist]\n * @param {string[]} [idBlacklist]\n * @returns {HTMLElement|undefined}\n */\n this.getElementByCfi = function (spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n if (_currentView) {\n return _currentView.getElementByCfi(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist);\n }\n\n return undefined;\n\n };\n\n function applyStyles(doNotUpdateView) {\n\n Helpers.setStyles(_userStyles.getStyles(), _$el);\n\n if (_mediaOverlayPlayer)\n _mediaOverlayPlayer.applyStyles();\n\n if (doNotUpdateView) return;\n\n if (_currentView) {\n _currentView.applyStyles();\n }\n }\n\n /**\n * Opens a content url from a media player context\n *\n * @param {string} contentRefUrl\n * @param {string} sourceFileHref\n * @param offset\n */\n this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\n _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\n };\n\n\n /**\n * Opens the content document specified by the url\n *\n * @param {string} contentRefUrl Url of the content document\n * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\n * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\n * sourceFileHref to resolve contentUrl relative to the package file.\n * @param {object} initiator optional\n */\n this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\n\n var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\n\n var hashIndex = combinedPath.indexOf(\"#\");\n var hrefPart;\n var elementId;\n if (hashIndex >= 0) {\n hrefPart = combinedPath.substr(0, hashIndex);\n elementId = combinedPath.substr(hashIndex + 1);\n }\n else {\n hrefPart = combinedPath;\n elementId = undefined;\n }\n\n var spineItem = _spine.getItemByHref(hrefPart);\n if (!spineItem) {\n console.warn('spineItem ' + hrefPart + ' not found');\n // sometimes that happens because spine item's URI gets encoded,\n // yet it's compared with raw strings by `getItemByHref()` -\n // so we try to search with decoded link as well\n var decodedHrefPart = decodeURIComponent(hrefPart);\n spineItem = _spine.getItemByHref(decodedHrefPart);\n if (!spineItem) {\n console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\n return false;\n }\n }\n\n return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\n };\n\n /**\n * Opens the page of the spine item with element with provided cfi\n *\n * @param {string} idref Id of the spine item\n * @param {string} elementId id of the element to be shown\n * @param {object} initiator optional\n */\n this.openSpineItemElementId = function (idref, elementId, initiator) {\n\n var spineItem = _spine.getItemById(idref);\n if (!spineItem) {\n return false;\n }\n\n var pageData = new PageOpenRequest(spineItem, initiator);\n\n if (elementId) {\n pageData.setElementId(elementId);\n }\n\n\n openPage(pageData, 0);\n\n return true;\n };\n\n //var cfi = new BookmarkData(bookmark.idref, bookmark.contentCFI);\n this.debugBookmarkData = function(cfi) {\n\n if (!ReadiumSDK) return;\n\n var DEBUG = true; // change this to visualize the CFI range\n if (!DEBUG) return;\n \n var paginationInfo = this.getPaginationInfo();\n console.log(JSON.stringify(paginationInfo));\n \n if (paginationInfo.isFixedLayout) return;\n \n try {\n ReadiumSDK._DEBUG_CfiNavigationLogic.clearDebugOverlays();\n \n } catch (error) {\n //ignore\n }\n \n try {\n console.log(cfi);\n \n var range = this.getDomRangeFromRangeCfi(cfi);\n console.log(range);\n \n var res = ReadiumSDK._DEBUG_CfiNavigationLogic.drawDebugOverlayFromDomRange(range);\n console.log(res);\n \n var cfiFirst = ReadiumSDK.reader.getFirstVisibleCfi();\n console.log(cfiFirst);\n \n var cfiLast = ReadiumSDK.reader.getLastVisibleCfi();\n console.log(cfiLast);\n \n } catch (error) {\n //ignore\n }\n \n setTimeout(function() {\n try {\n ReadiumSDK._DEBUG_CfiNavigationLogic.clearDebugOverlays();\n } catch (error) {\n //ignore\n }\n }, 2000);\n };\n\n /**\n * Returns the bookmark associated with currently opened page.\n *\n * @returns {string} Serialized ReadiumSDK.Models.BookmarkData object as JSON string.\n * {null} If a bookmark could not be created successfully.\n */\n this.bookmarkCurrentPage = function() {\n var bookmark = _currentView.bookmarkCurrentPage();\n return bookmark ? bookmark.toString() : null;\n };\n\n /**\n * Resets all the custom styles set by setStyle callers at runtime\n */\n this.clearStyles = function () {\n\n _userStyles.resetStyleValues();\n applyStyles();\n _userStyles.clear();\n };\n\n /**\n * Resets all the custom styles set by setBookStyle callers at runtime\n */\n this.clearBookStyles = function () {\n\n if (_currentView) {\n\n _bookStyles.resetStyleValues();\n _currentView.applyBookStyles();\n }\n\n _bookStyles.clear();\n };\n\n /**\n * Returns true if media overlay available for one of the open pages.\n *\n * @returns {boolean}\n */\n this.isMediaOverlayAvailable = function () {\n\n if (!_mediaOverlayPlayer) return false;\n\n return _mediaOverlayPlayer.isMediaOverlayAvailable();\n };\n\n /*\n this.setMediaOverlaySkippables = function(items) {\n\n _mediaOverlayPlayer.setMediaOverlaySkippables(items);\n };\n\n this.setMediaOverlayEscapables = function(items) {\n\n _mediaOverlayPlayer.setMediaOverlayEscapables(items);\n };\n */\n\n /**\n * Starts/Stop playing media overlay on current page\n */\n this.toggleMediaOverlay = function () {\n\n _mediaOverlayPlayer.toggleMediaOverlay();\n };\n\n\n /**\n * Plays next fragment media overlay\n */\n this.nextMediaOverlay = function () {\n\n _mediaOverlayPlayer.nextMediaOverlay();\n\n };\n\n /**\n * Plays previous fragment media overlay\n */\n this.previousMediaOverlay = function () {\n\n _mediaOverlayPlayer.previousMediaOverlay();\n\n };\n\n /**\n * Plays next available fragment media overlay that is outside of the current escapable scope\n */\n this.escapeMediaOverlay = function () {\n\n _mediaOverlayPlayer.escape();\n };\n\n /**\n * End media overlay TTS\n * @todo Clarify what this does with Daniel.\n */\n this.ttsEndedMediaOverlay = function () {\n\n _mediaOverlayPlayer.onTTSEnd();\n };\n\n /**\n * Pause currently playing media overlays.\n */\n this.pauseMediaOverlay = function () {\n\n _mediaOverlayPlayer.pause();\n };\n\n /**\n * Start/Resume playback of media overlays.\n */\n this.playMediaOverlay = function () {\n\n _mediaOverlayPlayer.play();\n };\n\n /**\n * Determine if media overlays are currently playing.\n * @returns {boolean}\n */\n this.isPlayingMediaOverlay = function () {\n\n return _mediaOverlayPlayer.isPlaying();\n };\n\n//\n// should use Globals.Events.SETTINGS_APPLIED instead!\n// this.setRateMediaOverlay = function(rate) {\n//\n// _mediaOverlayPlayer.setRate(rate);\n// };\n// this.setVolumeMediaOverlay = function(volume){\n//\n// _mediaOverlayPlayer.setVolume(volume);\n// };\n\n /**\n * Get the first visible media overlay element from the currently active content document(s)\n * @returns {HTMLElement|undefined}\n */\n this.getFirstVisibleMediaOverlayElement = function () {\n\n if (_currentView) {\n return _currentView.getFirstVisibleMediaOverlayElement();\n }\n\n return undefined;\n };\n\n /**\n * Used to jump to an element to make sure it is visible when a content document is paginated\n * @param {string} spineItemId The spine item idref associated with an active content document\n * @param {HTMLElement} element The element to make visible\n * @param [initiator]\n */\n this.insureElementVisibility = function (spineItemId, element, initiator) {\n\n if (_currentView) {\n _currentView.insureElementVisibility(spineItemId, element, initiator);\n }\n };\n\n var _resizeBookmark = null;\n var _resizeMOWasPlaying = false;\n\n function handleViewportResizeStart() {\n\n _resizeBookmark = null;\n _resizeMOWasPlaying = false;\n\n if (_currentView) {\n\n if (_currentView.isReflowable && _currentView.isReflowable()) {\n _resizeMOWasPlaying = self.isPlayingMediaOverlay();\n if (_resizeMOWasPlaying) {\n self.pauseMediaOverlay();\n }\n }\n\n _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\n }\n }\n\n function handleViewportResizeTick() {\n if (_currentView) {\n self.handleViewportResize(_resizeBookmark);\n }\n }\n\n function handleViewportResizeEnd() {\n //same as doing one final tick for now\n handleViewportResizeTick();\n\n if (_resizeMOWasPlaying) self.playMediaOverlay();\n }\n\n this.handleViewportResize = function (bookmarkToRestore) {\n if (!_currentView) return;\n\n _currentView.onViewportResize();\n };\n\n /**\n * Lets user to subscribe to iframe's window events\n *\n * @param {string} eventName Event name.\n * @param {function} callback Callback function.\n * @param {object} context User specified data passed to the callback function.\n * @returns {undefined}\n */\n this.addIFrameEventListener = function (eventName, callback, context) {\n _iframeLoader.addIFrameEventListener(eventName, callback, context);\n };\n\n var BackgroundAudioTrackManager = function (readerView) {\n var _spineItemIframeMap = {};\n var _wasPlaying = false;\n\n var _callback_playPause = undefined;\n this.setCallback_PlayPause = function (callback) {\n _callback_playPause = callback;\n };\n\n var _callback_isAvailable = undefined;\n this.setCallback_IsAvailable = function (callback) {\n _callback_isAvailable = callback;\n };\n\n this.playPause = function (doPlay) {\n _playPause(doPlay);\n };\n\n var _playPause = function (doPlay) {\n if (_callback_playPause) {\n _callback_playPause(doPlay);\n }\n\n try {\n var $iframe = undefined;\n\n for (var prop in _spineItemIframeMap) {\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n var data = _spineItemIframeMap[prop];\n if (!data || !data.active) continue;\n\n if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\n\n $iframe = data[\"$iframe\"];\n if (!$iframe) continue;\n\n var $audios = $(\"audio\", $iframe[0].contentDocument);\n\n $.each($audios, function () {\n\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\n\n if (!attr) return true; // continue\n\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\n\n if (doPlay && this.play) {\n this.play();\n }\n else if (this.pause) {\n this.pause();\n }\n\n return true; // continue (more than one track?)\n });\n }\n }\n catch (err) {\n console.error(err);\n }\n };\n\n this.setPlayState = function (wasPlaying) {\n _wasPlaying = wasPlaying;\n };\n\n readerView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\n Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager) [ \" + spineItem.href + \" ]\");;\n \n try {\n if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\n // console.log(\"CONTENT_DOCUMENT_LOADED\");\n // console.debug(spineItem.href);\n // console.debug(spineItem.idref);\n\n _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\n }\n }\n catch (err) {\n console.error(err);\n }\n });\n\n readerView.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\n Globals.logEvent(\"PAGINATION_CHANGED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager)\");\n \n // console.log(\"PAGINATION_CHANGED\");\n // console.debug(pageChangeData);\n //\n // if (pageChangeData.spineItem)\n // {\n // console.debug(pageChangeData.spineItem.href);\n // console.debug(pageChangeData.spineItem.idref);\n // }\n // else\n // {\n // //console.error(pageChangeData);\n // }\n //\n // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\n // {\n // for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\n // {\n // console.log(pageChangeData.paginationInfo.openPages[i].idref);\n // }\n // }\n\n var atLeastOne = false;\n\n try {\n for (var prop in _spineItemIframeMap) {\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\n\n var isDisplayed = false;\n\n if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\n var allSame = true;\n\n for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\n if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\n isDisplayed = true;\n }\n else {\n allSame = false;\n }\n }\n\n if (!isActive && allSame) isActive = true;\n }\n\n if (isActive || isDisplayed) {\n var data = _spineItemIframeMap[prop];\n if (!data) continue;\n\n _spineItemIframeMap[prop][\"active\"] = isActive;\n\n var $iframe = data[\"$iframe\"];\n var href = data.href;\n\n var $audios = $(\"audio\", $iframe[0].contentDocument);\n $.each($audios, function () {\n\n var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\n\n if (!attr) return true; // continue\n\n if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\n\n this.setAttribute(\"loop\", \"loop\");\n this.removeAttribute(\"autoplay\");\n\n // DEBUG!\n //this.setAttribute(\"controls\", \"controls\");\n\n if (isActive) {\n // DEBUG!\n //$(this).css({border:\"2px solid green\"});\n }\n else {\n if (this.pause) this.pause();\n\n // DEBUG!\n //$(this).css({border:\"2px solid red\"});\n }\n\n atLeastOne = true;\n\n return true; // continue (more than one track?)\n });\n\n continue;\n }\n else {\n if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\n _spineItemIframeMap[prop] = undefined;\n }\n }\n }\n catch (err) {\n console.error(err);\n }\n\n if (_callback_isAvailable) {\n _callback_isAvailable(atLeastOne);\n }\n\n if (atLeastOne) {\n if (_wasPlaying) {\n _playPause(true);\n }\n else {\n _playPause(false); // ensure correct paused state\n }\n }\n else {\n _playPause(false); // ensure correct paused state\n }\n });\n\n readerView.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\n Globals.logEvent(\"MEDIA_OVERLAY_STATUS_CHANGED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager)\");\n \n if (!value.smilIndex) return;\n var package = readerView.package();\n var smil = package.media_overlay.smilAt(value.smilIndex);\n if (!smil || !smil.spineItemId) return;\n\n var needUpdate = false;\n for (var prop in _spineItemIframeMap) {\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n var data = _spineItemIframeMap[prop];\n if (!data) continue;\n\n if (data.active) {\n if (prop !== smil.spineItemId) {\n _playPause(false); // ensure correct paused state\n data.active = false;\n needUpdate = true;\n }\n }\n }\n\n if (needUpdate) {\n for (var prop in _spineItemIframeMap) {\n if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n var data = _spineItemIframeMap[prop];\n if (!data) continue;\n\n if (!data.active) {\n if (prop === smil.spineItemId) {\n data.active = true;\n }\n }\n }\n\n if (_wasPlaying) {\n _playPause(true);\n }\n }\n });\n };\n this.backgroundAudioTrackManager = new BackgroundAudioTrackManager(self);\n\n function getCfisForVisibleRegion() {\n return {firstVisibleCfi: self.getFirstVisibleCfi(), lastVisibleCfi: self.getLastVisibleCfi()};\n }\n\n\n this.isVisibleSpineItemElementCfi = function(spineIdRef, partialCfi){\n var spineItem = getSpineItem(spineIdRef);\n\n if (!spineItem) {\n return false;\n }\n\n if (_currentView) {\n\n if(!partialCfi || (partialCfi && partialCfi === '')){\n var spines = _currentView.getLoadedSpineItems();\n for(var i = 0, count = spines.length; i < count; i++) {\n if(spines[i].idref == spineIdRef){\n return true;\n }\n }\n }\n return _currentView.isVisibleSpineItemElementCfi(spineIdRef, partialCfi);\n\n }\n return false;\n };\n\n /**\n * Gets all elements from active content documents based on a query selector.\n *\n * @param {string} spineItemIdref The spine item idref associated with the content document\n * @param {string} selector The query selector\n * @returns {HTMLElement[]}\n */\n this.getElements = function(spineItemIdref, selector) {\n\n if(_currentView) {\n return _currentView.getElements(spineItemIdref, selector);\n }\n\n return undefined;\n };\n\n /**\n * Determine if an element is visible on the active content documents\n *\n * @param {HTMLElement} element The element.\n * @returns {boolean}\n */\n this.isElementVisible = function (element) {\n return _currentView.isElementVisible($(element));\n\n };\n\n /**\n * Resolve a range CFI into an object containing info about it.\n * @param {string} spineIdRef The spine item idref associated with the content document\n * @param {string} partialCfi The partial CFI that is the range CFI to resolve\n * @returns {Models.NodeRangeInfo}\n */\n this.getNodeRangeInfoFromCfi = function (spineIdRef, partialCfi) {\n if (_currentView && spineIdRef && partialCfi) {\n var nodeRangeInfo = _currentView.getNodeRangeInfoFromCfi(spineIdRef, partialCfi);\n if (nodeRangeInfo) {\n return new NodeRangeInfo(nodeRangeInfo.clientRect)\n .setStartInfo(nodeRangeInfo.startInfo)\n .setEndInfo(nodeRangeInfo.endInfo);\n }\n }\n return undefined;\n };\n\n /**\n * Get the pagination info from the current view\n *\n * @returns {ReadiumSDK.Models.CurrentPagesInfo}\n */\n this.getPaginationInfo = function(){\n return _currentView.getPaginationInfo();\n };\n /**\n * Get CFI of the first element visible in the viewport\n * @returns {ReadiumSDK.Models.BookmarkData}\n */\n this.getFirstVisibleCfi = function() {\n if (_currentView) {\n return _currentView.getFirstVisibleCfi();\n }\n return undefined;\n };\n\n /**\n * Get CFI of the last element visible in the viewport\n * @returns {ReadiumSDK.Models.BookmarkData}\n */\n this.getLastVisibleCfi = function() {\n if (_currentView) {\n return _currentView.getLastVisibleCfi();\n }\n return undefined;\n };\n\n /**\n * Get CFI of the first element from the base of the document\n * @returns {ReadiumSDK.Models.BookmarkData}\n */\n this.getStartCfi = function() {\n if (_currentView) {\n return _currentView.getStartCfi();\n }\n return undefined;\n };\n\n /**\n * Get CFI of the last element from the base of the document\n * @returns {ReadiumSDK.Models.BookmarkData}\n */\n this.getEndCfi = function() {\n if (_currentView) {\n return _currentView.getEndCfi();\n }\n return undefined;\n };\n\n /**\n *\n * @param {string} rangeCfi\n * @param {string} [rangeCfi2]\n * @param {boolean} [inclusive]\n * @returns {array}\n */\n this.getDomRangesFromRangeCfi = function(rangeCfi, rangeCfi2, inclusive) {\n if (_currentView) {\n if (_currentView.getDomRangesFromRangeCfi) {\n return _currentView.getDomRangesFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n } else {\n return [_currentView.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n }\n }\n return undefined;\n };\n\n /**\n *\n * @param {ReadiumSDK.Models.BookmarkData} startCfi starting CFI\n * @param {ReadiumSDK.Models.BookmarkData} [endCfi] ending CFI\n * optional - may be omited if startCfi is a range CFI\n * @param {boolean} [inclusive] optional indicating if the range should be inclusive\n * @returns {array}\n */\n this.getDomRangesFromRangeCfi = function(rangeCfi, rangeCfi2, inclusive) {\n if (_currentView) {\n if (_currentView.getDomRangesFromRangeCfi) {\n return _currentView.getDomRangesFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n } else {\n return [_currentView.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n }\n }\n return undefined;\n };\n\n /**\n *\n * @param {ReadiumSDK.Models.BookmarkData} startCfi starting CFI\n * @param {ReadiumSDK.Models.BookmarkData} [endCfi] ending CFI\n * optional - may be omited if startCfi is a range CFI\n * @param {boolean} [inclusive] optional indicating if the range should be inclusive\n * @returns {DOM Range} https://developer.mozilla.org/en-US/docs/Web/API/Range\n */\n this.getDomRangeFromRangeCfi = function(startCfi, endCfi, inclusive) {\n if (_currentView) {\n return _currentView.getDomRangeFromRangeCfi(startCfi, endCfi, inclusive);\n }\n return undefined;\n };\n\n /**\n * Generate range CFI from DOM range\n * @param {DOM Range} https://developer.mozilla.org/en-US/docs/Web/API/Range\n * @returns {string} - represents Range CFI for the DOM range\n */\n this.getRangeCfiFromDomRange = function(domRange) {\n if (_currentView) {\n return _currentView.getRangeCfiFromDomRange(domRange);\n }\n return undefined;\n };\n\n /**\n * @param x\n * @param y\n * @param [precisePoint]\n * @param [spineItemIdref] Required for fixed layout views\n * @returns {string}\n */\n this.getVisibleCfiFromPoint = function (x, y, precisePoint, spineItemIdref) {\n if (_currentView) {\n return _currentView.getVisibleCfiFromPoint(x, y, precisePoint, spineItemIdref);\n }\n return undefined;\n };\n\n /**\n *\n * @param startX\n * @param startY\n * @param endX\n * @param endY\n * @param [spineItemIdref] Required for fixed layout views\n * @returns {*}\n */\n this.getRangeCfiFromPoints = function(startX, startY, endX, endY, spineItemIdref) {\n if (_currentView) {\n return _currentView.getRangeCfiFromPoints(startX, startY, endX, endY, spineItemIdref);\n }\n return undefined;\n };\n\n /**\n *\n * @param {HTMLElement} element\n * @returns {*}\n */\n this.getCfiForElement = function(element) {\n if (_currentView) {\n return _currentView.getCfiForElement(element);\n }\n return undefined;\n };\n \n /**\n * Useful for getting a CFI that's as close as possible to an invisible (not rendered, zero client rects) element\n * @param {HTMLElement} element\n * @returns {*}\n */\n this.getNearestCfiFromElement = function(element) {\n if (_currentView) {\n return _currentView.getNearestCfiFromElement(element);\n }\n return undefined;\n };\n \n};\n\n/**\n * View Type\n * @typedef {object} Globals.Views.ReaderView.ViewType\n * @property {number} VIEW_TYPE_COLUMNIZED Reflowable document view\n * @property {number} VIEW_TYPE_FIXED Fixed layout document view\n * @property {number} VIEW_TYPE_SCROLLED_DOC Scrollable document view\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\n */\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\nReaderView.VIEW_TYPE_FIXED = 2;\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\nreturn ReaderView;\n});\n\n", "\ndefine(\"readium-shared-js\", function(){});\n", "\nrequire([\"readium_shared_js/globalsSetup\"]);\n" diff --git a/build-output/_single-bundle/readium-shared-js_all.js b/build-output/_single-bundle/readium-shared-js_all.js index ddf14ede4..0abfe3091 100644 --- a/build-output/_single-bundle/readium-shared-js_all.js +++ b/build-output/_single-bundle/readium-shared-js_all.js @@ -20174,6 +20174,16 @@ var SpineItem = function(itemData, index, spine){ */ this.href = itemData.href; + /** + * The package level CFI of the spine item, i.e. the CFI path to the spine item + * element in the package document. + * + * @property cfi + * @type String + * @default None + */ + this.cfi = itemData.cfi; + /** * A flag indicating whether the spineItem has the attribute linear, which * is either yes or no. Default is yes. @@ -20697,7 +20707,7 @@ SpineItem.alternateSpread = function(spread) { // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/helpers',["./globals", 'underscore', "jquery", "jquerySizes", "./models/spine_item"], function(Globals, _, $, JQuerySizes, SpineItem) { +define('readium_shared_js/helpers',["./globals", 'underscore', "jquery", "jquerySizes", "./models/spine_item", 'URIjs'], function(Globals, _, $, JQuerySizes, SpineItem, URI) { (function() { @@ -20764,13 +20774,13 @@ Helpers.getEbookUrlFilePath = function(ebookURL) { }; /** - * + * @param initialQuery: (optional) initial query string * @returns object (map between URL query parameter names and corresponding decoded / unescaped values) */ -Helpers.getURLQueryParams = function() { +Helpers.getURLQueryParams = function(initialQuery) { var params = {}; - var query = window.location.search; + var query = initialQuery || window.location.search; if (query && query.length) { query = query.substring(1); var keyParams = query.split('&'); @@ -20788,57 +20798,64 @@ Helpers.getURLQueryParams = function() { /** - * @param urlpath: string corresponding a URL without query parameters (i.e. the part before the '?' question mark in index.html?param=value). If undefined/null, the default window.location is used. - * @param overrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) - * @returns a string corresponding to a URL obtained by concatenating the given URL with the given query parameters (and those already in window.location) + * @param initialUrl: string corresponding a URL. If undefined/null, the default window.location is used. + * @param queryStringOverrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) + * @returns string corresponding to a URL obtained by concatenating the given URL with the given query parameters */ -Helpers.buildUrlQueryParameters = function(urlpath, overrides) { - - if (!urlpath) { - urlpath = - window.location ? ( - window.location.protocol - + "//" - + window.location.hostname - + (window.location.port ? (':' + window.location.port) : '') - + window.location.pathname - ) : 'index.html'; - } - - var paramsString = ""; - - for (var key in overrides) { - if (!overrides.hasOwnProperty(key)) continue; - - if (!overrides[key]) continue; - - var val = overrides[key].trim(); - if (!val) continue; - - console.debug("URL QUERY PARAM OVERRIDE: " + key + " = " + val); +Helpers.buildUrlQueryParameters = function(initialUrl, queryStringOverrides) { + var uriInstance = new URI(initialUrl || window.location); + var startingQueryString = uriInstance.search(); + var urlFragment = uriInstance.hash(); + var urlPath = uriInstance.search('').hash('').toString(); + + var newQueryString = ""; + + for (var overrideKey in queryStringOverrides) { + if (!queryStringOverrides.hasOwnProperty(overrideKey)) continue; + + if (!queryStringOverrides[overrideKey]) continue; + + var overrideEntry = queryStringOverrides[overrideKey]; + if (_.isString(overrideEntry)) { + overrideEntry = overrideEntry.trim(); + } + + if (!overrideEntry) continue; + + if (overrideEntry.verbatim) { + overrideEntry = overrideEntry.value; // grab value from entry as object + } else { + overrideEntry = encodeURIComponent(overrideEntry); + } + + console.debug("URL QUERY PARAM OVERRIDE: " + overrideKey + " = " + overrideEntry); - paramsString += (key + "=" + encodeURIComponent(val)); - paramsString += "&"; + newQueryString += (overrideKey + "=" + overrideEntry); + newQueryString += "&"; } - - var urlParams = Helpers.getURLQueryParams(); - for (var key in urlParams) { - if (!urlParams.hasOwnProperty(key)) continue; - - if (!urlParams[key]) continue; - - if (overrides[key]) continue; - var val = urlParams[key].trim(); - if (!val) continue; - - console.debug("URL QUERY PARAM PRESERVED: " + key + " = " + val); - paramsString += (key + "=" + encodeURIComponent(val)); - paramsString += "&"; + var parsedQueryString = Helpers.getURLQueryParams(startingQueryString); + for (var parsedKey in parsedQueryString) { + if (!parsedQueryString.hasOwnProperty(parsedKey)) continue; + + if (!parsedQueryString[parsedKey]) continue; + + if (queryStringOverrides[parsedKey]) continue; + + var parsedValue = parsedQueryString[parsedKey].trim(); + if (!parsedValue) continue; + + console.debug("URL QUERY PARAM PRESERVED: " + parsedKey + " = " + parsedValue); + + newQueryString += (parsedKey + "=" + encodeURIComponent(parsedValue)); + newQueryString += "&"; } - - return urlpath + "?" + paramsString; + + // remove trailing "&" + newQueryString = newQueryString.slice(0, -1); + + return urlPath + "?" + newQueryString + urlFragment; }; @@ -26222,7 +26239,7 @@ var FixedView = function(options, reader){ // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/views/iframe_loader',["jquery", "underscore"], function($, _) { +define('readium_shared_js/views/iframe_loader',["jquery", "underscore", 'URIjs'], function($, _, URI) { /** * * @constructor @@ -26361,7 +26378,7 @@ return IFrameLoader; // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. -define('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js'], function($, Helpers, epubCfi) { +define('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js', 'URIjs'], function($, Helpers, epubCfi, URI) { /** * * @param reader @@ -44403,16 +44420,31 @@ define('readium_shared_js/views/external_agent_support',["../globals", "undersco } } + function determineCanonicalLinkHref(contentWindow) { + // Only grab the href if there's no potential cross-domain violation + // and the reader application URL has a CFI value in a 'goto' query param. + var isSameDomain = Object.keys(contentWindow).indexOf('document') !== -1; + if (isSameDomain && contentWindow.location.search.match(/goto=.*cfi/i)) { + return contentWindow.location.href.split("#")[0]; + } + } + + function getContentDocumentCanonicalLink(contentDocument) { + var contentDocWindow = contentDocument.defaultView; + if (contentDocWindow && (contentDocWindow.parent|| contentDocWindow.top)) { + var parentWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.parent); + var topWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.top); + return topWindowCanonicalHref || parentWindowCanonicalHref; + } + } + function injectAppUrlAsCanonicalLink(contentDocument, spineItem) { if (contentDocument.defaultView && contentDocument.defaultView.parent) { - var parentWindow = contentDocument.defaultView.parent; - var isParentInSameDomain = Object.keys(parentWindow).indexOf('document') !== -1; - // Only do this if there's no potential cross-domain violation - // and the reader application URL has a CFI value in a 'goto' query param. - if (isParentInSameDomain && parentWindow.location.search.match(/goto=.*cfi/i)) { + var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument); + if (canonicalLinkHref) { var link = contentDocument.createElement('link'); link.setAttribute('rel', 'canonical'); - link.setAttribute('href', parentWindow.location.href); + link.setAttribute('href', canonicalLinkHref); contentDocument.head.appendChild(link); contentDocumentStates[spineItem.idref].canonicalLinkElement = link; } @@ -44488,13 +44520,10 @@ define('readium_shared_js/views/external_agent_support',["../globals", "undersco if (contentDocument && state) { - if (state.canonicalLinkElement && - contentDocument.defaultView && - contentDocument.defaultView.parent) { - var parentWindow = contentDocument.defaultView.parent; - var isParentInDifferentDomain = 'document' in Object.keys(parentWindow); - if (!isParentInDifferentDomain) { - state.canonicalLinkElement.setAttribute('href', parentWindow.location.href); + if (state.canonicalLinkElement) { + var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument); + if (canonicalLinkHref) { + state.canonicalLinkElement.setAttribute('href', canonicalLinkHref); } } diff --git a/build-output/_single-bundle/readium-shared-js_all.js.map b/build-output/_single-bundle/readium-shared-js_all.js.map index 0ac879d5b..8f72f27d4 100644 --- a/build-output/_single-bundle/readium-shared-js_all.js.map +++ b/build-output/_single-bundle/readium-shared-js_all.js.map @@ -64,7 +64,7 @@ "../../../../../../../module-insertRequire.js" ], "names": [], - "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzgDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvlTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7gDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACthBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9iBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7uDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9nCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC33BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9qHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACh+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACliBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACz7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/wDA;AACA;AACA", + "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzgDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvlTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7gDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACthBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChkCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7uDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9nCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC33BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC9qHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACh+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACliBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACz7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACrmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACjWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACzqCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC3aA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACxJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,ACnMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,AC/wDA;AACA;AACA", "file": "readium-shared-js_all.js", "sourcesContent": [ "/**\n * @license almond 0.3.3 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/almond/LICENSE\n */\n//Going sloppy to avoid 'use strict' string cost, but strict practices should\n//be followed.\n/*global setTimeout: false */\n\nvar requirejs, require, define;\n(function (undef) {\n var main, req, makeMap, handlers,\n defined = {},\n waiting = {},\n config = {},\n defining = {},\n hasOwn = Object.prototype.hasOwnProperty,\n aps = [].slice,\n jsSuffixRegExp = /\\.js$/;\n\n function hasProp(obj, prop) {\n return hasOwn.call(obj, prop);\n }\n\n /**\n * Given a relative module name, like ./something, normalize it to\n * a real name that can be mapped to a path.\n * @param {String} name the relative name\n * @param {String} baseName a real name that the name arg is relative\n * to.\n * @returns {String} normalized name\n */\n function normalize(name, baseName) {\n var nameParts, nameSegment, mapValue, foundMap, lastIndex,\n foundI, foundStarMap, starI, i, j, part, normalizedBaseParts,\n baseParts = baseName && baseName.split(\"/\"),\n map = config.map,\n starMap = (map && map['*']) || {};\n\n //Adjust any relative paths.\n if (name) {\n name = name.split('/');\n lastIndex = name.length - 1;\n\n // If wanting node ID compatibility, strip .js from end\n // of IDs. Have to do this here, and not in nameToUrl\n // because node allows either .js or non .js to map\n // to same file.\n if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {\n name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');\n }\n\n // Starts with a '.' so need the baseName\n if (name[0].charAt(0) === '.' && baseParts) {\n //Convert baseName to array, and lop off the last part,\n //so that . matches that 'directory' and not name of the baseName's\n //module. For instance, baseName of 'one/two/three', maps to\n //'one/two/three.js', but we want the directory, 'one/two' for\n //this normalization.\n normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n name = normalizedBaseParts.concat(name);\n }\n\n //start trimDots\n for (i = 0; i < name.length; i++) {\n part = name[i];\n if (part === '.') {\n name.splice(i, 1);\n i -= 1;\n } else if (part === '..') {\n // If at the start, or previous value is still ..,\n // keep them so that when converted to a path it may\n // still work when converted to a path, even though\n // as an ID it is less than ideal. In larger point\n // releases, may be better to just kick out an error.\n if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') {\n continue;\n } else if (i > 0) {\n name.splice(i - 1, 2);\n i -= 2;\n }\n }\n }\n //end trimDots\n\n name = name.join('/');\n }\n\n //Apply map config if available.\n if ((baseParts || starMap) && map) {\n nameParts = name.split('/');\n\n for (i = nameParts.length; i > 0; i -= 1) {\n nameSegment = nameParts.slice(0, i).join(\"/\");\n\n if (baseParts) {\n //Find the longest baseName segment match in the config.\n //So, do joins on the biggest to smallest lengths of baseParts.\n for (j = baseParts.length; j > 0; j -= 1) {\n mapValue = map[baseParts.slice(0, j).join('/')];\n\n //baseName segment has config, find if it has one for\n //this name.\n if (mapValue) {\n mapValue = mapValue[nameSegment];\n if (mapValue) {\n //Match, update name to the new value.\n foundMap = mapValue;\n foundI = i;\n break;\n }\n }\n }\n }\n\n if (foundMap) {\n break;\n }\n\n //Check for a star map match, but just hold on to it,\n //if there is a shorter segment match later in a matching\n //config, then favor over this star map.\n if (!foundStarMap && starMap && starMap[nameSegment]) {\n foundStarMap = starMap[nameSegment];\n starI = i;\n }\n }\n\n if (!foundMap && foundStarMap) {\n foundMap = foundStarMap;\n foundI = starI;\n }\n\n if (foundMap) {\n nameParts.splice(0, foundI, foundMap);\n name = nameParts.join('/');\n }\n }\n\n return name;\n }\n\n function makeRequire(relName, forceSync) {\n return function () {\n //A version of a require function that passes a moduleName\n //value for items that may need to\n //look up paths relative to the moduleName\n var args = aps.call(arguments, 0);\n\n //If first arg is not require('string'), and there is only\n //one arg, it is the array form without a callback. Insert\n //a null so that the following concat is correct.\n if (typeof args[0] !== 'string' && args.length === 1) {\n args.push(null);\n }\n return req.apply(undef, args.concat([relName, forceSync]));\n };\n }\n\n function makeNormalize(relName) {\n return function (name) {\n return normalize(name, relName);\n };\n }\n\n function makeLoad(depName) {\n return function (value) {\n defined[depName] = value;\n };\n }\n\n function callDep(name) {\n if (hasProp(waiting, name)) {\n var args = waiting[name];\n delete waiting[name];\n defining[name] = true;\n main.apply(undef, args);\n }\n\n if (!hasProp(defined, name) && !hasProp(defining, name)) {\n throw new Error('No ' + name);\n }\n return defined[name];\n }\n\n //Turns a plugin!resource to [plugin, resource]\n //with the plugin being undefined if the name\n //did not have a plugin prefix.\n function splitPrefix(name) {\n var prefix,\n index = name ? name.indexOf('!') : -1;\n if (index > -1) {\n prefix = name.substring(0, index);\n name = name.substring(index + 1, name.length);\n }\n return [prefix, name];\n }\n\n //Creates a parts array for a relName where first part is plugin ID,\n //second part is resource ID. Assumes relName has already been normalized.\n function makeRelParts(relName) {\n return relName ? splitPrefix(relName) : [];\n }\n\n /**\n * Makes a name map, normalizing the name, and using a plugin\n * for normalization if necessary. Grabs a ref to plugin\n * too, as an optimization.\n */\n makeMap = function (name, relParts) {\n var plugin,\n parts = splitPrefix(name),\n prefix = parts[0],\n relResourceName = relParts[1];\n\n name = parts[1];\n\n if (prefix) {\n prefix = normalize(prefix, relResourceName);\n plugin = callDep(prefix);\n }\n\n //Normalize according\n if (prefix) {\n if (plugin && plugin.normalize) {\n name = plugin.normalize(name, makeNormalize(relResourceName));\n } else {\n name = normalize(name, relResourceName);\n }\n } else {\n name = normalize(name, relResourceName);\n parts = splitPrefix(name);\n prefix = parts[0];\n name = parts[1];\n if (prefix) {\n plugin = callDep(prefix);\n }\n }\n\n //Using ridiculous property names for space reasons\n return {\n f: prefix ? prefix + '!' + name : name, //fullName\n n: name,\n pr: prefix,\n p: plugin\n };\n };\n\n function makeConfig(name) {\n return function () {\n return (config && config.config && config.config[name]) || {};\n };\n }\n\n handlers = {\n require: function (name) {\n return makeRequire(name);\n },\n exports: function (name) {\n var e = defined[name];\n if (typeof e !== 'undefined') {\n return e;\n } else {\n return (defined[name] = {});\n }\n },\n module: function (name) {\n return {\n id: name,\n uri: '',\n exports: defined[name],\n config: makeConfig(name)\n };\n }\n };\n\n main = function (name, deps, callback, relName) {\n var cjsModule, depName, ret, map, i, relParts,\n args = [],\n callbackType = typeof callback,\n usingExports;\n\n //Use name if no relName\n relName = relName || name;\n relParts = makeRelParts(relName);\n\n //Call the callback to define the module, if necessary.\n if (callbackType === 'undefined' || callbackType === 'function') {\n //Pull out the defined dependencies and pass the ordered\n //values to the callback.\n //Default to [require, exports, module] if no deps\n deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;\n for (i = 0; i < deps.length; i += 1) {\n map = makeMap(deps[i], relParts);\n depName = map.f;\n\n //Fast path CommonJS standard dependencies.\n if (depName === \"require\") {\n args[i] = handlers.require(name);\n } else if (depName === \"exports\") {\n //CommonJS module spec 1.1\n args[i] = handlers.exports(name);\n usingExports = true;\n } else if (depName === \"module\") {\n //CommonJS module spec 1.1\n cjsModule = args[i] = handlers.module(name);\n } else if (hasProp(defined, depName) ||\n hasProp(waiting, depName) ||\n hasProp(defining, depName)) {\n args[i] = callDep(depName);\n } else if (map.p) {\n map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});\n args[i] = defined[depName];\n } else {\n throw new Error(name + ' missing ' + depName);\n }\n }\n\n ret = callback ? callback.apply(defined[name], args) : undefined;\n\n if (name) {\n //If setting exports via \"module\" is in play,\n //favor that over return value and exports. After that,\n //favor a non-undefined return value over exports use.\n if (cjsModule && cjsModule.exports !== undef &&\n cjsModule.exports !== defined[name]) {\n defined[name] = cjsModule.exports;\n } else if (ret !== undef || !usingExports) {\n //Use the return value from the function.\n defined[name] = ret;\n }\n }\n } else if (name) {\n //May just be an object definition for the module. Only\n //worry about defining if have a module name.\n defined[name] = callback;\n }\n };\n\n requirejs = require = req = function (deps, callback, relName, forceSync, alt) {\n if (typeof deps === \"string\") {\n if (handlers[deps]) {\n //callback in this case is really relName\n return handlers[deps](callback);\n }\n //Just return the module wanted. In this scenario, the\n //deps arg is the module name, and second arg (if passed)\n //is just the relName.\n //Normalize module name, if it contains . or ..\n return callDep(makeMap(deps, makeRelParts(callback)).f);\n } else if (!deps.splice) {\n //deps is a config object, not an array.\n config = deps;\n if (config.deps) {\n req(config.deps, config.callback);\n }\n if (!callback) {\n return;\n }\n\n if (callback.splice) {\n //callback is an array, which means it is a dependency list.\n //Adjust args if there are dependencies\n deps = callback;\n callback = relName;\n relName = null;\n } else {\n deps = undef;\n }\n }\n\n //Support require(['a'])\n callback = callback || function () {};\n\n //If relName is a function, it is an errback handler,\n //so remove it.\n if (typeof relName === 'function') {\n relName = forceSync;\n forceSync = alt;\n }\n\n //Simulate async callback;\n if (forceSync) {\n main(undef, deps, callback, relName);\n } else {\n //Using a non-zero value because of concern for what old browsers\n //do, and latest browsers \"upgrade\" to 4 if lower value is used:\n //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:\n //If want a value immediately, use require('id') instead -- something\n //that works in almond on the global level, but not guaranteed and\n //unlikely to work in other AMD implementations.\n setTimeout(function () {\n main(undef, deps, callback, relName);\n }, 4);\n }\n\n return req;\n };\n\n /**\n * Just drops the config on the floor, but returns req in case\n * the config return value is used.\n */\n req.config = function (cfg) {\n return req(cfg);\n };\n\n /**\n * Expose module registry for debugging and tooling\n */\n requirejs._defined = defined;\n\n define = function (name, deps, callback) {\n if (typeof name !== 'string') {\n throw new Error('See almond README: incorrect module build, no module name');\n }\n\n //This module may not have dependencies\n if (!deps.splice) {\n //deps is not an array, so probably means\n //an object literal or factory function for\n //the value. Adjust args.\n callback = deps;\n deps = [];\n }\n\n if (!hasProp(defined, name) && !hasProp(waiting, name)) {\n waiting[name] = [name, deps, callback];\n }\n };\n\n define.amd = {\n jQuery: true\n };\n}());\n\ndefine(\"readium-shared-js_all\", function(){});\n\n", @@ -90,16 +90,16 @@ "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/current_pages_info',[],function() {\n\n/**\n * Used to report pagination state back to the host application\n *\n * @class Models.CurrentPagesInfo\n *\n * @constructor\n *\n * @param {Models.Spine} spine\n * @param {boolean} isFixedLayout is fixed or reflowable spine item\n * @return CurrentPagesInfo\n*/\n\nvar CurrentPagesInfo = function(spine, isFixedLayout) {\n\n\n /**\n * The reading direction\n *\n * @property isRightToLeft\n * @type bool\n */\n\n this.isRightToLeft = spine.isRightToLeft();\n \n /**\n * Is the ebook fixed layout or not?\n *\n * @property isFixedLayout\n * @type bool\n */\n\n this.isFixedLayout = isFixedLayout;\n \n /**\n * Counts the number of spine items\n *\n * @property spineItemCount\n * @type number\n */ \n\n this.spineItemCount = spine.items.length\n \n /**\n * returns an array of open pages, each array item is a data structure (plain JavaScript object) with the following fields: spineItemPageIndex, spineItemPageCount, idref, spineItemIndex (as per the parameters of the addOpenPage() function below)\n *\n * @property openPages\n * @type array\n */\n\n this.openPages = [];\n\n /**\n * Adds an page item to the openPages array\n *\n * @method addOpenPage\n * @param {number} spineItemPageIndex\n * @param {number} spineItemPageCount\n * @param {string} idref\n * @param {number} spineItemIndex \n */\n\n this.addOpenPage = function(spineItemPageIndex, spineItemPageCount, idref, spineItemIndex) {\n this.openPages.push({spineItemPageIndex: spineItemPageIndex, spineItemPageCount: spineItemPageCount, idref: idref, spineItemIndex: spineItemIndex});\n\n this.sort();\n };\n\n /**\n * Checks if navigation to the page on the left is possible (depending on page-progression-direction: previous page in LTR mode, next page in RTL mode)\n *\n * @method canGoLeft\n * @return bool true if turning to the left page is possible \n */\n\n this.canGoLeft = function () {\n return this.isRightToLeft ? this.canGoNext() : this.canGoPrev();\n };\n\n /**\n * Checks if navigation to the page on the right is possible (depending on page-progression-direction: next page in LTR mode, previous page in RTL mode)\n *\n * @method canGoRight\n * @return bool true if turning to the right page is possible \n */\n\n this.canGoRight = function () {\n return this.isRightToLeft ? this.canGoPrev() : this.canGoNext();\n };\n\n /**\n * Checks if navigation to the next page is possible (depending on page-progression-direction: right page in LTR mode, left page in RTL mode)\n *\n * @method canGoNext\n * @return bool true if turning to the next page is possible \n */\n\n this.canGoNext = function() {\n\n if(this.openPages.length == 0)\n return false;\n\n var lastOpenPage = this.openPages[this.openPages.length - 1];\n\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\n // See https://github.com/readium/readium-shared-js/issues/26\n\n // Removed, needs to be implemented properly as per above.\n // See https://github.com/readium/readium-shared-js/issues/108\n // if(!spine.isValidLinearItem(lastOpenPage.spineItemIndex))\n // return false;\n\n return lastOpenPage.spineItemIndex < spine.last().index || lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1;\n };\n\n /**\n * Checks if navigation to the previous page is possible (depending on page-progression-direction: left page in LTR mode, right page in RTL mode)\n *\n * @method canGoPrev\n * @return bool true if turning to the previous page is possible \n */\n\n this.canGoPrev = function() {\n\n if(this.openPages.length == 0)\n return false;\n\n var firstOpenPage = this.openPages[0];\n\n // TODO: handling of non-linear spine items (\"ancillary\" documents), allowing page turn within the reflowable XHTML, but preventing previous/next access to sibling spine items. Also needs \"go back\" feature to navigate to source hyperlink location that led to the non-linear document.\n // See https://github.com/readium/readium-shared-js/issues/26\n\n // Removed, needs to be implemented properly as per above.\n // //https://github.com/readium/readium-shared-js/issues/108\n // if(!spine.isValidLinearItem(firstOpenPage.spineItemIndex))\n // return false;\n\n return spine.first().index < firstOpenPage.spineItemIndex || 0 < firstOpenPage.spineItemPageIndex;\n };\n\n /**\n * Sorts the openPages array based on spineItemIndex and spineItemPageIndex\n *\n * @method sort\n */\n\n this.sort = function() {\n\n this.openPages.sort(function(a, b) {\n\n if(a.spineItemIndex != b.spineItemIndex) {\n return a.spineItemIndex - b.spineItemIndex;\n }\n\n return a.spineItemPageIndex - b.spineItemPageIndex;\n\n });\n\n };\n\n};\n\nreturn CurrentPagesInfo;\n});\n", " // Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/fixed_page_spread',[],function() {\n/**\n * Spread the page \n *\n * @class Models.Spread\n * @constructor\n * @param spine \n * @param {Boolean} isSyntheticSpread \n *\n */\nvar Spread = function(spine, isSyntheticSpread) {\n\n var self = this;\n\n this.spine = spine;\n \n this.leftItem = undefined;\n this.rightItem = undefined;\n this.centerItem = undefined;\n\n var _isSyntheticSpread = isSyntheticSpread;\n\n /**\n * Sets whether or not this is a synthetic spread\n *\n * @method setSyntheticSpread\n * @param {Bool} isSyntheticSpread\n */\n\n this.setSyntheticSpread = function(isSyntheticSpread) {\n _isSyntheticSpread = isSyntheticSpread;\n };\n\n /**\n * Checks out if the spread is synthetic\n *\n * @method isSyntheticSpread\n * @return {Bool} true if this is a 2-page synthetic spread\n */\n\n this.isSyntheticSpread = function() {\n return _isSyntheticSpread;\n };\n\n /**\n * Opens the first spine item (FXL page)\n *\n * @method openFirst\n */\n\n this.openFirst = function() {\n\n if( this.spine.items.length == 0 ) {\n resetItems();\n }\n else {\n this.openItem(this.spine.first());\n }\n };\n\n /**\n * Opens the last spine item (FXL page)\n *\n * @method openLast\n */\n\n this.openLast = function() {\n\n if( this.spine.items.length == 0 ) {\n resetItems();\n }\n else {\n this.openItem(this.spine.last());\n }\n };\n\n /**\n * Opens a spine item (FXL page)\n *\n * @method openItem\n * @param {Models.SpineItem} item\n */\n\n this.openItem = function(item) {\n\n resetItems();\n\n var position = getItemPosition(item);\n setItemToPosition(item, position);\n\n if(position != Spread.POSITION_CENTER && this.spine.isValidLinearItem(item.index)) { // && item.isRenditionSpreadAllowed() not necessary, see getItemPosition() below\n var neighbour = getNeighbourItem(item);\n if(neighbour) {\n var neighbourPos = getItemPosition(neighbour);\n if(neighbourPos != position\n && neighbourPos != Spread.POSITION_CENTER\n && !neighbour.isReflowable()\n && neighbour.isRenditionSpreadAllowed()) {\n setItemToPosition(neighbour, neighbourPos);\n }\n }\n }\n };\n\n /**\n * Resets the spine items (FXL pages, left + right + center) to undefined\n *\n * @method resetItems\n */\n\n function resetItems() {\n\n self.leftItem = undefined;\n self.rightItem = undefined;\n self.centerItem = undefined;\n }\n\n /**\n * Sets the spine item (FXL page) to a position (left, right or center)\n *\n * @method setItemToPosition\n * @param {Models.SpineItem} item\n * @param {Spread.POSITION_CENTER | Spread.POSITION_LEFT | Spread.POSITION_RIGHT} position\n */\n\n function setItemToPosition(item, position) {\n\n if(position == Spread.POSITION_LEFT) {\n self.leftItem = item;\n }\n else if (position == Spread.POSITION_RIGHT) {\n self.rightItem = item;\n }\n else {\n\n if(position != Spread.POSITION_CENTER) {\n console.error(\"Unrecognized position value\");\n }\n\n self.centerItem = item;\n }\n }\n\n /**\n * Returns the position of a spine item / FXL page (left, center or right)\n *\n * @method getItemPosition\n * @param {Models.SpineItem} item\n * @return {Spread.POSITION_CENTER | Spread.POSITION_LEFT | Spread.POSITION_RIGHT}\n */\n\n function getItemPosition(item) {\n \n // includes !item.isRenditionSpreadAllowed() (\"rendition:spread-none\") ==> force center position\n if(!_isSyntheticSpread) {\n return Spread.POSITION_CENTER;\n }\n\n if(item.isLeftPage()) {\n return Spread.POSITION_LEFT;\n }\n\n if (item.isRightPage()) {\n return Spread.POSITION_RIGHT;\n }\n\n return Spread.POSITION_CENTER;\n }\n\n /**\n * Opens the next item\n *\n * @method openNext\n */ \n\n this.openNext = function() {\n\n var items = this.validItems();\n\n if(items.length == 0) {\n\n this.openFirst();\n }\n else {\n\n var nextItem = this.spine.nextItem(items[items.length - 1]);\n if(nextItem) {\n\n this.openItem(nextItem);\n }\n }\n };\n\n /**\n * Opens the previous item\n *\n * @method openPrev\n */ \n\n this.openPrev = function() {\n\n var items = this.validItems();\n\n if(items.length == 0) {\n this.openLast();\n }\n else {\n\n var prevItem = this.spine.prevItem(items[0]);\n if(prevItem) {\n\n this.openItem(prevItem);\n\n }\n }\n };\n\n /**\n * Returns an sorrted array of spine items (as per their order in the spine) that are currently in the FXL page layout\n *\n * @method validItems\n * @return {array} \n */ \n\n this.validItems = function() {\n\n var arr = [];\n\n if(this.leftItem) arr.push(this.leftItem);\n if(this.rightItem) arr.push(this.rightItem);\n if(this.centerItem) arr.push(this.centerItem);\n\n arr.sort(function(a, b) {\n return a.index - b.index;\n });\n\n return arr;\n };\n\n /**\n * Gets the neighbour spine item in the FXL page layout (on left or right of the current item)\n *\n * @method getNeighbourItem\n * @param {Models.SpineItem} item\n * @return {Models.SpineItem} item\n */ \n\n function getNeighbourItem(item) {\n\n if(item.isLeftPage()) {\n return self.spine.isRightToLeft() ? self.spine.prevItem(item) : self.spine.nextItem(item);\n }\n\n if(item.isRightPage()) {\n return self.spine.isRightToLeft() ? self.spine.nextItem(item) : self.spine.prevItem(item);\n }\n\n return undefined;\n }\n\n};\n\nSpread.POSITION_LEFT = \"left\";\nSpread.POSITION_RIGHT = \"right\";\nSpread.POSITION_CENTER = \"center\";\n\nreturn Spread;\n});\n", "/**\n * @preserve JSizes - JQuery plugin v0.33\n *\n * Licensed under the revised BSD License.\n * Copyright 2008-2010 Bram Stein\n * All rights reserved.\n */\n/*global jQuery*/\n(function ($) {\n\t'use strict';\n\tvar num = function (value) {\n\t\t\treturn parseInt(value, 10) || 0;\n\t\t};\n\n\t/**\n\t * Sets or gets the values for min-width, min-height, max-width\n\t * and max-height.\n\t */\n\t$.each(['min', 'max'], function (i, name) {\n\t\t$.fn[name + 'Size'] = function (value) {\n\t\t\tvar width, height;\n\t\t\tif (value) {\n\t\t\t\tif (value.width !== undefined) {\n\t\t\t\t\tthis.css(name + '-width', value.width);\n\t\t\t\t}\n\t\t\t\tif (value.height !== undefined) {\n\t\t\t\t\tthis.css(name + '-height', value.height);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twidth = this.css(name + '-width');\n\t\t\t\theight = this.css(name + '-height');\n\t\t\t\t// Apparently:\n\t\t\t\t// * Opera returns -1px instead of none\n\t\t\t\t// * IE6 returns undefined instead of none\n\t\t\t\treturn {'width': (name === 'max' && (width === undefined || width === 'none' || num(width) === -1) && Number.MAX_VALUE) || num(width), \n\t\t\t\t\t\t'height': (name === 'max' && (height === undefined || height === 'none' || num(height) === -1) && Number.MAX_VALUE) || num(height)};\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\t});\n\n\t/**\n\t * Returns whether or not an element is visible.\n\t */\n\t$.fn.isVisible = function () {\n\t\treturn this.is(':visible');\n\t};\n\n\t/**\n\t * Sets or gets the values for border, margin and padding.\n\t */\n\t$.each(['border', 'margin', 'padding'], function (i, name) {\n\t\t$.fn[name] = function (value) {\n\t\t\tif (value) {\n\t\t\t\tif (value.top !== undefined) {\n\t\t\t\t\tthis.css(name + '-top' + (name === 'border' ? '-width' : ''), value.top);\n\t\t\t\t}\n\t\t\t\tif (value.bottom !== undefined) {\n\t\t\t\t\tthis.css(name + '-bottom' + (name === 'border' ? '-width' : ''), value.bottom);\n\t\t\t\t}\n\t\t\t\tif (value.left !== undefined) {\n\t\t\t\t\tthis.css(name + '-left' + (name === 'border' ? '-width' : ''), value.left);\n\t\t\t\t}\n\t\t\t\tif (value.right !== undefined) {\n\t\t\t\t\tthis.css(name + '-right' + (name === 'border' ? '-width' : ''), value.right);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn {top: num(this.css(name + '-top' + (name === 'border' ? '-width' : ''))),\n\t\t\t\t\t\tbottom: num(this.css(name + '-bottom' + (name === 'border' ? '-width' : ''))),\n\t\t\t\t\t\tleft: num(this.css(name + '-left' + (name === 'border' ? '-width' : ''))),\n\t\t\t\t\t\tright: num(this.css(name + '-right' + (name === 'border' ? '-width' : '')))};\n\t\t\t}\n\t\t\treturn this;\n\t\t};\n\t});\n}(jQuery));\n\ndefine(\"jquerySizes\", [\"jquery\"], (function (global) {\n return function () {\n var ret, fn;\n return ret || global.jQuery;\n };\n}(this)));\n\n", - "// Created by Boris Schneiderman.\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/spine_item',[], function() {\n\n/**\n * Wrapper of the SpineItem object received from the host application\n *\n * @class Models.SpineItem\n * @constructor\n * @param itemData container for spine item properties\n * @param {Number} index index of this spine item in the parent spine \n * @param {Models.Spine} spine parent spine\n *\n */\nvar SpineItem = function(itemData, index, spine){\n\n var self = this;\n\n /**\n * The idref of the spine item, i.e. the ID-based pointer to the actual \n * manifest item that the spine item references\n *\n * @property idref\n * @type String\n * @default None\n */\n this.idref = itemData.idref;\n\n /**\n * The href of the spine item, i.e. the URI to the resource in the EPUB\n * which the spineitem will render\n *\n * @property href\n * @type String\n * @default None\n */\n this.href = itemData.href;\n\n /**\n * A flag indicating whether the spineItem has the attribute linear, which \n * is either yes or no. Default is yes.\n *\n * @property linear\n * @type String\n * @default yes\n */\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\n\n /**\n * A variable indicating the type of synthetic spread for this specific\n * spine item, where page:spread-* can be left, right or center or auto\n *\n * @property page_spread\n * @type String\n * @default auto\n */\n this.page_spread = itemData.page_spread;\n \n /**\n * A string specifying the height and width from the rendition:viewport tag.\n * Note: This is deprecated in EPUB 3.1\n *\n * @property rendition_viewport\n * @type String\n * @default None\n */\n this.rendition_viewport = itemData.rendition_viewport;\n \n /**\n * A string specifying the type of synthetic spread for ALL spine items, where\n * where rendtion:spread-* can be left, right or center or auto\n *\n * @property rendition_spread\n * @type String\n * @default auto\n */\n this.rendition_spread = itemData.rendition_spread;\n\n /**\n * A string specifying desired orientation for ALL spine items. Possible values are\n * rendition-orientation-*, which can be none, landscape, portrait, both or auto\n *\n * Note: Not yet implemented.\n *\n * @property rendition_orientation\n * @type String\n * @default auto\n */\n this.rendition_orientation = itemData.rendition_orientation;\n\n /**\n * A string indicating the type of document layout, either prepaginated or reflowable\n *\n * @property rendition_layout\n * @type String\n * @default reflowable\n */\n this.rendition_layout = itemData.rendition_layout;\n \n /**\n * A string specifying how \"overflow\" content that exceeds the current viewport should\n * be laid out. Possible values are paginated, scrolled-continuous, scrolled-doc or auto\n *\n * @property rendition_flow\n * @type String\n * @default auto\n */\n this.rendition_flow = itemData.rendition_flow;\n \n /**\n * The ID, if any, of the root SMIL element of the media overlay for the document.\n *\n * @property media_overlay_id\n * @type String\n * @default None\n */\n this.media_overlay_id = itemData.media_overlay_id;\n\n /**\n * The mimetype of this specific spine item.\n *\n * @property media_type\n * @type String\n * @default None\n */\n this.media_type = itemData.media_type;\n\n /**\n * The index of this spine item in the parent spine .\n * \n * @property index\n * @type String\n * @default None\n */\n this.index = index;\n\n /**\n * The object which is the actual spine of which this spineItem is a child.\n *\n * @property spine\n * @type Models.Spine\n * @default None\n */\n this.spine = spine;\n\n validateSpread();\n\n /**\n * Sets a new page spread and checks its validity\n *\n * @method setSpread\n * @param {String} spread the new page spread \n */\n this.setSpread = function(spread) {\n this.page_spread = spread;\n\n validateSpread();\n };\n\n /* private method (validateSpread) */\n function validateSpread() {\n\n if(!self.page_spread) {\n return;\n }\n\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\n self.page_spread != SpineItem.SPREAD_RIGHT &&\n self.page_spread != SpineItem.SPREAD_CENTER ) {\n\n console.error(self.page_spread + \" is not a recognized spread type\");\n }\n };\n\n /**\n * Checks to see if the manifest has specified a spread property of \"none\"\n *\n * @method isRenditionSpreadAllowed\n * @return {Boolean} TRUE if spread=none has NOT been specified, else FALSE\n */\n this.isRenditionSpreadAllowed = function() {\n \n var rendition_spread = self.getRenditionSpread();\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_LEFT\n *\n * @method isLeftPage\n * @return {Boolean} \n */\n this.isLeftPage = function() {\n return self.page_spread == SpineItem.SPREAD_LEFT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_RIGHT\n *\n * @method isRightPage\n * @return {Boolean} \n */\n this.isRightPage = function() {\n return self.page_spread == SpineItem.SPREAD_RIGHT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_CENTER\n *\n * @method isCenterPage\n * @return {Boolean} \n */\n this.isCenterPage = function() {\n return self.page_spread == SpineItem.SPREAD_CENTER;\n };\n\n /**\n * Checks to see if the parent package of this spineIem is\n * reflowable\n *\n * @method isReflowable\n * @return {Boolean} \n */\n this.isReflowable = function() {\n return !self.isFixedLayout();\n };\n\n /**\n * Checks to see if the parent package of to this spineIem is\n * fixed layout\n *\n * @method isFixedLayout\n * @return {Boolean} \n */\n this.isFixedLayout = function() {\n \n // cannot use isPropertyValueSetForItemOrPackage() here!\n\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\n\n if(isLayoutExplicitlyDefined) {\n\n if (self.rendition_layout)\n {\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\n }\n\n return self.spine.package.isFixedLayout();\n }\n\n // if image or svg use fixed layout\n return self.media_type.indexOf(\"image/\") >= 0;\n };\n\n /**\n * Returns a string indicating the type of layout for viewport overflow, \n * i.e. scrolldoc, scroll-continuous, paginated or auto. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned\n *\n * @method getRenditionFlow\n * @return {String} \n */\n this.getRenditionFlow = function() {\n\n if(self.rendition_flow) {\n return self.rendition_flow;\n }\n\n return self.spine.package.rendition_flow;\n };\n \n /**\n * Returns the rendition:viewport, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n * Note that this attribute is deprecated in EPUB 3.1\n *\n * @method getRenditionViewport\n * @return {Boolean} \n */\n this.getRenditionViewport = function() {\n\n if(self.rendition_viewport) {\n return self.rendition_viewport;\n }\n\n return self.spine.package.rendition_viewport;\n };\n\n /**\n * Returns the rendition:spread, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionSpread\n * @return {Boolean} \n */\n this.getRenditionSpread = function() {\n\n if(self.rendition_spread) {\n return self.rendition_spread;\n }\n\n return self.spine.package.rendition_spread;\n };\n\n /**\n * Returns the rendition:orientation, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionOrientation\n * @return {Boolean} \n */\n this.getRenditionOrientation = function() {\n\n if(self.rendition_orientation) {\n return self.rendition_orientation;\n }\n\n return self.spine.package.rendition_orientation;\n };\n\n /**\n * Returns the rendition:layout, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionLayout\n * @return {String} \n */\n this.getRenditionLayout = function() {\n\n if(self.rendition_layout) {\n return self.rendition_layout;\n }\n\n return self.spine.package.rendition_layout;\n };\n\n /**\n * Checks to see if the specified property is set in this spineItem and\n * matches the supplied value. If the property is NOT set in the spineItem\n * then the the package is checked. If not set in either place then \n * the function returns FALSE.\n *\n * @method isPropertyValueSetForItemOrPackage\n * @param {String} propName The name of the property to be checked\n * @param {String} propValue The value of the property to be checked\n * @return {Boolean} \n */\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\n\n if(self[propName]) {\n return self[propName] === propValue;\n }\n\n if(self.spine.package[propName]) {\n return self.spine.package[propName] === propValue;\n }\n\n return false;\n }\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-continuous.\n *\n * @method isFlowScrolledContinuous\n * @return {Boolean} \n */\n this.isFlowScrolledContinuous = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\n };\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-doc.\n *\n * @method isFlowScrolledDoc\n * @return {Boolean} \n */\n this.isFlowScrolledDoc = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\n };\n};\n\n/** \n * @property RENDITION_LAYOUT_REFLOWABLE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\n\n/** \n * @property RENDITION_LAYOUT_PREPAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\n\n/** \n * @property RENDITION_ORIENTATION_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_ORIENTATION_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\n/** \n * @property RENDITION_ORIENTATION_AUTO\n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\n\n/** \n * @property SPREAD_LEFT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\n\n/** \n * @property SPREAD_RIGHT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\n\n/** \n * @property SPREAD_CENTER \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\n\n/** \n * @property RENDITION_SPREAD_NONE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\n\n/** \n * @property RENDITION_SPREAD_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_SPREAD_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\n\n/** \n * @property RENDITION_SPREAD_BOTH \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\n\n/** \n * @property RENDITION_SPREAD_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\n\n/** \n * @property RENDITION_FLOW_PAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_CONTINUOUS \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_DOC \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\n\n/** \n * @property RENDITION_FLOW_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\n\n/**\n * Returns the inversion of the spineItem's SPREAD property. i.e\n * if the page-spread is right it returns LEFT and vice versa. If \n * the spread is center then it returns CENTER\n *\n * @method alternateSpread\n * @return {String} \n */\nSpineItem.alternateSpread = function(spread) {\n\n if(spread === SpineItem.SPREAD_LEFT) {\n return SpineItem.SPREAD_RIGHT;\n }\n\n if(spread === SpineItem.SPREAD_RIGHT) {\n return SpineItem.SPREAD_LEFT;\n }\n\n return spread;\n\n};\n return SpineItem;\n});\n\n\n\n", - "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/helpers',[\"./globals\", 'underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\"], function(Globals, _, $, JQuerySizes, SpineItem) {\n \n(function()\n{\n/* jshint strict: true */\n/* jshint -W034 */\n \"use strict\";\n \n if(window.performance)\n {\n if (window.performance.now)\n {\n return;\n }\n \n var vendors = ['webkitNow', 'mozNow', 'msNow', 'oNow'];\n \n for (var i = 0; i < vendors.length; i++)\n {\n if (vendors[i] in window.performance)\n {\n window.performance.now = window.performance[vendors[i]];\n return;\n }\n }\n }\n else\n {\n window.performance = {};\n \n }\n \n if(Date.now)\n {\n window.performance.now = function()\n {\n return Date.now();\n };\n return;\n }\n \n window.performance.now = function()\n {\n return +(new Date());\n };\n})();\n\nvar Helpers = {};\n\n/**\n *\n * @param ebookURL URL string, or Blob (possibly File)\n * @returns string representing the file path / name from which the asset referenced by this URL originates\n */\nHelpers.getEbookUrlFilePath = function(ebookURL) {\n if (!window.Blob || !window.File) return ebookURL;\n\n if (ebookURL instanceof File) {\n return ebookURL.name;\n } else if (ebookURL instanceof Blob) {\n return \"readium-ebook.epub\";\n } else {\n return ebookURL;\n }\n};\n\n/**\n *\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\n */\nHelpers.getURLQueryParams = function() {\n var params = {};\n\n var query = window.location.search;\n if (query && query.length) {\n query = query.substring(1);\n var keyParams = query.split('&');\n for (var x = 0; x < keyParams.length; x++)\n {\n var keyVal = keyParams[x].split('=');\n if (keyVal.length > 1) {\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\n }\n }\n }\n\n return params;\n};\n\n\n/**\n * @param urlpath: string corresponding a URL without query parameters (i.e. the part before the '?' question mark in index.html?param=value). If undefined/null, the default window.location is used.\n * @param overrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is) \n * @returns a string corresponding to a URL obtained by concatenating the given URL with the given query parameters (and those already in window.location)\n */\nHelpers.buildUrlQueryParameters = function(urlpath, overrides) {\n \n if (!urlpath) {\n urlpath =\n window.location ? (\n window.location.protocol\n + \"//\"\n + window.location.hostname\n + (window.location.port ? (':' + window.location.port) : '')\n + window.location.pathname\n ) : 'index.html';\n }\n\n var paramsString = \"\";\n \n for (var key in overrides) {\n if (!overrides.hasOwnProperty(key)) continue;\n \n if (!overrides[key]) continue;\n \n var val = overrides[key].trim();\n if (!val) continue;\n \n console.debug(\"URL QUERY PARAM OVERRIDE: \" + key + \" = \" + val);\n\n paramsString += (key + \"=\" + encodeURIComponent(val));\n paramsString += \"&\";\n }\n \n var urlParams = Helpers.getURLQueryParams();\n for (var key in urlParams) {\n if (!urlParams.hasOwnProperty(key)) continue;\n \n if (!urlParams[key]) continue;\n \n if (overrides[key]) continue;\n\n var val = urlParams[key].trim();\n if (!val) continue;\n \n console.debug(\"URL QUERY PARAM PRESERVED: \" + key + \" = \" + val);\n\n paramsString += (key + \"=\" + encodeURIComponent(val));\n paramsString += \"&\";\n }\n \n return urlpath + \"?\" + paramsString;\n};\n\n\n/**\n *\n * @param left\n * @param top\n * @param width\n * @param height\n * @constructor\n */\nHelpers.Rect = function (left, top, width, height) {\n\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n\n this.right = function () {\n return this.left + this.width;\n };\n\n this.bottom = function () {\n return this.top + this.height;\n };\n\n this.isOverlap = function (rect, tolerance) {\n\n if (tolerance == undefined) {\n tolerance = 0;\n }\n\n return !(rect.right() < this.left + tolerance ||\n rect.left > this.right() - tolerance ||\n rect.bottom() < this.top + tolerance ||\n rect.top > this.bottom() - tolerance);\n }\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\n// reflows between columns this is inconstant and difficult to analyze .\nHelpers.Rect.fromElement = function ($element) {\n\n var e;\n if (_.isArray($element) || $element instanceof jQuery)\n e = $element[0];\n else\n e = $element;\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\n if (e.nodeType === 3) {\n e = $element.parent()[0];\n }\n\n\n var offsetLeft = e.offsetLeft;\n var offsetTop = e.offsetTop;\n var offsetWidth = e.offsetWidth;\n var offsetHeight = e.offsetHeight;\n\n while (e = e.offsetParent) {\n offsetLeft += e.offsetLeft;\n offsetTop += e.offsetTop;\n }\n\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\n};\n/**\n *\n * @param $epubHtml: The html that is to have font attributes added.\n * @param fontSize: The font size that is to be added to the element at all locations.\n * @param fontObj: The font Object containing at minimum the URL, and fontFamilyName (In fields url and fontFamily) respectively. Pass in null's on the object's fields to signal no font.\n * @param callback: function invoked when \"done\", which means that if there are asynchronous operations such as font-face loading via injected stylesheets, then the UpdateHtmlFontAttributes() function returns immediately but the caller should wait for the callback function call if fully-loaded font-face *stylesheets* are required on the caller's side (note that the caller's side may still need to detect *actual font loading*, via the FontLoader API or some sort of ResizeSensor to indicate that the updated font-family has been used to render the document). \n */\n\nHelpers.UpdateHtmlFontAttributes = function ($epubHtml, fontSize, fontObj, callback) {\n\n\n var FONT_FAMILY_ID = \"readium_font_family_link\";\n\n var docHead = $(\"head\", $epubHtml);\n var link = $(\"#\" + FONT_FAMILY_ID, docHead);\n\n const NOTHING = 0, ADD = 1, REMOVE = 2; //Types for css font family.\n var changeFontFamily = NOTHING;\n\n var fontLoadCallback = function() {\n \n var perf = false;\n\n // TODO: very slow on Firefox!\n // See https://github.com/readium/readium-shared-js/issues/274\n if (perf) var time1 = window.performance.now();\n\n\n\n if (changeFontFamily != NOTHING) {\n var fontFamilyStyle = $(\"style#readium-fontFamily\", docHead);\n\n if (fontFamilyStyle && fontFamilyStyle[0]) {\n // REMOVE, or ADD (because we remove before re-adding from scratch)\n docHead[0].removeChild(fontFamilyStyle[0]);\n }\n if (changeFontFamily == ADD) {\n var style = $epubHtml[0].ownerDocument.createElement('style');\n style.setAttribute(\"id\", \"readium-fontFamily\");\n style.appendChild($epubHtml[0].ownerDocument.createTextNode('html * { font-family: \"'+fontObj.fontFamily+'\" !important; }')); // this technique works for text-align too (e.g. text-align: justify !important;)\n\n docHead[0].appendChild(style);\n\n //fontFamilyStyle = $(style);\n }\n }\n \n // The code below does not work because jQuery $element.css() on html.body somehow \"resets\" the font: CSS directive by removing it entirely (font-family: works with !important, but unfortunately further deep inside the DOM there may be CSS applied with the font: directive, which somehow seems to take precedence! ... as shown in Chrome's developer tools)\n // ...thus why we use the above routine instead, to insert a new head>style element\n // // var doc = $epubHtml[0].ownerDocument;\n // // var body = doc.body;\n // var $body = $(\"body\", $epubHtml);\n // // $body.css({\n // // \"font-size\" : fontSize + \"%\",\n // // \"font-family\" : \"\"\n // // });\n // $body.css(\"font-family\", \"\");\n // if (changeFontFamily == ADD) {\n \n // var existing = $body.attr(\"style\");\n // $body[0].setAttribute(\"style\",\n // existing + \" ; font-family: '\" + fontObj.fontFamily + \"' !important ;\" + \" ; font: regular 100% '\" + fontObj.fontFamily + \"' !important ;\");\n // }\n\n\n var factor = fontSize / 100;\n var win = $epubHtml[0].ownerDocument.defaultView;\n if (!win) {\n console.log(\"NIL $epubHtml[0].ownerDocument.defaultView\");\n return;\n }\n\n // TODO: is this a complete list? Is there a better way to do this?\n //https://github.com/readium/readium-shared-js/issues/336\n // Note that font-family is handled differently, using an injected stylesheet with a catch-all selector that pushes an \"!important\" CSS value in the document's cascade.\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre, dt, dd, code, a', $epubHtml); // excludes section, body etc.\n\n // need to do two passes because it is possible to have nested text blocks.\n // If you change the font size of the parent this will then create an inaccurate\n // font size for any children.\n for (var i = 0; i < $textblocks.length; i++) {\n\n var ele = $textblocks[i];\n \n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n if (fontSizeAttr) {\n // early exit, original values already set.\n break;\n }\n\n var style = win.getComputedStyle(ele);\n \n var originalFontSize = parseInt(style.fontSize);\n ele.setAttribute('data-original-font-size', originalFontSize);\n\n var originalLineHeight = parseInt(style.lineHeight);\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\n if (originalLineHeight) {\n ele.setAttribute('data-original-line-height', originalLineHeight);\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // if (!fontFamilyAttr) {\n // var originalFontFamily = style.fontFamily;\n // if (originalFontFamily) {\n // ele.setAttribute('data-original-font-family', originalFontFamily);\n // }\n // }\n }\n\n for (var i = 0; i < $textblocks.length; i++) {\n var ele = $textblocks[i];\n\n // TODO: group the 3x potential $(ele).css() calls below to avoid multiple jQuery style mutations \n\n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n var originalFontSize = Number(fontSizeAttr);\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\n\n var lineHeightAttr = ele.getAttribute('data-original-line-height');\n var originalLineHeight = lineHeightAttr ? Number(lineHeightAttr) : 0;\n if (originalLineHeight) {\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // switch(changeFontFamily){\n // case NOTHING:\n // break;\n // case ADD:\n // $(ele).css(\"font-family\", fontObj.fontFamily);\n // break;\n // case REMOVE:\n // $(ele).css(\"font-family\", fontFamilyAttr);\n // break;\n // }\n }\n\n $epubHtml.css(\"font-size\", fontSize + \"%\");\n\n \n \n if (perf) {\n var time2 = window.performance.now();\n \n // Firefox: 80+\n // Chrome: 4-10\n // Edge: 15-34\n // IE: 10-15\n // https://readium.firebase.com/?epub=..%2Fepub_content%2Faccessible_epub_3&goto=%7B%22idref%22%3A%22id-id2635343%22%2C%22elementCfi%22%3A%22%2F4%2F2%5Bbuilding_a_better_epub%5D%2F10%2F44%2F6%2C%2F1%3A334%2C%2F1%3A335%22%7D\n \n var diff = time2-time1;\n console.log(diff);\n \n // setTimeout(function(){\n // alert(diff);\n // }, 2000);\n }\n\n callback();\n };\n var fontLoadCallback_ = _.once(fontLoadCallback);\n\n if(fontObj.fontFamily && fontObj.url){\n var dataFontFamily = link.length ? link.attr(\"data-fontfamily\") : undefined;\n\n if(!link.length){\n changeFontFamily = ADD;\n\n setTimeout(function(){\n \n link = $(\"\", {\n \"id\" : FONT_FAMILY_ID,\n \"data-fontfamily\" : fontObj.fontFamily,\n \"rel\" : \"stylesheet\",\n \"type\" : \"text/css\"\n });\n docHead.append(link);\n \n link.attr({\n \"href\" : fontObj.url\n });\n }, 0);\n }\n else if(dataFontFamily != fontObj.fontFamily){\n changeFontFamily = ADD;\n \n link.attr({\n \"data-fontfamily\" : fontObj.fontFamily,\n \"href\" : fontObj.url\n });\n } else {\n changeFontFamily = NOTHING;\n }\n }\n else{\n changeFontFamily = REMOVE;\n if(link.length) link.remove();\n }\n\n if (changeFontFamily == ADD) {\n // just in case the link@onload does not trigger, we set a timeout\n setTimeout(function(){\n fontLoadCallback_();\n }, 100);\n }\n else { // REMOVE, NOTHING\n fontLoadCallback_();\n }\n};\n\n\n/**\n *\n * @param contentRef\n * @param sourceFileHref\n * @returns {string}\n * @constructor\n */\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\n\n if (!sourceFileHref) {\n return contentRef;\n }\n\n var sourceParts = sourceFileHref.split(\"/\");\n sourceParts.pop(); //remove source file name\n\n var pathComponents = contentRef.split(\"/\");\n\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\n\n sourceParts.pop();\n pathComponents.splice(0, 1);\n }\n\n var combined = sourceParts.concat(pathComponents);\n\n return combined.join(\"/\");\n\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.EndsWith = function (str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.BeginsWith = function (str, suffix) {\n\n return str.indexOf(suffix) === 0;\n};\n\n/**\n *\n * @param str\n * @param toRemove\n * @returns {string}\n * @static\n */\nHelpers.RemoveFromString = function (str, toRemove) {\n\n var startIx = str.indexOf(toRemove);\n\n if (startIx == -1) {\n return str;\n }\n\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\n};\n\n/**\n *\n * @param margin\n * @param border\n * @param padding\n * @constructor\n */\nHelpers.Margins = function (margin, border, padding) {\n\n this.margin = margin;\n this.border = border;\n this.padding = padding;\n\n this.left = this.margin.left + this.border.left + this.padding.left;\n this.right = this.margin.right + this.border.right + this.padding.right;\n this.top = this.margin.top + this.border.top + this.padding.top;\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\n\n this.width = function () {\n return this.left + this.right;\n };\n\n this.height = function () {\n return this.top + this.bottom;\n }\n};\n\n/**\n *\n * @param $iframe\n */\nHelpers.triggerLayout = function ($iframe) {\n\n var doc = $iframe[0].contentDocument;\n\n if (!doc) {\n return;\n }\n\n var ss = undefined;\n try {\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\n if (!ss) {\n var style = doc.createElement('style');\n doc.head.appendChild(style);\n style.appendChild(doc.createTextNode(''));\n ss = style.sheet;\n }\n\n if (ss) {\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\n if (ss.cssRules) {\n ss.insertRule(cssRule, ss.cssRules.length);\n } else {\n ss.insertRule(cssRule, 0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n try {\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\n el.appendChild(doc.createTextNode(\"*{}\"));\n doc.body.appendChild(el);\n doc.body.removeChild(el);\n\n if (ss) {\n if (ss.cssRules) {\n ss.deleteRule(ss.cssRules.length - 1);\n } else {\n ss.deleteRule(0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n if (doc.body) {\n var val = doc.body.offsetTop; // triggers layout\n }\n\n};\n\n/**\n *\n * @param $viewport\n * @param spineItem\n * @param settings\n * @returns {boolean}\n */\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\n// Returns falsy and truthy\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\n\n if (!$viewport || $viewport.length == 0) {\n return 0; // non-forced\n }\n\n //http://www.idpf.org/epub/fxl/#property-spread-values\n\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\n return false; // forced\n\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\n }\n\n if (settings.syntheticSpread == \"double\") {\n return true; // forced\n }\n else if (settings.syntheticSpread == \"single\") {\n return false; // forced\n }\n\n if (!spineItem) {\n return 0; // non-forced\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\n return true; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\n }\n\n var orientation = Helpers.getOrientation($viewport);\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\n }\n\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\n // if no spread set in document and user didn't set in in setting we will do double for landscape\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\n return landscape ? 1 : 0; // non-forced\n\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\n }\n\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\n return 0; // non-forced\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.fromElement = function ($element) {\n return new this($element.margin(), $element.border(), $element.padding());\n};\n\n/**\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.empty = function () {\n\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n });\n\n};\n\n/**\n *\n * @param name\n * @param params\n * @returns {Helpers.loadTemplate.cache}\n */\nHelpers.loadTemplate = function (name, params) {\n return Helpers.loadTemplate.cache[name];\n};\n\n/**\n *\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\n */\nHelpers.loadTemplate.cache = {\n \"fixed_book_frame\": '
',\n \"single_page_frame\": '
',\n //\"single_page_frame\" : '
',\n\n \"scrolled_book_frame\": '
',\n \"reflowable_book_frame\": '
',\n \"reflowable_book_page_frame\": '
'\n /***\n * The `enable-annotation` attribute on an iframe helps detect the content frames for annotating tools such as Hypothesis\n * See here for more details:\n * https://h.readthedocs.io/projects/client/en/latest/publishers/embedding/\n * https://github.com/hypothesis/client/pull/533\n ***/\n};\n\n/**\n *\n * @param styles\n * @param $element\n */\nHelpers.setStyles = function (styles, $element) {\n\n var count = styles.length;\n\n if (!count) {\n return;\n }\n\n var stylingGlobal = \"\";\n var stylings = [];\n var elementIsDocument = ($element && $element.createTextNode) ? true : false;\n\n for (var i = 0; i < count; i++) {\n var style = styles[i];\n\n if (elementIsDocument) {\n if (!style.selector || style.selector == \"\" || style.selector == \"html\" || style.selector == \"body\" || style.selector == \"*\") {\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n\n stylingGlobal += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n } else {\n //$(style.selector, $($element.doumentElement)).css(style.declarations);\n\n var cssProperties = \"\";\n\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n cssProperties += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n\n stylings.push({selector: style.selector, cssProps: cssProperties});\n }\n \n } else { // HTML element\n if (style.selector) {\n $(style.selector, $element).css(style.declarations);\n }\n else {\n $element.css(style.declarations);\n }\n }\n }\n\n if (elementIsDocument) { // HTML document\n\n var doc = $element;\n\n var bookStyleElement = $(\"style#readium-bookStyles\", doc.head);\n\n if (bookStyleElement && bookStyleElement[0]) {\n // we remove before re-adding from scratch\n doc.head.removeChild(bookStyleElement[0]);\n }\n \n var cssStylesheet = \"\";\n\n if (stylingGlobal.length > 0) {\n cssStylesheet += ' body, body::after, body::before, body *, body *::after, body *::before { ' + stylingGlobal + ' } ';\n }\n\n if (stylings.length > 0) {\n for (var i = 0; i < stylings.length; i++) {\n var styling = stylings[i];\n\n cssStylesheet += ' ' + styling.selector + ' { ' + styling.cssProps + ' } ';\n }\n }\n\n if (cssStylesheet.length > 0) {\n\n var styleElement = doc.createElement('style');\n styleElement.setAttribute(\"id\", \"readium-bookStyles\");\n styleElement.appendChild(doc.createTextNode(cssStylesheet));\n\n doc.head.appendChild(styleElement);\n\n //bookStyleElement = $(styleElement);\n }\n }\n};\n\n/**\n *\n * @param iframe\n * @returns {boolean}\n */\nHelpers.isIframeAlive = function (iframe) {\n var w = undefined;\n var d = undefined;\n try {\n w = iframe.contentWindow;\n d = iframe.contentDocument;\n }\n catch (ex) {\n console.error(ex);\n return false;\n }\n\n return w && d;\n};\n\n/**\n *\n * @param $viewport\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\n */\nHelpers.getOrientation = function ($viewport) {\n\n var viewportWidth = $viewport.width();\n var viewportHeight = $viewport.height();\n\n if (!viewportWidth || !viewportHeight) {\n return undefined;\n }\n\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\n};\n\n/**\n *\n * @param item\n * @param orientation\n * @returns {boolean}\n */\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\n\n var rendition_spread = item.getRenditionSpread();\n\n return !rendition_spread\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\n};\n\nHelpers.CSSTransition = function ($el, trans) {\n\n // does not work!\n //$el.css('transition', trans);\n\n var css = {};\n // empty '' prefix FIRST!\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\n css[prefix + 'transition'] = prefix + trans;\n });\n $el.css(css);\n}\n\n//scale, left, top, angle, origin\nHelpers.CSSTransformString = function (options) {\n var enable3D = options.enable3D ? true : false;\n\n var translate, scale, rotation,\n origin = options.origin;\n\n if (options.left || options.top) {\n var left = options.left || 0,\n top = options.top || 0;\n\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\n }\n if (options.scale) {\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\n }\n if (options.angle) {\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\n }\n\n if (!(translate || scale || rotation)) {\n return {};\n }\n\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\n if (rotation) {\n transformString = transformString + \" \" + rotation;\n //transformString = rotation + \" \" + transformString;\n }\n\n var css = {};\n css['transform'] = transformString;\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\n return css;\n};\n\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\n if (!tickRate) tickRate = 250;\n if (!waitThreshold) waitThreshold = tickRate;\n\n var first = true,\n last,\n deferTimer;\n\n return function () {\n var ctx = context || this,\n now = (Date.now && Date.now()) || new Date().getTime(),\n args = arguments;\n\n if (!(last && now < last + tickRate)) {\n last = now;\n if (first) {\n startCb.apply(ctx, args);\n first = false;\n } else {\n tickCb.apply(ctx, args);\n }\n }\n\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n first = true;\n endCb.apply(ctx, args);\n }, waitThreshold);\n };\n};\n\n\n//TODO: consider using CSSOM escape() or polyfill\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\n//http://mathiasbynens.be/notes/css-escapes\n/**\n *\n * @param sel\n * @returns {string}\n */\nHelpers.escapeJQuerySelector = function (sel) {\n //http://api.jquery.com/category/selectors/\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\n // double backslash escape\n\n if (!sel) return undefined;\n\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\n\n // if (selector !== sel)\n // {\n // console.debug(\"---- SELECTOR ESCAPED\");\n // console.debug(\"1: \" + sel);\n // console.debug(\"2: \" + selector);\n // }\n // else\n // {\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\n // }\n\n return selector;\n};\n\nHelpers.polyfillCaretRangeFromPoint = function(document) {\n //Derived from css-regions-polyfill:\n // https://github.com/FremyCompany/css-regions-polyfill/blob/bfbb6445ec2a2a883005ab8801d8463fa54b5701/src/range-extensions.js\n //Copyright (c) 2013 François REMY\n //Copyright (c) 2013 Adobe Systems Inc.\n //Licensed under the Apache License, Version 2.0\n if (!document.caretRangeFromPoint) {\n if (document.caretPositionFromPoint) {\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n var r = document.createRange();\n var p = document.caretPositionFromPoint(x, y);\n if (!p) return null;\n if (p.offsetNode) {\n r.setStart(p.offsetNode, p.offset);\n r.setEnd(p.offsetNode, p.offset);\n }\n return r;\n }\n } else if ((document.body || document.createElement('body')).createTextRange) {\n //\n // we may want to convert TextRange to Range\n //\n\n //TextRangeUtils, taken from: https://code.google.com/p/ierange/\n //Copyright (c) 2009 Tim Cameron Ryan\n //Released under the MIT/X License\n var TextRangeUtils = {\n convertToDOMRange: function(textRange, document) {\n var adoptBoundary = function(domRange, textRangeInner, bStart) {\n // iterate backwards through parent element to find anchor location\n var cursorNode = document.createElement('a'),\n cursor = textRangeInner.duplicate();\n cursor.collapse(bStart);\n var parent = cursor.parentElement();\n do {\n parent.insertBefore(cursorNode, cursorNode.previousSibling);\n cursor.moveToElementText(cursorNode);\n } while (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) > 0 && cursorNode.previousSibling);\n // when we exceed or meet the cursor, we've found the node\n if (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) == -1 && cursorNode.nextSibling) {\n // data node\n cursor.setEndPoint(bStart ? 'EndToStart' : 'EndToEnd', textRangeInner);\n domRange[bStart ? 'setStart' : 'setEnd'](cursorNode.nextSibling, cursor.text.length);\n } else {\n // element\n domRange[bStart ? 'setStartBefore' : 'setEndBefore'](cursorNode);\n }\n cursorNode.parentNode.removeChild(cursorNode);\n };\n // return a DOM range\n var domRange = document.createRange();\n adoptBoundary(domRange, textRange, true);\n adoptBoundary(domRange, textRange, false);\n return domRange;\n }\n };\n\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n // the accepted number of vertical backtracking, in CSS pixels\n var IYDepth = 40;\n // try to create a text range at the specified location\n var tr = document.body.createTextRange();\n for (var iy = IYDepth; iy; iy = iy - 4) {\n try {\n tr.moveToPoint(x, iy + y - IYDepth);\n return TextRangeUtils.convertToDOMRange(tr, document);\n } catch (ex) {\n }\n }\n // if that fails, return the location just after the element located there\n try {\n var elem = document.elementFromPoint(x - 1, y - 1);\n var r = document.createRange();\n r.setStartAfter(elem);\n return r;\n } catch (ex) {\n return null;\n }\n }\n }\n }\n};\n\nreturn Helpers;\n});\n\n", + "// Created by Boris Schneiderman.\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/spine_item',[], function() {\n\n/**\n * Wrapper of the SpineItem object received from the host application\n *\n * @class Models.SpineItem\n * @constructor\n * @param itemData container for spine item properties\n * @param {Number} index index of this spine item in the parent spine \n * @param {Models.Spine} spine parent spine\n *\n */\nvar SpineItem = function(itemData, index, spine){\n\n var self = this;\n\n /**\n * The idref of the spine item, i.e. the ID-based pointer to the actual \n * manifest item that the spine item references\n *\n * @property idref\n * @type String\n * @default None\n */\n this.idref = itemData.idref;\n\n /**\n * The href of the spine item, i.e. the URI to the resource in the EPUB\n * which the spineitem will render\n *\n * @property href\n * @type String\n * @default None\n */\n this.href = itemData.href;\n\n /**\n * The package level CFI of the spine item, i.e. the CFI path to the spine item\n * element in the package document.\n *\n * @property cfi\n * @type String\n * @default None\n */\n this.cfi = itemData.cfi;\n\n /**\n * A flag indicating whether the spineItem has the attribute linear, which \n * is either yes or no. Default is yes.\n *\n * @property linear\n * @type String\n * @default yes\n */\n this.linear = itemData.linear ? itemData.linear.toLowerCase() : itemData.linear;\n\n /**\n * A variable indicating the type of synthetic spread for this specific\n * spine item, where page:spread-* can be left, right or center or auto\n *\n * @property page_spread\n * @type String\n * @default auto\n */\n this.page_spread = itemData.page_spread;\n \n /**\n * A string specifying the height and width from the rendition:viewport tag.\n * Note: This is deprecated in EPUB 3.1\n *\n * @property rendition_viewport\n * @type String\n * @default None\n */\n this.rendition_viewport = itemData.rendition_viewport;\n \n /**\n * A string specifying the type of synthetic spread for ALL spine items, where\n * where rendtion:spread-* can be left, right or center or auto\n *\n * @property rendition_spread\n * @type String\n * @default auto\n */\n this.rendition_spread = itemData.rendition_spread;\n\n /**\n * A string specifying desired orientation for ALL spine items. Possible values are\n * rendition-orientation-*, which can be none, landscape, portrait, both or auto\n *\n * Note: Not yet implemented.\n *\n * @property rendition_orientation\n * @type String\n * @default auto\n */\n this.rendition_orientation = itemData.rendition_orientation;\n\n /**\n * A string indicating the type of document layout, either prepaginated or reflowable\n *\n * @property rendition_layout\n * @type String\n * @default reflowable\n */\n this.rendition_layout = itemData.rendition_layout;\n \n /**\n * A string specifying how \"overflow\" content that exceeds the current viewport should\n * be laid out. Possible values are paginated, scrolled-continuous, scrolled-doc or auto\n *\n * @property rendition_flow\n * @type String\n * @default auto\n */\n this.rendition_flow = itemData.rendition_flow;\n \n /**\n * The ID, if any, of the root SMIL element of the media overlay for the document.\n *\n * @property media_overlay_id\n * @type String\n * @default None\n */\n this.media_overlay_id = itemData.media_overlay_id;\n\n /**\n * The mimetype of this specific spine item.\n *\n * @property media_type\n * @type String\n * @default None\n */\n this.media_type = itemData.media_type;\n\n /**\n * The index of this spine item in the parent spine .\n * \n * @property index\n * @type String\n * @default None\n */\n this.index = index;\n\n /**\n * The object which is the actual spine of which this spineItem is a child.\n *\n * @property spine\n * @type Models.Spine\n * @default None\n */\n this.spine = spine;\n\n validateSpread();\n\n /**\n * Sets a new page spread and checks its validity\n *\n * @method setSpread\n * @param {String} spread the new page spread \n */\n this.setSpread = function(spread) {\n this.page_spread = spread;\n\n validateSpread();\n };\n\n /* private method (validateSpread) */\n function validateSpread() {\n\n if(!self.page_spread) {\n return;\n }\n\n if( self.page_spread != SpineItem.SPREAD_LEFT &&\n self.page_spread != SpineItem.SPREAD_RIGHT &&\n self.page_spread != SpineItem.SPREAD_CENTER ) {\n\n console.error(self.page_spread + \" is not a recognized spread type\");\n }\n };\n\n /**\n * Checks to see if the manifest has specified a spread property of \"none\"\n *\n * @method isRenditionSpreadAllowed\n * @return {Boolean} TRUE if spread=none has NOT been specified, else FALSE\n */\n this.isRenditionSpreadAllowed = function() {\n \n var rendition_spread = self.getRenditionSpread();\n return !rendition_spread || rendition_spread != SpineItem.RENDITION_SPREAD_NONE;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_LEFT\n *\n * @method isLeftPage\n * @return {Boolean} \n */\n this.isLeftPage = function() {\n return self.page_spread == SpineItem.SPREAD_LEFT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_RIGHT\n *\n * @method isRightPage\n * @return {Boolean} \n */\n this.isRightPage = function() {\n return self.page_spread == SpineItem.SPREAD_RIGHT;\n };\n\n /**\n * Checks to see if this spineItem explicitly specifies SPREAD_CENTER\n *\n * @method isCenterPage\n * @return {Boolean} \n */\n this.isCenterPage = function() {\n return self.page_spread == SpineItem.SPREAD_CENTER;\n };\n\n /**\n * Checks to see if the parent package of this spineIem is\n * reflowable\n *\n * @method isReflowable\n * @return {Boolean} \n */\n this.isReflowable = function() {\n return !self.isFixedLayout();\n };\n\n /**\n * Checks to see if the parent package of to this spineIem is\n * fixed layout\n *\n * @method isFixedLayout\n * @return {Boolean} \n */\n this.isFixedLayout = function() {\n \n // cannot use isPropertyValueSetForItemOrPackage() here!\n\n var isLayoutExplicitlyDefined = self.getRenditionLayout();\n\n if(isLayoutExplicitlyDefined) {\n\n if (self.rendition_layout)\n {\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_PREPAGINATED) return true;\n if (self.rendition_layout === SpineItem.RENDITION_LAYOUT_REFLOWABLE) return false;\n }\n\n return self.spine.package.isFixedLayout();\n }\n\n // if image or svg use fixed layout\n return self.media_type.indexOf(\"image/\") >= 0;\n };\n\n /**\n * Returns a string indicating the type of layout for viewport overflow, \n * i.e. scrolldoc, scroll-continuous, paginated or auto. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned\n *\n * @method getRenditionFlow\n * @return {String} \n */\n this.getRenditionFlow = function() {\n\n if(self.rendition_flow) {\n return self.rendition_flow;\n }\n\n return self.spine.package.rendition_flow;\n };\n \n /**\n * Returns the rendition:viewport, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n * Note that this attribute is deprecated in EPUB 3.1\n *\n * @method getRenditionViewport\n * @return {Boolean} \n */\n this.getRenditionViewport = function() {\n\n if(self.rendition_viewport) {\n return self.rendition_viewport;\n }\n\n return self.spine.package.rendition_viewport;\n };\n\n /**\n * Returns the rendition:spread, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionSpread\n * @return {Boolean} \n */\n this.getRenditionSpread = function() {\n\n if(self.rendition_spread) {\n return self.rendition_spread;\n }\n\n return self.spine.package.rendition_spread;\n };\n\n /**\n * Returns the rendition:orientation, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionOrientation\n * @return {Boolean} \n */\n this.getRenditionOrientation = function() {\n\n if(self.rendition_orientation) {\n return self.rendition_orientation;\n }\n\n return self.spine.package.rendition_orientation;\n };\n\n /**\n * Returns the rendition:layout, if any. Note that if the spineItem \n * has an override (local value) that is returned, else the package's \n * value is returned.\n *\n * @method getRenditionLayout\n * @return {String} \n */\n this.getRenditionLayout = function() {\n\n if(self.rendition_layout) {\n return self.rendition_layout;\n }\n\n return self.spine.package.rendition_layout;\n };\n\n /**\n * Checks to see if the specified property is set in this spineItem and\n * matches the supplied value. If the property is NOT set in the spineItem\n * then the the package is checked. If not set in either place then \n * the function returns FALSE.\n *\n * @method isPropertyValueSetForItemOrPackage\n * @param {String} propName The name of the property to be checked\n * @param {String} propValue The value of the property to be checked\n * @return {Boolean} \n */\n function isPropertyValueSetForItemOrPackage(propName, propValue) {\n\n if(self[propName]) {\n return self[propName] === propValue;\n }\n\n if(self.spine.package[propName]) {\n return self.spine.package[propName] === propValue;\n }\n\n return false;\n }\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-continuous.\n *\n * @method isFlowScrolledContinuous\n * @return {Boolean} \n */\n this.isFlowScrolledContinuous = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS);\n };\n\n /**\n * Checks if this spineItem or its parent package has its overflow content \n * layout specified as scrolled-doc.\n *\n * @method isFlowScrolledDoc\n * @return {Boolean} \n */\n this.isFlowScrolledDoc = function() {\n\n return isPropertyValueSetForItemOrPackage(\"rendition_flow\", SpineItem.RENDITION_FLOW_SCROLLED_DOC);\n };\n};\n\n/** \n * @property RENDITION_LAYOUT_REFLOWABLE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_REFLOWABLE = \"reflowable\";\n\n/** \n * @property RENDITION_LAYOUT_PREPAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_LAYOUT_PREPAGINATED = \"pre-paginated\";\n\n/** \n * @property RENDITION_ORIENTATION_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_ORIENTATION_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_PORTRAIT = \"portrait\";\n/** \n * @property RENDITION_ORIENTATION_AUTO\n * @type {String}\n * @static \n */\nSpineItem.RENDITION_ORIENTATION_AUTO = \"auto\";\n\n/** \n * @property SPREAD_LEFT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_LEFT = \"page-spread-left\";\n\n/** \n * @property SPREAD_RIGHT \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_RIGHT = \"page-spread-right\";\n\n/** \n * @property SPREAD_CENTER \n * @type {String}\n * @static \n */\nSpineItem.SPREAD_CENTER = \"page-spread-center\";\n\n/** \n * @property RENDITION_SPREAD_NONE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_NONE = \"none\";\n\n/** \n * @property RENDITION_SPREAD_LANDSCAPE \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_LANDSCAPE = \"landscape\";\n\n/** \n * @property RENDITION_SPREAD_PORTRAIT \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_PORTRAIT = \"portrait\";\n\n/** \n * @property RENDITION_SPREAD_BOTH \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_BOTH = \"both\";\n\n/** \n * @property RENDITION_SPREAD_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_SPREAD_AUTO = \"auto\";\n\n/** \n * @property RENDITION_FLOW_PAGINATED \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_PAGINATED = \"paginated\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_CONTINUOUS \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_CONTINUOUS = \"scrolled-continuous\";\n\n/** \n * @property RENDITION_FLOW_SCROLLED_DOC \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_SCROLLED_DOC = \"scrolled-doc\";\n\n/** \n * @property RENDITION_FLOW_AUTO \n * @type {String}\n * @static \n */\nSpineItem.RENDITION_FLOW_AUTO = \"auto\";\n\n/**\n * Returns the inversion of the spineItem's SPREAD property. i.e\n * if the page-spread is right it returns LEFT and vice versa. If \n * the spread is center then it returns CENTER\n *\n * @method alternateSpread\n * @return {String} \n */\nSpineItem.alternateSpread = function(spread) {\n\n if(spread === SpineItem.SPREAD_LEFT) {\n return SpineItem.SPREAD_RIGHT;\n }\n\n if(spread === SpineItem.SPREAD_RIGHT) {\n return SpineItem.SPREAD_LEFT;\n }\n\n return spread;\n\n};\n return SpineItem;\n});\n\n\n\n", + "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/helpers',[\"./globals\", 'underscore', \"jquery\", \"jquerySizes\", \"./models/spine_item\", 'URIjs'], function(Globals, _, $, JQuerySizes, SpineItem, URI) {\n \n(function()\n{\n/* jshint strict: true */\n/* jshint -W034 */\n \"use strict\";\n \n if(window.performance)\n {\n if (window.performance.now)\n {\n return;\n }\n \n var vendors = ['webkitNow', 'mozNow', 'msNow', 'oNow'];\n \n for (var i = 0; i < vendors.length; i++)\n {\n if (vendors[i] in window.performance)\n {\n window.performance.now = window.performance[vendors[i]];\n return;\n }\n }\n }\n else\n {\n window.performance = {};\n \n }\n \n if(Date.now)\n {\n window.performance.now = function()\n {\n return Date.now();\n };\n return;\n }\n \n window.performance.now = function()\n {\n return +(new Date());\n };\n})();\n\nvar Helpers = {};\n\n/**\n *\n * @param ebookURL URL string, or Blob (possibly File)\n * @returns string representing the file path / name from which the asset referenced by this URL originates\n */\nHelpers.getEbookUrlFilePath = function(ebookURL) {\n if (!window.Blob || !window.File) return ebookURL;\n\n if (ebookURL instanceof File) {\n return ebookURL.name;\n } else if (ebookURL instanceof Blob) {\n return \"readium-ebook.epub\";\n } else {\n return ebookURL;\n }\n};\n\n/**\n * @param initialQuery: (optional) initial query string\n * @returns object (map between URL query parameter names and corresponding decoded / unescaped values)\n */\nHelpers.getURLQueryParams = function(initialQuery) {\n var params = {};\n\n var query = initialQuery || window.location.search;\n if (query && query.length) {\n query = query.substring(1);\n var keyParams = query.split('&');\n for (var x = 0; x < keyParams.length; x++)\n {\n var keyVal = keyParams[x].split('=');\n if (keyVal.length > 1) {\n params[keyVal[0]] = decodeURIComponent(keyVal[1]);\n }\n }\n }\n\n return params;\n};\n\n\n/**\n * @param initialUrl: string corresponding a URL. If undefined/null, the default window.location is used.\n * @param queryStringOverrides: object that maps query parameter names with values (to be included in the resulting URL, while any other query params in the current window.location are preserved as-is)\n * @returns string corresponding to a URL obtained by concatenating the given URL with the given query parameters\n */\nHelpers.buildUrlQueryParameters = function(initialUrl, queryStringOverrides) {\n var uriInstance = new URI(initialUrl || window.location);\n var startingQueryString = uriInstance.search();\n var urlFragment = uriInstance.hash();\n var urlPath = uriInstance.search('').hash('').toString();\n\n var newQueryString = \"\";\n\n for (var overrideKey in queryStringOverrides) {\n if (!queryStringOverrides.hasOwnProperty(overrideKey)) continue;\n\n if (!queryStringOverrides[overrideKey]) continue;\n\n var overrideEntry = queryStringOverrides[overrideKey];\n if (_.isString(overrideEntry)) {\n overrideEntry = overrideEntry.trim();\n }\n\n if (!overrideEntry) continue;\n\n if (overrideEntry.verbatim) {\n overrideEntry = overrideEntry.value; // grab value from entry as object\n } else {\n overrideEntry = encodeURIComponent(overrideEntry);\n }\n\n console.debug(\"URL QUERY PARAM OVERRIDE: \" + overrideKey + \" = \" + overrideEntry);\n\n newQueryString += (overrideKey + \"=\" + overrideEntry);\n newQueryString += \"&\";\n }\n\n\n var parsedQueryString = Helpers.getURLQueryParams(startingQueryString);\n for (var parsedKey in parsedQueryString) {\n if (!parsedQueryString.hasOwnProperty(parsedKey)) continue;\n\n if (!parsedQueryString[parsedKey]) continue;\n\n if (queryStringOverrides[parsedKey]) continue;\n\n var parsedValue = parsedQueryString[parsedKey].trim();\n if (!parsedValue) continue;\n\n console.debug(\"URL QUERY PARAM PRESERVED: \" + parsedKey + \" = \" + parsedValue);\n\n newQueryString += (parsedKey + \"=\" + encodeURIComponent(parsedValue));\n newQueryString += \"&\";\n }\n\n // remove trailing \"&\"\n newQueryString = newQueryString.slice(0, -1);\n\n return urlPath + \"?\" + newQueryString + urlFragment;\n};\n\n\n/**\n *\n * @param left\n * @param top\n * @param width\n * @param height\n * @constructor\n */\nHelpers.Rect = function (left, top, width, height) {\n\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n\n this.right = function () {\n return this.left + this.width;\n };\n\n this.bottom = function () {\n return this.top + this.height;\n };\n\n this.isOverlap = function (rect, tolerance) {\n\n if (tolerance == undefined) {\n tolerance = 0;\n }\n\n return !(rect.right() < this.left + tolerance ||\n rect.left > this.right() - tolerance ||\n rect.bottom() < this.top + tolerance ||\n rect.top > this.bottom() - tolerance);\n }\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\n//This method treats multicolumn view as one long column and finds the rectangle of the element in this \"long\" column\n//we are not using jQuery Offset() and width()/height() function because for multicolumn rendition_layout it produces rectangle as a bounding box of element that\n// reflows between columns this is inconstant and difficult to analyze .\nHelpers.Rect.fromElement = function ($element) {\n\n var e;\n if (_.isArray($element) || $element instanceof jQuery)\n e = $element[0];\n else\n e = $element;\n // TODODM this is somewhat hacky. Text (range?) elements don't have a position so we have to ask the parent.\n if (e.nodeType === 3) {\n e = $element.parent()[0];\n }\n\n\n var offsetLeft = e.offsetLeft;\n var offsetTop = e.offsetTop;\n var offsetWidth = e.offsetWidth;\n var offsetHeight = e.offsetHeight;\n\n while (e = e.offsetParent) {\n offsetLeft += e.offsetLeft;\n offsetTop += e.offsetTop;\n }\n\n return new Helpers.Rect(offsetLeft, offsetTop, offsetWidth, offsetHeight);\n};\n/**\n *\n * @param $epubHtml: The html that is to have font attributes added.\n * @param fontSize: The font size that is to be added to the element at all locations.\n * @param fontObj: The font Object containing at minimum the URL, and fontFamilyName (In fields url and fontFamily) respectively. Pass in null's on the object's fields to signal no font.\n * @param callback: function invoked when \"done\", which means that if there are asynchronous operations such as font-face loading via injected stylesheets, then the UpdateHtmlFontAttributes() function returns immediately but the caller should wait for the callback function call if fully-loaded font-face *stylesheets* are required on the caller's side (note that the caller's side may still need to detect *actual font loading*, via the FontLoader API or some sort of ResizeSensor to indicate that the updated font-family has been used to render the document). \n */\n\nHelpers.UpdateHtmlFontAttributes = function ($epubHtml, fontSize, fontObj, callback) {\n\n\n var FONT_FAMILY_ID = \"readium_font_family_link\";\n\n var docHead = $(\"head\", $epubHtml);\n var link = $(\"#\" + FONT_FAMILY_ID, docHead);\n\n const NOTHING = 0, ADD = 1, REMOVE = 2; //Types for css font family.\n var changeFontFamily = NOTHING;\n\n var fontLoadCallback = function() {\n \n var perf = false;\n\n // TODO: very slow on Firefox!\n // See https://github.com/readium/readium-shared-js/issues/274\n if (perf) var time1 = window.performance.now();\n\n\n\n if (changeFontFamily != NOTHING) {\n var fontFamilyStyle = $(\"style#readium-fontFamily\", docHead);\n\n if (fontFamilyStyle && fontFamilyStyle[0]) {\n // REMOVE, or ADD (because we remove before re-adding from scratch)\n docHead[0].removeChild(fontFamilyStyle[0]);\n }\n if (changeFontFamily == ADD) {\n var style = $epubHtml[0].ownerDocument.createElement('style');\n style.setAttribute(\"id\", \"readium-fontFamily\");\n style.appendChild($epubHtml[0].ownerDocument.createTextNode('html * { font-family: \"'+fontObj.fontFamily+'\" !important; }')); // this technique works for text-align too (e.g. text-align: justify !important;)\n\n docHead[0].appendChild(style);\n\n //fontFamilyStyle = $(style);\n }\n }\n \n // The code below does not work because jQuery $element.css() on html.body somehow \"resets\" the font: CSS directive by removing it entirely (font-family: works with !important, but unfortunately further deep inside the DOM there may be CSS applied with the font: directive, which somehow seems to take precedence! ... as shown in Chrome's developer tools)\n // ...thus why we use the above routine instead, to insert a new head>style element\n // // var doc = $epubHtml[0].ownerDocument;\n // // var body = doc.body;\n // var $body = $(\"body\", $epubHtml);\n // // $body.css({\n // // \"font-size\" : fontSize + \"%\",\n // // \"font-family\" : \"\"\n // // });\n // $body.css(\"font-family\", \"\");\n // if (changeFontFamily == ADD) {\n \n // var existing = $body.attr(\"style\");\n // $body[0].setAttribute(\"style\",\n // existing + \" ; font-family: '\" + fontObj.fontFamily + \"' !important ;\" + \" ; font: regular 100% '\" + fontObj.fontFamily + \"' !important ;\");\n // }\n\n\n var factor = fontSize / 100;\n var win = $epubHtml[0].ownerDocument.defaultView;\n if (!win) {\n console.log(\"NIL $epubHtml[0].ownerDocument.defaultView\");\n return;\n }\n\n // TODO: is this a complete list? Is there a better way to do this?\n //https://github.com/readium/readium-shared-js/issues/336\n // Note that font-family is handled differently, using an injected stylesheet with a catch-all selector that pushes an \"!important\" CSS value in the document's cascade.\n var $textblocks = $('p, div, span, h1, h2, h3, h4, h5, h6, li, blockquote, td, pre, dt, dd, code, a', $epubHtml); // excludes section, body etc.\n\n // need to do two passes because it is possible to have nested text blocks.\n // If you change the font size of the parent this will then create an inaccurate\n // font size for any children.\n for (var i = 0; i < $textblocks.length; i++) {\n\n var ele = $textblocks[i];\n \n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n if (fontSizeAttr) {\n // early exit, original values already set.\n break;\n }\n\n var style = win.getComputedStyle(ele);\n \n var originalFontSize = parseInt(style.fontSize);\n ele.setAttribute('data-original-font-size', originalFontSize);\n\n var originalLineHeight = parseInt(style.lineHeight);\n // getComputedStyle will not calculate the line-height if the value is 'normal'. In this case parseInt will return NaN\n if (originalLineHeight) {\n ele.setAttribute('data-original-line-height', originalLineHeight);\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // if (!fontFamilyAttr) {\n // var originalFontFamily = style.fontFamily;\n // if (originalFontFamily) {\n // ele.setAttribute('data-original-font-family', originalFontFamily);\n // }\n // }\n }\n\n for (var i = 0; i < $textblocks.length; i++) {\n var ele = $textblocks[i];\n\n // TODO: group the 3x potential $(ele).css() calls below to avoid multiple jQuery style mutations \n\n var fontSizeAttr = ele.getAttribute('data-original-font-size');\n var originalFontSize = Number(fontSizeAttr);\n $(ele).css(\"font-size\", (originalFontSize * factor) + 'px');\n\n var lineHeightAttr = ele.getAttribute('data-original-line-height');\n var originalLineHeight = lineHeightAttr ? Number(lineHeightAttr) : 0;\n if (originalLineHeight) {\n $(ele).css(\"line-height\", (originalLineHeight * factor) + 'px');\n }\n \n // var fontFamilyAttr = ele.getAttribute('data-original-font-family');\n // switch(changeFontFamily){\n // case NOTHING:\n // break;\n // case ADD:\n // $(ele).css(\"font-family\", fontObj.fontFamily);\n // break;\n // case REMOVE:\n // $(ele).css(\"font-family\", fontFamilyAttr);\n // break;\n // }\n }\n\n $epubHtml.css(\"font-size\", fontSize + \"%\");\n\n \n \n if (perf) {\n var time2 = window.performance.now();\n \n // Firefox: 80+\n // Chrome: 4-10\n // Edge: 15-34\n // IE: 10-15\n // https://readium.firebase.com/?epub=..%2Fepub_content%2Faccessible_epub_3&goto=%7B%22idref%22%3A%22id-id2635343%22%2C%22elementCfi%22%3A%22%2F4%2F2%5Bbuilding_a_better_epub%5D%2F10%2F44%2F6%2C%2F1%3A334%2C%2F1%3A335%22%7D\n \n var diff = time2-time1;\n console.log(diff);\n \n // setTimeout(function(){\n // alert(diff);\n // }, 2000);\n }\n\n callback();\n };\n var fontLoadCallback_ = _.once(fontLoadCallback);\n\n if(fontObj.fontFamily && fontObj.url){\n var dataFontFamily = link.length ? link.attr(\"data-fontfamily\") : undefined;\n\n if(!link.length){\n changeFontFamily = ADD;\n\n setTimeout(function(){\n \n link = $(\"\", {\n \"id\" : FONT_FAMILY_ID,\n \"data-fontfamily\" : fontObj.fontFamily,\n \"rel\" : \"stylesheet\",\n \"type\" : \"text/css\"\n });\n docHead.append(link);\n \n link.attr({\n \"href\" : fontObj.url\n });\n }, 0);\n }\n else if(dataFontFamily != fontObj.fontFamily){\n changeFontFamily = ADD;\n \n link.attr({\n \"data-fontfamily\" : fontObj.fontFamily,\n \"href\" : fontObj.url\n });\n } else {\n changeFontFamily = NOTHING;\n }\n }\n else{\n changeFontFamily = REMOVE;\n if(link.length) link.remove();\n }\n\n if (changeFontFamily == ADD) {\n // just in case the link@onload does not trigger, we set a timeout\n setTimeout(function(){\n fontLoadCallback_();\n }, 100);\n }\n else { // REMOVE, NOTHING\n fontLoadCallback_();\n }\n};\n\n\n/**\n *\n * @param contentRef\n * @param sourceFileHref\n * @returns {string}\n * @constructor\n */\nHelpers.ResolveContentRef = function (contentRef, sourceFileHref) {\n\n if (!sourceFileHref) {\n return contentRef;\n }\n\n var sourceParts = sourceFileHref.split(\"/\");\n sourceParts.pop(); //remove source file name\n\n var pathComponents = contentRef.split(\"/\");\n\n while (sourceParts.length > 0 && pathComponents[0] === \"..\") {\n\n sourceParts.pop();\n pathComponents.splice(0, 1);\n }\n\n var combined = sourceParts.concat(pathComponents);\n\n return combined.join(\"/\");\n\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.EndsWith = function (str, suffix) {\n return str.indexOf(suffix, str.length - suffix.length) !== -1;\n};\n\n/**\n *\n * @param str\n * @param suffix\n * @returns {boolean}\n * @static\n */\nHelpers.BeginsWith = function (str, suffix) {\n\n return str.indexOf(suffix) === 0;\n};\n\n/**\n *\n * @param str\n * @param toRemove\n * @returns {string}\n * @static\n */\nHelpers.RemoveFromString = function (str, toRemove) {\n\n var startIx = str.indexOf(toRemove);\n\n if (startIx == -1) {\n return str;\n }\n\n return str.substring(0, startIx) + str.substring(startIx + toRemove.length);\n};\n\n/**\n *\n * @param margin\n * @param border\n * @param padding\n * @constructor\n */\nHelpers.Margins = function (margin, border, padding) {\n\n this.margin = margin;\n this.border = border;\n this.padding = padding;\n\n this.left = this.margin.left + this.border.left + this.padding.left;\n this.right = this.margin.right + this.border.right + this.padding.right;\n this.top = this.margin.top + this.border.top + this.padding.top;\n this.bottom = this.margin.bottom + this.border.bottom + this.padding.bottom;\n\n this.width = function () {\n return this.left + this.right;\n };\n\n this.height = function () {\n return this.top + this.bottom;\n }\n};\n\n/**\n *\n * @param $iframe\n */\nHelpers.triggerLayout = function ($iframe) {\n\n var doc = $iframe[0].contentDocument;\n\n if (!doc) {\n return;\n }\n\n var ss = undefined;\n try {\n ss = doc.styleSheets && doc.styleSheets.length ? doc.styleSheets[0] : undefined;\n if (!ss) {\n var style = doc.createElement('style');\n doc.head.appendChild(style);\n style.appendChild(doc.createTextNode(''));\n ss = style.sheet;\n }\n\n if (ss) {\n var cssRule = 'body:first-child::before {content:\\'READIUM\\';color: red;font-weight: bold;}';\n if (ss.cssRules) {\n ss.insertRule(cssRule, ss.cssRules.length);\n } else {\n ss.insertRule(cssRule, 0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n try {\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\n el.appendChild(doc.createTextNode(\"*{}\"));\n doc.body.appendChild(el);\n doc.body.removeChild(el);\n\n if (ss) {\n if (ss.cssRules) {\n ss.deleteRule(ss.cssRules.length - 1);\n } else {\n ss.deleteRule(0);\n }\n }\n }\n catch (ex) {\n console.error(ex);\n }\n\n if (doc.body) {\n var val = doc.body.offsetTop; // triggers layout\n }\n\n};\n\n/**\n *\n * @param $viewport\n * @param spineItem\n * @param settings\n * @returns {boolean}\n */\n//Based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 doc\n// Returns falsy and truthy\n// true and false mean that the synthetic-spread or single-page is \"forced\" (to be respected whatever the external conditions)\n// 1 and 0 mean that the synthetic-spread or single-page is \"not forced\" (is allowed to be overriden by external conditions, such as optimum column width / text line number of characters, etc.)\nHelpers.deduceSyntheticSpread = function ($viewport, spineItem, settings) {\n\n if (!$viewport || $viewport.length == 0) {\n return 0; // non-forced\n }\n\n //http://www.idpf.org/epub/fxl/#property-spread-values\n\n var rendition_spread = spineItem ? spineItem.getRenditionSpread() : undefined;\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_NONE) {\n return false; // forced\n\n //\"Reading Systems must not incorporate this spine item in a synthetic spread.\"\n }\n\n if (settings.syntheticSpread == \"double\") {\n return true; // forced\n }\n else if (settings.syntheticSpread == \"single\") {\n return false; // forced\n }\n\n if (!spineItem) {\n return 0; // non-forced\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_BOTH) {\n return true; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread regardless of device orientation.\"\n }\n\n var orientation = Helpers.getOrientation($viewport);\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_LANDSCAPE) {\n return orientation === Globals.Views.ORIENTATION_LANDSCAPE; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in landscape orientation.\"\n }\n\n if (rendition_spread === SpineItem.RENDITION_SPREAD_PORTRAIT) {\n return orientation === Globals.Views.ORIENTATION_PORTRAIT; // forced\n\n //\"Reading Systems should incorporate this spine item in a synthetic spread only when the device is in portrait orientation.\"\n }\n\n if (!rendition_spread || rendition_spread === SpineItem.RENDITION_SPREAD_AUTO) {\n // if no spread set in document and user didn't set in in setting we will do double for landscape\n var landscape = orientation === Globals.Views.ORIENTATION_LANDSCAPE;\n return landscape ? 1 : 0; // non-forced\n\n //\"Reading Systems may use synthetic spreads in specific or all device orientations as part of a display area utilization optimization process.\"\n }\n\n console.warn(\"Helpers.deduceSyntheticSpread: spread properties?!\");\n return 0; // non-forced\n};\n\n/**\n *\n * @param $element\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.fromElement = function ($element) {\n return new this($element.margin(), $element.border(), $element.padding());\n};\n\n/**\n * @returns {Helpers.Rect}\n */\nHelpers.Margins.empty = function () {\n\n return new this({left: 0, right: 0, top: 0, bottom: 0}, {left: 0, right: 0, top: 0, bottom: 0}, {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n });\n\n};\n\n/**\n *\n * @param name\n * @param params\n * @returns {Helpers.loadTemplate.cache}\n */\nHelpers.loadTemplate = function (name, params) {\n return Helpers.loadTemplate.cache[name];\n};\n\n/**\n *\n * @type {{fixed_book_frame: string, single_page_frame: string, scrolled_book_frame: string, reflowable_book_frame: string, reflowable_book_page_frame: string}}\n */\nHelpers.loadTemplate.cache = {\n \"fixed_book_frame\": '
',\n \"single_page_frame\": '
',\n //\"single_page_frame\" : '
',\n\n \"scrolled_book_frame\": '
',\n \"reflowable_book_frame\": '
',\n \"reflowable_book_page_frame\": '
'\n /***\n * The `enable-annotation` attribute on an iframe helps detect the content frames for annotating tools such as Hypothesis\n * See here for more details:\n * https://h.readthedocs.io/projects/client/en/latest/publishers/embedding/\n * https://github.com/hypothesis/client/pull/533\n ***/\n};\n\n/**\n *\n * @param styles\n * @param $element\n */\nHelpers.setStyles = function (styles, $element) {\n\n var count = styles.length;\n\n if (!count) {\n return;\n }\n\n var stylingGlobal = \"\";\n var stylings = [];\n var elementIsDocument = ($element && $element.createTextNode) ? true : false;\n\n for (var i = 0; i < count; i++) {\n var style = styles[i];\n\n if (elementIsDocument) {\n if (!style.selector || style.selector == \"\" || style.selector == \"html\" || style.selector == \"body\" || style.selector == \"*\") {\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n\n stylingGlobal += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n } else {\n //$(style.selector, $($element.doumentElement)).css(style.declarations);\n\n var cssProperties = \"\";\n\n for (var prop in style.declarations) {\n if (style.declarations.hasOwnProperty(prop)) {\n // backgroundColor => background-color\n var prop_ = prop.replace(/[A-Z]/g, function(a) {return '-' + a.toLowerCase()});\n cssProperties += prop_ + \": \" + style.declarations[prop] + \" !important; \";\n }\n }\n\n stylings.push({selector: style.selector, cssProps: cssProperties});\n }\n \n } else { // HTML element\n if (style.selector) {\n $(style.selector, $element).css(style.declarations);\n }\n else {\n $element.css(style.declarations);\n }\n }\n }\n\n if (elementIsDocument) { // HTML document\n\n var doc = $element;\n\n var bookStyleElement = $(\"style#readium-bookStyles\", doc.head);\n\n if (bookStyleElement && bookStyleElement[0]) {\n // we remove before re-adding from scratch\n doc.head.removeChild(bookStyleElement[0]);\n }\n \n var cssStylesheet = \"\";\n\n if (stylingGlobal.length > 0) {\n cssStylesheet += ' body, body::after, body::before, body *, body *::after, body *::before { ' + stylingGlobal + ' } ';\n }\n\n if (stylings.length > 0) {\n for (var i = 0; i < stylings.length; i++) {\n var styling = stylings[i];\n\n cssStylesheet += ' ' + styling.selector + ' { ' + styling.cssProps + ' } ';\n }\n }\n\n if (cssStylesheet.length > 0) {\n\n var styleElement = doc.createElement('style');\n styleElement.setAttribute(\"id\", \"readium-bookStyles\");\n styleElement.appendChild(doc.createTextNode(cssStylesheet));\n\n doc.head.appendChild(styleElement);\n\n //bookStyleElement = $(styleElement);\n }\n }\n};\n\n/**\n *\n * @param iframe\n * @returns {boolean}\n */\nHelpers.isIframeAlive = function (iframe) {\n var w = undefined;\n var d = undefined;\n try {\n w = iframe.contentWindow;\n d = iframe.contentDocument;\n }\n catch (ex) {\n console.error(ex);\n return false;\n }\n\n return w && d;\n};\n\n/**\n *\n * @param $viewport\n * @returns {Globals.Views.ORIENTATION_LANDSCAPE|Globals.Views.ORIENTATION_PORTRAIT}\n */\nHelpers.getOrientation = function ($viewport) {\n\n var viewportWidth = $viewport.width();\n var viewportHeight = $viewport.height();\n\n if (!viewportWidth || !viewportHeight) {\n return undefined;\n }\n\n return viewportWidth >= viewportHeight ? Globals.Views.ORIENTATION_LANDSCAPE : Globals.Views.ORIENTATION_PORTRAIT;\n};\n\n/**\n *\n * @param item\n * @param orientation\n * @returns {boolean}\n */\nHelpers.isRenditionSpreadPermittedForItem = function (item, orientation) {\n\n var rendition_spread = item.getRenditionSpread();\n\n return !rendition_spread\n || rendition_spread == SpineItem.RENDITION_SPREAD_BOTH\n || rendition_spread == SpineItem.RENDITION_SPREAD_AUTO\n || (rendition_spread == SpineItem.RENDITION_SPREAD_LANDSCAPE\n && orientation == Globals.Views.ORIENTATION_LANDSCAPE)\n || (rendition_spread == SpineItem.RENDITION_SPREAD_PORTRAIT\n && orientation == Globals.Views.ORIENTATION_PORTRAIT );\n};\n\nHelpers.CSSTransition = function ($el, trans) {\n\n // does not work!\n //$el.css('transition', trans);\n\n var css = {};\n // empty '' prefix FIRST!\n _.each(['', '-webkit-', '-moz-', '-ms-'], function (prefix) {\n css[prefix + 'transition'] = prefix + trans;\n });\n $el.css(css);\n}\n\n//scale, left, top, angle, origin\nHelpers.CSSTransformString = function (options) {\n var enable3D = options.enable3D ? true : false;\n\n var translate, scale, rotation,\n origin = options.origin;\n\n if (options.left || options.top) {\n var left = options.left || 0,\n top = options.top || 0;\n\n translate = enable3D ? (\"translate3D(\" + left + \"px, \" + top + \"px, 0)\") : (\"translate(\" + left + \"px, \" + top + \"px)\");\n }\n if (options.scale) {\n scale = enable3D ? (\"scale3D(\" + options.scale + \", \" + options.scale + \", 0)\") : (\"scale(\" + options.scale + \")\");\n }\n if (options.angle) {\n rotation = enable3D ? (\"rotate3D(0,0,\" + options.angle + \"deg)\") : (\"rotate(\" + options.angle + \"deg)\");\n }\n\n if (!(translate || scale || rotation)) {\n return {};\n }\n\n var transformString = (translate && scale) ? (translate + \" \" + scale) : (translate ? translate : scale); // the order is important!\n if (rotation) {\n transformString = transformString + \" \" + rotation;\n //transformString = rotation + \" \" + transformString;\n }\n\n var css = {};\n css['transform'] = transformString;\n css['transform-origin'] = origin ? origin : (enable3D ? '0 0 0' : '0 0');\n return css;\n};\n\nHelpers.extendedThrottle = function (startCb, tickCb, endCb, tickRate, waitThreshold, context) {\n if (!tickRate) tickRate = 250;\n if (!waitThreshold) waitThreshold = tickRate;\n\n var first = true,\n last,\n deferTimer;\n\n return function () {\n var ctx = context || this,\n now = (Date.now && Date.now()) || new Date().getTime(),\n args = arguments;\n\n if (!(last && now < last + tickRate)) {\n last = now;\n if (first) {\n startCb.apply(ctx, args);\n first = false;\n } else {\n tickCb.apply(ctx, args);\n }\n }\n\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n first = true;\n endCb.apply(ctx, args);\n }, waitThreshold);\n };\n};\n\n\n//TODO: consider using CSSOM escape() or polyfill\n//https://github.com/mathiasbynens/CSS.escape/blob/master/css.escape.js\n//http://mathiasbynens.be/notes/css-escapes\n/**\n *\n * @param sel\n * @returns {string}\n */\nHelpers.escapeJQuerySelector = function (sel) {\n //http://api.jquery.com/category/selectors/\n //!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~\n // double backslash escape\n\n if (!sel) return undefined;\n\n var selector = sel.replace(/([;&,\\.\\+\\*\\~\\?':\"\\!\\^#$%@\\[\\]\\(\\)<=>\\|\\/\\\\{}`])/g, '\\\\$1');\n\n // if (selector !== sel)\n // {\n // console.debug(\"---- SELECTOR ESCAPED\");\n // console.debug(\"1: \" + sel);\n // console.debug(\"2: \" + selector);\n // }\n // else\n // {\n // console.debug(\"---- SELECTOR OKAY: \" + sel);\n // }\n\n return selector;\n};\n\nHelpers.polyfillCaretRangeFromPoint = function(document) {\n //Derived from css-regions-polyfill:\n // https://github.com/FremyCompany/css-regions-polyfill/blob/bfbb6445ec2a2a883005ab8801d8463fa54b5701/src/range-extensions.js\n //Copyright (c) 2013 François REMY\n //Copyright (c) 2013 Adobe Systems Inc.\n //Licensed under the Apache License, Version 2.0\n if (!document.caretRangeFromPoint) {\n if (document.caretPositionFromPoint) {\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n var r = document.createRange();\n var p = document.caretPositionFromPoint(x, y);\n if (!p) return null;\n if (p.offsetNode) {\n r.setStart(p.offsetNode, p.offset);\n r.setEnd(p.offsetNode, p.offset);\n }\n return r;\n }\n } else if ((document.body || document.createElement('body')).createTextRange) {\n //\n // we may want to convert TextRange to Range\n //\n\n //TextRangeUtils, taken from: https://code.google.com/p/ierange/\n //Copyright (c) 2009 Tim Cameron Ryan\n //Released under the MIT/X License\n var TextRangeUtils = {\n convertToDOMRange: function(textRange, document) {\n var adoptBoundary = function(domRange, textRangeInner, bStart) {\n // iterate backwards through parent element to find anchor location\n var cursorNode = document.createElement('a'),\n cursor = textRangeInner.duplicate();\n cursor.collapse(bStart);\n var parent = cursor.parentElement();\n do {\n parent.insertBefore(cursorNode, cursorNode.previousSibling);\n cursor.moveToElementText(cursorNode);\n } while (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) > 0 && cursorNode.previousSibling);\n // when we exceed or meet the cursor, we've found the node\n if (cursor.compareEndPoints(bStart ? 'StartToStart' : 'StartToEnd', textRangeInner) == -1 && cursorNode.nextSibling) {\n // data node\n cursor.setEndPoint(bStart ? 'EndToStart' : 'EndToEnd', textRangeInner);\n domRange[bStart ? 'setStart' : 'setEnd'](cursorNode.nextSibling, cursor.text.length);\n } else {\n // element\n domRange[bStart ? 'setStartBefore' : 'setEndBefore'](cursorNode);\n }\n cursorNode.parentNode.removeChild(cursorNode);\n };\n // return a DOM range\n var domRange = document.createRange();\n adoptBoundary(domRange, textRange, true);\n adoptBoundary(domRange, textRange, false);\n return domRange;\n }\n };\n\n document.caretRangeFromPoint = function caretRangeFromPoint(x, y) {\n // the accepted number of vertical backtracking, in CSS pixels\n var IYDepth = 40;\n // try to create a text range at the specified location\n var tr = document.body.createTextRange();\n for (var iy = IYDepth; iy; iy = iy - 4) {\n try {\n tr.moveToPoint(x, iy + y - IYDepth);\n return TextRangeUtils.convertToDOMRange(tr, document);\n } catch (ex) {\n }\n }\n // if that fails, return the location just after the element located there\n try {\n var elem = document.elementFromPoint(x - 1, y - 1);\n var r = document.createRange();\n r.setStartAfter(elem);\n return r;\n } catch (ex) {\n return null;\n }\n }\n }\n }\n};\n\nreturn Helpers;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\n/**\n* CFI navigation helper class\n*\n* @param options Additional settings for NavigationLogic object\n* - paginationInfo Layout details, used by clientRect-based geometry\n* - visibleContentOffsets Function that returns offsets. If supplied it is used instead of the inferred offsets\n* - frameDimensions Function that returns an object with width and height properties. Needs to be set.\n* - $iframe Iframe reference, and needs to be set.\n* @constructor\n*/\ndefine('readium_shared_js/views/cfi_navigation_logic',[\"jquery\", \"underscore\", \"../helpers\", 'readium_cfi_js'], function($, _, Helpers, epubCfi) {\n\nvar CfiNavigationLogic = function (options) {\n var self = this;\n options = options || {};\n\n var _DEBUG = ReadiumSDK.DEBUG_MODE;\n if (_DEBUG) {\n window.top._DEBUG_visibleTextRangeOffsetsRuns = window.top._DEBUG_visibleTextRangeOffsetsRuns || [];\n }\n\n this.getRootElement = function () {\n if (!options.$iframe) {\n return null;\n }\n\n return options.$iframe[0].contentDocument.documentElement;\n };\n\n this.getBodyElement = function () {\n var rootDocument = this.getRootDocument();\n if (rootDocument && rootDocument.body) {\n return rootDocument.body;\n } else {\n // In SVG documents the root element can be considered the body.\n return this.getRootElement();\n }\n };\n\n this.getClassBlacklist = function () {\n return options.classBlacklist || [];\n };\n\n this.getIdBlacklist = function () {\n return options.idBlacklist || [];\n };\n\n this.getElementBlacklist = function () {\n return options.elementBlacklist || [];\n };\n\n this.getRootDocument = function () {\n if (!options.$iframe) {\n return null;\n }\n\n return options.$iframe[0].contentDocument;\n };\n\n function createRange() {\n return self.getRootDocument().createRange();\n }\n\n function createRangeFromNode(textnode) {\n var documentRange = createRange();\n documentRange.selectNodeContents(textnode);\n return documentRange;\n }\n\n function getNodeClientRect(node) {\n var range = createRange();\n range.selectNode(node);\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n\n function getNodeContentsClientRect(node) {\n var range = createRange();\n range.selectNodeContents(node);\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n\n function getNodeRangeClientRect(startNode, startOffset, endNode, endOffset) {\n var range = createRange();\n range.setStart(startNode, startOffset ? startOffset : 0);\n if (endNode.nodeType === Node.ELEMENT_NODE) {\n range.setEnd(endNode, endOffset ? endOffset : endNode.childNodes.length);\n } else if (endNode.nodeType === Node.TEXT_NODE) {\n range.setEnd(endNode, endOffset ? endOffset : 0);\n }\n\n // Webkit has a bug where collapsed ranges provide an empty rect with getBoundingClientRect()\n // https://bugs.webkit.org/show_bug.cgi?id=138949\n // Thankfully it implements getClientRects() properly...\n // A collapsed text range may still have geometry!\n if (range.collapsed) {\n return normalizeRectangle(range.getClientRects()[0], 0, 0);\n } else {\n return normalizeRectangle(range.getBoundingClientRect(), 0, 0);\n }\n }\n\n function getNodeClientRectList(node, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n var range = createRange();\n range.selectNode(node);\n return getRangeClientRectList(range, visibleContentOffsets);\n }\n\n function getRangeClientRectList(range, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n //noinspection JSUnresolvedFunction\n\n return _.map(range.getClientRects(), function (rect) {\n\n return normalizeRectangle(rect, visibleContentOffsets.left, visibleContentOffsets.top);\n });\n }\n\n function getFrameDimensions() {\n if (options.frameDimensionsGetter) {\n return options.frameDimensionsGetter();\n }\n\n console.error('CfiNavigationLogic: No frame dimensions specified!');\n return null;\n }\n\n function getCaretRangeFromPoint(x, y, document) {\n document = document || self.getRootDocument();\n Helpers.polyfillCaretRangeFromPoint(document); //only polyfills once, no-op afterwards\n return document.caretRangeFromPoint(x, y);\n }\n\n function isPaginatedView() {\n return !!options.paginationInfo;\n }\n\n /**\n * @private\n * Checks whether or not pages are rendered right-to-left\n *\n * @returns {boolean}\n */\n function isPageProgressionRightToLeft() {\n return options.paginationInfo && !!options.paginationInfo.rightToLeft;\n }\n\n /**\n * @private\n * Checks whether or not pages are rendered with vertical writing mode\n *\n * @returns {boolean}\n */\n function isVerticalWritingMode() {\n return options.paginationInfo && !!options.paginationInfo.isVerticalWritingMode;\n }\n\n\n /**\n * @private\n * Checks whether or not a (fully adjusted) rectangle is visible\n *\n * @param {Object} rect\n * @param {boolean} [ignorePartiallyVisible]\n * @param {Object} [frameDimensions]\n * @returns {boolean}\n */\n function isRectVisible(rect, ignorePartiallyVisible, frameDimensions) {\n\n frameDimensions = frameDimensions || getFrameDimensions();\n\n //Text nodes without printable text dont have client rectangles\n if (!rect) {\n return false;\n }\n //Sometimes we get client rects that are \"empty\" and aren't supposed to be visible\n if (rect.left == 0 && rect.right == 0 && rect.top == 0 && rect.bottom == 0) {\n return false;\n }\n\n if (isPaginatedView() && !isVerticalWritingMode()) {\n return (rect.left >= 0 && rect.left < frameDimensions.width) ||\n (!ignorePartiallyVisible && rect.left < 0 && rect.right > 0);\n } else {\n return (rect.top >= 0 && rect.top < frameDimensions.height) ||\n (!ignorePartiallyVisible && rect.top < 0 && rect.bottom > 0);\n }\n\n }\n\n /**\n * @private\n * Retrieves _current_ full width of a column (including its gap)\n *\n * @returns {number} Full width of a column in pixels\n */\n function getColumnFullWidth() {\n\n if (!options.paginationInfo || isVerticalWritingMode()) {\n return options.$iframe.width();\n }\n\n return options.paginationInfo.columnWidth + options.paginationInfo.columnGap;\n }\n\n /**\n * @private\n *\n * Retrieves _current_ offset of a viewport\n * (relational to the beginning of the chapter)\n *\n * @returns {Object}\n */\n function getVisibleContentOffsets() {\n if (options.visibleContentOffsetsGetter) {\n return options.visibleContentOffsetsGetter();\n }\n\n if (isVerticalWritingMode() && options.paginationOffsetsGetter) {\n return options.paginationOffsetsGetter();\n }\n\n return {\n top: 0,\n left: 0\n };\n }\n\n function getPaginationOffsets() {\n if (options.paginationOffsetsGetter) {\n return options.paginationOffsetsGetter();\n }\n\n return {\n top: 0,\n left: 0\n };\n }\n\n /**\n * New (rectangle-based) algorithm, useful in multi-column layouts\n *\n * Note: the second param (props) is ignored intentionally\n * (no need to use those in normalization)\n *\n * @param {jQuery} $element\n * @param {boolean} shouldCalculateVisibilityPercentage\n * @param {Object} [visibleContentOffsets]\n * @param {Object} [frameDimensions]\n * @returns {number|null}\n * 0 for non-visible elements,\n * 0 < n <= 100 for visible elements\n * (will just give 100, if `shouldCalculateVisibilityPercentage` => false)\n * null for elements with display:none\n */\n function checkVisibilityByRectangles($element, shouldCalculateVisibilityPercentage, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var clientRectangles = getNormalizedRectangles($element, visibleContentOffsets);\n if (clientRectangles.length === 0) { // elements with display:none, etc.\n return null;\n }\n\n var visibilityPercentage = 0;\n\n if (clientRectangles.length === 1) {\n var adjustedRect = clientRectangles[0];\n\n if (isPaginatedView()) {\n if (adjustedRect.bottom > frameDimensions.height || adjustedRect.top < 0) {\n // because of webkit inconsistency, that single rectangle should be adjusted\n // until it hits the end OR will be based on the FIRST column that is visible\n adjustRectangle(adjustedRect, true, frameDimensions);\n }\n }\n\n if (isRectVisible(adjustedRect, false, frameDimensions)) {\n if (shouldCalculateVisibilityPercentage && adjustedRect.top < 0) {\n visibilityPercentage =\n Math.floor(100 * (adjustedRect.height + adjustedRect.top) / adjustedRect.height);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.bottom > frameDimensions.height) {\n visibilityPercentage =\n Math.floor(100 * (frameDimensions.height - adjustedRect.top) / adjustedRect.height);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.left < 0 && adjustedRect.right > 0) {\n visibilityPercentage =\n Math.floor(100 * adjustedRect.right / adjustedRect.width);\n } else if (shouldCalculateVisibilityPercentage && adjustedRect.left < 0 && adjustedRect.right > 0) {\n visibilityPercentage =\n Math.floor(100 * adjustedRect.right / adjustedRect.width);\n } else {\n visibilityPercentage = 100;\n }\n }\n } else {\n // for an element split between several CSS columns,z\n // both Firefox and IE produce as many client rectangles;\n // each of those should be checked\n for (var i = 0, l = clientRectangles.length; i < l; ++i) {\n if (isRectVisible(clientRectangles[i], false, frameDimensions)) {\n visibilityPercentage = shouldCalculateVisibilityPercentage\n ? measureVisibilityPercentageByRectangles(clientRectangles, i)\n : 100;\n break;\n }\n }\n }\n\n return visibilityPercentage;\n }\n\n /**\n * Finds a page index (0-based) delta for a specific element.\n * Calculations are based on rectangles retrieved with getClientRects() method.\n *\n * @param {jQuery} $element\n * @returns {number|null}\n */\n function findPageIndexDeltaByRectangles($element) {\n\n var visibleContentOffsets = getVisibleContentOffsets();\n\n var clientRectangles = getNormalizedRectangles($element, visibleContentOffsets);\n if (clientRectangles.length === 0) { // elements with display:none, etc.\n return null;\n }\n\n return calculatePageIndexDeltaByRectangles(clientRectangles);\n }\n\n /**\n * @private\n * Calculate a page index (0-based) delta for given client rectangles.\n *\n * @param {object[]} clientRectangles\n * @param {object} [frameDimensions]\n * @param {number} [columnFullWidth]\n * @returns {number|null}\n */\n function calculatePageIndexDeltaByRectangles(clientRectangles, frameDimensions, columnFullWidth) {\n var isRtl = isPageProgressionRightToLeft();\n var isVwm = isVerticalWritingMode();\n columnFullWidth = columnFullWidth || getColumnFullWidth();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var firstRectangle = _.first(clientRectangles);\n if (clientRectangles.length === 1) {\n adjustRectangle(firstRectangle, false, frameDimensions, columnFullWidth, isRtl, isVwm);\n }\n\n var pageIndex;\n\n if (isVwm) {\n var topOffset = firstRectangle.top;\n pageIndex = Math.round(topOffset / frameDimensions.height);\n } else {\n var leftOffset = firstRectangle.left;\n if (isRtl) {\n leftOffset = (columnFullWidth * (options.paginationInfo ? options.paginationInfo.visibleColumnCount : 1)) - leftOffset;\n }\n pageIndex = Math.round(leftOffset / columnFullWidth);\n }\n\n return pageIndex;\n }\n\n /**\n * Finds a page index (0-based) delta for a specific client rectangle.\n * Calculations are based on viewport dimensions, offsets, and rectangle coordinates\n *\n * @param {ClientRect} clientRectangle\n * @param {Object} [visibleContentOffsets]\n * @param {Object} [frameDimensions]\n * @returns {number|null}\n */\n function findPageIndexDeltaBySingleRectangle(clientRectangle, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n frameDimensions = frameDimensions || getFrameDimensions();\n\n var normalizedRectangle = normalizeRectangle(\n clientRectangle, visibleContentOffsets.left, visibleContentOffsets.top);\n\n return calculatePageIndexDeltaByRectangles([normalizedRectangle], frameDimensions);\n }\n\n /**\n * @private\n * Calculates the visibility offset percentage based on ClientRect dimensions\n *\n * @param {Array} clientRectangles (should already be normalized)\n * @param {number} firstVisibleRectIndex\n * @returns {number} - visibility percentage (0 < n <= 100)\n */\n function measureVisibilityPercentageByRectangles(clientRectangles, firstVisibleRectIndex) {\n\n var heightTotal = 0;\n var heightVisible = 0;\n\n if (clientRectangles.length > 1) {\n _.each(clientRectangles, function (rect, index) {\n heightTotal += rect.height;\n if (index >= firstVisibleRectIndex) {\n // in this case, all the rectangles after the first visible\n // should be counted as visible\n heightVisible += rect.height;\n }\n });\n }\n else {\n // should already be normalized and adjusted\n heightTotal = clientRectangles[0].height;\n heightVisible = clientRectangles[0].height - Math.max(\n 0, -clientRectangles[0].top);\n }\n return heightVisible === heightTotal\n ? 100 // trivial case: element is 100% visible\n : Math.floor(100 * heightVisible / heightTotal);\n }\n\n /**\n * @private\n * Retrieves the position of $element in multi-column layout\n *\n * @param {jQuery} $el\n * @param {Object} [visibleContentOffsets]\n * @returns {Object[]}\n */\n function getNormalizedRectangles($el, visibleContentOffsets) {\n\n visibleContentOffsets = visibleContentOffsets || {};\n var leftOffset = visibleContentOffsets.left || 0;\n var topOffset = visibleContentOffsets.top || 0;\n\n var isTextNode = ($el[0].nodeType === Node.TEXT_NODE);\n var clientRectList;\n\n if (isTextNode) {\n var range = createRange();\n range.selectNode($el[0]);\n //noinspection JSUnresolvedFunction\n clientRectList = range.getClientRects();\n } else {\n //noinspection JSUnresolvedFunction\n clientRectList = $el[0].getClientRects();\n }\n\n // all the separate rectangles (for detecting position of the element\n // split between several columns)\n var clientRectangles = [];\n for (var i = 0, l = clientRectList.length; i < l; ++i) {\n if (clientRectList[i].height > 0 || clientRectList.length === 1) {\n // Firefox sometimes gets it wrong,\n // adding literally empty (height = 0) client rectangle preceding the real one,\n // that empty client rectanle shouldn't be retrieved\n clientRectangles.push(\n normalizeRectangle(clientRectList[i], leftOffset, topOffset));\n }\n }\n\n return clientRectangles;\n }\n\n function getNormalizedBoundingRect($el, visibleContentOffsets) {\n visibleContentOffsets = visibleContentOffsets || {};\n var leftOffset = visibleContentOffsets.left || 0;\n var topOffset = visibleContentOffsets.top || 0;\n\n var isTextNode = ($el[0].nodeType === Node.TEXT_NODE);\n var boundingClientRect;\n\n if (isTextNode) {\n var range = createRange();\n range.selectNode($el[0]);\n boundingClientRect = range.getBoundingClientRect();\n } else {\n boundingClientRect = $el[0].getBoundingClientRect();\n }\n\n // union of all rectangles wrapping the element\n return normalizeRectangle(boundingClientRect, leftOffset, topOffset);\n }\n\n /**\n * @private\n * Converts TextRectangle object into a plain object,\n * taking content offsets (=scrolls, position shifts etc.) into account\n *\n * @param {Object} textRect\n * @param {number} leftOffset\n * @param {number} topOffset\n * @returns {Object}\n */\n function normalizeRectangle(textRect, leftOffset, topOffset) {\n\n var plainRectObject = {\n left: textRect.left,\n right: textRect.right,\n top: textRect.top,\n bottom: textRect.bottom,\n width: textRect.right - textRect.left,\n height: textRect.bottom - textRect.top\n };\n leftOffset = leftOffset || 0;\n topOffset = topOffset || 0;\n offsetRectangle(plainRectObject, leftOffset, topOffset);\n return plainRectObject;\n }\n\n /**\n * @private\n * Offsets plain object (which represents a TextRectangle).\n *\n * @param {Object} rect\n * @param {number} leftOffset\n * @param {number} topOffset\n */\n function offsetRectangle(rect, leftOffset, topOffset) {\n\n rect.left += leftOffset;\n rect.right += leftOffset;\n rect.top += topOffset;\n rect.bottom += topOffset;\n }\n\n /**\n * @private\n *\n * When element is spilled over two or more columns,\n * most of the time Webkit-based browsers\n * still assign a single clientRectangle to it, setting its `top` property to negative value\n * (so it looks like it's rendered based on the second column)\n * Alas, sometimes they decide to continue the leftmost column - from _below_ its real height.\n * In this case, `bottom` property is actually greater than element's height and had to be adjusted accordingly.\n *\n * Ugh.\n *\n * @param {Object} rect\n * @param {boolean} [shouldLookForFirstVisibleColumn]\n * If set, there'll be two-phase adjustment\n * (to align a rectangle with a viewport)\n * @param {Object} [frameDimensions]\n * @param {number} [columnFullWidth]\n * @param {boolean} [isRtl]\n * @param {boolean} [isVwm] isVerticalWritingMode\n */\n function adjustRectangle(rect, shouldLookForFirstVisibleColumn, frameDimensions, columnFullWidth, isRtl, isVwm) {\n\n frameDimensions = frameDimensions || getFrameDimensions();\n columnFullWidth = columnFullWidth || getColumnFullWidth();\n isRtl = isRtl || isPageProgressionRightToLeft();\n isVwm = isVwm || isVerticalWritingMode();\n\n // Rectangle adjustment is not needed in VWM since it does not deal with columns\n if (isVwm) {\n return;\n }\n\n if (isRtl) {\n columnFullWidth *= -1; // horizontal shifts are reverted in RTL mode\n }\n\n // first we go left/right (rebasing onto the very first column available)\n while (rect.top < 0) {\n offsetRectangle(rect, -columnFullWidth, frameDimensions.height);\n }\n\n // ... then, if necessary (for visibility offset checks),\n // each column is tried again (now in reverse order)\n // the loop will be stopped when the column is aligned with a viewport\n // (i.e., is the first visible one).\n if (shouldLookForFirstVisibleColumn) {\n while (rect.bottom >= frameDimensions.height) {\n if (isRectVisible(rect, false, frameDimensions)) {\n break;\n }\n offsetRectangle(rect, columnFullWidth, -frameDimensions.height);\n }\n }\n }\n\n this.getCfiForElement = function (element) {\n\n var cfi = EPUBcfi.Generator.generateElementCFIComponent(element,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (cfi[0] == \"!\") {\n cfi = cfi.substring(1);\n }\n return cfi;\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint) {\n var document = self.getRootDocument();\n var firstVisibleCaretRange = getCaretRangeFromPoint(x, y, document);\n var elementFromPoint = document.elementFromPoint(x, y);\n var invalidElementFromPoint = !elementFromPoint || elementFromPoint === document.documentElement;\n\n if (precisePoint) {\n if (!elementFromPoint || invalidElementFromPoint) {\n return null;\n }\n var testRect = getNodeContentsClientRect(elementFromPoint);\n if (!isRectVisible(testRect, false)) {\n return null;\n }\n if ((x < testRect.left || x > testRect.right) || (y < testRect.top || y > testRect.bottom)) {\n return null;\n }\n }\n\n if (!firstVisibleCaretRange) {\n if (invalidElementFromPoint) {\n console.error(\"Could not generate CFI no visible element on page\");\n return null;\n }\n firstVisibleCaretRange = createRange();\n firstVisibleCaretRange.selectNode(elementFromPoint);\n }\n\n var range = firstVisibleCaretRange;\n var cfi;\n //if we get a text node we need to get an approximate range for the first visible character offsets.\n var node = range.startContainer;\n var startOffset, endOffset;\n if (node.nodeType === Node.TEXT_NODE) {\n if (precisePoint && node.parentNode !== elementFromPoint) {\n return null;\n }\n if (node.length === 1 && range.startOffset === 1) {\n startOffset = 0;\n endOffset = 1;\n } else if (range.startOffset === node.length) {\n startOffset = range.startOffset - 1;\n endOffset = range.startOffset;\n } else {\n startOffset = range.startOffset;\n endOffset = range.startOffset + 1;\n }\n var wrappedRange = {\n startContainer: node,\n endContainer: node,\n startOffset: startOffset,\n endOffset: endOffset,\n commonAncestorContainer: range.commonAncestorContainer\n };\n\n if (_DEBUG) {\n drawDebugOverlayFromDomRange(wrappedRange);\n }\n\n cfi = generateCfiFromDomRange(wrappedRange);\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n node =\n range.startContainer.childNodes[range.startOffset] ||\n range.startContainer.childNodes[0] ||\n range.startContainer;\n if (precisePoint && node !== elementFromPoint) {\n return null;\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n cfi = generateCfiFromDomRange(range);\n } else {\n cfi = self.getCfiForElement(node);\n }\n } else {\n if (precisePoint && node !== elementFromPoint) {\n return null;\n }\n\n cfi = self.getCfiForElement(elementFromPoint);\n }\n\n //This should not happen but if it does print some output, just in case\n if (cfi && cfi.indexOf('NaN') !== -1) {\n console.log('Did not generate a valid CFI:' + cfi);\n return undefined;\n }\n return cfi;\n };\n\n this.getRangeCfiFromPoints = function (startX, startY, endX, endY) {\n var document = self.getRootDocument();\n var start = getCaretRangeFromPoint(startX, startY, document),\n end = getCaretRangeFromPoint(endX, endY, document),\n range = createRange();\n range.setStart(start.startContainer, start.startOffset);\n range.setEnd(end.startContainer, end.startOffset);\n // if we're looking at a text node create a nice range (n, n+1)\n if (start.startContainer === start.endContainer && start.startContainer.nodeType === Node.TEXT_NODE && end.startContainer.length > end.startOffset + 1) {\n range.setEnd(end.startContainer, end.startOffset + 1);\n }\n return generateCfiFromDomRange(range);\n };\n\n function determineSplit(range, division) {\n var percent = division / 100;\n return Math.round((range.endOffset - range.startOffset ) * percent);\n }\n\n function splitRange(range, division) {\n if (range.endOffset - range.startOffset === 1) {\n return [range];\n }\n var length = determineSplit(range, division);\n var textNode = range.startContainer;\n var leftNodeRange = range.cloneRange();\n leftNodeRange.setStart(textNode, range.startOffset);\n leftNodeRange.setEnd(textNode, range.startOffset + length);\n var rightNodeRange = range.cloneRange();\n rightNodeRange.setStart(textNode, range.startOffset + length);\n rightNodeRange.setEnd(textNode, range.endOffset);\n\n return [leftNodeRange, rightNodeRange];\n\n }\n\n // create Range from target node and search for visibleOutput Range\n function getVisibleTextRangeOffsets(textNode, pickerFunc, visibleContentOffsets, frameDimensions) {\n visibleContentOffsets = visibleContentOffsets || getVisibleContentOffsets();\n\n var nodeRange = createRangeFromNode(textNode);\n var nodeClientRects = getRangeClientRectList(nodeRange, visibleContentOffsets);\n var splitRatio = deterministicSplit(nodeClientRects, pickerFunc([0, 1]));\n return getTextRangeOffset(splitRange(nodeRange, splitRatio), visibleContentOffsets,\n pickerFunc([0, 1]), splitRatio,\n function (rect) {\n return (isVerticalWritingMode() ? rect.height : rect.width) && isRectVisible(rect, false, frameDimensions);\n });\n }\n\n function deterministicSplit(rectList, directionBit) {\n var split = 0;\n // Calculate total cumulative Height for both visible portions and invisible portions and find the split\n var visibleRects = _.filter(rectList, function (rect) {\n return (isVerticalWritingMode() ? rect.height : rect.width) && isRectVisible(rect, false, getFrameDimensions());\n });\n var visibleRectHeight = calculateCumulativeHeight(visibleRects);\n var invisibleRectHeight = totalHeight - visibleRectHeight;\n var totalHeight = calculateCumulativeHeight(rectList);\n\n if (visibleRectHeight === totalHeight) {\n // either all visible or split\n // heuristic: slight bias to increase likelihood of hits\n return directionBit ? 55 : 45;\n } else {\n split = 100 * (visibleRectHeight / totalHeight);\n return invisibleRectHeight > visibleRectHeight ? split + 5 : split - 5;\n }\n }\n\n function rectTopHash (rectList) {\n // sort the rectangles by top value\n var sortedList = rectList.sort(function (a, b) {\n return a.top < b.top;\n });\n var lineMap = [];\n _.each(sortedList, function (rect) {\n var key = rect.top;\n if (!lineMap[key]) {\n lineMap[key] = [rect.height];\n } else {\n var currentLine = lineMap[key];\n currentLine.push(rect.height);\n lineMap[key] = currentLine;\n }\n });\n }\n\n function calculateCumulativeHeight (rectList) {\n var lineMap = rectTopHash(rectList);\n var height = 0;\n _.each(lineMap, function (line) {\n height = height + Math.max.apply(null, line);\n });\n return height;\n }\n\n function getTextRangeOffset(startingSet, visibleContentOffsets, directionBit, splitRatio, filterFunc) {\n var runCount = 0;\n var currRange = startingSet;\n //begin iterative binary search, each iteration will check Range length and visibility\n while (currRange.length !== 1) {\n runCount++;\n var currTextNodeFragments = getRangeClientRectList(currRange[directionBit], visibleContentOffsets);\n if (hasVisibleFragments(currTextNodeFragments, filterFunc)) {\n currRange = splitRange(currRange[directionBit], splitRatio);\n }\n // No visible fragment Look in other half\n else {\n currRange = splitRange(currRange[directionBit ? 0 : 1], splitRatio);\n }\n }\n if (_DEBUG) {\n console.debug('getVisibleTextRangeOffsets:getTextRangeOffset:runCount', runCount);\n window.top._DEBUG_visibleTextRangeOffsetsRuns.push(runCount);\n }\n var resultRange = currRange[0];\n if (resultRange) {\n resultRange.collapse(!directionBit);\n }\n return resultRange;\n }\n\n function hasVisibleFragments(fragments, filterFunc) {\n var visibleFragments = _.filter(fragments, filterFunc);\n return !!visibleFragments.length;\n }\n\n function findVisibleLeafNodeCfi(visibleLeafNode, pickerFunc, visibleContentOffsets, frameDimensions) {\n if (!visibleLeafNode) {\n return null;\n }\n\n var element = visibleLeafNode.element;\n var textNode = visibleLeafNode.textNode;\n\n //if a valid text node is found, try to generate a CFI with range offsets\n if (textNode && isValidTextNode(textNode)) {\n var visibleRange = getVisibleTextRangeOffsets(textNode, pickerFunc, visibleContentOffsets, frameDimensions);\n if (!visibleRange) {\n if (_DEBUG) console.warn(\"findVisibleLeafNodeCfi: failed to find text range offset\");\n return null;\n }\n return generateCfiFromDomRange(visibleRange);\n } else {\n //if not then generate a CFI for the element\n return self.getCfiForElement(element);\n }\n }\n\n function getLastVisibleTextRangeCfi(visibleContentOffsets, frameDimensions) {\n var visibleLeafNode = self.findLastVisibleElement(visibleContentOffsets, frameDimensions);\n return findVisibleLeafNodeCfi(visibleLeafNode, _.last, visibleContentOffsets, frameDimensions);\n }\n\n function getFirstVisibleTextRangeCfi(visibleContentOffsets, frameDimensions) {\n var visibleLeafNode = self.findFirstVisibleElement(visibleContentOffsets, frameDimensions);\n return findVisibleLeafNodeCfi(visibleLeafNode, _.first, visibleContentOffsets, frameDimensions);\n }\n\n this.getFirstVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return getFirstVisibleTextRangeCfi(visibleContentOffsets, frameDimensions);\n };\n\n this.getLastVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return getLastVisibleTextRangeCfi(visibleContentOffsets, frameDimensions);\n };\n\n function generateCfiFromDomRange(range) {\n if (range.collapsed && range.startContainer.nodeType === Node.TEXT_NODE) {\n return EPUBcfi.generateCharacterOffsetCFIComponent(\n range.startContainer, range.startOffset,\n ['cfi-marker'], [], [\"MathJax_Message\", \"MathJax_SVG_Hidden\"]);\n } else if (range.collapsed) {\n return self.getCfiForElement(range.startContainer);\n } else {\n return EPUBcfi.generateRangeComponent(\n range.startContainer, range.startOffset,\n range.endContainer, range.endOffset,\n self.getClassBlacklist(), self.getElementBlacklist(), self.getIdBlacklist());\n }\n }\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var range = createRange();\n\n if (!rangeCfi2) {\n if (self.isRangeCfi(rangeCfi)) {\n var rangeInfo = self.getNodeRangeInfoFromCfi(rangeCfi);\n range.setStart(rangeInfo.startInfo.node, rangeInfo.startInfo.offset);\n range.setEnd(rangeInfo.endInfo.node, rangeInfo.endInfo.offset);\n } else {\n var element = self.getElementByCfi(rangeCfi,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.selectNode(element);\n }\n } else {\n if (self.isRangeCfi(rangeCfi)) {\n var rangeInfo1 = self.getNodeRangeInfoFromCfi(rangeCfi);\n range.setStart(rangeInfo1.startInfo.node, rangeInfo1.startInfo.offset);\n } else {\n var startElement = self.getElementByCfi(rangeCfi,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.setStart(startElement, 0);\n }\n\n if (self.isRangeCfi(rangeCfi2)) {\n var rangeInfo2 = self.getNodeRangeInfoFromCfi(rangeCfi2);\n if (inclusive) {\n range.setEnd(rangeInfo2.endInfo.node, rangeInfo2.endInfo.offset);\n } else {\n range.setEnd(rangeInfo2.startInfo.node, rangeInfo2.startInfo.offset);\n }\n } else {\n var endElement = self.getElementByCfi(rangeCfi2,\n this.getClassBlacklist(), this.getElementBlacklist(), this.getIdBlacklist())[0];\n range.setEnd(endElement, endElement.childNodes.length);\n }\n }\n return range;\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n return generateCfiFromDomRange(domRange);\n };\n\n function getWrappedCfi(partialCfi) {\n return \"epubcfi(/99!\" + partialCfi + \")\";\n }\n\n this.isRangeCfi = function (partialCfi) {\n return _isRangeCfi(partialCfi) || _hasTextTerminus(partialCfi);\n };\n\n function _isRangeCfi(partialCfi) {\n return EPUBcfi.Interpreter.isRangeCfi(getWrappedCfi(partialCfi));\n }\n\n function _hasTextTerminus(partialCfi) {\n return EPUBcfi.Interpreter.hasTextTerminus(getWrappedCfi(partialCfi));\n }\n\n this.getPageIndexDeltaForCfi = function (partialCfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n if (this.isRangeCfi(partialCfi)) {\n //if given a range cfi the exact page index needs to be calculated by getting node info from the range cfi\n var nodeRangeInfoFromCfi = this.getNodeRangeInfoFromCfi(partialCfi);\n //the page index is calculated from the node's client rectangle\n return findPageIndexDeltaBySingleRectangle(nodeRangeInfoFromCfi.clientRect);\n }\n\n var $element = getElementByPartialCfi(partialCfi, classBlacklist, elementBlacklist, idBlacklist);\n\n if (!$element) {\n return -1;\n }\n\n return this.getPageIndexDeltaForElement($element);\n };\n\n function getElementByPartialCfi(cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n var contentDoc = self.getRootDocument();\n\n var wrappedCfi = getWrappedCfi(cfi);\n\n try {\n //noinspection JSUnresolvedVariable\n var $element = EPUBcfi.getTargetElement(wrappedCfi, contentDoc, classBlacklist, elementBlacklist, idBlacklist);\n\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!$element || $element.length == 0) {\n console.log(\"Can't find element for CFI: \" + cfi);\n return undefined;\n }\n\n return $element;\n }\n\n this.getElementFromPoint = function (x, y) {\n\n var document = self.getRootDocument();\n return document.elementFromPoint(x, y);\n };\n\n this.getNodeRangeInfoFromCfi = function (cfi) {\n var contentDoc = self.getRootDocument();\n\n var wrappedCfi = getWrappedCfi(cfi);\n if (_isRangeCfi(cfi)) {\n\n try {\n //noinspection JSUnresolvedVariable\n var nodeResult = EPUBcfi.Interpreter.getRangeTargetElements(wrappedCfi, contentDoc,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (_DEBUG) {\n console.log(nodeResult);\n }\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!nodeResult) {\n console.log(\"Can't find nodes for range CFI: \" + cfi);\n return undefined;\n }\n\n var startRangeInfo = {node: nodeResult.startElement, offset: nodeResult.startOffset};\n var endRangeInfo = {node: nodeResult.endElement, offset: nodeResult.endOffset};\n var nodeRangeClientRect =\n startRangeInfo && endRangeInfo ?\n getNodeRangeClientRect(\n startRangeInfo.node,\n startRangeInfo.offset,\n endRangeInfo.node,\n endRangeInfo.offset)\n : null;\n\n if (_DEBUG) {\n console.log(nodeRangeClientRect);\n addOverlayRect(nodeRangeClientRect, 'purple', contentDoc);\n }\n\n return {startInfo: startRangeInfo, endInfo: endRangeInfo, clientRect: nodeRangeClientRect};\n } else if (_hasTextTerminus(cfi)) {\n\n try {\n //noinspection JSUnresolvedVariable\n var textTerminusResult = EPUBcfi.Interpreter.getTextTerminusInfo(wrappedCfi, contentDoc,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n if (_DEBUG) {\n console.log(textTerminusResult);\n }\n } catch (ex) {\n //EPUBcfi.Interpreter can throw a SyntaxError\n }\n\n if (!textTerminusResult) {\n console.log(\"Can't find node for text term CFI: \" + cfi);\n return undefined;\n }\n\n var textTermRangeInfo = {node: textTerminusResult.textNode, offset: textTerminusResult.textOffset};\n var textTermClientRect =\n getNodeRangeClientRect(\n textTermRangeInfo.node,\n textTermRangeInfo.offset,\n textTermRangeInfo.node,\n textTermRangeInfo.offset);\n if (_DEBUG) {\n console.log(textTermClientRect);\n addOverlayRect(textTermClientRect, 'purple', contentDoc);\n }\n\n return {startInfo: textTermRangeInfo, endInfo: textTermRangeInfo, clientRect: textTermClientRect};\n } else {\n var $element = self.getElementByCfi(cfi,\n this.getClassBlacklist(),\n this.getElementBlacklist(),\n this.getIdBlacklist());\n\n var visibleContentOffsets = getVisibleContentOffsets();\n return {\n startInfo: null,\n endInfo: null,\n clientRect: getNormalizedBoundingRect($element, visibleContentOffsets)\n };\n }\n };\n\n this.isNodeFromRangeCfiVisible = function (cfi) {\n var nodeRangeInfo = this.getNodeRangeInfoFromCfi(cfi);\n if (nodeRangeInfo) {\n return isRectVisible(nodeRangeInfo.clientRect, false);\n } else {\n return undefined;\n }\n };\n\n this.getNearestCfiFromElement = function (element) {\n var collapseToStart;\n var chosenNode;\n var isTextNode;\n\n var siblingTextNodesAndSelf = _.filter(element.parentNode.childNodes, function (n) {\n return n === element || isValidTextNode(n);\n });\n\n var indexOfSelf = siblingTextNodesAndSelf.indexOf(element);\n var nearestNode = siblingTextNodesAndSelf[indexOfSelf - 1];\n if (!nearestNode) {\n nearestNode = siblingTextNodesAndSelf[indexOfSelf + 1];\n collapseToStart = true;\n }\n if (!nearestNode) {\n nearestNode = _.last(this.getLeafNodeElements($(element.previousElementSibling)));\n if (!nearestNode) {\n collapseToStart = true;\n nearestNode = _.first(this.getLeafNodeElements($(element.nextElementSibling)));\n }\n }\n\n // Prioritize text node use\n if (isValidTextNode(nearestNode)) {\n chosenNode = nearestNode;\n isTextNode = true;\n } else if (isElementNode(nearestNode)) {\n chosenNode = nearestNode;\n } else if (isElementNode(element.previousElementSibling)) {\n chosenNode = element.previousElementSibling;\n } else if (isElementNode(element.nextElementSibling)) {\n chosenNode = element.nextElementSibling;\n } else {\n chosenNode = element.parentNode;\n }\n\n if (isTextNode) {\n var range = chosenNode.ownerDocument.createRange();\n range.selectNodeContents(chosenNode);\n range.collapse(collapseToStart);\n return this.getRangeCfiFromDomRange(range);\n } else {\n return this.getCfiForElement(chosenNode);\n }\n };\n\n this.getElementByCfi = function (partialCfi, classBlacklist, elementBlacklist, idBlacklist) {\n return getElementByPartialCfi(partialCfi, classBlacklist, elementBlacklist, idBlacklist);\n };\n\n this.getPageIndexDeltaForElement = function ($element) {\n\n // first try to get delta by rectangles\n var pageIndex = findPageIndexDeltaByRectangles($element);\n\n // for hidden elements (e.g., page breaks) there are no rectangles\n if (pageIndex === null) {\n\n // get CFI of the nearest (to hidden) element, and then get CFI's element\n var nearestVisibleElement = this.getElementByCfi(this.getNearestCfiFromElement($element[0]));\n\n // find page index by rectangles again, for the nearest element\n return findPageIndexDeltaByRectangles(nearestVisibleElement);\n }\n return pageIndex;\n };\n\n this.getElementById = function (id) {\n\n var contentDoc = this.getRootDocument();\n\n var $element = $(contentDoc.getElementById(id));\n //$(\"#\" + Helpers.escapeJQuerySelector(id), contentDoc);\n\n if ($element.length == 0) {\n return undefined;\n }\n\n return $element;\n };\n\n this.getPageIndexDeltaForElementId = function (id) {\n\n var $element = this.getElementById(id);\n if (!$element) {\n return -1;\n }\n\n return this.getPageIndexDeltaForElement($element);\n };\n\n // returns raw DOM element (not $ jQuery-wrapped)\n this.getFirstVisibleMediaOverlayElement = function (visibleContentOffsets) {\n var $root = $(this.getBodyElement());\n if (!$root || !$root.length || !$root[0]) return undefined;\n\n var that = this;\n\n var firstPartial = undefined;\n\n function traverseArray(arr) {\n if (!arr || !arr.length) return undefined;\n\n for (var i = 0, count = arr.length; i < count; i++) {\n var item = arr[i];\n if (!item) continue;\n\n var $item = $(item);\n\n if ($item.data(\"mediaOverlayData\")) {\n var visible = that.getElementVisibility($item, visibleContentOffsets);\n if (visible) {\n if (!firstPartial) firstPartial = item;\n\n if (visible == 100) return item;\n }\n }\n else {\n var elem = traverseArray(item.children);\n if (elem) return elem;\n }\n }\n\n return undefined;\n }\n\n var el = traverseArray([$root[0]]);\n if (!el) el = firstPartial;\n return el;\n\n // var $elements = this.getMediaOverlayElements($root);\n // return this.getVisibleElements($elements, visibleContentOffsets);\n };\n\n this.getElementVisibility = function ($element, visibleContentOffsets) {\n return checkVisibilityByRectangles($element, true, visibleContentOffsets);\n };\n\n\n this.isElementVisible = this.getElementVisibility;\n\n this.getVisibleElementsWithFilter = function (visibleContentOffsets, filterFunction) {\n var $elements = this.getElementsWithFilter($(this.getBodyElement()), filterFunction);\n return this.getVisibleElements($elements, visibleContentOffsets);\n };\n\n this.getAllElementsWithFilter = function (filterFunction) {\n return this.getElementsWithFilter($(this.getBodyElement()), filterFunction);\n };\n\n this.getAllVisibleElementsWithSelector = function (selector, visibleContentOffset) {\n var elements = $(selector, this.getRootElement());\n var $newElements = [];\n $.each(elements, function () {\n $newElements.push($(this));\n });\n return this.getVisibleElements($newElements, visibleContentOffset);\n };\n\n this.getVisibleElements = function ($elements, visibleContentOffsets, frameDimensions) {\n\n var visibleElements = [];\n\n _.each($elements, function ($node) {\n var isTextNode = ($node[0].nodeType === Node.TEXT_NODE);\n var $element = isTextNode ? $node.parent() : $node;\n var visibilityPercentage = checkVisibilityByRectangles(\n $node, true, visibleContentOffsets, frameDimensions);\n\n if (visibilityPercentage) {\n visibleElements.push({\n element: $element[0], // DOM Element is pushed\n textNode: isTextNode ? $node[0] : null,\n percentVisible: visibilityPercentage\n\n });\n }\n });\n\n return visibleElements;\n };\n\n this.getVisibleLeafNodes = function (visibleContentOffsets, frameDimensions) {\n\n if (_cacheEnabled) {\n var cacheKey = (options.paginationInfo || {}).currentSpreadIndex || 0;\n var fromCache = _cache.visibleLeafNodes.get(cacheKey);\n if (fromCache) {\n return fromCache;\n }\n }\n\n var $elements = this.getLeafNodeElements($(this.getBodyElement()));\n\n var visibleElements = this.getVisibleElements($elements, visibleContentOffsets, frameDimensions);\n if (_cacheEnabled) {\n _cache.visibleLeafNodes.set(cacheKey, visibleElements);\n }\n\n return visibleElements;\n };\n\n function getBaseCfiSelectedByFunc(pickerFunc) {\n var $elements = self.getLeafNodeElements($(self.getBodyElement()));\n var $selectedNode = pickerFunc($elements);\n var collapseToStart = pickerFunc([true, false]);\n var range = createRange();\n range.selectNodeContents($selectedNode[0]);\n range.collapse(collapseToStart);\n return generateCfiFromDomRange(range);\n }\n\n this.getStartCfi = function () {\n return getBaseCfiSelectedByFunc(_.first);\n };\n\n\n this.getEndCfi = function () {\n return getBaseCfiSelectedByFunc(_.last);\n };\n\n this.getElementsWithFilter = function ($root, filterFunction) {\n\n var $elements = [];\n\n function traverseCollection(elements) {\n\n if (elements == undefined) return;\n\n for (var i = 0, count = elements.length; i < count; i++) {\n\n var $element = $(elements[i]);\n\n if (filterFunction($element)) {\n $elements.push($element);\n }\n else {\n traverseCollection($element[0].children);\n }\n\n }\n }\n\n traverseCollection([$root[0]]);\n\n return $elements;\n };\n\n function isElementBlacklisted(element) {\n var classAttribute = element.className;\n // check for SVGAnimatedString\n if (classAttribute && typeof classAttribute.animVal !== \"undefined\") {\n classAttribute = classAttribute.animVal;\n } else if (classAttribute && typeof classAttribute.baseVal !== \"undefined\") {\n classAttribute = classAttribute.baseVal;\n }\n var classList = classAttribute ? classAttribute.split(' ') : [];\n var id = element.id;\n\n var classBlacklist = self.getClassBlacklist();\n if (classList.length === 1 && _.contains(classBlacklist, classList[0])) {\n return true;\n } else if (classList.length && _.intersection(classBlacklist, classList).length) {\n return true;\n }\n\n if (id && id.length && _.contains(self.getIdBlacklist(), id)) {\n return true;\n }\n\n return false;\n }\n\n this.getLeafNodeElements = function ($root) {\n\n if (_cacheEnabled) {\n var fromCache = _cache.leafNodeElements.get($root);\n if (fromCache) {\n return fromCache;\n }\n }\n\n //noinspection JSUnresolvedVariable,JSCheckFunctionSignatures\n var nodeIterator = document.createNodeIterator(\n $root[0],\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function () {\n //noinspection JSUnresolvedVariable\n return NodeFilter.FILTER_ACCEPT;\n },\n false\n );\n\n var $leafNodeElements = [];\n\n var node;\n while ((node = nodeIterator.nextNode())) {\n var isLeafNode = node.nodeType === Node.ELEMENT_NODE && !node.childElementCount && !isValidTextNodeContent(node.textContent);\n if (isLeafNode || isValidTextNode(node)){\n var element = (node.nodeType === Node.TEXT_NODE) ? node.parentNode : node;\n if (!isElementBlacklisted(element)) {\n $leafNodeElements.push($(node));\n }\n }\n }\n\n if (_cacheEnabled) {\n _cache.leafNodeElements.set($root, $leafNodeElements);\n }\n return $leafNodeElements;\n };\n\n function isElementNode(node) {\n if (!node) {\n return false;\n }\n else {\n return node.nodeType === Node.ELEMENT_NODE;\n }\n }\n\n function isValidTextNode(node) {\n if (!node) {\n return false;\n }\n if (node.nodeType === Node.TEXT_NODE) {\n\n return isValidTextNodeContent(node.nodeValue);\n }\n\n return false;\n\n }\n\n function isValidTextNodeContent(text) {\n // Heuristic to find a text node with actual text\n // If we don't do this, we may get a reference to a node that doesn't get rendered\n // (such as for example a node that has tab character and a bunch of spaces)\n // this is would be bad! ask me why.\n return !!text.trim().length;\n }\n\n this.getElements = function (selector) {\n if (!selector) {\n return $(this.getRootElement()).children();\n }\n return $(selector, this.getRootElement());\n };\n\n this.getElement = function (selector) {\n\n var $element = this.getElements(selector);\n\n if ($element.length > 0) {\n return $element;\n }\n\n return undefined;\n };\n\n function Cache() {\n var that = this;\n\n //true = survives invalidation\n var props = {\n leafNodeElements: true,\n visibleLeafNodes: false\n };\n\n _.each(props, function (val, key) {\n that[key] = new Map();\n });\n\n this._invalidate = function () {\n _.each(props, function (val, key) {\n if (!val) {\n that[key] = new Map();\n }\n });\n }\n }\n\n var _cache = new Cache();\n\n var _cacheEnabled = false;\n\n this.invalidateCache = function () {\n _cache._invalidate();\n };\n\n //if (_DEBUG) {\n\n var $debugOverlays = [];\n\n //used for visual debug atm\n function getRandomColor() {\n var letters = '0123456789ABCDEF'.split('');\n var color = '#';\n for (var i = 0; i < 6; i++) {\n color += letters[Math.round(Math.random() * 15)];\n }\n return color;\n }\n\n //used for visual debug atm\n function addOverlayRect(rects, color, doc) {\n var random = getRandomColor();\n if (!(rects instanceof Array)) {\n rects = [rects];\n }\n for (var i = 0; i != rects.length; i++) {\n var rect = rects[i];\n var overlayDiv = doc.createElement('div');\n overlayDiv.style.position = 'absolute';\n $(overlayDiv).css('z-index', '1000');\n $(overlayDiv).css('pointer-events', 'none');\n $(overlayDiv).css('opacity', '0.4');\n overlayDiv.style.border = '1px solid white';\n if (!color && !random) {\n overlayDiv.style.background = 'purple';\n } else if (random && !color) {\n overlayDiv.style.background = random;\n } else {\n if (color === true) {\n color = 'red';\n }\n overlayDiv.style.border = '1px dashed ' + color;\n overlayDiv.style.background = 'yellow';\n }\n\n overlayDiv.style.margin = overlayDiv.style.padding = '0';\n overlayDiv.style.top = (rect.top ) + 'px';\n overlayDiv.style.left = (rect.left ) + 'px';\n // we want rect.width to be the border width, so content width is 2px less.\n overlayDiv.style.width = (rect.width - 2) + 'px';\n overlayDiv.style.height = (rect.height - 2) + 'px';\n doc.documentElement.appendChild(overlayDiv);\n $debugOverlays.push($(overlayDiv));\n }\n }\n\n function drawDebugOverlayFromRect(rect) {\n var offsets = getPaginationOffsets();\n\n addOverlayRect({\n left: rect.left + offsets.left,\n top: rect.top + offsets.top,\n width: rect.width,\n height: rect.height\n }, true, self.getRootDocument());\n }\n\n function drawDebugOverlayFromDomRange(range) {\n var rect = getNodeRangeClientRect(\n range.startContainer,\n range.startOffset,\n range.endContainer,\n range.endOffset);\n drawDebugOverlayFromRect(rect);\n return rect;\n }\n\n function drawDebugOverlayFromNode(node) {\n drawDebugOverlayFromRect(getNodeClientRect(node));\n }\n\n function clearDebugOverlays() {\n _.each($debugOverlays, function ($el) {\n $el.remove();\n });\n $debugOverlays = [];\n }\n\n ReadiumSDK._DEBUG_CfiNavigationLogic = {\n clearDebugOverlays: clearDebugOverlays,\n drawDebugOverlayFromRect: drawDebugOverlayFromRect,\n drawDebugOverlayFromDomRange: drawDebugOverlayFromDomRange,\n drawDebugOverlayFromNode: drawDebugOverlayFromNode,\n debugVisibleCfis: function () {\n console.log(JSON.stringify(ReadiumSDK.reader.getPaginationInfo().openPages));\n\n var cfi1 = ReadiumSDK.reader.getFirstVisibleCfi();\n var range1 = ReadiumSDK.reader.getDomRangeFromRangeCfi(cfi1);\n console.log(cfi1, range1, drawDebugOverlayFromDomRange(range1));\n\n var cfi2 = ReadiumSDK.reader.getLastVisibleCfi();\n var range2 = ReadiumSDK.reader.getDomRangeFromRangeCfi(cfi2);\n console.log(cfi2, range2, drawDebugOverlayFromDomRange(range2));\n },\n visibleTextRangeOffsetsRunsAvg: function () {\n var arr = window.top._DEBUG_visibleTextRangeOffsetsRuns;\n return arr.reduce(function (a, b) {\n return a + b;\n }) / arr.length;\n }\n };\n\n //\n // }\n\n this.findFirstVisibleElement = function (visibleContentOffsets, frameDimensions) {\n\n var bodyElement = this.getBodyElement();\n\n if (!bodyElement) {\n return null;\n }\n\n var firstVisibleElement;\n var percentVisible = 0;\n var textNode;\n\n var treeWalker = document.createTreeWalker(\n bodyElement,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function(node) {\n if (node.nodeType === Node.ELEMENT_NODE && isElementBlacklisted(node))\n return NodeFilter.FILTER_REJECT;\n\n if (node.nodeType === Node.TEXT_NODE && !isValidTextNode(node))\n return NodeFilter.FILTER_REJECT;\n\n var visibilityResult = checkVisibilityByRectangles($(node), true, visibleContentOffsets, frameDimensions);\n return visibilityResult ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n false\n );\n\n while (treeWalker.nextNode()) {\n var node = treeWalker.currentNode;\n\n if (node.nodeType === Node.TEXT_NODE) {\n firstVisibleElement = node.parentNode;\n textNode = node;\n percentVisible = 100; // not really used, assume this value unless otherwise\n break;\n }\n\n var hasChildElements = false;\n var hasChildTextNodes = false;\n\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.ELEMENT_NODE) {\n hasChildElements = true;\n break;\n }\n if (childNode.nodeType === Node.TEXT_NODE)\n hasChildTextNodes = true;\n }\n\n // potentially stop tree traversal when first element hit with no child element nodes\n if (!hasChildElements && hasChildTextNodes) {\n for (var i=node.childNodes.length-1; i>=0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.TEXT_NODE && isValidTextNode(childNode)) {\n var visibilityResult = checkVisibilityByRectangles($(childNode), true, visibleContentOffsets, frameDimensions);\n if (visibilityResult) {\n firstVisibleElement = node;\n textNode = childNode;\n percentVisible = visibilityResult;\n break;\n }\n }\n }\n } else if (!hasChildElements) {\n firstVisibleElement = node;\n percentVisible = 100;\n textNode = null;\n break;\n }\n }\n\n if (!firstVisibleElement) {\n return null;\n }\n return {\n element: firstVisibleElement,\n textNode: textNode,\n percentVisible: percentVisible\n };\n };\n\n this.findLastVisibleElement = function (visibleContentOffsets, frameDimensions) {\n\n var bodyElement = this.getBodyElement();\n\n if (!bodyElement) {\n return null;\n }\n\n var firstVisibleElement;\n var percentVisible = 0;\n var textNode;\n\n var treeWalker = document.createTreeWalker(\n bodyElement,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n function(node) {\n if (node.nodeType === Node.ELEMENT_NODE && isElementBlacklisted(node))\n return NodeFilter.FILTER_REJECT;\n\n if (node.nodeType === Node.TEXT_NODE && !isValidTextNode(node))\n return NodeFilter.FILTER_REJECT;\n\n var visibilityResult = checkVisibilityByRectangles($(node), true, visibleContentOffsets, frameDimensions);\n return visibilityResult ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n },\n false\n );\n\n while (treeWalker.lastChild()) { }\n\n do {\n var node = treeWalker.currentNode;\n\n if (node.nodeType === Node.TEXT_NODE) {\n firstVisibleElement = node.parentNode;\n textNode = node;\n percentVisible = 100; // not really used, assume this value unless otherwise\n break;\n }\n\n var hasChildElements = false;\n var hasChildTextNodes = false;\n\n for (var i = node.childNodes.length - 1; i >= 0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.ELEMENT_NODE) {\n hasChildElements = true;\n break;\n }\n if (childNode.nodeType === Node.TEXT_NODE)\n hasChildTextNodes = true;\n }\n\n // potentially stop tree traversal when first element hit with no child element nodes\n if (!hasChildElements && hasChildTextNodes) {\n for (var i=node.childNodes.length-1; i>=0; i--) {\n var childNode = node.childNodes[i];\n if (childNode.nodeType === Node.TEXT_NODE && isValidTextNode(childNode)) {\n var visibilityResult = checkVisibilityByRectangles($(childNode), true, visibleContentOffsets, frameDimensions);\n if (visibilityResult) {\n firstVisibleElement = node;\n textNode = childNode;\n percentVisible = visibilityResult;\n break;\n }\n }\n }\n } else if (!hasChildElements) {\n firstVisibleElement = node;\n percentVisible = 100;\n textNode = null;\n break;\n }\n } while (treeWalker.previousNode());\n\n if (!firstVisibleElement) {\n return null;\n }\n return {\n element: firstVisibleElement,\n textNode: textNode,\n percentVisible: percentVisible\n };\n };\n\n };\nreturn CfiNavigationLogic;\n});\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/viewer_settings',[], function() {\n/**\n *\n * @param settingsData\n * @constructor\n */\nvar ViewerSettings = function(settingsData) {\n\n var self = this;\n\n /** Set to \"auto\"\n *\n * @property syntheticSpread\n * @type \n */\n\n this.syntheticSpread = \"auto\";\n\n /** \n *\n * @property fontSelection\n * @type number\n */\n \n this.fontSelection = 0;\n\n /** \n *\n * @property fontSize\n * @type number\n */\n\n this.fontSize = 100;\n\n /** \n *\n * @property columnGap\n * @type number\n */\n\n this.columnGap = 20;\n \n /** \n *\n * @property columnMaxWidth\n * @type number\n */\n\n this.columnMaxWidth = 700;\n\n /** \n *\n * @property columnMinWidth\n * @type number\n */\n\n this.columnMinWidth = 400;\n\n /** \n *\n * @property mediaOverlaysPreservePlaybackWhenScroll\n * @type bool\n */\n\n this.mediaOverlaysPreservePlaybackWhenScroll = false;\n\n /** \n *\n * @property mediaOverlaysSkipSkippables\n * @type bool\n */\n\n this.mediaOverlaysSkipSkippables = false;\n\n /** \n *\n * @property mediaOverlaysEscapables\n * @type bool\n */\n\n this.mediaOverlaysEscapeEscapables = true;\n\n /** \n *\n * @property mediaOverlaysSkippables\n * @type array\n */\n\n this.mediaOverlaysSkippables = [];\n \n /** \n *\n * @property mediaOverlaysEscapables\n * @type array\n */\n\n this.mediaOverlaysEscapables = [];\n\n /** \n *\n * @property mediaOverlaysEnableClick\n * @type bool\n */\n \n this.mediaOverlaysEnableClick = true;\n\n /** \n *\n * @property mediaOverlaysRate\n * @type number\n */\n\n this.mediaOverlaysRate = 1;\n\n /** \n *\n * @property mediaOverlaysVolume\n * @type number\n */\n\n this.mediaOverlaysVolume = 100;\n\n /** \n *\n * @property mediaOverlaysSynchronizationGranularity\n * @type string\n */\n \n this.mediaOverlaysSynchronizationGranularity = \"\";\n\n /** \n *\n * @property mediaOverlaysAutomaticPageTurn\n * @type bool\n */ \n\n this.mediaOverlaysAutomaticPageTurn = true;\n\n /** \n *\n * @property enableGPUHardwareAccelerationCSS3D\n * @type bool\n */ \n\n\n this.enableGPUHardwareAccelerationCSS3D = false;\n\n // -1 ==> disable\n // [0...n] ==> index of transition in pre-defined array\n \n /** \n *\n * @property pageTransition\n * @type number\n */ \n\n this.pageTransition = -1;\n \n /** \n *\n * @property scroll\n * @type string\n */ \n\n this.scroll = \"auto\";\n\n /**\n * Builds an array\n *\n * @method buildArray\n * @param {string} str\n * @return {array} retArr\n */\n\n function buildArray(str)\n {\n var retArr = [];\n var arr = str.split(/[\\s,;]+/); //','\n for (var i = 0; i < arr.length; i++)\n {\n var item = arr[i].trim();\n if (item !== \"\")\n {\n retArr.push(item);\n }\n }\n return retArr;\n }\n\n /**\n * Maps the properties to the settings\n *\n * @method mapProperty\n * @param {string} propName\n * @param settingsData\n * @param functionToApply\n */\n\n function mapProperty(propName, settingsData, functionToApply) {\n\n if(settingsData[propName] !== undefined) {\n if(functionToApply) {\n\n self[propName] = functionToApply(settingsData[propName]);\n }\n else {\n self[propName] = settingsData[propName];\n }\n }\n\n }\n\n /**\n * Updates the settings' new values\n *\n * @method update\n * @param settingsData\n */\n\n this.update = function(settingsData) {\n\n mapProperty(\"columnGap\", settingsData);\n mapProperty(\"columnMaxWidth\", settingsData);\n mapProperty(\"columnMinWidth\", settingsData);\n mapProperty(\"fontSize\", settingsData);\n mapProperty(\"fontSelection\", settingsData);\n mapProperty(\"mediaOverlaysPreservePlaybackWhenScroll\", settingsData);\n mapProperty(\"mediaOverlaysSkipSkippables\", settingsData);\n mapProperty(\"mediaOverlaysEscapeEscapables\", settingsData);\n mapProperty(\"mediaOverlaysSkippables\", settingsData, buildArray);\n mapProperty(\"mediaOverlaysEscapables\", settingsData, buildArray);\n mapProperty(\"mediaOverlaysEnableClick\", settingsData);\n mapProperty(\"mediaOverlaysRate\", settingsData);\n mapProperty(\"mediaOverlaysVolume\", settingsData);\n mapProperty(\"mediaOverlaysSynchronizationGranularity\", settingsData);\n mapProperty(\"mediaOverlaysAutomaticPageTurn\", settingsData);\n mapProperty(\"scroll\", settingsData);\n mapProperty(\"syntheticSpread\", settingsData);\n mapProperty(\"pageTransition\", settingsData);\n mapProperty(\"enableGPUHardwareAccelerationCSS3D\", settingsData);\n };\n\n this.update(settingsData);\n};\n return ViewerSettings;\n});\n\n", "/**\n * Copyright Marc J. Schmidt. See the LICENSE file at the top-level\n * directory of this distribution and at\n * https://github.com/marcj/css-element-queries/blob/master/LICENSE.\n */\n;\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define('ResizeSensor',factory);\n } else if (typeof exports === \"object\") {\n module.exports = factory();\n } else {\n root.ResizeSensor = factory();\n }\n}(typeof window !== 'undefined' ? window : this, function () {\n\n // Make sure it does not throw in a SSR (Server Side Rendering) situation\n if (typeof window === \"undefined\") {\n return null;\n }\n // Only used for the dirty checking, so the event callback count is limited to max 1 call per fps per sensor.\n // In combination with the event based resize sensor this saves cpu time, because the sensor is too fast and\n // would generate too many unnecessary events.\n var requestAnimationFrame = window.requestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n function (fn) {\n return window.setTimeout(fn, 20);\n };\n\n /**\n * Iterate over each of the provided element(s).\n *\n * @param {HTMLElement|HTMLElement[]} elements\n * @param {Function} callback\n */\n function forEachElement(elements, callback){\n var elementsType = Object.prototype.toString.call(elements);\n var isCollectionTyped = ('[object Array]' === elementsType\n || ('[object NodeList]' === elementsType)\n || ('[object HTMLCollection]' === elementsType)\n || ('[object Object]' === elementsType)\n || ('undefined' !== typeof jQuery && elements instanceof jQuery) //jquery\n || ('undefined' !== typeof Elements && elements instanceof Elements) //mootools\n );\n var i = 0, j = elements.length;\n if (isCollectionTyped) {\n for (; i < j; i++) {\n callback(elements[i]);\n }\n } else {\n callback(elements);\n }\n }\n\n /**\n * Class for dimension change detection.\n *\n * @param {Element|Element[]|Elements|jQuery} element\n * @param {Function} callback\n *\n * @constructor\n */\n var ResizeSensor = function(element, callback) {\n /**\n *\n * @constructor\n */\n function EventQueue() {\n var q = [];\n this.add = function(ev) {\n q.push(ev);\n };\n\n var i, j;\n this.call = function() {\n for (i = 0, j = q.length; i < j; i++) {\n q[i].call();\n }\n };\n\n this.remove = function(ev) {\n var newQueue = [];\n for(i = 0, j = q.length; i < j; i++) {\n if(q[i] !== ev) newQueue.push(q[i]);\n }\n q = newQueue;\n }\n\n this.length = function() {\n return q.length;\n }\n }\n\n /**\n *\n * @param {HTMLElement} element\n * @param {Function} resized\n */\n function attachResizeEvent(element, resized) {\n if (!element) return;\n if (element.resizedAttached) {\n element.resizedAttached.add(resized);\n return;\n }\n\n element.resizedAttached = new EventQueue();\n element.resizedAttached.add(resized);\n\n element.resizeSensor = document.createElement('div');\n element.resizeSensor.className = 'resize-sensor';\n var style = 'position: absolute; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: -1; visibility: hidden;';\n var styleChild = 'position: absolute; left: 0; top: 0; transition: 0s;';\n\n element.resizeSensor.style.cssText = style;\n element.resizeSensor.innerHTML =\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n element.appendChild(element.resizeSensor);\n\n if (element.resizeSensor.offsetParent !== element) {\n element.style.position = 'relative';\n }\n\n var expand = element.resizeSensor.childNodes[0];\n var expandChild = expand.childNodes[0];\n var shrink = element.resizeSensor.childNodes[1];\n var dirty, rafId, newWidth, newHeight;\n var lastWidth = element.offsetWidth;\n var lastHeight = element.offsetHeight;\n\n var reset = function() {\n expandChild.style.width = '100000px';\n expandChild.style.height = '100000px';\n\n expand.scrollLeft = 100000;\n expand.scrollTop = 100000;\n\n shrink.scrollLeft = 100000;\n shrink.scrollTop = 100000;\n };\n\n reset();\n\n var onResized = function() {\n rafId = 0;\n\n if (!dirty) return;\n\n lastWidth = newWidth;\n lastHeight = newHeight;\n\n if (element.resizedAttached) {\n element.resizedAttached.call();\n }\n };\n\n var onScroll = function() {\n newWidth = element.offsetWidth;\n newHeight = element.offsetHeight;\n dirty = newWidth != lastWidth || newHeight != lastHeight;\n\n if (dirty && !rafId) {\n rafId = requestAnimationFrame(onResized);\n }\n\n reset();\n };\n\n var addEvent = function(el, name, cb) {\n if (el.attachEvent) {\n el.attachEvent('on' + name, cb);\n } else {\n el.addEventListener(name, cb);\n }\n };\n\n addEvent(expand, 'scroll', onScroll);\n addEvent(shrink, 'scroll', onScroll);\n }\n\n forEachElement(element, function(elem){\n attachResizeEvent(elem, callback);\n });\n\n this.detach = function(ev) {\n ResizeSensor.detach(element, ev);\n };\n };\n\n ResizeSensor.detach = function(element, ev) {\n forEachElement(element, function(elem){\n if (!elem) return\n if(elem.resizedAttached && typeof ev == \"function\"){\n elem.resizedAttached.remove(ev);\n if(elem.resizedAttached.length()) return;\n }\n if (elem.resizeSensor) {\n if (elem.contains(elem.resizeSensor)) {\n elem.removeChild(elem.resizeSensor);\n }\n delete elem.resizeSensor;\n delete elem.resizedAttached;\n }\n });\n };\n\n return ResizeSensor;\n\n}));\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without modification,\n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this\n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice,\n// this list of conditions and the following disclaimer in the documentation and/or\n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be\n// used to endorse or promote products derived from this software without specific\n// prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\ndefine('readium_shared_js/views/one_page_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"./cfi_navigation_logic\", \"../helpers\", \"../models/viewer_settings\", \"../models/bookmark_data\", \"ResizeSensor\"],\n function (Globals, $, _, EventEmitter, CfiNavigationLogic, Helpers, ViewerSettings, BookmarkData, ResizeSensor) {\n\n/**\n * Renders one page of fixed layout spread\n *\n * @param options\n * @param classes\n * @param enableBookStyleOverrides\n * @constructor\n */\nvar OnePageView = function (options, classes, enableBookStyleOverrides, reader) {\n\n $.extend(this, new EventEmitter());\n\n var self = this;\n\n var _$epubHtml;\n var _$epubBody;\n var _$el;\n var _$iframe;\n var _currentSpineItem;\n var _spine = options.spine;\n var _iframeLoader = options.iframeLoader;\n var _navigationLogic = undefined;\n var _bookStyles = options.bookStyles;\n\n var _$viewport = options.$viewport;\n\n var _isIframeLoaded = false;\n\n var _$scaler;\n\n var _lastBodySize = {\n width: undefined,\n height: undefined\n };\n\n var PageTransitionHandler = function (opts) {\n var PageTransition = function (begin, end) {\n this.begin = begin;\n this.end = end;\n };\n\n var _pageTransition_OPACITY = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"transform\", \"none\");\n\n Helpers.CSSTransition($el, \"opacity 150ms ease-out\");\n\n $el.css(\"opacity\", \"1\");\n }\n );\n\n var _pageTransition_TRANSLATE = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 0.8 * (pageSwitchDir === 2 ? 1 : -1);\n var move = Helpers.CSSTransformString({\n left: Math.round(initialLeft),\n origin: \"50% 50% 0\",\n enable3D: _enable3D\n });\n $el.css(move);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 150ms ease-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransition_ROTATE = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 1.7 * (pageSwitchDir === 2 ? 1 : -1);\n var trans = Helpers.CSSTransformString({\n left: Math.round(initialLeft),\n angle: (pageSwitchDir === 2 ? -1 : 1) * 30,\n origin: \"50% 50% 0\",\n enable3D: _enable3D\n }); //(pageSwitchDir === 2 ? '0% 0%' : '100% 0%')\n $el.css(trans);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 300ms ease-in-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransition_SWING = new PageTransition(\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"0\");\n\n // SUPER HACKY!! (just for demo)\n var isLeft = false;\n var isCenter = false;\n var isRight = false;\n for (var i = 0; i < classes.length; i++) {\n var c = classes[i].toLowerCase();\n if (c.indexOf(\"left\") >= 0) {\n isLeft = true;\n break;\n }\n if (c.indexOf(\"right\") >= 0) {\n isRight = true;\n break;\n }\n if (c.indexOf(\"center\") >= 0) {\n isCenter = true;\n break;\n }\n }\n\n var elWidth = Math.ceil(meta_width * scale);\n\n var initialLeft = elWidth * 0.5 * ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1);\n var trans = Helpers.CSSTransformString({\n scale: 0.2,\n left: Math.round(initialLeft),\n angle: ((isLeft || isCenter && pageSwitchDir === 1) ? 1 : -1) * 30,\n origin: '50% 50% 0',\n enable3D: _enable3D\n });\n $el.css(trans);\n },\n function (scale, left, top, $el, meta_width, meta_height, pageSwitchDir) {\n $el.css(\"opacity\", \"1\");\n\n Helpers.CSSTransition($el, \"transform 400ms ease-out\");\n\n $el.css(\"transform\", \"none\");\n }\n );\n\n var _pageTransitions = [];\n _pageTransitions.push(_pageTransition_OPACITY); // 0\n _pageTransitions.push(_pageTransition_TRANSLATE); // 1\n _pageTransitions.push(_pageTransition_ROTATE); // 2\n _pageTransitions.push(_pageTransition_SWING); // 3\n\n var _disablePageTransitions = opts.disablePageTransitions || false;\n \n // TODO: page transitions are broken, sp we disable them to avoid nasty visual artefacts\n _disablePageTransitions = true;\n\n var _pageTransition = -1;\n\n var _enable3D = new ViewerSettings({}).enableGPUHardwareAccelerationCSS3D;\n\n var _viewerSettings = undefined;\n this.updateOptions = function (o) {\n _viewerSettings = o;\n\n var settings = _viewerSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n _enable3D = true;\n }\n\n if (o.pageTransition !== null && typeof o.pageTransition !== \"undefined\") {\n _pageTransition = o.pageTransition;\n }\n };\n this.updateOptions(opts);\n\n var _pageSwitchDir = 0;\n var _pageSwitchActuallyChanged = false;\n var _pageSwitchActuallyChanged_IFRAME_LOAD = false;\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.updatePageSwitchDir = function (dir, hasChanged) {\n if (_pageSwitchActuallyChanged_IFRAME_LOAD) {\n return;\n }\n\n _pageSwitchDir = dir;\n _pageSwitchActuallyChanged = hasChanged;\n };\n\n this.onIFrameLoad = function () {\n _pageSwitchActuallyChanged_IFRAME_LOAD = true; // second pass, but initial display for transition\n };\n\n this.transformContentImmediate_BEGIN = function ($el, scale, left, top) {\n var pageSwitchActuallyChanged = _pageSwitchActuallyChanged || _pageSwitchActuallyChanged_IFRAME_LOAD;\n _pageSwitchActuallyChanged_IFRAME_LOAD = false;\n\n if (_disablePageTransitions || _pageTransition === -1) return;\n\n Helpers.CSSTransition($el, \"all 0 ease 0\");\n\n if (!pageSwitchActuallyChanged) return;\n\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\n\n if (_pageSwitchDir === 0 || !pageTransition) {\n $el.css(\"opacity\", \"0\");\n }\n else {\n pageTransition.begin(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\n }\n };\n\n this.transformContentImmediate_END = function ($el, scale, left, top) {\n if (_disablePageTransitions || _pageTransition === -1) {\n $el.css(\"transform\", \"none\");\n return;\n }\n\n setTimeout(function () {\n var pageTransition = (_pageTransition >= 0 && _pageTransition < _pageTransitions.length) ? _pageTransitions[_pageTransition] : undefined;\n\n if (_pageSwitchDir === 0 || !pageTransition) {\n $el.css(\"transform\", \"none\");\n\n Helpers.CSSTransition($el, \"opacity 250ms linear\");\n\n $el.css(\"opacity\", \"1\");\n }\n else {\n pageTransition.end(scale, left, top, $el, self.meta_width(), self.meta_height(), _pageSwitchDir);\n }\n\n }, 10);\n };\n };\n var _pageTransitionHandler = new PageTransitionHandler(options);\n\n\n // fixed layout does not apply user styles to publisher content, but reflowable scroll view does\n var _enableBookStyleOverrides = enableBookStyleOverrides || false;\n\n var _meta_size = {\n width: 0,\n height: 0\n };\n\n this.element = function () {\n return _$el;\n };\n\n this.meta_height = function () {\n return _meta_size.height;\n };\n\n this.meta_width = function () {\n return _meta_size.width;\n };\n\n this.isDisplaying = function () {\n\n return _isIframeLoaded; //_$iframe && _$iframe[0] && _$epubHtml\n };\n\n this.render = function () {\n\n var template = Helpers.loadTemplate(\"single_page_frame\", {});\n\n _$el = $(template);\n\n _$scaler = $(\"#scaler\", _$el);\n\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\n\n _$el.css(\"transform\", \"none\");\n\n var settings = reader.viewerSettings();\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n\n // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\n _$el.css(\"transform\", \"translateZ(0)\");\n }\n\n _$el.css(\"height\", \"100%\");\n _$el.css(\"width\", \"100%\");\n\n for (var i = 0, count = classes.length; i < count; i++) {\n _$el.addClass(classes[i]);\n }\n\n _$iframe = $(\"iframe\", _$el);\n\n return this;\n };\n\n\n this.decorateIframe = function () {\n if (!_$iframe || !_$iframe.length) return;\n\n _$iframe.css(\"border-bottom\", \"1px dashed silver\");\n _$iframe.css(\"border-top\", \"1px dashed silver\");\n };\n\n this.remove = function () {\n this.clear();\n \n _currentSpineItem = undefined;\n \n if (_$el && _$el[0]) {\n _$el.remove();\n }\n \n _$el = undefined;\n _$scaler = undefined;\n _$iframe = undefined;\n };\n\n this.clear = function () {\n _isIframeLoaded = false;\n \n if (_$iframe && _$iframe[0]) {\n _$iframe[0].src = \"\";\n }\n };\n\n this.currentSpineItem = function () {\n\n return _currentSpineItem;\n };\n\n function onIFrameLoad(success) {\n\n if (success) {\n _isIframeLoaded = true;\n var epubContentDocument = _$iframe[0].contentDocument;\n _$epubHtml = $(\"html\", epubContentDocument);\n if (!_$epubHtml || _$epubHtml.length == 0) {\n _$epubHtml = $(\"svg\", epubContentDocument);\n _$epubBody = undefined;\n } else {\n _$epubBody = $(\"body\", _$epubHtml);\n }\n\n //_$epubHtml.css(\"overflow\", \"hidden\");\n\n if (_enableBookStyleOverrides) { // not fixed layout (reflowable in scroll view)\n self.applyBookStyles();\n }\n\n updateMetaSize();\n\n initResizeSensor();\n\n _pageTransitionHandler.onIFrameLoad();\n }\n }\n\n function initResizeSensor() {\n\n if (_$epubBody // undefined with SVG spine items\n && _enableBookStyleOverrides // not fixed layout (reflowable in scroll view)\n ) {\n\n var bodyElement = _$epubBody[0];\n if (bodyElement.resizeSensor) {\n return;\n }\n\n // We need to make sure the content has indeed be resized, especially\n // the first time it is triggered\n _lastBodySize.width = $(bodyElement).width();\n _lastBodySize.height = $(bodyElement).height();\n\n bodyElement.resizeSensor = new ResizeSensor(bodyElement, function() {\n\n var newBodySize = {\n width: $(bodyElement).width(),\n height: $(bodyElement).height()\n };\n\n console.debug(\"OnePageView content resized ...\", newBodySize.width, newBodySize.height, _currentSpineItem.idref);\n \n if (newBodySize.width != _lastBodySize.width || newBodySize.height != _lastBodySize.height) {\n _lastBodySize.width = newBodySize.width;\n _lastBodySize.height = newBodySize.height;\n\n console.debug(\"... updating pagination.\");\n\n var src = _spine.package.resolveRelativeUrl(_currentSpineItem.href);\n\n Globals.logEvent(\"OnePageView.Events.CONTENT_SIZE_CHANGED\", \"EMIT\", \"one_page_view.js [ \" + _currentSpineItem.href + \" -- \" + src + \" ]\");\n \n self.emit(OnePageView.Events.CONTENT_SIZE_CHANGED, _$iframe, _currentSpineItem);\n \n //updatePagination();\n } else {\n console.debug(\"... ignored (identical dimensions).\");\n }\n });\n }\n }\n \n var _viewSettings = undefined;\n this.setViewSettings = function (settings, docWillChange) {\n\n _viewSettings = settings;\n\n if (_enableBookStyleOverrides // not fixed layout (reflowable in scroll view)\n && !docWillChange) {\n self.applyBookStyles();\n }\n\n updateMetaSize();\n\n _pageTransitionHandler.updateOptions(settings);\n };\n\n function updateHtmlFontInfo() {\n\n if (!_enableBookStyleOverrides) return; // fixed layout (not reflowable in scroll view)\n\n if (_$epubHtml && _viewSettings) {\n var i = _viewSettings.fontSelection;\n var useDefault = !reader.fonts || !reader.fonts.length || i <= 0 || (i-1) >= reader.fonts.length;\n var font = (useDefault ?\n {} :\n reader.fonts[i - 1]);\n Helpers.UpdateHtmlFontAttributes(_$epubHtml, _viewSettings.fontSize, font, function() {});\n }\n }\n\n this.applyBookStyles = function () {\n\n if (!_enableBookStyleOverrides) return; // fixed layout (not reflowable in scroll view)\n\n if (_$epubHtml) {\n Helpers.setStyles(_bookStyles.getStyles(), _$epubHtml);\n updateHtmlFontInfo();\n }\n };\n\n //this is called by scroll_view for fixed spine item\n this.scaleToWidth = function (width) {\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n if (_meta_size.width <= 0) return; // resize event too early!\n\n var scale = width / _meta_size.width;\n self.transformContentImmediate(scale, 0, 0);\n };\n\n //this is called by scroll_view for reflowable spine item\n this.resizeIFrameToContent = function () {\n var contHeight = getContentDocHeight();\n //console.log(\"resizeIFrameToContent: \" + contHeight);\n\n self.setHeight(contHeight);\n\n self.showIFrame();\n };\n\n this.setHeight = function (height) {\n\n _$scaler.css(\"height\", height + \"px\");\n _$el.css(\"height\", height + \"px\");\n\n// _$iframe.css(\"height\", height + \"px\");\n };\n\n var _useCSSTransformToHideIframe = true;\n\n this.showIFrame = function () {\n\n _$iframe.css(\"visibility\", \"visible\");\n\n if (_useCSSTransformToHideIframe) {\n _$iframe.css(\"transform\", \"none\");\n\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n _$iframe.css(\"transform\", \"translateZ(0)\");\n }\n }\n else {\n _$iframe.css({left: \"0px\", top: \"0px\"});\n }\n };\n\n this.hideIFrame = function () {\n\n _$iframe.css(\"visibility\", \"hidden\");\n\n // With some books, despite the iframe and its containing div wrapper being hidden,\n // the iframe's contentWindow / contentDocument is still visible!\n // Thus why we translate the iframe out of view instead.\n\n if (_useCSSTransformToHideIframe) {\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n }\n\n var css = Helpers.CSSTransformString({left: \"10000\", top: \"10000\", enable3D: enable3D});\n _$iframe.css(css);\n }\n else {\n _$iframe.css({left: \"10000px\", top: \"10000px\"});\n }\n };\n\n function getContentDocHeight() {\n\n if (!_$iframe || !_$iframe.length) {\n return 0;\n }\n\n if (Helpers.isIframeAlive(_$iframe[0])) {\n var win = _$iframe[0].contentWindow;\n var doc = _$iframe[0].contentDocument;\n\n var height = Math.round(parseFloat(win.getComputedStyle(doc.documentElement).height)); //body can be shorter!\n return height;\n }\n else if (_$epubHtml) {\n console.error(\"getContentDocHeight ??\");\n\n var jqueryHeight = _$epubHtml.height();\n return jqueryHeight;\n }\n\n return 0;\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.updatePageSwitchDir = function (dir, hasChanged) {\n _pageTransitionHandler.updatePageSwitchDir(dir, hasChanged);\n };\n\n\n this.transformContentImmediate = function (scale, left, top) {\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n var elWidth = Math.ceil(_meta_size.width * scale);\n var elHeight = Math.floor(_meta_size.height * scale);\n\n _pageTransitionHandler.transformContentImmediate_BEGIN(_$el, scale, left, top);\n\n _$el.css(\"left\", left + \"px\");\n _$el.css(\"top\", top + \"px\");\n _$el.css(\"width\", elWidth + \"px\");\n _$el.css(\"height\", elHeight + \"px\");\n\n if (!_$epubHtml) {\n// debugger;\n return;\n }\n\n var enable3D = false;\n var settings = _viewSettings;\n if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\") {\n //defaults\n settings = new ViewerSettings({});\n }\n if (settings.enableGPUHardwareAccelerationCSS3D) {\n enable3D = true;\n }\n \n if (_$epubBody // not SVG spine item (otherwise fails in Safari OSX)\n && reader.needsFixedLayoutScalerWorkAround()) {\n\n var css1 = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\n \n // See https://github.com/readium/readium-shared-js/issues/285 \n css1[\"min-width\"] = _meta_size.width;\n css1[\"min-height\"] = _meta_size.height;\n \n _$epubHtml.css(css1);\n\n // Ensures content dimensions matches viewport meta (authors / production tools should do this in their CSS...but unfortunately some don't).\n if (_$epubBody && _$epubBody.length) {\n _$epubBody.css({width:_meta_size.width, height:_meta_size.height});\n }\n\n var css2 = Helpers.CSSTransformString({scale : 1, enable3D: enable3D});\n css2[\"width\"] = _meta_size.width * scale;\n css2[\"height\"] = _meta_size.height * scale;\n\n _$scaler.css(css2);\n }\n else {\n var css = Helpers.CSSTransformString({scale: scale, enable3D: enable3D});\n css[\"width\"] = _meta_size.width;\n css[\"height\"] = _meta_size.height;\n _$scaler.css(css);\n }\n\n // Chrome workaround: otherwise text is sometimes invisible (probably a rendering glitch due to the 3D transform graphics backend?)\n //_$epubHtml.css(\"visibility\", \"hidden\"); // \"flashing\" in two-page spread mode is annoying :(\n _$epubHtml.css(\"opacity\", \"0.999\");\n\n self.showIFrame();\n\n setTimeout(function () {\n //_$epubHtml.css(\"visibility\", \"visible\");\n _$epubHtml.css(\"opacity\", \"1\");\n }, 0);\n \n // TODO: the CSS transitions do not work anymore, tested on Firefox and Chrome.\n // The line of code below still needs to be invoked, but the logic in _pageTransitionHandler probably need adjusting to work around the animation timing issue.\n // PS: opacity=1 above seems to interfere with the fade-in transition, probably a browser issue with mixing inner-iframe effects with effects applied to the iframe parent/ancestors.\n _pageTransitionHandler.transformContentImmediate_END(_$el, scale, left, top);\n };\n\n this.getCalculatedPageHeight = function () {\n return _$el.height();\n };\n\n this.transformContent = _.bind(_.debounce(this.transformContentImmediate, 50), self);\n\n function updateMetaSize() {\n\n _meta_size.width = 0;\n _meta_size.height = 0;\n\n if (_enableBookStyleOverrides) return; // not fixed layout (reflowable in scroll view)\n\n var size = undefined;\n\n var isFallbackDimension = false;\n var widthPercent = undefined;\n var heightPercent = undefined;\n\n var contentDocument = _$iframe[0].contentDocument;\n\n // first try to read viewport size\n var content = $('meta[name=viewport]', contentDocument).attr(\"content\");\n\n // if not found try viewbox (used for SVG)\n if (!content) {\n content = $('meta[name=viewbox]', contentDocument).attr(\"content\");\n }\n\n if (content) {\n size = parseMetaSize(content);\n }\n\n if (!size) {\n\n //var $svg = $(contentDocument).find('svg');\n // if($svg.length > 0) {\n if (contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\n\n var width = undefined;\n var height = undefined;\n\n var wAttr = contentDocument.documentElement.getAttribute(\"width\");\n var isWidthPercent = wAttr && wAttr.length >= 1 && wAttr[wAttr.length - 1] == '%';\n if (wAttr) {\n try {\n width = parseInt(wAttr, 10);\n }\n catch (err) {}\n }\n if (width && isWidthPercent) {\n widthPercent = width;\n width = undefined;\n }\n\n var hAttr = contentDocument.documentElement.getAttribute(\"height\");\n var isHeightPercent = hAttr && hAttr.length >= 1 && hAttr[hAttr.length - 1] == '%';\n if (hAttr) {\n try {\n height = parseInt(hAttr, 10);\n }\n catch (err) {}\n }\n if (height && isHeightPercent) {\n heightPercent = height;\n height = undefined;\n }\n\n if (width && height) {\n size = {\n width: width,\n height: height\n }\n }\n else {\n /// DISABLED (not a satisfactory fallback)\n // content = $svg.attr('viewBox');\n // if(content) {\n // size = parseViewBoxSize(content);\n // }\n //\n // if (size) {\n // console.warn(\"Viewport SVG: using viewbox!\");\n // }\n }\n }\n }\n\n if (!size && _currentSpineItem) {\n content = _currentSpineItem.getRenditionViewport();\n\n if (content) {\n size = parseMetaSize(content);\n if (size) {\n console.log(\"Viewport: using rendition:viewport dimensions\");\n }\n }\n }\n\n if (!size) {\n // Image fallback (auto-generated HTML template when WebView / iFrame is fed with image media type)\n var $img = $(contentDocument).find('img');\n if ($img.length > 0) {\n size = {\n width: $img.width(),\n height: $img.height()\n };\n\n var isImage = _currentSpineItem && _currentSpineItem.media_type && _currentSpineItem.media_type.length && _currentSpineItem.media_type.indexOf(\"image/\") == 0;\n if (!isImage) {\n console.warn(\"Viewport: using img dimensions!\");\n }\n }\n else {\n $img = $(contentDocument).find('image');\n if ($img.length > 0) {\n var width = undefined;\n var height = undefined;\n\n var wAttr = $img[0].getAttribute(\"width\");\n if (wAttr) {\n try {\n width = parseInt(wAttr, 10);\n }\n catch (err) {}\n }\n var hAttr = $img[0].getAttribute(\"height\");\n if (hAttr) {\n try {\n height = parseInt(hAttr, 10);\n }\n catch (err) {}\n }\n\n\n if (width && height) {\n size = {\n width: width,\n height: height\n };\n\n isFallbackDimension = true;\n\n console.warn(\"Viewport: using image dimensions!\");\n }\n }\n }\n }\n\n if (!size) {\n // Not a great fallback, as it has the aspect ratio of the full window, but it is better than no display at all.\n width = _$viewport.width();\n height = _$viewport.height();\n\n // hacky method to determine the actual available horizontal space (half the two-page spread is a reasonable approximation, this means that whatever the size of the other iframe / one_page_view, the aspect ratio of this one exactly corresponds to half the viewport rendering surface)\n var isTwoPageSyntheticSpread = $(\"iframe.iframe-fixed\", _$viewport).length > 1;\n if (isTwoPageSyntheticSpread) width *= 0.5;\n\n // the original SVG width/height might have been specified as a percentage of the containing viewport\n if (widthPercent) {\n width *= (widthPercent / 100);\n }\n if (heightPercent) {\n height *= (heightPercent / 100);\n }\n\n size = {\n width: width,\n height: height\n };\n\n isFallbackDimension = true;\n\n console.warn(\"Viewport: using browser / e-reader viewport dimensions!\");\n }\n\n if (size) {\n _meta_size.width = size.width;\n _meta_size.height = size.height;\n\n // Not strictly necessary, let's preserve the percentage values\n // if (isFallbackDimension && contentDocument && contentDocument.documentElement && contentDocument.documentElement.nodeName && contentDocument.documentElement.nodeName.toLowerCase() == \"svg\") {\n // contentDocument.documentElement.setAttribute(\"width\", size.width + \"px\");\n // contentDocument.documentElement.setAttribute(\"height\", size.height + \"px\");\n // }\n }\n }\n\n function onUnload (spineItem) {\n if (spineItem) {\n \n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"one_page_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, _$iframe, spineItem);\n }\n }\n\n this.onUnload = function () {\n onUnload(_currentSpineItem);\n };\n\n //expected callback signature: function(success, $iframe, spineItem, isNewlyLoaded, context)\n this.loadSpineItem = function (spineItem, callback, context) {\n\n if (_currentSpineItem != spineItem) {\n\n var prevSpineItem = _currentSpineItem;\n _currentSpineItem = spineItem;\n var src = _spine.package.resolveRelativeUrl(spineItem.href);\n\n // both fixed layout and reflowable documents need hiding due to flashing during layout/rendering\n //hide iframe until content is scaled\n self.hideIFrame();\n\n onUnload(prevSpineItem);\n\n\n Globals.logEvent(\"OnePageView.Events.SPINE_ITEM_OPEN_START\", \"EMIT\", \"one_page_view.js [ \" + spineItem.href + \" -- \" + src + \" ]\");\n self.emit(OnePageView.Events.SPINE_ITEM_OPEN_START, _$iframe, _currentSpineItem);\n \n _iframeLoader.loadIframe(_$iframe[0], src, function (success) {\n\n if (success && callback) {\n var func = function () {\n callback(success, _$iframe, _currentSpineItem, true, context);\n };\n\n if (Helpers.isIframeAlive(_$iframe[0])) {\n onIFrameLoad(success); // applies styles\n\n func();\n }\n else {\n console.error(\"onIFrameLoad !! doc && win + TIMEOUT\");\n console.debug(spineItem.href);\n\n onIFrameLoad(success);\n\n setTimeout(func, 500);\n }\n }\n else {\n onIFrameLoad(success);\n }\n\n }, self, {spineItem: _currentSpineItem});\n }\n else {\n if (callback) {\n callback(true, _$iframe, _currentSpineItem, false, context);\n }\n }\n };\n //\n // function parseViewBoxSize(viewBoxString) {\n //\n // var parts = viewBoxString.split(' ');\n //\n // if(parts.length < 4) {\n // console.warn(viewBoxString + \" value is not valid viewBox size\")\n // return undefined;\n // }\n //\n // var width = parseInt(parts[2]);\n // var height = parseInt(parts[3]);\n //\n // if(!isNaN(width) && !isNaN(height)) {\n // return { width: width, height: height} ;\n // }\n //\n // return undefined;\n // }\n\n function parseMetaSize(content) {\n\n var pairs = content.replace(/\\s/g, '').split(\",\");\n\n var dict = {};\n\n for (var i = 0; i < pairs.length; i++) {\n var nameVal = pairs[i].split(\"=\");\n if (nameVal.length == 2) {\n\n dict[nameVal[0]] = nameVal[1];\n }\n }\n\n var width = Number.NaN;\n var height = Number.NaN;\n\n if (dict[\"width\"]) {\n width = parseInt(dict[\"width\"]);\n }\n\n if (dict[\"height\"]) {\n height = parseInt(dict[\"height\"]);\n }\n\n if (!isNaN(width) && !isNaN(height)) {\n return {width: width, height: height};\n }\n\n return undefined;\n }\n\n function getVisibleContentOffsets() {\n return {\n top: -_$el.parent().scrollTop(),\n left: 0\n };\n }\n \n function getFrameDimensions() {\n if (reader.needsFixedLayoutScalerWorkAround()) {\n var parentEl = _$el.parent()[0];\n return {\n width: parentEl.clientWidth,\n height: parentEl.clientHeight\n };\n }\n return {\n width: _meta_size.width,\n height: _meta_size.height\n };\n }\n \n this.getNavigator = function () {\n return new CfiNavigationLogic({\n $iframe: _$iframe,\n frameDimensionsGetter: getFrameDimensions,\n visibleContentOffsetsGetter: getVisibleContentOffsets,\n classBlacklist: [\"cfi-marker\", \"mo-cfi-highlight\", \"resize-sensor\", \"resize-sensor-expand\", \"resize-sensor-shrink\", \"resize-sensor-inner\"],\n elementBlacklist: [],\n idBlacklist: [\"MathJax_Message\", \"MathJax_SVG_Hidden\"]\n });\n };\n\n this.getElementByCfi = function (spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n if (spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElementByCfi(cfi, classBlacklist, elementBlacklist, idBlacklist);\n };\n\n this.getElementById = function (spineItemIdref, id) {\n\n if (spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElementById(id);\n };\n\n this.getElement = function (spineItemIdref, selector) {\n\n if(spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n return navigation.getElement(selector);\n };\n\n this.getFirstVisibleMediaOverlayElement = function() {\n var navigation = self.getNavigator();\n return navigation.getFirstVisibleMediaOverlayElement();\n };\n\n this.offset = function () {\n if (_$iframe) {\n return _$iframe.offset();\n }\n return undefined;\n };\n\n this.getVisibleElementsWithFilter = function (filterFunction) {\n var navigation = self.getNavigator();\n var elements = navigation.getVisibleElementsWithFilter(null, filterFunction);\n return elements;\n };\n\n this.getVisibleElements = function (selector) {\n\n var navigation = self.getNavigator();\n var elements = navigation.getAllVisibleElementsWithSelector(selector);\n return elements;\n };\n\n this.getAllElementsWithFilter = function (filterFunction, outsideBody) {\n var navigation = self.getNavigator();\n var elements = navigation.getAllElementsWithFilter(filterFunction, outsideBody);\n return elements;\n };\n\n this.getElements = function(spineItemIdref, selector) {\n\n if(spineItemIdref != _currentSpineItem.idref) {\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n var navigation = self.getNavigator();\n\n return navigation.getElements(selector);\n };\n\n this.getNodeRangeInfoFromCfi = function (spineIdRef, partialCfi) {\n if (spineIdRef != _currentSpineItem.idref) {\n console.warn(\"spine item is not loaded\");\n return undefined;\n }\n var navigation = self.getNavigator();\n\n return navigation.getNodeRangeInfoFromCfi(partialCfi);\n };\n\n function createBookmarkFromCfi(cfi) {\n if (!_currentSpineItem) {\n return null;\n }\n\n return new BookmarkData(_currentSpineItem.idref, cfi);\n }\n\n this.getLoadedContentFrames = function () {\n return [{spineItem: _currentSpineItem, $iframe: _$iframe}];\n };\n\n this.getFirstVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return createBookmarkFromCfi(self.getNavigator().getFirstVisibleCfi(visibleContentOffsets, frameDimensions));\n };\n\n this.getLastVisibleCfi = function (visibleContentOffsets, frameDimensions) {\n return createBookmarkFromCfi(self.getNavigator().getLastVisibleCfi(visibleContentOffsets, frameDimensions));\n };\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n return self.getNavigator().getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n return createBookmarkFromCfi(self.getNavigator().getRangeCfiFromDomRange(domRange));\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint) {\n return createBookmarkFromCfi(self.getNavigator().getVisibleCfiFromPoint(x, y, precisePoint));\n };\n\n this.getRangeCfiFromPoints = function(startX, startY, endX, endY) {\n return createBookmarkFromCfi(self.getNavigator().getRangeCfiFromPoints(startX, startY, endX, endY));\n };\n\n this.getCfiForElement = function(element) {\n return createBookmarkFromCfi(self.getNavigator().getCfiForElement(element));\n };\n\n this.getElementFromPoint = function (x, y) {\n return self.getNavigator().getElementFromPoint(x, y);\n };\n\n this.getStartCfi = function () {\n return createBookmarkFromCfi(self.getNavigator().getStartCfi());\n };\n\n this.getEndCfi = function () {\n return createBookmarkFromCfi(self.getNavigator().getEndCfi());\n };\n\n this.getNearestCfiFromElement = function(element) {\n return createBookmarkFromCfi(self.getNavigator().getNearestCfiFromElement(element));\n };\n};\n\nOnePageView.Events = {\n SPINE_ITEM_OPEN_START: \"SpineItemOpenStart\",\n CONTENT_SIZE_CHANGED: \"ContentSizeChanged\"\n};\nreturn OnePageView;\n});\n\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/page_open_request',[],function() {\n/**\n * Representation of opening page request\n * Provides the spine item to be opened and one of the following properties:\n * spineItemPageIndex {Number},\n * elementId {String},\n * elementCfi {String},\n * firstPage {bool},\n * lastPage {bool}\n *\n * @class Models.PageOpenRequest\n * @constructor\n * @param {Models.SpineItem} spineItem\n * @param {object} [initiator]\n *\n\n */\nvar PageOpenRequest = function(spineItem, initiator) {\n\n this.spineItem = spineItem;\n this.spineItemPageIndex = undefined;\n this.elementId = undefined;\n this.elementCfi = undefined;\n this.firstVisibleCfi = undefined;\n this.lastVisibleCfi = undefined;\n this.firstPage = false;\n this.lastPage = false;\n this.initiator = initiator;\n\n /**\n * Resets the reading system\n *\n * @method reset\n */\n\n this.reset = function() {\n this.spineItemPageIndex = undefined;\n this.elementId = undefined;\n this.elementCfi = undefined;\n this.firstPage = false;\n this.lastPage = false;\n };\n\n /**\n * Sets the first page of the book\n *\n * @method setFirstPage\n */\n\n this.setFirstPage = function() {\n this.reset();\n this.firstPage = true;\n };\n\n /**\n * Sets the last page of the book\n *\n * @method setLastPage\n */\n\n this.setLastPage = function() {\n this.reset();\n this.lastPage = true;\n };\n\n /**\n * Sets the index of the book\n *\n * @method setPageIndex\n * @param pageIndex\n */\n\n this.setPageIndex = function(pageIndex) {\n this.reset();\n this.spineItemPageIndex = pageIndex;\n };\n\n /**\n * Sets the ID of the current element\n *\n * @method setElementId\n * @param {number} elementId \n */\n\n this.setElementId = function(elementId) {\n this.reset();\n this.elementId = elementId;\n };\n \n /**\n * Sets the CFI of the current element\n *\n * @method setElementCfi\n * @param elementCfi\n */\n\n this.setElementCfi = function(elementCfi) {\n this.reset();\n this.elementCfi = elementCfi;\n };\n\n // Used by ReflowView to better keep track of the current page\n // using just a bookmark to firstVisibleElement makes the current\n // page gradually shift to the beginning of the chapter. By bookmarking\n // both the first and last visible elements, we can keep track of the \n // \"middle\" of the visible area.\n this.setFirstAndLastVisibleCfi = function(firstVisibleCfi, lastVisibleCfi) {\n this.reset();\n this.firstVisibleCfi = firstVisibleCfi;\n this.lastVisibleCfi = lastVisibleCfi;\n }\n\n};\n\nreturn PageOpenRequest;\n});\n", "// Created by Boris Schneiderman.\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine ('readium_shared_js/views/fixed_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"../models/bookmark_data\", \"../models/current_pages_info\",\n \"../models/fixed_page_spread\", \"./one_page_view\", \"../models/page_open_request\", \"../helpers\"],\n function(Globals, $, _, EventEmitter, BookmarkData, CurrentPagesInfo,\n Spread, OnePageView, PageOpenRequest, Helpers) {\n/**\n * View for rendering fixed layout page spread\n * @param options\n * @param reader\n * @constructor\n */\nvar FixedView = function(options, reader){\n\n $.extend(this, new EventEmitter());\n\n var self = this;\n\n var _$el;\n var _$viewport = options.$viewport;\n var _spine = options.spine;\n var _userStyles = options.userStyles;\n var _bookStyles = options.bookStyles;\n var _zoom = options.zoom || {style: 'default'};\n var _currentScale;\n var _iframeLoader = options.iframeLoader;\n var _viewSettings = undefined;\n\n var _leftPageView = createOnePageView(\"fixed-page-frame-left\");\n var _rightPageView = createOnePageView(\"fixed-page-frame-right\");\n var _centerPageView = createOnePageView(\"fixed-page-frame-center\");\n\n var _pageViews = [];\n _pageViews.push(_leftPageView);\n _pageViews.push(_rightPageView);\n _pageViews.push(_centerPageView);\n\n var _spread = new Spread(_spine, false);\n var _bookMargins;\n var _contentMetaSize;\n var _isRedrowing = false;\n var _redrawRequest = false;\n\n function createOnePageView(elementClass) {\n\n var pageView = new OnePageView(options,\n [elementClass],\n false, //enableBookStyleOverrides\n reader\n );\n\n\n pageView.on(OnePageView.Events.SPINE_ITEM_OPEN_START, function($iframe, spineItem) {\n \n Globals.logEvent(\"OnePageView.Events.SPINE_ITEM_OPEN_START\", \"ON\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOAD_START\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\n });\n\n pageView.on(Globals.Events.CONTENT_DOCUMENT_UNLOADED, function($iframe, spineItem) {\n\n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"ON\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n\n Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, $iframe, spineItem);\n });\n\n return pageView;\n }\n\n this.isReflowable = function() {\n return false;\n };\n\n this.setZoom = function(zoom){\n _zoom = zoom;\n\n resizeBook(false); \n }\n\n this.render = function(){\n\n var template = Helpers.loadTemplate(\"fixed_book_frame\", {});\n\n _$el = $(template);\n\n Helpers.CSSTransition(_$el, \"all 0 ease 0\");\n \n _$el.css(\"overflow\", \"hidden\");\n \n // Removed, see one_page_view@render()\n // var settings = reader.viewerSettings();\n // if (!settings || typeof settings.enableGPUHardwareAccelerationCSS3D === \"undefined\")\n // {\n // //defaults\n // settings = new Globals.Models.ViewerSettings({});\n // }\n // if (settings.enableGPUHardwareAccelerationCSS3D) {\n //\n // // This fixes rendering issues with WebView (native apps), which crops content embedded in iframes unless GPU hardware acceleration is enabled for CSS rendering.\n // _$el.css(\"transform\", \"translateZ(0)\");\n // }\n \n _$viewport.append(_$el);\n\n self.applyStyles();\n\n return this;\n };\n\n this.remove = function() {\n\n _$el.remove();\n };\n\n\n this.setViewSettings = function(settings, docWillChange) {\n \n _viewSettings = settings;\n \n _spread.setSyntheticSpread(Helpers.deduceSyntheticSpread(_$viewport, getFirstVisibleItem(), _viewSettings) == true); // force boolean value (from truthy/falsey return value)\n\n var views = getDisplayingViews();\n for(var i = 0, count = views.length; i < count; i++) {\n views[i].setViewSettings(settings, docWillChange);\n }\n };\n\n function getFirstVisibleItem() {\n\n var visibleItems = _spread.validItems();\n return visibleItems[0];\n }\n\n function redraw(initiator, paginationRequest) {\n\n if(_isRedrowing) {\n _redrawRequest = {initiator: initiator, paginationRequest: paginationRequest};\n return;\n }\n\n _isRedrowing = true;\n\n var context = {isElementAdded : false};\n\n var pageLoadDeferrals = createPageLoadDeferrals([\n {pageView: _leftPageView, spineItem: _spread.leftItem, context: context},\n {pageView: _rightPageView, spineItem: _spread.rightItem, context: context},\n {pageView: _centerPageView, spineItem: _spread.centerItem, context: context}]);\n\n $.when.apply($, pageLoadDeferrals).done(function(){\n _isRedrowing = false;\n\n if(_redrawRequest) {\n var p1 = _redrawRequest.initiator;\n var p2 = _redrawRequest.paginationRequest;\n _redrawRequest = undefined;\n redraw(p1, p2);\n }\n else {\n \n if(context.isElementAdded) {\n //self.applyStyles();\n \n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\n updateBookMargins();\n // updateContentMetaSize() and resizeBook() are invoked in onPagesLoaded below\n }\n\n if (paginationRequest)\n {\n onPagesLoaded(initiator, paginationRequest.spineItem, paginationRequest.elementId)\n }\n else\n {\n onPagesLoaded(initiator);\n }\n }\n\n });\n\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n var updatePageSwitchDir = function(dir, hasChanged)\n {\n // irrespective of display state\n if (_leftPageView) _leftPageView.updatePageSwitchDir(dir, hasChanged);\n if (_rightPageView) _rightPageView.updatePageSwitchDir(dir, hasChanged);\n if (_centerPageView) _centerPageView.updatePageSwitchDir(dir, hasChanged);\n\n // var views = getDisplayingViews();\n // for(var i = 0, count = views.length; i < count; i++) {\n // views[i].updatePageSwitchDir(dir, hasChanged);\n // }\n };\n \n\n this.applyStyles = function() {\n\n Helpers.setStyles(_userStyles.getStyles(), _$el.parent());\n updateBookMargins();\n \n updateContentMetaSize();\n resizeBook();\n };\n\n this.applyBookStyles = function() {\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n views[i].applyBookStyles();\n }\n };\n\n function createPageLoadDeferrals(viewItemPairs) {\n\n var pageLoadDeferrals = [];\n\n for(var i = 0; i < viewItemPairs.length; i++) {\n\n var dfd = updatePageViewForItem(viewItemPairs[i].pageView, viewItemPairs[i].spineItem, viewItemPairs[i].context);\n pageLoadDeferrals.push(dfd);\n }\n\n return pageLoadDeferrals;\n\n }\n\n function onPagesLoaded(initiator, paginationRequest_spineItem, paginationRequest_elementId) {\n \n updateContentMetaSize();\n resizeBook();\n \n window.setTimeout(function () {\n \n Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"EMIT\", \"fixed_view.js\");\n self.emit(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, {\n paginationInfo: self.getPaginationInfo(),\n initiator: initiator,\n spineItem: paginationRequest_spineItem,\n elementId: paginationRequest_elementId\n });\n }, 60);\n //this delay of 60ms is to ensure that it triggers\n // after any other 10-50ms timers that defer the pagination process in OnePageView\n }\n\n this.onViewportResize = function() {\n\n //because change of the viewport orientation can alter pagination behaviour we have to check if\n //visible content stays same\n\n var firstVisibleItem = getFirstVisibleItem();\n if(!firstVisibleItem) {\n return;\n }\n\n var isSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, firstVisibleItem, _viewSettings) == true; // force boolean value (from truthy/falsey return value)\n\n if(isSpreadChanged(firstVisibleItem, isSyntheticSpread)) {\n _spread.setSyntheticSpread(isSyntheticSpread);\n var paginationRequest = new PageOpenRequest(firstVisibleItem, self);\n self.openPage(paginationRequest);\n }\n else {\n resizeBook(true);\n }\n };\n\n function isSpreadChanged(firstVisibleItem, isSyntheticSpread) {\n\n var tmpSpread = new Spread(_spine, isSyntheticSpread);\n tmpSpread.openItem(firstVisibleItem);\n\n return _spread.leftItem != tmpSpread.leftItem || _spread.rightItem != tmpSpread.rightItem || _spread.centerItem != tmpSpread.centerItem;\n }\n\n this.getViewScale = function(){\n return _currentScale;\n };\n\n function isContentRendered() {\n\n if(!_contentMetaSize || !_bookMargins) {\n return false;\n }\n\n var viewportWidth = _$viewport.width();\n var viewportHeight = _$viewport.height();\n\n return viewportWidth && viewportHeight;\n }\n\n function resizeBook(viewportIsResizing) {\n\n updatePageSwitchDir(0, false);\n \n if(!isContentRendered()) {\n return;\n }\n\n var viewportWidth = _$viewport.width();\n var viewportHeight = _$viewport.height();\n\n var leftPageMargins = _leftPageView.isDisplaying() ? Helpers.Margins.fromElement(_leftPageView.element()) : Helpers.Margins.empty();\n var rightPageMargins = _rightPageView.isDisplaying() ? Helpers.Margins.fromElement(_rightPageView.element()) : Helpers.Margins.empty();\n var centerPageMargins = _centerPageView.isDisplaying() ? Helpers.Margins.fromElement(_centerPageView.element()) : Helpers.Margins.empty();\n\n var pageMargins = getMaxPageMargins(leftPageMargins, rightPageMargins, centerPageMargins);\n\n var potentialTargetElementSize = { width: viewportWidth - _bookMargins.width(),\n height: viewportHeight - _bookMargins.height()};\n\n var potentialContentSize = { width: potentialTargetElementSize.width - pageMargins.width(),\n height: potentialTargetElementSize.height - pageMargins.height() };\n\n if(potentialTargetElementSize.width <= 0 || potentialTargetElementSize.height <= 0) {\n return;\n }\n\n var horScale = potentialContentSize.width / _contentMetaSize.width;\n var verScale = potentialContentSize.height / _contentMetaSize.height;\n \n _$viewport.css(\"overflow\", \"auto\");\n \n var scale;\n if (_zoom.style == 'fit-width'){\n scale = horScale;\n }\n else if (_zoom.style == 'fit-height'){\n scale = verScale;\n }\n else if (_zoom.style == 'user'){\n scale = _zoom.scale;\n }\n else{\n scale = Math.min(horScale, verScale);\n\n // no need for pan during \"viewport fit\" zoom\n _$viewport.css(\"overflow\", \"hidden\");\n }\n\n _currentScale = scale;\n\n var contentSize = { width: _contentMetaSize.width * scale,\n height: _contentMetaSize.height * scale };\n\n var targetElementSize = { width: contentSize.width + pageMargins.width(),\n height: contentSize.height + pageMargins.height() };\n\n var bookSize = { width: targetElementSize.width + _bookMargins.width(),\n height: targetElementSize.height + _bookMargins.height() };\n\n\n var bookLeft = Math.floor((viewportWidth - bookSize.width) / 2);\n var bookTop = Math.floor((viewportHeight - bookSize.height) / 2);\n\n if(bookLeft < 0) bookLeft = 0;\n if(bookTop < 0) bookTop = 0;\n \n _$el.css(\"left\", bookLeft + \"px\");\n _$el.css(\"top\", bookTop + \"px\");\n _$el.css(\"width\", targetElementSize.width + \"px\");\n _$el.css(\"height\", targetElementSize.height + \"px\");\n\n var left = _bookMargins.padding.left;\n var top = _bookMargins.padding.top;\n\n var transFunc = viewportIsResizing ? \"transformContentImmediate\" : \"transformContent\";\n\n if(_leftPageView.isDisplaying()) {\n\n _leftPageView[transFunc](scale, left, top);\n }\n\n if(_rightPageView.isDisplaying()) {\n\n left += _contentMetaSize.separatorPosition * scale;\n\n if(_leftPageView.isDisplaying()) {\n left += leftPageMargins.left;\n }\n\n _rightPageView[transFunc](scale, left, top);\n }\n\n if(_centerPageView.isDisplaying()) {\n\n _centerPageView[transFunc](scale, left, top);\n }\n \n Globals.logEvent(\"FXL_VIEW_RESIZED\", \"EMIT\", \"fixed_view.js\");\n self.emit(Globals.Events.FXL_VIEW_RESIZED);\n }\n\n function getMaxPageMargins(leftPageMargins, rightPageMargins, centerPageMargins) {\n\n var sumMargin = {\n left: Math.max(leftPageMargins.margin.left, rightPageMargins.margin.left, centerPageMargins.margin.left),\n right: Math.max(leftPageMargins.margin.right, rightPageMargins.margin.right, centerPageMargins.margin.right),\n top: Math.max(leftPageMargins.margin.top, rightPageMargins.margin.top, centerPageMargins.margin.top),\n bottom: Math.max(leftPageMargins.margin.bottom, rightPageMargins.margin.bottom, centerPageMargins.margin.bottom)\n };\n\n var sumBorder = {\n left: Math.max(leftPageMargins.border.left, rightPageMargins.border.left, centerPageMargins.border.left),\n right: Math.max(leftPageMargins.border.right, rightPageMargins.border.right, centerPageMargins.border.right),\n top: Math.max(leftPageMargins.border.top, rightPageMargins.border.top, centerPageMargins.border.top),\n bottom: Math.max(leftPageMargins.border.bottom, rightPageMargins.border.bottom, centerPageMargins.border.bottom)\n };\n\n var sumPAdding = {\n left: Math.max(leftPageMargins.padding.left, rightPageMargins.padding.left, centerPageMargins.padding.left),\n right: Math.max(leftPageMargins.padding.right, rightPageMargins.padding.right, centerPageMargins.padding.right),\n top: Math.max(leftPageMargins.padding.top, rightPageMargins.padding.top, centerPageMargins.padding.top),\n bottom: Math.max(leftPageMargins.padding.bottom, rightPageMargins.padding.bottom, centerPageMargins.padding.bottom)\n };\n\n return new Helpers.Margins(sumMargin, sumBorder, sumPAdding);\n\n }\n\n function updateContentMetaSize() {\n\n _contentMetaSize = {};\n\n if(_centerPageView.isDisplaying()) {\n _contentMetaSize.width = _centerPageView.meta_width();\n _contentMetaSize.height = _centerPageView.meta_height();\n _contentMetaSize.separatorPosition = 0;\n }\n else if(_leftPageView.isDisplaying() && _rightPageView.isDisplaying()) {\n if(_leftPageView.meta_height() == _rightPageView.meta_height()) {\n _contentMetaSize.width = _leftPageView.meta_width() + _rightPageView.meta_width();\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n else {\n //normalize by height\n _contentMetaSize.width = _leftPageView.meta_width() + _rightPageView.meta_width() * (_leftPageView.meta_height() / _rightPageView.meta_height());\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n }\n else if(_leftPageView.isDisplaying()) {\n _contentMetaSize.width = _leftPageView.meta_width() * 2;\n _contentMetaSize.height = _leftPageView.meta_height();\n _contentMetaSize.separatorPosition = _leftPageView.meta_width();\n }\n else if(_rightPageView.isDisplaying()) {\n _contentMetaSize.width = _rightPageView.meta_width() * 2;\n _contentMetaSize.height = _rightPageView.meta_height();\n _contentMetaSize.separatorPosition = _rightPageView.meta_width();\n }\n else {\n _contentMetaSize = undefined;\n }\n\n }\n\n function updateBookMargins() {\n _bookMargins = Helpers.Margins.fromElement(_$el);\n }\n\n // dir: 0 => new or same page, 1 => previous, 2 => next\n this.openPage = function(paginationRequest, dir) {\n\n if(!paginationRequest.spineItem) {\n return;\n }\n\n var leftItem = _spread.leftItem;\n var rightItem = _spread.rightItem;\n var centerItem = _spread.centerItem;\n\n var isSyntheticSpread = Helpers.deduceSyntheticSpread(_$viewport, paginationRequest.spineItem, _viewSettings) == true; // force boolean value (from truthy/falsey return value)\n _spread.setSyntheticSpread(isSyntheticSpread);\n _spread.openItem(paginationRequest.spineItem);\n \n var hasChanged = leftItem !== _spread.leftItem || rightItem !== _spread.rightItem || centerItem !== _spread.centerItem;\n \n if (dir === null || typeof dir === \"undefined\") dir = 0;\n \n updatePageSwitchDir(dir === 0 ? 0 : (_spread.spine.isRightToLeft() ? (dir === 1 ? 2 : 1) : dir), hasChanged);\n \n redraw(paginationRequest.initiator, paginationRequest);\n };\n\n\n this.openPagePrev = function(initiator) {\n\n _spread.openPrev();\n \n updatePageSwitchDir(_spread.spine.isRightToLeft() ? 2 : 1, true);\n \n redraw(initiator, undefined);\n };\n\n this.openPageNext = function(initiator) {\n\n _spread.openNext();\n \n updatePageSwitchDir(_spread.spine.isRightToLeft() ? 1 : 2, true);\n \n redraw(initiator, undefined);\n };\n\n function updatePageViewForItem(pageView, item, context) {\n\n var dfd = $.Deferred();\n\n if(!item) {\n if(pageView.isDisplaying()) {\n pageView.remove();\n }\n\n dfd.resolve();\n }\n else {\n\n //if(pageView.isDisplaying()) { // always DO (no iframe reuse, as this creates problems with BlobURIs, and navigator history ... just like the reflowable view, we re-create an iframe from the template whenever needed for a new spine item URI)\n pageView.remove();\n \n //if(!pageView.isDisplaying()) { // always TRUE\n _$el.append(pageView.render().element());\n context.isElementAdded = true;\n \n\n pageView.loadSpineItem(item, function(success, $iframe, spineItem, isNewContentDocumentLoaded, context){\n\n if(success && isNewContentDocumentLoaded) {\n\n //if we a re loading fixed view meta size should be defined\n if(!pageView.meta_height() || !pageView.meta_width()) {\n console.error(\"Invalid document \" + spineItem.href + \": viewport is not specified!\");\n }\n\n Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"EMIT\", \"fixed_view.js [ \" + spineItem.href + \" ]\");\n self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\n }\n\n dfd.resolve();\n\n }, context);\n }\n\n return dfd.promise();\n }\n\n this.getPaginationInfo = function() {\n\n var paginationInfo = new CurrentPagesInfo(_spine, true);\n\n var spreadItems = [_spread.leftItem, _spread.rightItem, _spread.centerItem];\n\n for(var i = 0; i < spreadItems.length; i++) {\n\n var spreadItem = spreadItems[i];\n\n if(spreadItem) {\n paginationInfo.addOpenPage(0, 1, spreadItem.idref, spreadItem.index);\n }\n }\n\n return paginationInfo;\n };\n\n this.bookmarkCurrentPage = function() {\n\n var views = getDisplayingViews();\n var loadedSpineItems = this.getLoadedSpineItems();\n\n if (views.length > 0) {\n return views[0].getFirstVisibleCfi();\n } else if (loadedSpineItems.length > 0) {\n return new BookmarkData(this.getLoadedSpineItems()[0].idref, null);\n }\n\n return undefined;\n };\n\n function getDisplayingViews() {\n\n var viewsToCheck = [];\n\n if( _spine.isLeftToRight() ) {\n viewsToCheck = [_leftPageView, _centerPageView, _rightPageView];\n }\n else {\n viewsToCheck = [_rightPageView, _centerPageView, _leftPageView];\n }\n\n var views = [];\n\n for(var i = 0, count = viewsToCheck.length; i < count; i++) {\n if(viewsToCheck[i].isDisplaying()) {\n views.push(viewsToCheck[i]);\n }\n }\n\n return views;\n }\n\n this.getLoadedSpineItems = function() {\n\n return _spread.validItems();\n };\n\n function callOnPageView(spineItemIdref, fn) {\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.currentSpineItem().idref == spineItemIdref) {\n return fn(view);\n }\n }\n\n console.error(\"spine item is not loaded\");\n return undefined;\n }\n\n this.getElement = function (spineItemIdref, selector) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElement(spineItemIdref, selector);\n });\n };\n\n this.getElementById = function (spineItemIdref, id) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementById(spineItemIdref, id);\n });\n };\n\n\n this.getElementByCfi = function(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementByCfi(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist);\n });\n };\n \n this.getFirstVisibleMediaOverlayElement = function() {\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n var el = views[i].getFirstVisibleMediaOverlayElement();\n if (el) return el;\n }\n\n return undefined;\n };\n\n this.insureElementVisibility = function(spineItemId, element, initiator) {\n\n //TODO: during zoom+pan, playing element might not actually be visible\n\n };\n \n this.getElements = function(spineItemIdref, selector) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElements(spineItemIdref, selector);\n });\n };\n \n this.isElementVisible = function($element){\n\n //for now we assume that for fixed layouts, elements are always visible\n return true;\n };\n \n this.getVisibleElementsWithFilter = function(filterFunction, includeSpineItems) {\n\n var elements = [];\n\n var views = getDisplayingViews();\n\n for(var i = 0, count = views.length; i < count; i++) {\n //for now we assume that for fixed layouts, elements are always visible\n elements.push(views[i].getAllElementsWithFilter(filterFunction, includeSpineItems));\n }\n\n return elements;\n };\n\n this.getVisibleElements = function (selector, includeSpineItems) {\n\n var elements = [];\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n //for now we assume that for fixed layouts, elements are always visible\n if (includeSpineItems) {\n elements.push({elements: views[i].getElements(views[i].currentSpineItem().idref, selector), spineItem: views[i].currentSpineItem()});\n } else {\n elements.push(views[i].getElements(views[i].currentSpineItem().idref, selector));\n }\n }\n\n return elements;\n };\n\n this.isElementVisible = function($element){\n\n //for now we assume that for fixed layouts, elements are always visible\n return true;\n };\n \n this.isVisibleSpineItemElementCfi = function (spineItemIdref, partialCfi) {\n\n return callOnPageView(spineItemIdref, function (view) {\n //for now we assume that for fixed layouts, everything is always visible\n return true;\n });\n };\n\n this.getNodeRangeInfoFromCfi = function (spineItemIdref, partialCfi) {\n\n return callOnPageView(spineItemIdref, function (view) {\n return view.getNodeRangeInfoFromCfi(spineItemIdref, partialCfi);\n });\n };\n\n\n this.getFirstVisibleCfi = function () {\n var views = getDisplayingViews();\n if (views.length > 0) {\n return views[0].getFirstVisibleCfi();\n }\n return undefined;\n };\n\n this.getLastVisibleCfi = function () {\n var views = getDisplayingViews();\n if (views.length > 0) {\n return views[views.length - 1].getLastVisibleCfi();\n }\n return undefined;\n };\n\n this.getDomRangesFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var views = getDisplayingViews();\n if (rangeCfi2 && rangeCfi.idref !== rangeCfi2.idref) {\n var ranges = [];\n for (var i = 0, count = views.length; i < count; i++) {\n var view = views[i];\n if (view.currentSpineItem().idref === rangeCfi.idref) {\n var last = view.getLastVisibleCfi();\n ranges.push(view.getDomRangeFromRangeCfi(rangeCfi.contentCFI, last.contentCFI, inclusive));\n } else if (view.currentSpineItem().idref === rangeCfi2.idref) {\n var first = view.getFirstVisibleCfi();\n ranges.push(view.getDomRangeFromRangeCfi(first.contentCFI, rangeCfi2.contentCFI, inclusive));\n }\n }\n return ranges;\n }\n\n return [this.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n },\n\n this.getDomRangeFromRangeCfi = function (rangeCfi, rangeCfi2, inclusive) {\n var views = getDisplayingViews();\n if (rangeCfi2 && rangeCfi.idref !== rangeCfi2.idref) {\n console.error(\"getDomRangeFromRangeCfi: both CFIs must be scoped under the same spineitem idref\");\n return undefined;\n }\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.currentSpineItem().idref === rangeCfi.idref) {\n return view.getDomRangeFromRangeCfi(rangeCfi.contentCFI, rangeCfi2 ? rangeCfi2.contentCFI : null, inclusive);\n }\n }\n\n return undefined;\n };\n\n this.getRangeCfiFromDomRange = function (domRange) {\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === domRange.startContainer.ownerDocument) {\n return view.getRangeCfiFromDomRange(domRange);\n }\n }\n\n return undefined;\n };\n\n this.getVisibleCfiFromPoint = function (x, y, precisePoint, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getVisibleCfiFromPoint: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getVisibleCfiFromPoint(x,y, precisePoint);\n });\n };\n\n this.getRangeCfiFromPoints = function (startX, startY, endX, endY, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getRangeCfiFromPoints: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getRangeCfiFromPoints(startX, startY, endX, endY);\n });\n };\n\n this.getCfiForElement = function (element) {\n\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === element.ownerDocument) {\n return view.getCfiForElement(element);\n }\n }\n\n return undefined;\n };\n\n this.getElementFromPoint = function (x, y, spineItemIdref) {\n if (!spineItemIdref) {\n throw new Error(\"getElementFromPoint: Spine item idref must be specified for this fixed layout view.\");\n }\n return callOnPageView(spineItemIdref, function (view) {\n return view.getElementFromPoint(x,y);\n });\n };\n\n this.getStartCfi = function () {\n return getDisplayingViews()[0].getStartCfi();\n };\n\n this.getEndCfi = function () {\n return getDisplayingViews()[0].getEndCfi();\n };\n\n this.getNearestCfiFromElement = function(element) {\n var views = getDisplayingViews();\n\n for (var i = 0, count = views.length; i < count; i++) {\n\n var view = views[i];\n if (view.getLoadedContentFrames()[0].$iframe[0].contentDocument === element.ownerDocument) {\n return view.getNearestCfiFromElement(element);\n }\n }\n\n };\n\n};\n return FixedView;\n});\n\n", - "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/iframe_loader',[\"jquery\", \"underscore\"], function($, _) {\n/**\n *\n * @constructor\n */\nvar IFrameLoader = function() {\n\n var self = this;\n var eventListeners = {};\n\n\n this.addIFrameEventListener = function (eventName, callback, context) {\n\n if (eventListeners[eventName] == undefined) {\n eventListeners[eventName] = [];\n }\n\n eventListeners[eventName].push({callback: callback, context: context});\n };\n\n this.updateIframeEvents = function (iframe) {\n\n _.each(eventListeners, function (value, key) {\n $(iframe.contentWindow).off(key);\n for (var i = 0, count = value.length; i < count; i++) {\n $(iframe.contentWindow).on(key, value[i].callback, value[i].context);\n }\n });\n };\n\n this.loadIframe = function (iframe, src, callback, context, attachedData) {\n\n if (!iframe.baseURI) {\n if (typeof location !== 'undefined') {\n iframe.baseURI = location.href + \"\";\n }\n console.error(\"!iframe.baseURI => \" + iframe.baseURI);\n }\n \n console.log(\"EPUB doc iframe src:\");\n console.log(src);\n console.log(\"EPUB doc iframe base URI:\");\n console.log(iframe.baseURI);\n \n iframe.setAttribute(\"data-baseUri\", iframe.baseURI);\n iframe.setAttribute(\"data-src\", src);\n\n var loadedDocumentUri = new URI(src).absoluteTo(iframe.baseURI).search('').hash('').toString();\n\n self._loadIframeWithUri(iframe, attachedData, loadedDocumentUri, function () {\n \n callback.call(context, true, attachedData);\n });\n };\n\n this._loadIframeWithUri = function (iframe, attachedData, contentUri, callback) {\n\n iframe.onload = function () {\n\n var doc = iframe.contentDocument || iframe.contentWindow.document;\n $('svg', doc).on(\"load\", function(){\n console.log('SVG loaded');\n });\n \n self.updateIframeEvents(iframe);\n\n var mathJax = iframe.contentWindow.MathJax;\n if (mathJax) {\n \n console.log(\"MathJax VERSION: \" + mathJax.cdnVersion + \" // \" + mathJax.fileversion + \" // \" + mathJax.version);\n \n var useFontCache = true; // default in MathJax\n \n // Firefox fails to render SVG otherwise\n if (mathJax.Hub.Browser.isFirefox) {\n useFontCache = false;\n }\n \n // Chrome 49+ fails to render SVG otherwise\n // https://github.com/readium/readium-js/issues/138\n if (mathJax.Hub.Browser.isChrome) {\n useFontCache = false;\n }\n \n // Edge fails to render SVG otherwise\n // https://github.com/readium/readium-js-viewer/issues/394#issuecomment-185382196\n if (window.navigator.userAgent.indexOf(\"Edge\") > 0) {\n useFontCache = false;\n }\n \n mathJax.Hub.Config({showMathMenu:false, messageStyle: \"none\", showProcessingMessages: true, SVG:{useFontCache:useFontCache}});\n \n // If MathJax is being used, delay the callback until it has completed rendering\n var mathJaxCallback = _.once(callback);\n try {\n mathJax.Hub.Queue(mathJaxCallback);\n } catch (err) {\n console.error(\"MathJax fail!\");\n callback();\n }\n // Or at an 8 second timeout, which ever comes first\n //window.setTimeout(mathJaxCallback, 8000);\n } else {\n callback();\n }\n };\n\n iframe.setAttribute(\"src\", contentUri);\n };\n\n};\n\nreturn IFrameLoader;\n});\n\n", - "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js'], function($, Helpers, epubCfi) {\n/**\n *\n * @param reader\n * @constructor\n */\nvar InternalLinksSupport = function(reader) {\n\n var self = this;\n\n function splitCfi(fullCfi) {\n\n var startIx = fullCfi.indexOf(\"(\");\n var bungIx = fullCfi.indexOf(\"!\");\n var endIx = fullCfi.indexOf(\")\");\n\n if(bungIx == -1) {\n return undefined;\n }\n\n if(endIx == -1) {\n endIx = fullCfi.length;\n }\n\n return {\n\n spineItemCfi: fullCfi.substring(startIx + 1, bungIx),\n elementCfi: fullCfi.substring(bungIx + 1, endIx)\n }\n }\n\n function getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem) {\n\n var fullPath = reader.package().resolveRelativeUrl(spineItem.href);\n\n var absUrl = hrefUri.absoluteTo(fullPath);\n\n return absUrl;\n }\n\n function processDeepLink(hrefUri, spineItem) {\n\n var absoluteOpfUri = getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem);\n\n if(!absoluteOpfUri) {\n console.error(\"Unable to resolve \" + hrefUri.href())\n return;\n }\n\n var fullCfi = hrefUri.fragment();\n\n var absPath = absoluteOpfUri.toString();\n\n absPath = Helpers.RemoveFromString(absPath, \"#\" + fullCfi);\n\n readOpfFile(absPath, function(opfText) {\n\n if(!opfText) {\n return;\n }\n\n var parser = new window.DOMParser;\n var packageDom = parser.parseFromString(opfText, 'text/xml');\n var cfi = splitCfi(fullCfi);\n\n if(!cfi) {\n console.warn(\"Unable to split cfi:\" + fullCfi);\n return;\n }\n\n var contentDocRef = EPUBcfi.Interpreter.getContentDocHref(\"epubcfi(\" + cfi.spineItemCfi + \")\", packageDom);\n\n if(contentDocRef) {\n\n var newSpineItem = reader.spine().getItemByHref(contentDocRef);\n if(newSpineItem) {\n\n reader.openSpineItemElementCfi(newSpineItem.idref, cfi.elementCfi, self);\n }\n else {\n console.warn(\"Unable to find spineItem with href=\" + contentDocRef);\n }\n\n }\n else {\n console.warn(\"Unable to find document ref from \" + fullCfi +\" cfi\");\n }\n\n });\n\n }\n\n function readOpfFile(path, callback) {\n\n //TODO: this should use readium-js resource fetcher (file / URI access abstraction layer), as right now this fails with packed EPUBs \n $.ajax({\n // encoding: \"UTF-8\",\n // mimeType: \"text/plain; charset=UTF-8\",\n // beforeSend: function( xhr ) {\n // xhr.overrideMimeType(\"text/plain; charset=UTF-8\");\n // },\n isLocal: path.indexOf(\"http\") === 0 ? false : true,\n url: path,\n dataType: 'text',\n async: true,\n success: function (result) {\n callback(result);\n },\n error: function (xhr, status, errorThrown) {\n console.error('Error when AJAX fetching ' + path);\n console.error(status);\n console.error(errorThrown);\n callback();\n }\n });\n }\n\n //checks if href includes path to opf file and full cfi\n function isDeepLikHref(uri) {\n\n var fileName = uri.filename();\n return fileName && Helpers.EndsWith(fileName, \".opf\");\n }\n\n function processLinkWithHash(hrefUri, spineItem) {\n\n var fileName = hrefUri.filename();\n\n var idref;\n\n //reference to another file\n if(fileName) {\n var normalizedUri = new URI(hrefUri, spineItem.href);\n \n var pathname = decodeURIComponent(normalizedUri.pathname());\n \n var newSpineItem = reader.spine().getItemByHref(pathname);\n\n if(!newSpineItem) {\n console.error(\"spine item with href=\" + pathname + \" not found\");\n return;\n }\n\n idref = newSpineItem.idref;\n }\n else { //hush in the same file\n idref = spineItem.idref;\n }\n\n var hashFrag = hrefUri.fragment();\n\n reader.openSpineItemElementId(idref, hashFrag, self);\n\n }\n\n this.processLinkElements = function($iframe, spineItem) {\n\n var epubContentDocument = $iframe[0].contentDocument;\n\n $('a', epubContentDocument).click(function (clickEvent) {\n // Check for both href and xlink:href attribute and get value\n var href;\n if (clickEvent.currentTarget.attributes[\"xlink:href\"]) {\n \n href = clickEvent.currentTarget.attributes[\"xlink:href\"].value;\n }\n else {\n href = clickEvent.currentTarget.attributes[\"href\"].value;\n }\n\n var overrideClickEvent = false;\n var hrefUri = new URI(href);\n var hrefIsRelative = hrefUri.is('relative');\n\n if (hrefIsRelative) {\n\n if(isDeepLikHref(hrefUri)) {\n processDeepLink(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n else {\n processLinkWithHash(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n\n } else {\n // It's an absolute URL to a remote site - open it in a separate window outside the reader\n window.open(href, '_blank');\n overrideClickEvent = true;\n }\n\n if (overrideClickEvent) {\n clickEvent.preventDefault();\n clickEvent.stopPropagation();\n }\n });\n\n }\n\n};\n\nreturn InternalLinksSupport;\n});\n\n", + "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/iframe_loader',[\"jquery\", \"underscore\", 'URIjs'], function($, _, URI) {\n/**\n *\n * @constructor\n */\nvar IFrameLoader = function() {\n\n var self = this;\n var eventListeners = {};\n\n\n this.addIFrameEventListener = function (eventName, callback, context) {\n\n if (eventListeners[eventName] == undefined) {\n eventListeners[eventName] = [];\n }\n\n eventListeners[eventName].push({callback: callback, context: context});\n };\n\n this.updateIframeEvents = function (iframe) {\n\n _.each(eventListeners, function (value, key) {\n $(iframe.contentWindow).off(key);\n for (var i = 0, count = value.length; i < count; i++) {\n $(iframe.contentWindow).on(key, value[i].callback, value[i].context);\n }\n });\n };\n\n this.loadIframe = function (iframe, src, callback, context, attachedData) {\n\n if (!iframe.baseURI) {\n if (typeof location !== 'undefined') {\n iframe.baseURI = location.href + \"\";\n }\n console.error(\"!iframe.baseURI => \" + iframe.baseURI);\n }\n \n console.log(\"EPUB doc iframe src:\");\n console.log(src);\n console.log(\"EPUB doc iframe base URI:\");\n console.log(iframe.baseURI);\n \n iframe.setAttribute(\"data-baseUri\", iframe.baseURI);\n iframe.setAttribute(\"data-src\", src);\n\n var loadedDocumentUri = new URI(src).absoluteTo(iframe.baseURI).search('').hash('').toString();\n\n self._loadIframeWithUri(iframe, attachedData, loadedDocumentUri, function () {\n \n callback.call(context, true, attachedData);\n });\n };\n\n this._loadIframeWithUri = function (iframe, attachedData, contentUri, callback) {\n\n iframe.onload = function () {\n\n var doc = iframe.contentDocument || iframe.contentWindow.document;\n $('svg', doc).on(\"load\", function(){\n console.log('SVG loaded');\n });\n \n self.updateIframeEvents(iframe);\n\n var mathJax = iframe.contentWindow.MathJax;\n if (mathJax) {\n \n console.log(\"MathJax VERSION: \" + mathJax.cdnVersion + \" // \" + mathJax.fileversion + \" // \" + mathJax.version);\n \n var useFontCache = true; // default in MathJax\n \n // Firefox fails to render SVG otherwise\n if (mathJax.Hub.Browser.isFirefox) {\n useFontCache = false;\n }\n \n // Chrome 49+ fails to render SVG otherwise\n // https://github.com/readium/readium-js/issues/138\n if (mathJax.Hub.Browser.isChrome) {\n useFontCache = false;\n }\n \n // Edge fails to render SVG otherwise\n // https://github.com/readium/readium-js-viewer/issues/394#issuecomment-185382196\n if (window.navigator.userAgent.indexOf(\"Edge\") > 0) {\n useFontCache = false;\n }\n \n mathJax.Hub.Config({showMathMenu:false, messageStyle: \"none\", showProcessingMessages: true, SVG:{useFontCache:useFontCache}});\n \n // If MathJax is being used, delay the callback until it has completed rendering\n var mathJaxCallback = _.once(callback);\n try {\n mathJax.Hub.Queue(mathJaxCallback);\n } catch (err) {\n console.error(\"MathJax fail!\");\n callback();\n }\n // Or at an 8 second timeout, which ever comes first\n //window.setTimeout(mathJaxCallback, 8000);\n } else {\n callback();\n }\n };\n\n iframe.setAttribute(\"src\", contentUri);\n };\n\n};\n\nreturn IFrameLoader;\n});\n\n", + "// Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/internal_links_support',['jquery', '../helpers', 'readium_cfi_js', 'URIjs'], function($, Helpers, epubCfi, URI) {\n/**\n *\n * @param reader\n * @constructor\n */\nvar InternalLinksSupport = function(reader) {\n\n var self = this;\n\n function splitCfi(fullCfi) {\n\n var startIx = fullCfi.indexOf(\"(\");\n var bungIx = fullCfi.indexOf(\"!\");\n var endIx = fullCfi.indexOf(\")\");\n\n if(bungIx == -1) {\n return undefined;\n }\n\n if(endIx == -1) {\n endIx = fullCfi.length;\n }\n\n return {\n\n spineItemCfi: fullCfi.substring(startIx + 1, bungIx),\n elementCfi: fullCfi.substring(bungIx + 1, endIx)\n }\n }\n\n function getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem) {\n\n var fullPath = reader.package().resolveRelativeUrl(spineItem.href);\n\n var absUrl = hrefUri.absoluteTo(fullPath);\n\n return absUrl;\n }\n\n function processDeepLink(hrefUri, spineItem) {\n\n var absoluteOpfUri = getAbsoluteUriRelativeToSpineItem(hrefUri, spineItem);\n\n if(!absoluteOpfUri) {\n console.error(\"Unable to resolve \" + hrefUri.href())\n return;\n }\n\n var fullCfi = hrefUri.fragment();\n\n var absPath = absoluteOpfUri.toString();\n\n absPath = Helpers.RemoveFromString(absPath, \"#\" + fullCfi);\n\n readOpfFile(absPath, function(opfText) {\n\n if(!opfText) {\n return;\n }\n\n var parser = new window.DOMParser;\n var packageDom = parser.parseFromString(opfText, 'text/xml');\n var cfi = splitCfi(fullCfi);\n\n if(!cfi) {\n console.warn(\"Unable to split cfi:\" + fullCfi);\n return;\n }\n\n var contentDocRef = EPUBcfi.Interpreter.getContentDocHref(\"epubcfi(\" + cfi.spineItemCfi + \")\", packageDom);\n\n if(contentDocRef) {\n\n var newSpineItem = reader.spine().getItemByHref(contentDocRef);\n if(newSpineItem) {\n\n reader.openSpineItemElementCfi(newSpineItem.idref, cfi.elementCfi, self);\n }\n else {\n console.warn(\"Unable to find spineItem with href=\" + contentDocRef);\n }\n\n }\n else {\n console.warn(\"Unable to find document ref from \" + fullCfi +\" cfi\");\n }\n\n });\n\n }\n\n function readOpfFile(path, callback) {\n\n //TODO: this should use readium-js resource fetcher (file / URI access abstraction layer), as right now this fails with packed EPUBs \n $.ajax({\n // encoding: \"UTF-8\",\n // mimeType: \"text/plain; charset=UTF-8\",\n // beforeSend: function( xhr ) {\n // xhr.overrideMimeType(\"text/plain; charset=UTF-8\");\n // },\n isLocal: path.indexOf(\"http\") === 0 ? false : true,\n url: path,\n dataType: 'text',\n async: true,\n success: function (result) {\n callback(result);\n },\n error: function (xhr, status, errorThrown) {\n console.error('Error when AJAX fetching ' + path);\n console.error(status);\n console.error(errorThrown);\n callback();\n }\n });\n }\n\n //checks if href includes path to opf file and full cfi\n function isDeepLikHref(uri) {\n\n var fileName = uri.filename();\n return fileName && Helpers.EndsWith(fileName, \".opf\");\n }\n\n function processLinkWithHash(hrefUri, spineItem) {\n\n var fileName = hrefUri.filename();\n\n var idref;\n\n //reference to another file\n if(fileName) {\n var normalizedUri = new URI(hrefUri, spineItem.href);\n \n var pathname = decodeURIComponent(normalizedUri.pathname());\n \n var newSpineItem = reader.spine().getItemByHref(pathname);\n\n if(!newSpineItem) {\n console.error(\"spine item with href=\" + pathname + \" not found\");\n return;\n }\n\n idref = newSpineItem.idref;\n }\n else { //hush in the same file\n idref = spineItem.idref;\n }\n\n var hashFrag = hrefUri.fragment();\n\n reader.openSpineItemElementId(idref, hashFrag, self);\n\n }\n\n this.processLinkElements = function($iframe, spineItem) {\n\n var epubContentDocument = $iframe[0].contentDocument;\n\n $('a', epubContentDocument).click(function (clickEvent) {\n // Check for both href and xlink:href attribute and get value\n var href;\n if (clickEvent.currentTarget.attributes[\"xlink:href\"]) {\n \n href = clickEvent.currentTarget.attributes[\"xlink:href\"].value;\n }\n else {\n href = clickEvent.currentTarget.attributes[\"href\"].value;\n }\n\n var overrideClickEvent = false;\n var hrefUri = new URI(href);\n var hrefIsRelative = hrefUri.is('relative');\n\n if (hrefIsRelative) {\n\n if(isDeepLikHref(hrefUri)) {\n processDeepLink(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n else {\n processLinkWithHash(hrefUri, spineItem);\n overrideClickEvent = true;\n }\n\n } else {\n // It's an absolute URL to a remote site - open it in a separate window outside the reader\n window.open(href, '_blank');\n overrideClickEvent = true;\n }\n\n if (overrideClickEvent) {\n clickEvent.preventDefault();\n clickEvent.stopPropagation();\n }\n });\n\n }\n\n};\n\nreturn InternalLinksSupport;\n});\n\n", "// LauncherOSX\n//\n// Created by Boris Schneiderman.\n// Modified by Daniel Weck\n// Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n// \n// Redistribution and use in source and binary forms, with or without modification, \n// are permitted provided that the following conditions are met:\n// 1. Redistributions of source code must retain the above copyright notice, this \n// list of conditions and the following disclaimer.\n// 2. Redistributions in binary form must reproduce the above copyright notice, \n// this list of conditions and the following disclaimer in the documentation and/or \n// other materials provided with the distribution.\n// 3. Neither the name of the organization nor the names of its contributors may be \n// used to endorse or promote products derived from this software without specific \n// prior written permission.\n// \n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n// IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n// OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine ('readium_shared_js/models/smil_iterator',[\"jquery\", \"../helpers\"], function($, Helpers) {\n/**\n * Wrapper of a smil iterator object. \n * A smil iterator is used by the media overlay player, to move along text areas which have an audio overlay. \n * Such areas are specified in the smil model via parallel smil nodes (text + audio). \n *\n * @class Models.SmilIterator\n * @constructor\n * @param {Models.SmilModel} smil The current smil model\n */\nvar SmilIterator = function(smil) {\n\n /**\n * The smil model\n *\n * @property smil\n * @type Models.SmilModel\n */\n this.smil = smil;\n\n /**\n * The current parallel smil node\n *\n * @property currentPar\n * @type object\n */\n \n this.currentPar = undefined;\n\n /**\n * Resets the iterator. \n * In practice, looks for the first parallel smil node in the smil model\n *\n * @method reset\n */\n\n this.reset = function() {\n this.currentPar = findParNode(0, this.smil, false);\n };\n\n /*\n this.firstDeep = function(container) {\n var par = container.nodeType === \"par\" ? container : findParNode(0, container, false);\n\n return par;\n };\n */\n//\n// this.ensureNextValidTextElement = function()\n// {\n// if (!this.currentPar)\n// {\n// console.debug(\"Par iterator is out of range\");\n// return;\n// }\n//\n// while (this.currentPar && !this.currentPar.element)\n// {\n// this.next();\n// }\n// };\n \n /**\n * Looks for a text smil node identified by the id parameter \n * Returns true if the id param identifies a text smil node.\n *\n * @method findTextId\n * @param {Number} id A smil node identifier\n * @return {Boolean} \n */\n this.findTextId = function(id)\n {\n if (!this.currentPar)\n {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n if (!id)\n {\n return false;\n }\n\n while (this.currentPar)\n {\n if (this.currentPar.element)\n {\n if (id === this.currentPar.text.srcFragmentId) //this.currentPar.element.id\n {\n return true;\n }\n\n // OUTER match\n var parent = this.currentPar.element.parentNode;\n while(parent)\n {\n if (parent.id && parent.id == id)\n {\n return true;\n }\n\n parent = parent.parentNode;\n }\n //console.log(parent);\n\n // INNER match\n //var inside = this.currentPar.element.ownerDocument.getElementById(id);\n var inside = $(\"#\" + Helpers.escapeJQuerySelector(id), this.currentPar.element);\n if (inside && inside.length && inside[0])\n {\n return true;\n }\n }\n // moves to the next parallel smil node\n this.next();\n }\n\n return false;\n }\n\n /**\n * Looks for the next parallel smil node\n *\n * @method next \n */\n\n this.next = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n this.currentPar = findParNode(this.currentPar.index + 1, this.currentPar.parent, false);\n };\n\n /**\n * Looks for the previous parallel smil node\n *\n * @method previous\n */\n\n this.previous = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n this.currentPar = findParNode(this.currentPar.index - 1, this.currentPar.parent, true);\n };\n\n /**\n * Checks if the current parallel smil node is the last one in the smil model\n *\n * @method isLast\n * @return {Bool}\n */\n\n this.isLast = function() {\n\n if(!this.currentPar) {\n console.debug(\"Par iterator is out of range\");\n return;\n }\n\n if (findParNode(this.currentPar.index + 1, this.currentPar.parent, false))\n {\n return false;\n }\n\n return true;\n }\n\n /**\n * Moves to the parallel smil node given as a parameter. \n *\n * @method goToPar\n * @param {Containter} par A parallel smil node\n * @return {Boolean} \n */\n\n this.goToPar = function(par) {\n\n while(this.currentPar) {\n if(this.currentPar == par) {\n break;\n }\n\n this.next();\n }\n };\n\n /**\n * Looks for a parallel smil node in the smil model.\n *\n * @method findParNode\n * @param {Number} startIndex Start index inside the container\n * @param {Models.SMilModel} container The smil model\n * @param {Boolean} previous True if search among previous nodes\n * @return {Smil.ParNode} \n */\n\n function findParNode(startIndex, container, previous) {\n\n for(var i = startIndex, count = container.children.length;\n i >= 0 && i < count;\n i += (previous ? -1 : 1)) {\n\n var node = container.children[i];\n if(node.nodeType == \"par\") {\n return node;\n }\n\n // assert(node.nodeType == \"seq\")\n node = findParNode(previous ? node.children.length - 1 : 0, node, previous);\n\n if(node) {\n return node;\n }\n }\n\n if(container.parent) {\n return findParNode(container.index + (previous ? -1 : 1), container.parent, previous);\n }\n\n return undefined;\n }\n\n this.reset();\n};\n\nreturn SmilIterator;\n});\n\n", "/**\n * @license domReady 2.0.1 Copyright jQuery Foundation and other contributors.\n * Released under MIT license, http://github.com/requirejs/domReady/LICENSE\n */\n/*jslint */\n/*global require: false, define: false, requirejs: false,\n window: false, clearInterval: false, document: false,\n self: false, setInterval: false */\n\n\ndefine('domReady',[],function () {\n 'use strict';\n\n var isTop, testDiv, scrollIntervalId,\n isBrowser = typeof window !== \"undefined\" && window.document,\n isPageLoaded = !isBrowser,\n doc = isBrowser ? document : null,\n readyCalls = [];\n\n function runCallbacks(callbacks) {\n var i;\n for (i = 0; i < callbacks.length; i += 1) {\n callbacks[i](doc);\n }\n }\n\n function callReady() {\n var callbacks = readyCalls;\n\n if (isPageLoaded) {\n //Call the DOM ready callbacks\n if (callbacks.length) {\n readyCalls = [];\n runCallbacks(callbacks);\n }\n }\n }\n\n /**\n * Sets the page as loaded.\n */\n function pageLoaded() {\n if (!isPageLoaded) {\n isPageLoaded = true;\n if (scrollIntervalId) {\n clearInterval(scrollIntervalId);\n }\n\n callReady();\n }\n }\n\n if (isBrowser) {\n if (document.addEventListener) {\n //Standards. Hooray! Assumption here that if standards based,\n //it knows about DOMContentLoaded.\n document.addEventListener(\"DOMContentLoaded\", pageLoaded, false);\n window.addEventListener(\"load\", pageLoaded, false);\n } else if (window.attachEvent) {\n window.attachEvent(\"onload\", pageLoaded);\n\n testDiv = document.createElement('div');\n try {\n isTop = window.frameElement === null;\n } catch (e) {}\n\n //DOMContentLoaded approximation that uses a doScroll, as found by\n //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/,\n //but modified by other contributors, including jdalton\n if (testDiv.doScroll && isTop && window.external) {\n scrollIntervalId = setInterval(function () {\n try {\n testDiv.doScroll();\n pageLoaded();\n } catch (e) {}\n }, 30);\n }\n }\n\n //Check if document already complete, and if so, just trigger page load\n //listeners. Latest webkit browsers also use \"interactive\", and\n //will fire the onDOMContentLoaded before \"interactive\" but not after\n //entering \"interactive\" or \"complete\". More details:\n //http://dev.w3.org/html5/spec/the-end.html#the-end\n //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded\n //Hmm, this is more complicated on further use, see \"firing too early\"\n //bug: https://github.com/requirejs/domReady/issues/1\n //so removing the || document.readyState === \"interactive\" test.\n //There is still a window.onload binding that should get fired if\n //DOMContentLoaded is missed.\n if (document.readyState === \"complete\") {\n pageLoaded();\n }\n }\n\n /** START OF PUBLIC API **/\n\n /**\n * Registers a callback for DOM ready. If DOM is already ready, the\n * callback is called immediately.\n * @param {Function} callback\n */\n function domReady(callback) {\n if (isPageLoaded) {\n callback(doc);\n } else {\n readyCalls.push(callback);\n }\n return domReady;\n }\n\n domReady.version = '2.0.1';\n\n /**\n * Loader Plugin API method\n */\n domReady.load = function (name, req, onLoad, config) {\n if (config.isBuild) {\n onLoad(null);\n } else {\n domReady(onLoad);\n }\n };\n\n /** END OF PUBLIC API **/\n\n return domReady;\n});\n\n", "/**\n * Rangy, a cross-browser JavaScript range and selection library\n * http://code.google.com/p/rangy/\n *\n * Copyright 2013, Tim Down\n * Licensed under the MIT license.\n * Version: 1.3alpha.804\n * Build date: 8 December 2013\n */\n\n(function(global) {\n var amdSupported = (typeof global.define == \"function\" && global.define.amd);\n\n var OBJECT = \"object\", FUNCTION = \"function\", UNDEFINED = \"undefined\";\n\n // Minimal set of properties required for DOM Level 2 Range compliance. Comparison constants such as START_TO_START\n // are omitted because ranges in KHTML do not have them but otherwise work perfectly well. See issue 113.\n var domRangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n // Minimal set of methods required for DOM Level 2 Range compliance\n var domRangeMethods = [\"setStart\", \"setStartBefore\", \"setStartAfter\", \"setEnd\", \"setEndBefore\",\n \"setEndAfter\", \"collapse\", \"selectNode\", \"selectNodeContents\", \"compareBoundaryPoints\", \"deleteContents\",\n \"extractContents\", \"cloneContents\", \"insertNode\", \"surroundContents\", \"cloneRange\", \"toString\", \"detach\"];\n\n var textRangeProperties = [\"boundingHeight\", \"boundingLeft\", \"boundingTop\", \"boundingWidth\", \"htmlText\", \"text\"];\n\n // Subset of TextRange's full set of methods that we're interested in\n var textRangeMethods = [\"collapse\", \"compareEndPoints\", \"duplicate\", \"moveToElementText\", \"parentElement\", \"select\",\n \"setEndPoint\", \"getBoundingClientRect\"];\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Trio of functions taken from Peter Michaux's article:\n // http://peter.michaux.ca/articles/feature-detection-state-of-the-art-browser-scripting\n function isHostMethod(o, p) {\n var t = typeof o[p];\n return t == FUNCTION || (!!(t == OBJECT && o[p])) || t == \"unknown\";\n }\n\n function isHostObject(o, p) {\n return !!(typeof o[p] == OBJECT && o[p]);\n }\n\n function isHostProperty(o, p) {\n return typeof o[p] != UNDEFINED;\n }\n\n // Creates a convenience function to save verbose repeated calls to tests functions\n function createMultiplePropertyTest(testFunc) {\n return function(o, props) {\n var i = props.length;\n while (i--) {\n if (!testFunc(o, props[i])) {\n return false;\n }\n }\n return true;\n };\n }\n\n // Next trio of functions are a convenience to save verbose repeated calls to previous two functions\n var areHostMethods = createMultiplePropertyTest(isHostMethod);\n var areHostObjects = createMultiplePropertyTest(isHostObject);\n var areHostProperties = createMultiplePropertyTest(isHostProperty);\n\n function isTextRange(range) {\n return range && areHostMethods(range, textRangeMethods) && areHostProperties(range, textRangeProperties);\n }\n\n function getBody(doc) {\n return isHostObject(doc, \"body\") ? doc.body : doc.getElementsByTagName(\"body\")[0];\n }\n\n var modules = {};\n\n var api = {\n version: \"1.3alpha.804\",\n initialized: false,\n supported: true,\n\n util: {\n isHostMethod: isHostMethod,\n isHostObject: isHostObject,\n isHostProperty: isHostProperty,\n areHostMethods: areHostMethods,\n areHostObjects: areHostObjects,\n areHostProperties: areHostProperties,\n isTextRange: isTextRange,\n getBody: getBody\n },\n\n features: {},\n\n modules: modules,\n config: {\n alertOnFail: true,\n alertOnWarn: false,\n preferTextRange: false\n }\n };\n\n function consoleLog(msg) {\n if (isHostObject(window, \"console\") && isHostMethod(window.console, \"log\")) {\n window.console.log(msg);\n }\n }\n\n function alertOrLog(msg, shouldAlert) {\n if (shouldAlert) {\n window.alert(msg);\n } else {\n consoleLog(msg);\n }\n }\n\n function fail(reason) {\n api.initialized = true;\n api.supported = false;\n alertOrLog(\"Rangy is not supported on this page in your browser. Reason: \" + reason, api.config.alertOnFail);\n }\n\n api.fail = fail;\n\n function warn(msg) {\n alertOrLog(\"Rangy warning: \" + msg, api.config.alertOnWarn);\n }\n\n api.warn = warn;\n\n // Add utility extend() method\n if ({}.hasOwnProperty) {\n api.util.extend = function(obj, props, deep) {\n var o, p;\n for (var i in props) {\n if (props.hasOwnProperty(i)) {\n o = obj[i];\n p = props[i];\n //if (deep) alert([o !== null, typeof o == \"object\", p !== null, typeof p == \"object\"])\n if (deep && o !== null && typeof o == \"object\" && p !== null && typeof p == \"object\") {\n api.util.extend(o, p, true);\n }\n obj[i] = p;\n }\n }\n return obj;\n };\n } else {\n fail(\"hasOwnProperty not supported\");\n }\n\n // Test whether Array.prototype.slice can be relied on for NodeLists and use an alternative toArray() if not\n (function() {\n var el = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"div\");\n el.appendChild(document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"span\"));\n var slice = [].slice;\n var toArray;\n try {\n if (slice.call(el.childNodes, 0)[0].nodeType == 1) {\n toArray = function(arrayLike) {\n return slice.call(arrayLike, 0);\n };\n }\n } catch (e) {}\n\n if (!toArray) {\n toArray = function(arrayLike) {\n var arr = [];\n for (var i = 0, len = arrayLike.length; i < len; ++i) {\n arr[i] = arrayLike[i];\n }\n return arr;\n };\n }\n\n api.util.toArray = toArray;\n })();\n\n\n // Very simple event handler wrapper function that doesn't attempt to solve issues such as \"this\" handling or\n // normalization of event properties\n var addListener;\n if (isHostMethod(document, \"addEventListener\")) {\n addListener = function(obj, eventType, listener) {\n obj.addEventListener(eventType, listener, false);\n };\n } else if (isHostMethod(document, \"attachEvent\")) {\n addListener = function(obj, eventType, listener) {\n obj.attachEvent(\"on\" + eventType, listener);\n };\n } else {\n fail(\"Document does not have required addEventListener or attachEvent method\");\n }\n\n api.util.addListener = addListener;\n\n var initListeners = [];\n\n function getErrorDesc(ex) {\n return ex.message || ex.description || String(ex);\n }\n\n // Initialization\n function init() {\n if (api.initialized) {\n return;\n }\n var testRange;\n var implementsDomRange = false, implementsTextRange = false;\n\n // First, perform basic feature tests\n\n if (isHostMethod(document, \"createRange\")) {\n testRange = document.createRange();\n if (areHostMethods(testRange, domRangeMethods) && areHostProperties(testRange, domRangeProperties)) {\n implementsDomRange = true;\n }\n testRange.detach();\n }\n\n var body = getBody(document);\n if (!body || body.nodeName.toLowerCase() != \"body\") {\n fail(\"No body element found\");\n return;\n }\n\n if (body && isHostMethod(body, \"createTextRange\")) {\n testRange = body.createTextRange();\n if (isTextRange(testRange)) {\n implementsTextRange = true;\n }\n }\n\n if (!implementsDomRange && !implementsTextRange) {\n fail(\"Neither Range nor TextRange are available\");\n return;\n }\n\n api.initialized = true;\n api.features = {\n implementsDomRange: implementsDomRange,\n implementsTextRange: implementsTextRange\n };\n\n // Initialize modules\n var module, errorMessage;\n for (var moduleName in modules) {\n if ( (module = modules[moduleName]) instanceof Module ) {\n module.init(module, api);\n }\n }\n\n // Call init listeners\n for (var i = 0, len = initListeners.length; i < len; ++i) {\n try {\n initListeners[i](api);\n } catch (ex) {\n errorMessage = \"Rangy init listener threw an exception. Continuing. Detail: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n }\n }\n }\n\n // Allow external scripts to initialize this library in case it's loaded after the document has loaded\n api.init = init;\n\n // Execute listener immediately if already initialized\n api.addInitListener = function(listener) {\n if (api.initialized) {\n listener(api);\n } else {\n initListeners.push(listener);\n }\n };\n\n var createMissingNativeApiListeners = [];\n\n api.addCreateMissingNativeApiListener = function(listener) {\n createMissingNativeApiListeners.push(listener);\n };\n\n function createMissingNativeApi(win) {\n win = win || window;\n init();\n\n // Notify listeners\n for (var i = 0, len = createMissingNativeApiListeners.length; i < len; ++i) {\n createMissingNativeApiListeners[i](win);\n }\n }\n\n api.createMissingNativeApi = createMissingNativeApi;\n\n function Module(name, dependencies, initializer) {\n this.name = name;\n this.dependencies = dependencies;\n this.initialized = false;\n this.supported = false;\n this.initializer = initializer;\n }\n\n Module.prototype = {\n init: function(api) {\n var requiredModuleNames = this.dependencies || [];\n for (var i = 0, len = requiredModuleNames.length, requiredModule, moduleName; i < len; ++i) {\n moduleName = requiredModuleNames[i];\n\n requiredModule = modules[moduleName];\n if (!requiredModule || !(requiredModule instanceof Module)) {\n throw new Error(\"required module '\" + moduleName + \"' not found\");\n }\n\n requiredModule.init();\n\n if (!requiredModule.supported) {\n throw new Error(\"required module '\" + moduleName + \"' not supported\");\n }\n }\n \n // Now run initializer\n this.initializer(this)\n },\n \n fail: function(reason) {\n this.initialized = true;\n this.supported = false;\n throw new Error(\"Module '\" + this.name + \"' failed to load: \" + reason);\n },\n\n warn: function(msg) {\n api.warn(\"Module \" + this.name + \": \" + msg);\n },\n\n deprecationNotice: function(deprecated, replacement) {\n api.warn(\"DEPRECATED: \" + deprecated + \" in module \" + this.name + \"is deprecated. Please use \"\n + replacement + \" instead\");\n },\n\n createError: function(msg) {\n return new Error(\"Error in Rangy \" + this.name + \" module: \" + msg);\n }\n };\n \n function createModule(isCore, name, dependencies, initFunc) {\n var newModule = new Module(name, dependencies, function(module) {\n if (!module.initialized) {\n module.initialized = true;\n try {\n initFunc(api, module);\n module.supported = true;\n } catch (ex) {\n var errorMessage = \"Module '\" + name + \"' failed to load: \" + getErrorDesc(ex);\n consoleLog(errorMessage);\n }\n }\n });\n modules[name] = newModule;\n \n/*\n // Add module AMD support\n if (!isCore && amdSupported) {\n global.define([\"rangy-core\"], function(rangy) {\n \n });\n }\n*/\n }\n\n api.createModule = function(name) {\n // Allow 2 or 3 arguments (second argument is an optional array of dependencies)\n var initFunc, dependencies;\n if (arguments.length == 2) {\n initFunc = arguments[1];\n dependencies = [];\n } else {\n initFunc = arguments[2];\n dependencies = arguments[1];\n }\n createModule(false, name, dependencies, initFunc);\n };\n\n api.createCoreModule = function(name, dependencies, initFunc) {\n createModule(true, name, dependencies, initFunc);\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Ensure rangy.rangePrototype and rangy.selectionPrototype are available immediately\n\n function RangePrototype() {}\n api.RangePrototype = RangePrototype;\n api.rangePrototype = new RangePrototype();\n\n function SelectionPrototype() {}\n api.selectionPrototype = new SelectionPrototype();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Wait for document to load before running tests\n\n var docReady = false;\n\n var loadHandler = function(e) {\n if (!docReady) {\n docReady = true;\n if (!api.initialized) {\n init();\n }\n }\n };\n\n // Test whether we have window and document objects that we will need\n if (typeof window == UNDEFINED) {\n fail(\"No window found\");\n return;\n }\n if (typeof document == UNDEFINED) {\n fail(\"No document found\");\n return;\n }\n\n if (isHostMethod(document, \"addEventListener\")) {\n document.addEventListener(\"DOMContentLoaded\", loadHandler, false);\n }\n\n // Add a fallback in case the DOMContentLoaded event isn't supported\n addListener(window, \"load\", loadHandler);\n\n /*----------------------------------------------------------------------------------------------------------------*/\n \n // AMD, for those who like this kind of thing\n\n /*\n if (amdSupported) {\n // AMD. Register as an anonymous module.\n global.define(function() {\n api.amd = true;\n return api;\n });\n }\n */\n // Create a \"rangy\" property of the global object in any case. Other Rangy modules (which use Rangy's own simple\n // module system) rely on the existence of this global property\n global.rangy = api;\n})(this); \n\nrangy.createCoreModule(\"DomUtil\", [], function(api, module) {\n var UNDEF = \"undefined\";\n var util = api.util;\n\n // Perform feature tests\n if (!util.areHostMethods(document, [\"createDocumentFragment\", \"createElement\", \"createTextNode\"])) {\n module.fail(\"document missing a Node creation method\");\n }\n\n if (!util.isHostMethod(document, \"getElementsByTagName\")) {\n module.fail(\"document missing getElementsByTagName method\");\n }\n\n var el = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"div\");\n if (!util.areHostMethods(el, [\"insertBefore\", \"appendChild\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]))) {\n module.fail(\"Incomplete Element implementation\");\n }\n\n // innerHTML is required for Range's createContextualFragment method\n if (!util.isHostProperty(el, \"innerHTML\")) {\n module.fail(\"Element is missing innerHTML property\");\n }\n\n var textNode = document.createTextNode(\"test\");\n if (!util.areHostMethods(textNode, [\"splitText\", \"deleteData\", \"insertData\", \"appendData\", \"cloneNode\"] ||\n !util.areHostObjects(el, [\"previousSibling\", \"nextSibling\", \"childNodes\", \"parentNode\"]) ||\n !util.areHostProperties(textNode, [\"data\"]))) {\n module.fail(\"Incomplete Text Node implementation\");\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Removed use of indexOf because of a bizarre bug in Opera that is thrown in one of the Acid3 tests. I haven't been\n // able to replicate it outside of the test. The bug is that indexOf returns -1 when called on an Array that\n // contains just the document as a single element and the value searched for is the document.\n var arrayContains = /*Array.prototype.indexOf ?\n function(arr, val) {\n return arr.indexOf(val) > -1;\n }:*/\n\n function(arr, val) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === val) {\n return true;\n }\n }\n return false;\n };\n\n // Opera 11 puts HTML elements in the null namespace, it seems, and IE 7 has undefined namespaceURI\n function isHtmlNamespace(node) {\n var ns;\n return typeof node.namespaceURI == UNDEF || ((ns = node.namespaceURI) === null || ns == \"http://www.w3.org/1999/xhtml\");\n }\n\n function parentElement(node) {\n var parent = node.parentNode;\n return (parent.nodeType == 1) ? parent : null;\n }\n\n function getNodeIndex(node) {\n var i = 0;\n while( (node = node.previousSibling) ) {\n ++i;\n }\n return i;\n }\n\n function getNodeLength(node) {\n switch (node.nodeType) {\n case 7:\n case 10:\n return 0;\n case 3:\n case 8:\n return node.length;\n default:\n return node.childNodes.length;\n }\n }\n\n function getCommonAncestor(node1, node2) {\n var ancestors = [], n;\n for (n = node1; n; n = n.parentNode) {\n ancestors.push(n);\n }\n\n for (n = node2; n; n = n.parentNode) {\n if (arrayContains(ancestors, n)) {\n return n;\n }\n }\n\n return null;\n }\n\n function isAncestorOf(ancestor, descendant, selfIsAncestor) {\n var n = selfIsAncestor ? descendant : descendant.parentNode;\n while (n) {\n if (n === ancestor) {\n return true;\n } else {\n n = n.parentNode;\n }\n }\n return false;\n }\n\n function isOrIsAncestorOf(ancestor, descendant) {\n return isAncestorOf(ancestor, descendant, true);\n }\n\n function getClosestAncestorIn(node, ancestor, selfIsAncestor) {\n var p, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n p = n.parentNode;\n if (p === ancestor) {\n return n;\n }\n n = p;\n }\n return null;\n }\n\n function isCharacterDataNode(node) {\n var t = node.nodeType;\n return t == 3 || t == 4 || t == 8 ; // Text, CDataSection or Comment\n }\n\n function isTextOrCommentNode(node) {\n if (!node) {\n return false;\n }\n var t = node.nodeType;\n return t == 3 || t == 8 ; // Text or Comment\n }\n\n function insertAfter(node, precedingNode) {\n var nextNode = precedingNode.nextSibling, parent = precedingNode.parentNode;\n if (nextNode) {\n parent.insertBefore(node, nextNode);\n } else {\n parent.appendChild(node);\n }\n return node;\n }\n\n // Note that we cannot use splitText() because it is bugridden in IE 9.\n function splitDataNode(node, index, positionsToPreserve) {\n var newNode = node.cloneNode(false);\n newNode.deleteData(0, index);\n node.deleteData(index, node.length - index);\n insertAfter(newNode, node);\n\n // Preserve positions\n if (positionsToPreserve) {\n for (var i = 0, position; position = positionsToPreserve[i++]; ) {\n // Handle case where position was inside the portion of node after the split point\n if (position.node == node && position.offset > index) {\n position.node = newNode;\n position.offset -= index;\n }\n // Handle the case where the position is a node offset within node's parent\n else if (position.node == node.parentNode && position.offset > getNodeIndex(node)) {\n ++position.offset;\n }\n }\n }\n return newNode;\n }\n\n function getDocument(node) {\n if (node.nodeType == 9) {\n return node;\n } else if (typeof node.ownerDocument != UNDEF) {\n return node.ownerDocument;\n } else if (typeof node.document != UNDEF) {\n return node.document;\n } else if (node.parentNode) {\n return getDocument(node.parentNode);\n } else {\n throw module.createError(\"getDocument: no document found for node\");\n }\n }\n\n function getWindow(node) {\n var doc = getDocument(node);\n if (typeof doc.defaultView != UNDEF) {\n return doc.defaultView;\n } else if (typeof doc.parentWindow != UNDEF) {\n return doc.parentWindow;\n } else {\n throw module.createError(\"Cannot get a window object for node\");\n }\n }\n\n function getIframeDocument(iframeEl) {\n if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument;\n } else if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow.document;\n } else {\n throw module.createError(\"getIframeDocument: No Document object found for iframe element\");\n }\n }\n\n function getIframeWindow(iframeEl) {\n if (typeof iframeEl.contentWindow != UNDEF) {\n return iframeEl.contentWindow;\n } else if (typeof iframeEl.contentDocument != UNDEF) {\n return iframeEl.contentDocument.defaultView;\n } else {\n throw module.createError(\"getIframeWindow: No Window object found for iframe element\");\n }\n }\n\n // This looks bad. Is it worth it?\n function isWindow(obj) {\n return obj && util.isHostMethod(obj, \"setTimeout\") && util.isHostObject(obj, \"document\");\n }\n\n function getContentDocument(obj, module, methodName) {\n var doc;\n\n if (!obj) {\n doc = document;\n }\n\n // Test if a DOM node has been passed and obtain a document object for it if so\n else if (util.isHostProperty(obj, \"nodeType\")) {\n doc = (obj.nodeType == 1 && obj.tagName.toLowerCase() == \"iframe\")\n ? getIframeDocument(obj) : getDocument(obj);\n }\n\n // Test if the doc parameter appears to be a Window object\n else if (isWindow(obj)) {\n doc = obj.document;\n }\n\n if (!doc) {\n throw module.createError(methodName + \"(): Parameter must be a Window object or DOM node\");\n }\n\n return doc;\n }\n\n function getRootContainer(node) {\n var parent;\n while ( (parent = node.parentNode) ) {\n node = parent;\n }\n return node;\n }\n\n function comparePoints(nodeA, offsetA, nodeB, offsetB) {\n // See http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html#Level-2-Range-Comparing\n var nodeC, root, childA, childB, n;\n if (nodeA == nodeB) {\n // Case 1: nodes are the same\n return offsetA === offsetB ? 0 : (offsetA < offsetB) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeB, nodeA, true)) ) {\n // Case 2: node C (container B or an ancestor) is a child node of A\n return offsetA <= getNodeIndex(nodeC) ? -1 : 1;\n } else if ( (nodeC = getClosestAncestorIn(nodeA, nodeB, true)) ) {\n // Case 3: node C (container A or an ancestor) is a child node of B\n return getNodeIndex(nodeC) < offsetB ? -1 : 1;\n } else {\n root = getCommonAncestor(nodeA, nodeB);\n if (!root) {\n throw new Error(\"comparePoints error: nodes have no common ancestor\");\n }\n\n // Case 4: containers are siblings or descendants of siblings\n childA = (nodeA === root) ? root : getClosestAncestorIn(nodeA, root, true);\n childB = (nodeB === root) ? root : getClosestAncestorIn(nodeB, root, true);\n\n if (childA === childB) {\n // This shouldn't be possible\n throw module.createError(\"comparePoints got to case 4 and childA and childB are the same!\");\n } else {\n n = root.firstChild;\n while (n) {\n if (n === childA) {\n return -1;\n } else if (n === childB) {\n return 1;\n }\n n = n.nextSibling;\n }\n }\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test for IE's crash (IE 6/7) or exception (IE >= 8) when a reference to garbage-collected text node is queried\n var crashyTextNodes = false;\n\n function isBrokenNode(node) {\n try {\n node.parentNode;\n return false;\n } catch (e) {\n return true;\n }\n }\n\n (function() {\n var el = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"b\");\n el.innerHTML = \"1\";\n var textNode = el.firstChild;\n el.innerHTML = \"
\";\n crashyTextNodes = isBrokenNode(textNode);\n\n api.features.crashyTextNodes = crashyTextNodes;\n })();\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n function inspectNode(node) {\n if (!node) {\n return \"[No node]\";\n }\n if (crashyTextNodes && isBrokenNode(node)) {\n return \"[Broken node]\";\n }\n if (isCharacterDataNode(node)) {\n return '\"' + node.data + '\"';\n }\n if (node.nodeType == 1) {\n var idAttr = node.id ? ' id=\"' + node.id + '\"' : \"\";\n return \"<\" + node.nodeName + idAttr + \">[\" + getNodeIndex(node) + \"][\" + node.childNodes.length + \"][\" + (node.innerHTML || \"[innerHTML not supported]\").slice(0, 25) + \"]\";\n }\n return node.nodeName;\n }\n\n function fragmentFromNodeChildren(node) {\n var fragment = getDocument(node).createDocumentFragment(), child;\n while ( (child = node.firstChild) ) {\n fragment.appendChild(child);\n }\n return fragment;\n }\n\n var getComputedStyleProperty;\n if (typeof window.getComputedStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return getWindow(el).getComputedStyle(el, null)[propName];\n };\n } else if (typeof document.documentElement.currentStyle != UNDEF) {\n getComputedStyleProperty = function(el, propName) {\n return el.currentStyle[propName];\n };\n } else {\n module.fail(\"No means of obtaining computed style properties found\");\n }\n\n function NodeIterator(root) {\n this.root = root;\n this._next = root;\n }\n\n NodeIterator.prototype = {\n _current: null,\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n var n = this._current = this._next;\n var child, next;\n if (this._current) {\n child = n.firstChild;\n if (child) {\n this._next = child;\n } else {\n next = null;\n while ((n !== this.root) && !(next = n.nextSibling)) {\n n = n.parentNode;\n }\n this._next = next;\n }\n }\n return this._current;\n },\n\n detach: function() {\n this._current = this._next = this.root = null;\n }\n };\n\n function createIterator(root) {\n return new NodeIterator(root);\n }\n\n function DomPosition(node, offset) {\n this.node = node;\n this.offset = offset;\n }\n\n DomPosition.prototype = {\n equals: function(pos) {\n return !!pos && this.node === pos.node && this.offset == pos.offset;\n },\n\n inspect: function() {\n return \"[DomPosition(\" + inspectNode(this.node) + \":\" + this.offset + \")]\";\n },\n\n toString: function() {\n return this.inspect();\n }\n };\n\n function DOMException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"DOMException: \" + this.codeName;\n }\n\n DOMException.prototype = {\n INDEX_SIZE_ERR: 1,\n HIERARCHY_REQUEST_ERR: 3,\n WRONG_DOCUMENT_ERR: 4,\n NO_MODIFICATION_ALLOWED_ERR: 7,\n NOT_FOUND_ERR: 8,\n NOT_SUPPORTED_ERR: 9,\n INVALID_STATE_ERR: 11\n };\n\n DOMException.prototype.toString = function() {\n return this.message;\n };\n\n api.dom = {\n arrayContains: arrayContains,\n isHtmlNamespace: isHtmlNamespace,\n parentElement: parentElement,\n getNodeIndex: getNodeIndex,\n getNodeLength: getNodeLength,\n getCommonAncestor: getCommonAncestor,\n isAncestorOf: isAncestorOf,\n isOrIsAncestorOf: isOrIsAncestorOf,\n getClosestAncestorIn: getClosestAncestorIn,\n isCharacterDataNode: isCharacterDataNode,\n isTextOrCommentNode: isTextOrCommentNode,\n insertAfter: insertAfter,\n splitDataNode: splitDataNode,\n getDocument: getDocument,\n getWindow: getWindow,\n getIframeWindow: getIframeWindow,\n getIframeDocument: getIframeDocument,\n getBody: util.getBody,\n isWindow: isWindow,\n getContentDocument: getContentDocument,\n getRootContainer: getRootContainer,\n comparePoints: comparePoints,\n isBrokenNode: isBrokenNode,\n inspectNode: inspectNode,\n getComputedStyleProperty: getComputedStyleProperty,\n fragmentFromNodeChildren: fragmentFromNodeChildren,\n createIterator: createIterator,\n DomPosition: DomPosition\n };\n\n api.DOMException = DOMException;\n});\nrangy.createCoreModule(\"DomRange\", [\"DomUtil\"], function(api, module) {\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DOMException = api.DOMException;\n\n var isCharacterDataNode = dom.isCharacterDataNode;\n var getNodeIndex = dom.getNodeIndex;\n var isOrIsAncestorOf = dom.isOrIsAncestorOf;\n var getDocument = dom.getDocument;\n var comparePoints = dom.comparePoints;\n var splitDataNode = dom.splitDataNode;\n var getClosestAncestorIn = dom.getClosestAncestorIn;\n var getNodeLength = dom.getNodeLength;\n var arrayContains = dom.arrayContains;\n var getRootContainer = dom.getRootContainer;\n var crashyTextNodes = api.features.crashyTextNodes;\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Utility functions\n\n function isNonTextPartiallySelected(node, range) {\n return (node.nodeType != 3) &&\n (isOrIsAncestorOf(node, range.startContainer) || isOrIsAncestorOf(node, range.endContainer));\n }\n\n function getRangeDocument(range) {\n return range.document || getDocument(range.startContainer);\n }\n\n function getBoundaryBeforeNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node));\n }\n\n function getBoundaryAfterNode(node) {\n return new DomPosition(node.parentNode, getNodeIndex(node) + 1);\n }\n\n function insertNodeAtPosition(node, n, o) {\n var firstNodeInserted = node.nodeType == 11 ? node.firstChild : node;\n if (isCharacterDataNode(n)) {\n if (o == n.length) {\n dom.insertAfter(node, n);\n } else {\n n.parentNode.insertBefore(node, o == 0 ? n : splitDataNode(n, o));\n }\n } else if (o >= n.childNodes.length) {\n n.appendChild(node);\n } else {\n n.insertBefore(node, n.childNodes[o]);\n }\n return firstNodeInserted;\n }\n\n function rangesIntersect(rangeA, rangeB, touchingIsIntersecting) {\n assertRangeValid(rangeA);\n assertRangeValid(rangeB);\n\n if (getRangeDocument(rangeB) != getRangeDocument(rangeA)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n\n var startComparison = comparePoints(rangeA.startContainer, rangeA.startOffset, rangeB.endContainer, rangeB.endOffset),\n endComparison = comparePoints(rangeA.endContainer, rangeA.endOffset, rangeB.startContainer, rangeB.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n }\n\n function cloneSubtree(iterator) {\n var partiallySelected;\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n partiallySelected = iterator.isPartiallySelectedSubtree();\n node = node.cloneNode(!partiallySelected);\n if (partiallySelected) {\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(cloneSubtree(subIterator));\n subIterator.detach(true);\n }\n\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function iterateSubtree(rangeIterator, func, iteratorState) {\n var it, n;\n iteratorState = iteratorState || { stop: false };\n for (var node, subRangeIterator; node = rangeIterator.next(); ) {\n if (rangeIterator.isPartiallySelectedSubtree()) {\n if (func(node) === false) {\n iteratorState.stop = true;\n return;\n } else {\n // The node is partially selected by the Range, so we can use a new RangeIterator on the portion of\n // the node selected by the Range.\n subRangeIterator = rangeIterator.getSubtreeIterator();\n iterateSubtree(subRangeIterator, func, iteratorState);\n subRangeIterator.detach(true);\n if (iteratorState.stop) {\n return;\n }\n }\n } else {\n // The whole node is selected, so we can use efficient DOM iteration to iterate over the node and its\n // descendants\n it = dom.createIterator(node);\n while ( (n = it.next()) ) {\n if (func(n) === false) {\n iteratorState.stop = true;\n return;\n }\n }\n }\n }\n }\n\n function deleteSubtree(iterator) {\n var subIterator;\n while (iterator.next()) {\n if (iterator.isPartiallySelectedSubtree()) {\n subIterator = iterator.getSubtreeIterator();\n deleteSubtree(subIterator);\n subIterator.detach(true);\n } else {\n iterator.remove();\n }\n }\n }\n\n function extractSubtree(iterator) {\n for (var node, frag = getRangeDocument(iterator.range).createDocumentFragment(), subIterator; node = iterator.next(); ) {\n\n if (iterator.isPartiallySelectedSubtree()) {\n node = node.cloneNode(false);\n subIterator = iterator.getSubtreeIterator();\n node.appendChild(extractSubtree(subIterator));\n subIterator.detach(true);\n } else {\n iterator.remove();\n }\n if (node.nodeType == 10) { // DocumentType\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n frag.appendChild(node);\n }\n return frag;\n }\n\n function getNodesInRange(range, nodeTypes, filter) {\n var filterNodeTypes = !!(nodeTypes && nodeTypes.length), regex;\n var filterExists = !!filter;\n if (filterNodeTypes) {\n regex = new RegExp(\"^(\" + nodeTypes.join(\"|\") + \")$\");\n }\n\n var nodes = [];\n iterateSubtree(new RangeIterator(range, false), function(node) {\n if (filterNodeTypes && !regex.test(node.nodeType)) {\n return;\n }\n if (filterExists && !filter(node)) {\n return;\n }\n // Don't include a boundary container if it is a character data node and the range does not contain any\n // of its character data. See issue 190.\n var sc = range.startContainer;\n if (node == sc && isCharacterDataNode(sc) && range.startOffset == sc.length) {\n return;\n }\n\n var ec = range.endContainer;\n if (node == ec && isCharacterDataNode(ec) && range.endOffset == 0) {\n return;\n }\n\n nodes.push(node);\n });\n return nodes;\n }\n\n function inspect(range) {\n var name = (typeof range.getName == \"undefined\") ? \"Range\" : range.getName();\n return \"[\" + name + \"(\" + dom.inspectNode(range.startContainer) + \":\" + range.startOffset + \", \" +\n dom.inspectNode(range.endContainer) + \":\" + range.endOffset + \")]\";\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // RangeIterator code partially borrows from IERange by Tim Ryan (http://github.com/timcameronryan/IERange)\n\n function RangeIterator(range, clonePartiallySelectedTextNodes) {\n this.range = range;\n this.clonePartiallySelectedTextNodes = clonePartiallySelectedTextNodes;\n\n\n if (!range.collapsed) {\n this.sc = range.startContainer;\n this.so = range.startOffset;\n this.ec = range.endContainer;\n this.eo = range.endOffset;\n var root = range.commonAncestorContainer;\n\n if (this.sc === this.ec && isCharacterDataNode(this.sc)) {\n this.isSingleCharacterDataNode = true;\n this._first = this._last = this._next = this.sc;\n } else {\n this._first = this._next = (this.sc === root && !isCharacterDataNode(this.sc)) ?\n this.sc.childNodes[this.so] : getClosestAncestorIn(this.sc, root, true);\n this._last = (this.ec === root && !isCharacterDataNode(this.ec)) ?\n this.ec.childNodes[this.eo - 1] : getClosestAncestorIn(this.ec, root, true);\n }\n }\n }\n\n RangeIterator.prototype = {\n _current: null,\n _next: null,\n _first: null,\n _last: null,\n isSingleCharacterDataNode: false,\n\n reset: function() {\n this._current = null;\n this._next = this._first;\n },\n\n hasNext: function() {\n return !!this._next;\n },\n\n next: function() {\n // Move to next node\n var current = this._current = this._next;\n if (current) {\n this._next = (current !== this._last) ? current.nextSibling : null;\n\n // Check for partially selected text nodes\n if (isCharacterDataNode(current) && this.clonePartiallySelectedTextNodes) {\n if (current === this.ec) {\n (current = current.cloneNode(true)).deleteData(this.eo, current.length - this.eo);\n }\n if (this._current === this.sc) {\n (current = current.cloneNode(true)).deleteData(0, this.so);\n }\n }\n }\n\n return current;\n },\n\n remove: function() {\n var current = this._current, start, end;\n\n if (isCharacterDataNode(current) && (current === this.sc || current === this.ec)) {\n start = (current === this.sc) ? this.so : 0;\n end = (current === this.ec) ? this.eo : current.length;\n if (start != end) {\n current.deleteData(start, end - start);\n }\n } else {\n if (current.parentNode) {\n current.parentNode.removeChild(current);\n } else {\n }\n }\n },\n\n // Checks if the current node is partially selected\n isPartiallySelectedSubtree: function() {\n var current = this._current;\n return isNonTextPartiallySelected(current, this.range);\n },\n\n getSubtreeIterator: function() {\n var subRange;\n if (this.isSingleCharacterDataNode) {\n subRange = this.range.cloneRange();\n subRange.collapse(false);\n } else {\n subRange = new Range(getRangeDocument(this.range));\n var current = this._current;\n var startContainer = current, startOffset = 0, endContainer = current, endOffset = getNodeLength(current);\n\n if (isOrIsAncestorOf(current, this.sc)) {\n startContainer = this.sc;\n startOffset = this.so;\n }\n if (isOrIsAncestorOf(current, this.ec)) {\n endContainer = this.ec;\n endOffset = this.eo;\n }\n\n updateBoundaries(subRange, startContainer, startOffset, endContainer, endOffset);\n }\n return new RangeIterator(subRange, this.clonePartiallySelectedTextNodes);\n },\n\n detach: function(detachRange) {\n if (detachRange) {\n this.range.detach();\n }\n this.range = this._current = this._next = this._first = this._last = this.sc = this.so = this.ec = this.eo = null;\n }\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Exceptions\n\n function RangeException(codeName) {\n this.code = this[codeName];\n this.codeName = codeName;\n this.message = \"RangeException: \" + this.codeName;\n }\n\n RangeException.prototype = {\n BAD_BOUNDARYPOINTS_ERR: 1,\n INVALID_NODE_TYPE_ERR: 2\n };\n\n RangeException.prototype.toString = function() {\n return this.message;\n };\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var beforeAfterNodeTypes = [1, 3, 4, 5, 7, 8, 10];\n var rootContainerNodeTypes = [2, 9, 11];\n var readonlyNodeTypes = [5, 6, 10, 12];\n var insertableNodeTypes = [1, 3, 4, 5, 7, 8, 10, 11];\n var surroundNodeTypes = [1, 3, 4, 5, 7, 8];\n\n function createAncestorFinder(nodeTypes) {\n return function(node, selfIsAncestor) {\n var t, n = selfIsAncestor ? node : node.parentNode;\n while (n) {\n t = n.nodeType;\n if (arrayContains(nodeTypes, t)) {\n return n;\n }\n n = n.parentNode;\n }\n return null;\n };\n }\n\n var getDocumentOrFragmentContainer = createAncestorFinder( [9, 11] );\n var getReadonlyAncestor = createAncestorFinder(readonlyNodeTypes);\n var getDocTypeNotationEntityAncestor = createAncestorFinder( [6, 10, 12] );\n\n function assertNoDocTypeNotationEntityAncestor(node, allowSelf) {\n if (getDocTypeNotationEntityAncestor(node, allowSelf)) {\n throw new RangeException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertNotDetached(range) {\n if (!range.startContainer) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n }\n\n function assertValidNodeType(node, invalidTypes) {\n if (!arrayContains(invalidTypes, node.nodeType)) {\n throw new RangeException(\"INVALID_NODE_TYPE_ERR\");\n }\n }\n\n function assertValidOffset(node, offset) {\n if (offset < 0 || offset > (isCharacterDataNode(node) ? node.length : node.childNodes.length)) {\n throw new DOMException(\"INDEX_SIZE_ERR\");\n }\n }\n\n function assertSameDocumentOrFragment(node1, node2) {\n if (getDocumentOrFragmentContainer(node1, true) !== getDocumentOrFragmentContainer(node2, true)) {\n throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n }\n }\n\n function assertNodeNotReadOnly(node) {\n if (getReadonlyAncestor(node, true)) {\n throw new DOMException(\"NO_MODIFICATION_ALLOWED_ERR\");\n }\n }\n\n function assertNode(node, codeName) {\n if (!node) {\n throw new DOMException(codeName);\n }\n }\n\n function isOrphan(node) {\n return (crashyTextNodes && dom.isBrokenNode(node)) ||\n !arrayContains(rootContainerNodeTypes, node.nodeType) && !getDocumentOrFragmentContainer(node, true);\n }\n\n function isValidOffset(node, offset) {\n return offset <= (isCharacterDataNode(node) ? node.length : node.childNodes.length);\n }\n\n function isRangeValid(range) {\n return (!!range.startContainer && !!range.endContainer\n && !isOrphan(range.startContainer)\n && !isOrphan(range.endContainer)\n && isValidOffset(range.startContainer, range.startOffset)\n && isValidOffset(range.endContainer, range.endOffset));\n }\n\n function assertRangeValid(range) {\n assertNotDetached(range);\n if (!isRangeValid(range)) {\n throw new Error(\"Range error: Range is no longer valid after DOM mutation (\" + range.inspect() + \")\");\n }\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Test the browser's innerHTML support to decide how to implement createContextualFragment\n var styleEl = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"style\");\n var htmlParsingConforms = false;\n try {\n styleEl.innerHTML = \"x\";\n htmlParsingConforms = (styleEl.firstChild.nodeType == 3); // Opera incorrectly creates an element node\n } catch (e) {\n // IE 6 and 7 throw\n }\n\n api.features.htmlParsingConforms = htmlParsingConforms;\n\n var createContextualFragment = htmlParsingConforms ?\n\n // Implementation as per HTML parsing spec, trusting in the browser's implementation of innerHTML. See\n // discussion and base code for this implementation at issue 67.\n // Spec: http://html5.org/specs/dom-parsing.html#extensions-to-the-range-interface\n // Thanks to Aleks Williams.\n function(fragmentStr) {\n // \"Let node the context object's start's node.\"\n var node = this.startContainer;\n var doc = getDocument(node);\n\n // \"If the context object's start's node is null, raise an INVALID_STATE_ERR\n // exception and abort these steps.\"\n if (!node) {\n throw new DOMException(\"INVALID_STATE_ERR\");\n }\n\n // \"Let element be as follows, depending on node's interface:\"\n // Document, Document Fragment: null\n var el = null;\n\n // \"Element: node\"\n if (node.nodeType == 1) {\n el = node;\n\n // \"Text, Comment: node's parentElement\"\n } else if (isCharacterDataNode(node)) {\n el = dom.parentElement(node);\n }\n\n // \"If either element is null or element's ownerDocument is an HTML document\n // and element's local name is \"html\" and element's namespace is the HTML\n // namespace\"\n if (el === null || (\n el.nodeName == \"HTML\"\n && dom.isHtmlNamespace(getDocument(el).documentElement)\n && dom.isHtmlNamespace(el)\n )) {\n\n // \"let element be a new Element with \"body\" as its local name and the HTML\n // namespace as its namespace.\"\"\n el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"body\");\n } else {\n el = el.cloneNode(false);\n }\n\n // \"If the node's document is an HTML document: Invoke the HTML fragment parsing algorithm.\"\n // \"If the node's document is an XML document: Invoke the XML fragment parsing algorithm.\"\n // \"In either case, the algorithm must be invoked with fragment as the input\n // and element as the context element.\"\n el.innerHTML = fragmentStr;\n\n // \"If this raises an exception, then abort these steps. Otherwise, let new\n // children be the nodes returned.\"\n\n // \"Let fragment be a new DocumentFragment.\"\n // \"Append all new children to fragment.\"\n // \"Return fragment.\"\n return dom.fragmentFromNodeChildren(el);\n } :\n\n // In this case, innerHTML cannot be trusted, so fall back to a simpler, non-conformant implementation that\n // previous versions of Rangy used (with the exception of using a body element rather than a div)\n function(fragmentStr) {\n assertNotDetached(this);\n var doc = getRangeDocument(this);\n var el = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"body\");\n el.innerHTML = fragmentStr;\n\n return dom.fragmentFromNodeChildren(el);\n };\n\n function splitRangeBoundaries(range, positionsToPreserve) {\n assertRangeValid(range);\n\n var sc = range.startContainer, so = range.startOffset, ec = range.endContainer, eo = range.endOffset;\n var startEndSame = (sc === ec);\n\n if (isCharacterDataNode(ec) && eo > 0 && eo < ec.length) {\n splitDataNode(ec, eo, positionsToPreserve);\n }\n\n if (isCharacterDataNode(sc) && so > 0 && so < sc.length) {\n sc = splitDataNode(sc, so, positionsToPreserve);\n if (startEndSame) {\n eo -= so;\n ec = sc;\n } else if (ec == sc.parentNode && eo >= getNodeIndex(sc)) {\n eo++;\n }\n so = 0;\n }\n range.setStartAndEnd(sc, so, ec, eo);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n var rangeProperties = [\"startContainer\", \"startOffset\", \"endContainer\", \"endOffset\", \"collapsed\",\n \"commonAncestorContainer\"];\n\n var s2s = 0, s2e = 1, e2e = 2, e2s = 3;\n var n_b = 0, n_a = 1, n_b_a = 2, n_i = 3;\n\n util.extend(api.rangePrototype, {\n compareBoundaryPoints: function(how, range) {\n assertRangeValid(this);\n assertSameDocumentOrFragment(this.startContainer, range.startContainer);\n\n var nodeA, offsetA, nodeB, offsetB;\n var prefixA = (how == e2s || how == s2s) ? \"start\" : \"end\";\n var prefixB = (how == s2e || how == s2s) ? \"start\" : \"end\";\n nodeA = this[prefixA + \"Container\"];\n offsetA = this[prefixA + \"Offset\"];\n nodeB = range[prefixB + \"Container\"];\n offsetB = range[prefixB + \"Offset\"];\n return comparePoints(nodeA, offsetA, nodeB, offsetB);\n },\n\n insertNode: function(node) {\n assertRangeValid(this);\n assertValidNodeType(node, insertableNodeTypes);\n assertNodeNotReadOnly(this.startContainer);\n\n if (isOrIsAncestorOf(node, this.startContainer)) {\n throw new DOMException(\"HIERARCHY_REQUEST_ERR\");\n }\n\n // No check for whether the container of the start of the Range is of a type that does not allow\n // children of the type of node: the browser's DOM implementation should do this for us when we attempt\n // to add the node\n\n var firstNodeInserted = insertNodeAtPosition(node, this.startContainer, this.startOffset);\n this.setStartBefore(firstNodeInserted);\n },\n\n cloneContents: function() {\n assertRangeValid(this);\n\n var clone, frag;\n if (this.collapsed) {\n return getRangeDocument(this).createDocumentFragment();\n } else {\n if (this.startContainer === this.endContainer && isCharacterDataNode(this.startContainer)) {\n clone = this.startContainer.cloneNode(true);\n clone.data = clone.data.slice(this.startOffset, this.endOffset);\n frag = getRangeDocument(this).createDocumentFragment();\n frag.appendChild(clone);\n return frag;\n } else {\n var iterator = new RangeIterator(this, true);\n clone = cloneSubtree(iterator);\n iterator.detach();\n }\n return clone;\n }\n },\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n surroundContents: function(node) {\n assertValidNodeType(node, surroundNodeTypes);\n\n if (!this.canSurroundContents()) {\n throw new RangeException(\"BAD_BOUNDARYPOINTS_ERR\");\n }\n\n // Extract the contents\n var content = this.extractContents();\n\n // Clear the children of the node\n if (node.hasChildNodes()) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n }\n\n // Insert the new node and add the extracted contents\n insertNodeAtPosition(node, this.startContainer, this.startOffset);\n node.appendChild(content);\n\n this.selectNode(node);\n },\n\n cloneRange: function() {\n assertRangeValid(this);\n var range = new Range(getRangeDocument(this));\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = this[prop];\n }\n return range;\n },\n\n toString: function() {\n assertRangeValid(this);\n var sc = this.startContainer;\n if (sc === this.endContainer && isCharacterDataNode(sc)) {\n return (sc.nodeType == 3 || sc.nodeType == 4) ? sc.data.slice(this.startOffset, this.endOffset) : \"\";\n } else {\n var textParts = [], iterator = new RangeIterator(this, true);\n iterateSubtree(iterator, function(node) {\n // Accept only text or CDATA nodes, not comments\n if (node.nodeType == 3 || node.nodeType == 4) {\n textParts.push(node.data);\n }\n });\n iterator.detach();\n return textParts.join(\"\");\n }\n },\n\n // The methods below are all non-standard. The following batch were introduced by Mozilla but have since\n // been removed from Mozilla.\n\n compareNode: function(node) {\n assertRangeValid(this);\n\n var parent = node.parentNode;\n var nodeIndex = getNodeIndex(node);\n\n if (!parent) {\n throw new DOMException(\"NOT_FOUND_ERR\");\n }\n\n var startComparison = this.comparePoint(parent, nodeIndex),\n endComparison = this.comparePoint(parent, nodeIndex + 1);\n\n if (startComparison < 0) { // Node starts before\n return (endComparison > 0) ? n_b_a : n_b;\n } else {\n return (endComparison > 0) ? n_a : n_i;\n }\n },\n\n comparePoint: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n if (comparePoints(node, offset, this.startContainer, this.startOffset) < 0) {\n return -1;\n } else if (comparePoints(node, offset, this.endContainer, this.endOffset) > 0) {\n return 1;\n }\n return 0;\n },\n\n createContextualFragment: createContextualFragment,\n\n toHtml: function() {\n assertRangeValid(this);\n var container = this.commonAncestorContainer.parentNode.cloneNode(false);\n container.appendChild(this.cloneContents());\n return container.innerHTML;\n },\n\n // touchingIsIntersecting determines whether this method considers a node that borders a range intersects\n // with it (as in WebKit) or not (as in Gecko pre-1.9, and the default)\n intersectsNode: function(node, touchingIsIntersecting) {\n assertRangeValid(this);\n assertNode(node, \"NOT_FOUND_ERR\");\n if (getDocument(node) !== getRangeDocument(this)) {\n return false;\n }\n\n var parent = node.parentNode, offset = getNodeIndex(node);\n assertNode(parent, \"NOT_FOUND_ERR\");\n\n var startComparison = comparePoints(parent, offset, this.endContainer, this.endOffset),\n endComparison = comparePoints(parent, offset + 1, this.startContainer, this.startOffset);\n\n return touchingIsIntersecting ? startComparison <= 0 && endComparison >= 0 : startComparison < 0 && endComparison > 0;\n },\n\n isPointInRange: function(node, offset) {\n assertRangeValid(this);\n assertNode(node, \"HIERARCHY_REQUEST_ERR\");\n assertSameDocumentOrFragment(node, this.startContainer);\n\n return (comparePoints(node, offset, this.startContainer, this.startOffset) >= 0) &&\n (comparePoints(node, offset, this.endContainer, this.endOffset) <= 0);\n },\n\n // The methods below are non-standard and invented by me.\n\n // Sharing a boundary start-to-end or end-to-start does not count as intersection.\n intersectsRange: function(range) {\n return rangesIntersect(this, range, false);\n },\n\n // Sharing a boundary start-to-end or end-to-start does count as intersection.\n intersectsOrTouchesRange: function(range) {\n return rangesIntersect(this, range, true);\n },\n\n intersection: function(range) {\n if (this.intersectsRange(range)) {\n var startComparison = comparePoints(this.startContainer, this.startOffset, range.startContainer, range.startOffset),\n endComparison = comparePoints(this.endContainer, this.endOffset, range.endContainer, range.endOffset);\n\n var intersectionRange = this.cloneRange();\n if (startComparison == -1) {\n intersectionRange.setStart(range.startContainer, range.startOffset);\n }\n if (endComparison == 1) {\n intersectionRange.setEnd(range.endContainer, range.endOffset);\n }\n return intersectionRange;\n }\n return null;\n },\n\n union: function(range) {\n if (this.intersectsOrTouchesRange(range)) {\n var unionRange = this.cloneRange();\n if (comparePoints(range.startContainer, range.startOffset, this.startContainer, this.startOffset) == -1) {\n unionRange.setStart(range.startContainer, range.startOffset);\n }\n if (comparePoints(range.endContainer, range.endOffset, this.endContainer, this.endOffset) == 1) {\n unionRange.setEnd(range.endContainer, range.endOffset);\n }\n return unionRange;\n } else {\n throw new RangeException(\"Ranges do not intersect\");\n }\n },\n\n containsNode: function(node, allowPartial) {\n if (allowPartial) {\n return this.intersectsNode(node, false);\n } else {\n return this.compareNode(node) == n_i;\n }\n },\n\n containsNodeContents: function(node) {\n return this.comparePoint(node, 0) >= 0 && this.comparePoint(node, getNodeLength(node)) <= 0;\n },\n\n containsRange: function(range) {\n var intersection = this.intersection(range);\n return intersection !== null && range.equals(intersection);\n },\n\n containsNodeText: function(node) {\n var nodeRange = this.cloneRange();\n nodeRange.selectNode(node);\n var textNodes = nodeRange.getNodes([3]);\n if (textNodes.length > 0) {\n nodeRange.setStart(textNodes[0], 0);\n var lastTextNode = textNodes.pop();\n nodeRange.setEnd(lastTextNode, lastTextNode.length);\n var contains = this.containsRange(nodeRange);\n nodeRange.detach();\n return contains;\n } else {\n return this.containsNodeContents(node);\n }\n },\n\n getNodes: function(nodeTypes, filter) {\n assertRangeValid(this);\n return getNodesInRange(this, nodeTypes, filter);\n },\n\n getDocument: function() {\n return getRangeDocument(this);\n },\n\n collapseBefore: function(node) {\n assertNotDetached(this);\n\n this.setEndBefore(node);\n this.collapse(false);\n },\n\n collapseAfter: function(node) {\n assertNotDetached(this);\n\n this.setStartAfter(node);\n this.collapse(true);\n },\n \n getBookmark: function(containerNode) {\n var doc = getRangeDocument(this);\n var preSelectionRange = api.createRange(doc);\n containerNode = containerNode || dom.getBody(doc);\n preSelectionRange.selectNodeContents(containerNode);\n var range = this.intersection(preSelectionRange);\n var start = 0, end = 0;\n if (range) {\n preSelectionRange.setEnd(range.startContainer, range.startOffset);\n start = preSelectionRange.toString().length;\n end = start + range.toString().length;\n preSelectionRange.detach();\n }\n\n return {\n start: start,\n end: end,\n containerNode: containerNode\n };\n },\n \n moveToBookmark: function(bookmark) {\n var containerNode = bookmark.containerNode;\n var charIndex = 0;\n this.setStart(containerNode, 0);\n this.collapse(true);\n var nodeStack = [containerNode], node, foundStart = false, stop = false;\n var nextCharIndex, i, childNodes;\n\n while (!stop && (node = nodeStack.pop())) {\n if (node.nodeType == 3) {\n nextCharIndex = charIndex + node.length;\n if (!foundStart && bookmark.start >= charIndex && bookmark.start <= nextCharIndex) {\n this.setStart(node, bookmark.start - charIndex);\n foundStart = true;\n }\n if (foundStart && bookmark.end >= charIndex && bookmark.end <= nextCharIndex) {\n this.setEnd(node, bookmark.end - charIndex);\n stop = true;\n }\n charIndex = nextCharIndex;\n } else {\n childNodes = node.childNodes;\n i = childNodes.length;\n while (i--) {\n nodeStack.push(childNodes[i]);\n }\n }\n }\n },\n\n getName: function() {\n return \"DomRange\";\n },\n\n equals: function(range) {\n return Range.rangesEqual(this, range);\n },\n\n isValid: function() {\n return isRangeValid(this);\n },\n \n inspect: function() {\n return inspect(this);\n }\n });\n\n function copyComparisonConstantsToObject(obj) {\n obj.START_TO_START = s2s;\n obj.START_TO_END = s2e;\n obj.END_TO_END = e2e;\n obj.END_TO_START = e2s;\n\n obj.NODE_BEFORE = n_b;\n obj.NODE_AFTER = n_a;\n obj.NODE_BEFORE_AND_AFTER = n_b_a;\n obj.NODE_INSIDE = n_i;\n }\n\n function copyComparisonConstants(constructor) {\n copyComparisonConstantsToObject(constructor);\n copyComparisonConstantsToObject(constructor.prototype);\n }\n\n function createRangeContentRemover(remover, boundaryUpdater) {\n return function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, root = this.commonAncestorContainer;\n\n var iterator = new RangeIterator(this, true);\n\n // Work out where to position the range after content removal\n var node, boundary;\n if (sc !== root) {\n node = getClosestAncestorIn(sc, root, true);\n boundary = getBoundaryAfterNode(node);\n sc = boundary.node;\n so = boundary.offset;\n }\n\n // Check none of the range is read-only\n iterateSubtree(iterator, assertNodeNotReadOnly);\n\n iterator.reset();\n\n // Remove the content\n var returnValue = remover(iterator);\n iterator.detach();\n\n // Move to the new position\n boundaryUpdater(this, sc, so, sc, so);\n\n return returnValue;\n };\n }\n\n function createPrototypeRange(constructor, boundaryUpdater, detacher) {\n function createBeforeAfterNodeSetter(isBefore, isStart) {\n return function(node) {\n assertNotDetached(this);\n assertValidNodeType(node, beforeAfterNodeTypes);\n assertValidNodeType(getRootContainer(node), rootContainerNodeTypes);\n\n var boundary = (isBefore ? getBoundaryBeforeNode : getBoundaryAfterNode)(node);\n (isStart ? setRangeStart : setRangeEnd)(this, boundary.node, boundary.offset);\n };\n }\n\n function setRangeStart(range, node, offset) {\n var ec = range.endContainer, eo = range.endOffset;\n if (node !== range.startContainer || offset !== range.startOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(ec) || comparePoints(node, offset, ec, eo) == 1) {\n ec = node;\n eo = offset;\n }\n boundaryUpdater(range, node, offset, ec, eo);\n }\n }\n\n function setRangeEnd(range, node, offset) {\n var sc = range.startContainer, so = range.startOffset;\n if (node !== range.endContainer || offset !== range.endOffset) {\n // Check the root containers of the range and the new boundary, and also check whether the new boundary\n // is after the current end. In either case, collapse the range to the new position\n if (getRootContainer(node) != getRootContainer(sc) || comparePoints(node, offset, sc, so) == -1) {\n sc = node;\n so = offset;\n }\n boundaryUpdater(range, sc, so, node, offset);\n }\n }\n\n // Set up inheritance\n var F = function() {};\n F.prototype = api.rangePrototype;\n constructor.prototype = new F();\n\n util.extend(constructor.prototype, {\n setStart: function(node, offset) {\n assertNotDetached(this);\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeStart(this, node, offset);\n },\n\n setEnd: function(node, offset) {\n assertNotDetached(this);\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n\n setRangeEnd(this, node, offset);\n },\n\n /**\n * Convenience method to set a range's start and end boundaries. Overloaded as follows:\n * - Two parameters (node, offset) creates a collapsed range at that position\n * - Three parameters (node, startOffset, endOffset) creates a range contained with node starting at\n * startOffset and ending at endOffset\n * - Four parameters (startNode, startOffset, endNode, endOffset) creates a range starting at startOffset in\n * startNode and ending at endOffset in endNode\n */\n setStartAndEnd: function() {\n assertNotDetached(this);\n\n var args = arguments;\n var sc = args[0], so = args[1], ec = sc, eo = so;\n\n switch (args.length) {\n case 3:\n eo = args[2];\n break;\n case 4:\n ec = args[2];\n eo = args[3];\n break;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n \n setBoundary: function(node, offset, isStart) {\n this[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n },\n\n setStartBefore: createBeforeAfterNodeSetter(true, true),\n setStartAfter: createBeforeAfterNodeSetter(false, true),\n setEndBefore: createBeforeAfterNodeSetter(true, false),\n setEndAfter: createBeforeAfterNodeSetter(false, false),\n\n collapse: function(isStart) {\n assertRangeValid(this);\n if (isStart) {\n boundaryUpdater(this, this.startContainer, this.startOffset, this.startContainer, this.startOffset);\n } else {\n boundaryUpdater(this, this.endContainer, this.endOffset, this.endContainer, this.endOffset);\n }\n },\n\n selectNodeContents: function(node) {\n assertNotDetached(this);\n assertNoDocTypeNotationEntityAncestor(node, true);\n\n boundaryUpdater(this, node, 0, node, getNodeLength(node));\n },\n\n selectNode: function(node) {\n assertNotDetached(this);\n assertNoDocTypeNotationEntityAncestor(node, false);\n assertValidNodeType(node, beforeAfterNodeTypes);\n\n var start = getBoundaryBeforeNode(node), end = getBoundaryAfterNode(node);\n boundaryUpdater(this, start.node, start.offset, end.node, end.offset);\n },\n\n extractContents: createRangeContentRemover(extractSubtree, boundaryUpdater),\n\n deleteContents: createRangeContentRemover(deleteSubtree, boundaryUpdater),\n\n canSurroundContents: function() {\n assertRangeValid(this);\n assertNodeNotReadOnly(this.startContainer);\n assertNodeNotReadOnly(this.endContainer);\n\n // Check if the contents can be surrounded. Specifically, this means whether the range partially selects\n // no non-text nodes.\n var iterator = new RangeIterator(this, true);\n var boundariesInvalid = (iterator._first && (isNonTextPartiallySelected(iterator._first, this)) ||\n (iterator._last && isNonTextPartiallySelected(iterator._last, this)));\n iterator.detach();\n return !boundariesInvalid;\n },\n\n detach: function() {\n detacher(this);\n },\n\n splitBoundaries: function() {\n splitRangeBoundaries(this);\n },\n\n splitBoundariesPreservingPositions: function(positionsToPreserve) {\n splitRangeBoundaries(this, positionsToPreserve);\n },\n\n normalizeBoundaries: function() {\n assertRangeValid(this);\n\n var sc = this.startContainer, so = this.startOffset, ec = this.endContainer, eo = this.endOffset;\n\n var mergeForward = function(node) {\n var sibling = node.nextSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n ec = node;\n eo = node.length;\n node.appendData(sibling.data);\n sibling.parentNode.removeChild(sibling);\n }\n };\n\n var mergeBackward = function(node) {\n var sibling = node.previousSibling;\n if (sibling && sibling.nodeType == node.nodeType) {\n sc = node;\n var nodeLength = node.length;\n so = sibling.length;\n node.insertData(0, sibling.data);\n sibling.parentNode.removeChild(sibling);\n if (sc == ec) {\n eo += so;\n ec = sc;\n } else if (ec == node.parentNode) {\n var nodeIndex = getNodeIndex(node);\n if (eo == nodeIndex) {\n ec = node;\n eo = nodeLength;\n } else if (eo > nodeIndex) {\n eo--;\n }\n }\n }\n };\n\n var normalizeStart = true;\n\n if (isCharacterDataNode(ec)) {\n if (ec.length == eo) {\n mergeForward(ec);\n }\n } else {\n if (eo > 0) {\n var endNode = ec.childNodes[eo - 1];\n if (endNode && isCharacterDataNode(endNode)) {\n mergeForward(endNode);\n }\n }\n normalizeStart = !this.collapsed;\n }\n\n if (normalizeStart) {\n if (isCharacterDataNode(sc)) {\n if (so == 0) {\n mergeBackward(sc);\n }\n } else {\n if (so < sc.childNodes.length) {\n var startNode = sc.childNodes[so];\n if (startNode && isCharacterDataNode(startNode)) {\n mergeBackward(startNode);\n }\n }\n }\n } else {\n sc = ec;\n so = eo;\n }\n\n boundaryUpdater(this, sc, so, ec, eo);\n },\n\n collapseToPoint: function(node, offset) {\n assertNotDetached(this);\n assertNoDocTypeNotationEntityAncestor(node, true);\n assertValidOffset(node, offset);\n this.setStartAndEnd(node, offset);\n }\n });\n\n copyComparisonConstants(constructor);\n }\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n // Updates commonAncestorContainer and collapsed after boundary change\n function updateCollapsedAndCommonAncestor(range) {\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n range.commonAncestorContainer = range.collapsed ?\n range.startContainer : dom.getCommonAncestor(range.startContainer, range.endContainer);\n }\n\n function updateBoundaries(range, startContainer, startOffset, endContainer, endOffset) {\n range.startContainer = startContainer;\n range.startOffset = startOffset;\n range.endContainer = endContainer;\n range.endOffset = endOffset;\n range.document = dom.getDocument(startContainer);\n\n updateCollapsedAndCommonAncestor(range);\n }\n\n function detach(range) {\n assertNotDetached(range);\n range.startContainer = range.startOffset = range.endContainer = range.endOffset = range.document = null;\n range.collapsed = range.commonAncestorContainer = null;\n }\n\n function Range(doc) {\n this.startContainer = doc;\n this.startOffset = 0;\n this.endContainer = doc;\n this.endOffset = 0;\n this.document = doc;\n updateCollapsedAndCommonAncestor(this);\n }\n\n createPrototypeRange(Range, updateBoundaries, detach);\n\n util.extend(Range, {\n rangeProperties: rangeProperties,\n RangeIterator: RangeIterator,\n copyComparisonConstants: copyComparisonConstants,\n createPrototypeRange: createPrototypeRange,\n inspect: inspect,\n getRangeDocument: getRangeDocument,\n rangesEqual: function(r1, r2) {\n return r1.startContainer === r2.startContainer &&\n r1.startOffset === r2.startOffset &&\n r1.endContainer === r2.endContainer &&\n r1.endOffset === r2.endOffset;\n }\n });\n\n api.DomRange = Range;\n api.RangeException = RangeException;\n});\nrangy.createCoreModule(\"WrappedRange\", [\"DomRange\"], function(api, module) {\n var WrappedRange, WrappedTextRange;\n var dom = api.dom;\n var util = api.util;\n var DomPosition = dom.DomPosition;\n var DomRange = api.DomRange;\n var getBody = dom.getBody;\n var getContentDocument = dom.getContentDocument;\n var isCharacterDataNode = dom.isCharacterDataNode;\n\n\n /*----------------------------------------------------------------------------------------------------------------*/\n\n if (api.features.implementsDomRange) {\n // This is a wrapper around the browser's native DOM Range. It has two aims:\n // - Provide workarounds for specific browser bugs\n // - provide convenient extensions, which are inherited from Rangy's DomRange\n\n (function() {\n var rangeProto;\n var rangeProperties = DomRange.rangeProperties;\n\n function updateRangeProperties(range) {\n var i = rangeProperties.length, prop;\n while (i--) {\n prop = rangeProperties[i];\n range[prop] = range.nativeRange[prop];\n }\n // Fix for broken collapsed property in IE 9.\n range.collapsed = (range.startContainer === range.endContainer && range.startOffset === range.endOffset);\n }\n\n function updateNativeRange(range, startContainer, startOffset, endContainer, endOffset) {\n var startMoved = (range.startContainer !== startContainer || range.startOffset != startOffset);\n var endMoved = (range.endContainer !== endContainer || range.endOffset != endOffset);\n var nativeRangeDifferent = !range.equals(range.nativeRange);\n\n // Always set both boundaries for the benefit of IE9 (see issue 35)\n if (startMoved || endMoved || nativeRangeDifferent) {\n range.setEnd(endContainer, endOffset);\n range.setStart(startContainer, startOffset);\n }\n }\n\n function detach(range) {\n range.nativeRange.detach();\n range.detached = true;\n var i = rangeProperties.length;\n while (i--) {\n range[ rangeProperties[i] ] = null;\n }\n }\n\n var createBeforeAfterNodeSetter;\n\n WrappedRange = function(range) {\n if (!range) {\n throw module.createError(\"WrappedRange: Range must be specified\");\n }\n this.nativeRange = range;\n updateRangeProperties(this);\n };\n\n DomRange.createPrototypeRange(WrappedRange, updateNativeRange, detach);\n\n rangeProto = WrappedRange.prototype;\n\n rangeProto.selectNode = function(node) {\n this.nativeRange.selectNode(node);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneContents = function() {\n return this.nativeRange.cloneContents();\n };\n\n // Due to a long-standing Firefox bug that I have not been able to find a reliable way to detect,\n // insertNode() is never delegated to the native range.\n\n rangeProto.surroundContents = function(node) {\n this.nativeRange.surroundContents(node);\n updateRangeProperties(this);\n };\n\n rangeProto.collapse = function(isStart) {\n this.nativeRange.collapse(isStart);\n updateRangeProperties(this);\n };\n\n rangeProto.cloneRange = function() {\n return new WrappedRange(this.nativeRange.cloneRange());\n };\n\n rangeProto.refresh = function() {\n updateRangeProperties(this);\n };\n\n rangeProto.toString = function() {\n return this.nativeRange.toString();\n };\n\n // Create test range and node for feature detection\n\n var testTextNode = document.createTextNode(\"test\");\n getBody(document).appendChild(testTextNode);\n var range = document.createRange();\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for Firefox 2 bug that prevents moving the start of a Range to a point after its current end and\n // correct for it\n\n range.setStart(testTextNode, 0);\n range.setEnd(testTextNode, 0);\n\n try {\n range.setStart(testTextNode, 1);\n\n rangeProto.setStart = function(node, offset) {\n this.nativeRange.setStart(node, offset);\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n this.nativeRange.setEnd(node, offset);\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name) {\n return function(node) {\n this.nativeRange[name](node);\n updateRangeProperties(this);\n };\n };\n\n } catch(ex) {\n\n rangeProto.setStart = function(node, offset) {\n try {\n this.nativeRange.setStart(node, offset);\n } catch (ex) {\n this.nativeRange.setEnd(node, offset);\n this.nativeRange.setStart(node, offset);\n }\n updateRangeProperties(this);\n };\n\n rangeProto.setEnd = function(node, offset) {\n try {\n this.nativeRange.setEnd(node, offset);\n } catch (ex) {\n this.nativeRange.setStart(node, offset);\n this.nativeRange.setEnd(node, offset);\n }\n updateRangeProperties(this);\n };\n\n createBeforeAfterNodeSetter = function(name, oppositeName) {\n return function(node) {\n try {\n this.nativeRange[name](node);\n } catch (ex) {\n this.nativeRange[oppositeName](node);\n this.nativeRange[name](node);\n }\n updateRangeProperties(this);\n };\n };\n }\n\n rangeProto.setStartBefore = createBeforeAfterNodeSetter(\"setStartBefore\", \"setEndBefore\");\n rangeProto.setStartAfter = createBeforeAfterNodeSetter(\"setStartAfter\", \"setEndAfter\");\n rangeProto.setEndBefore = createBeforeAfterNodeSetter(\"setEndBefore\", \"setStartBefore\");\n rangeProto.setEndAfter = createBeforeAfterNodeSetter(\"setEndAfter\", \"setStartAfter\");\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Always use DOM4-compliant selectNodeContents implementation: it's simpler and less code than testing\n // whether the native implementation can be trusted\n rangeProto.selectNodeContents = function(node) {\n this.setStartAndEnd(node, 0, dom.getNodeLength(node));\n };\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for and correct WebKit bug that has the behaviour of compareBoundaryPoints round the wrong way for\n // constants START_TO_END and END_TO_START: https://bugs.webkit.org/show_bug.cgi?id=20738\n\n range.selectNodeContents(testTextNode);\n range.setEnd(testTextNode, 3);\n\n var range2 = document.createRange();\n range2.selectNodeContents(testTextNode);\n range2.setEnd(testTextNode, 4);\n range2.setStart(testTextNode, 2);\n\n if (range.compareBoundaryPoints(range.START_TO_END, range2) == -1 &&\n range.compareBoundaryPoints(range.END_TO_START, range2) == 1) {\n // This is the wrong way round, so correct for it\n\n rangeProto.compareBoundaryPoints = function(type, range) {\n range = range.nativeRange || range;\n if (type == range.START_TO_END) {\n type = range.END_TO_START;\n } else if (type == range.END_TO_START) {\n type = range.START_TO_END;\n }\n return this.nativeRange.compareBoundaryPoints(type, range);\n };\n } else {\n rangeProto.compareBoundaryPoints = function(type, range) {\n return this.nativeRange.compareBoundaryPoints(type, range.nativeRange || range);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for IE 9 deleteContents() and extractContents() bug and correct it. See issue 107.\n\n var el = document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"div\");\n el.innerHTML = \"123\";\n var textNode = el.firstChild;\n var body = getBody(document);\n body.appendChild(el);\n\n range.setStart(textNode, 1);\n range.setEnd(textNode, 2);\n range.deleteContents();\n\n if (textNode.data == \"13\") {\n // Behaviour is correct per DOM4 Range so wrap the browser's implementation of deleteContents() and\n // extractContents()\n rangeProto.deleteContents = function() {\n this.nativeRange.deleteContents();\n updateRangeProperties(this);\n };\n\n rangeProto.extractContents = function() {\n var frag = this.nativeRange.extractContents();\n updateRangeProperties(this);\n return frag;\n };\n } else {\n }\n\n body.removeChild(el);\n body = null;\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Test for existence of createContextualFragment and delegate to it if it exists\n if (util.isHostMethod(range, \"createContextualFragment\")) {\n rangeProto.createContextualFragment = function(fragmentStr) {\n return this.nativeRange.createContextualFragment(fragmentStr);\n };\n }\n\n /*--------------------------------------------------------------------------------------------------------*/\n\n // Clean up\n getBody(document).removeChild(testTextNode);\n range.detach();\n range2.detach();\n\n rangeProto.getName = function() {\n return \"WrappedRange\";\n };\n\n api.WrappedRange = WrappedRange;\n\n api.createNativeRange = function(doc) {\n doc = getContentDocument(doc, module, \"createNativeRange\");\n return doc.createRange();\n };\n })();\n }\n \n if (api.features.implementsTextRange) {\n /*\n This is a workaround for a bug where IE returns the wrong container element from the TextRange's parentElement()\n method. For example, in the following (where pipes denote the selection boundaries):\n\n \n\n var range = document.selection.createRange();\n alert(range.parentElement().id); // Should alert \"ul\" but alerts \"b\"\n\n This method returns the common ancestor node of the following:\n - the parentElement() of the textRange\n - the parentElement() of the textRange after calling collapse(true)\n - the parentElement() of the textRange after calling collapse(false)\n */\n var getTextRangeContainerElement = function(textRange) {\n var parentEl = textRange.parentElement();\n var range = textRange.duplicate();\n range.collapse(true);\n var startEl = range.parentElement();\n range = textRange.duplicate();\n range.collapse(false);\n var endEl = range.parentElement();\n var startEndContainer = (startEl == endEl) ? startEl : dom.getCommonAncestor(startEl, endEl);\n\n return startEndContainer == parentEl ? startEndContainer : dom.getCommonAncestor(parentEl, startEndContainer);\n };\n\n var textRangeIsCollapsed = function(textRange) {\n return textRange.compareEndPoints(\"StartToEnd\", textRange) == 0;\n };\n\n // Gets the boundary of a TextRange expressed as a node and an offset within that node. This function started out as\n // an improved version of code found in Tim Cameron Ryan's IERange (http://code.google.com/p/ierange/) but has\n // grown, fixing problems with line breaks in preformatted text, adding workaround for IE TextRange bugs, handling\n // for inputs and images, plus optimizations.\n var getTextRangeBoundaryPosition = function(textRange, wholeRangeContainerElement, isStart, isCollapsed, startInfo) {\n var workingRange = textRange.duplicate();\n workingRange.collapse(isStart);\n var containerElement = workingRange.parentElement();\n\n // Sometimes collapsing a TextRange that's at the start of a text node can move it into the previous node, so\n // check for that\n if (!dom.isOrIsAncestorOf(wholeRangeContainerElement, containerElement)) {\n containerElement = wholeRangeContainerElement;\n }\n\n\n // Deal with nodes that cannot \"contain rich HTML markup\". In practice, this means form inputs, images and\n // similar. See http://msdn.microsoft.com/en-us/library/aa703950%28VS.85%29.aspx\n if (!containerElement.canHaveHTML) {\n var pos = new DomPosition(containerElement.parentNode, dom.getNodeIndex(containerElement));\n return {\n boundaryPosition: pos,\n nodeInfo: {\n nodeIndex: pos.offset,\n containerElement: pos.node\n }\n };\n }\n\n var workingNode = dom.getDocument(containerElement).createElementNS(\"http://www.w3.org/1999/xhtml\", \"span\");\n\n // Workaround for HTML5 Shiv's insane violation of document.createElementNS(\"http://www.w3.org/1999/xhtml\", ). See Rangy issue 104 and HTML5\n // Shiv issue 64: https://github.com/aFarkas/html5shiv/issues/64\n if (workingNode.parentNode) {\n workingNode.parentNode.removeChild(workingNode);\n }\n\n var comparison, workingComparisonType = isStart ? \"StartToStart\" : \"StartToEnd\";\n var previousNode, nextNode, boundaryPosition, boundaryNode;\n var start = (startInfo && startInfo.containerElement == containerElement) ? startInfo.nodeIndex : 0;\n var childNodeCount = containerElement.childNodes.length;\n var end = childNodeCount;\n\n // Check end first. Code within the loop assumes that the endth child node of the container is definitely\n // after the range boundary.\n var nodeIndex = end;\n\n while (true) {\n if (nodeIndex == childNodeCount) {\n containerElement.appendChild(workingNode);\n } else {\n containerElement.insertBefore(workingNode, containerElement.childNodes[nodeIndex]);\n }\n workingRange.moveToElementText(workingNode);\n comparison = workingRange.compareEndPoints(workingComparisonType, textRange);\n if (comparison == 0 || start == end) {\n break;\n } else if (comparison == -1) {\n if (end == start + 1) {\n // We know the endth child node is after the range boundary, so we must be done.\n break;\n } else {\n start = nodeIndex;\n }\n } else {\n end = (end == start + 1) ? start : nodeIndex;\n }\n nodeIndex = Math.floor((start + end) / 2);\n containerElement.removeChild(workingNode);\n }\n\n\n // We've now reached or gone past the boundary of the text range we're interested in\n // so have identified the node we want\n boundaryNode = workingNode.nextSibling;\n\n if (comparison == -1 && boundaryNode && isCharacterDataNode(boundaryNode)) {\n // This is a character data node (text, comment, cdata). The working range is collapsed at the start of the\n // node containing the text range's boundary, so we move the end of the working range to the boundary point\n // and measure the length of its text to get the boundary's offset within the node.\n workingRange.setEndPoint(isStart ? \"EndToStart\" : \"EndToEnd\", textRange);\n\n var offset;\n\n if (/[\\r\\n]/.test(boundaryNode.data)) {\n /*\n For the particular case of a boundary within a text node containing rendered line breaks (within a
\n                    element, for example), we need a slightly complicated approach to get the boundary's offset in IE. The\n                    facts:\n                    \n                    - Each line break is represented as \\r in the text node's data/nodeValue properties\n                    - Each line break is represented as \\r\\n in the TextRange's 'text' property\n                    - The 'text' property of the TextRange does not contain trailing line breaks\n                    \n                    To get round the problem presented by the final fact above, we can use the fact that TextRange's\n                    moveStart() and moveEnd() methods return the actual number of characters moved, which is not necessarily\n                    the same as the number of characters it was instructed to move. The simplest approach is to use this to\n                    store the characters moved when moving both the start and end of the range to the start of the document\n                    body and subtracting the start offset from the end offset (the \"move-negative-gazillion\" method).\n                    However, this is extremely slow when the document is large and the range is near the end of it. Clearly\n                    doing the mirror image (i.e. moving the range boundaries to the end of the document) has the same\n                    problem.\n                    \n                    Another approach that works is to use moveStart() to move the start boundary of the range up to the end\n                    boundary one character at a time and incrementing a counter with the value returned by the moveStart()\n                    call. However, the check for whether the start boundary has reached the end boundary is expensive, so\n                    this method is slow (although unlike \"move-negative-gazillion\" is largely unaffected by the location of\n                    the range within the document).\n                    \n                    The method below is a hybrid of the two methods above. It uses the fact that a string containing the\n                    TextRange's 'text' property with each \\r\\n converted to a single \\r character cannot be longer than the\n                    text of the TextRange, so the start of the range is moved that length initially and then a character at\n                    a time to make up for any trailing line breaks not contained in the 'text' property. This has good\n                    performance in most situations compared to the previous two methods.\n                    */\n                    var tempRange = workingRange.duplicate();\n                    var rangeLength = tempRange.text.replace(/\\r\\n/g, \"\\r\").length;\n\n                    offset = tempRange.moveStart(\"character\", rangeLength);\n                    while ( (comparison = tempRange.compareEndPoints(\"StartToEnd\", tempRange)) == -1) {\n                        offset++;\n                        tempRange.moveStart(\"character\", 1);\n                    }\n                } else {\n                    offset = workingRange.text.length;\n                }\n                boundaryPosition = new DomPosition(boundaryNode, offset);\n            } else {\n\n                // If the boundary immediately follows a character data node and this is the end boundary, we should favour\n                // a position within that, and likewise for a start boundary preceding a character data node\n                previousNode = (isCollapsed || !isStart) && workingNode.previousSibling;\n                nextNode = (isCollapsed || isStart) && workingNode.nextSibling;\n                if (nextNode && isCharacterDataNode(nextNode)) {\n                    boundaryPosition = new DomPosition(nextNode, 0);\n                } else if (previousNode && isCharacterDataNode(previousNode)) {\n                    boundaryPosition = new DomPosition(previousNode, previousNode.data.length);\n                } else {\n                    boundaryPosition = new DomPosition(containerElement, dom.getNodeIndex(workingNode));\n                }\n            }\n\n            // Clean up\n            workingNode.parentNode.removeChild(workingNode);\n\n            return {\n                boundaryPosition: boundaryPosition,\n                nodeInfo: {\n                    nodeIndex: nodeIndex,\n                    containerElement: containerElement\n                }\n            };\n        };\n\n        // Returns a TextRange representing the boundary of a TextRange expressed as a node and an offset within that node.\n        // This function started out as an optimized version of code found in Tim Cameron Ryan's IERange\n        // (http://code.google.com/p/ierange/)\n        var createBoundaryTextRange = function(boundaryPosition, isStart) {\n            var boundaryNode, boundaryParent, boundaryOffset = boundaryPosition.offset;\n            var doc = dom.getDocument(boundaryPosition.node);\n            var workingNode, childNodes, workingRange = getBody(doc).createTextRange();\n            var nodeIsDataNode = isCharacterDataNode(boundaryPosition.node);\n\n            if (nodeIsDataNode) {\n                boundaryNode = boundaryPosition.node;\n                boundaryParent = boundaryNode.parentNode;\n            } else {\n                childNodes = boundaryPosition.node.childNodes;\n                boundaryNode = (boundaryOffset < childNodes.length) ? childNodes[boundaryOffset] : null;\n                boundaryParent = boundaryPosition.node;\n            }\n\n            // Position the range immediately before the node containing the boundary\n            workingNode = doc.createElementNS(\"http://www.w3.org/1999/xhtml\", \"span\");\n\n            // Making the working element non-empty element persuades IE to consider the TextRange boundary to be within the\n            // element rather than immediately before or after it\n            workingNode.innerHTML = \"&#feff;\";\n\n            // insertBefore is supposed to work like appendChild if the second parameter is null. However, a bug report\n            // for IERange suggests that it can crash the browser: http://code.google.com/p/ierange/issues/detail?id=12\n            if (boundaryNode) {\n                boundaryParent.insertBefore(workingNode, boundaryNode);\n            } else {\n                boundaryParent.appendChild(workingNode);\n            }\n\n            workingRange.moveToElementText(workingNode);\n            workingRange.collapse(!isStart);\n\n            // Clean up\n            boundaryParent.removeChild(workingNode);\n\n            // Move the working range to the text offset, if required\n            if (nodeIsDataNode) {\n                workingRange[isStart ? \"moveStart\" : \"moveEnd\"](\"character\", boundaryOffset);\n            }\n\n            return workingRange;\n        };\n\n        /*------------------------------------------------------------------------------------------------------------*/\n\n        // This is a wrapper around a TextRange, providing full DOM Range functionality using rangy's DomRange as a\n        // prototype\n\n        WrappedTextRange = function(textRange) {\n            this.textRange = textRange;\n            this.refresh();\n        };\n\n        WrappedTextRange.prototype = new DomRange(document);\n\n        WrappedTextRange.prototype.refresh = function() {\n            var start, end, startBoundary;\n\n            // TextRange's parentElement() method cannot be trusted. getTextRangeContainerElement() works around that.\n            var rangeContainerElement = getTextRangeContainerElement(this.textRange);\n\n            if (textRangeIsCollapsed(this.textRange)) {\n                end = start = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true,\n                    true).boundaryPosition;\n            } else {\n                startBoundary = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, true, false);\n                start = startBoundary.boundaryPosition;\n\n                // An optimization used here is that if the start and end boundaries have the same parent element, the\n                // search scope for the end boundary can be limited to exclude the portion of the element that precedes\n                // the start boundary\n                end = getTextRangeBoundaryPosition(this.textRange, rangeContainerElement, false, false,\n                    startBoundary.nodeInfo).boundaryPosition;\n            }\n\n            this.setStart(start.node, start.offset);\n            this.setEnd(end.node, end.offset);\n        };\n\n        WrappedTextRange.prototype.getName = function() {\n            return \"WrappedTextRange\";\n        };\n\n        DomRange.copyComparisonConstants(WrappedTextRange);\n\n        WrappedTextRange.rangeToTextRange = function(range) {\n            if (range.collapsed) {\n                return createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n            } else {\n                var startRange = createBoundaryTextRange(new DomPosition(range.startContainer, range.startOffset), true);\n                var endRange = createBoundaryTextRange(new DomPosition(range.endContainer, range.endOffset), false);\n                var textRange = getBody( DomRange.getRangeDocument(range) ).createTextRange();\n                textRange.setEndPoint(\"StartToStart\", startRange);\n                textRange.setEndPoint(\"EndToEnd\", endRange);\n                return textRange;\n            }\n        };\n\n        api.WrappedTextRange = WrappedTextRange;\n\n        // IE 9 and above have both implementations and Rangy makes both available. The next few lines sets which\n        // implementation to use by default.\n        if (!api.features.implementsDomRange || api.config.preferTextRange) {\n            // Add WrappedTextRange as the Range property of the global object to allow expression like Range.END_TO_END to work\n            var globalObj = (function() { return this; })();\n            if (typeof globalObj.Range == \"undefined\") {\n                globalObj.Range = WrappedTextRange;\n            }\n\n            api.createNativeRange = function(doc) {\n                doc = getContentDocument(doc, module, \"createNativeRange\");\n                return getBody(doc).createTextRange();\n            };\n\n            api.WrappedRange = WrappedTextRange;\n        }\n    }\n\n    api.createRange = function(doc) {\n        doc = getContentDocument(doc, module, \"createRange\");\n        return new api.WrappedRange(api.createNativeRange(doc));\n    };\n\n    api.createRangyRange = function(doc) {\n        doc = getContentDocument(doc, module, \"createRangyRange\");\n        return new DomRange(doc);\n    };\n\n    api.createIframeRange = function(iframeEl) {\n        module.deprecationNotice(\"createIframeRange()\", \"createRange(iframeEl)\");\n        return api.createRange(iframeEl);\n    };\n\n    api.createIframeRangyRange = function(iframeEl) {\n        module.deprecationNotice(\"createIframeRangyRange()\", \"createRangyRange(iframeEl)\");\n        return api.createRangyRange(iframeEl);\n    };\n\n    api.addCreateMissingNativeApiListener(function(win) {\n        var doc = win.document;\n        if (typeof doc.createRange == \"undefined\") {\n            doc.createRange = function() {\n                return api.createRange(doc);\n            };\n        }\n        doc = win = null;\n    });\n});\n// This module creates a selection object wrapper that conforms as closely as possible to the Selection specification\n// in the HTML Editing spec (http://dvcs.w3.org/hg/editing/raw-file/tip/editing.html#selections)\nrangy.createCoreModule(\"WrappedSelection\", [\"DomRange\", \"WrappedRange\"], function(api, module) {\n    api.config.checkSelectionRanges = true;\n\n    var BOOLEAN = \"boolean\";\n    var NUMBER = \"number\";\n    var dom = api.dom;\n    var util = api.util;\n    var isHostMethod = util.isHostMethod;\n    var DomRange = api.DomRange;\n    var WrappedRange = api.WrappedRange;\n    var DOMException = api.DOMException;\n    var DomPosition = dom.DomPosition;\n    var getNativeSelection;\n    var selectionIsCollapsed;\n    var features = api.features;\n    var CONTROL = \"Control\";\n    var getDocument = dom.getDocument;\n    var getBody = dom.getBody;\n    var rangesEqual = DomRange.rangesEqual;\n\n\n    // Utility function to support direction parameters in the API that may be a string (\"backward\" or \"forward\") or a\n    // Boolean (true for backwards).\n    function isDirectionBackward(dir) {\n        return (typeof dir == \"string\") ? /^backward(s)?$/i.test(dir) : !!dir;\n    }\n\n    function getWindow(win, methodName) {\n        if (!win) {\n            return window;\n        } else if (dom.isWindow(win)) {\n            return win;\n        } else if (win instanceof WrappedSelection) {\n            return win.win;\n        } else {\n            var doc = dom.getContentDocument(win, module, methodName);\n            return dom.getWindow(doc);\n        }\n    }\n\n    function getWinSelection(winParam) {\n        return getWindow(winParam, \"getWinSelection\").getSelection();\n    }\n\n    function getDocSelection(winParam) {\n        return getWindow(winParam, \"getDocSelection\").document.selection;\n    }\n    \n    function winSelectionIsBackward(sel) {\n        var backward = false;\n        if (sel.anchorNode) {\n            backward = (dom.comparePoints(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset) == 1);\n        }\n        return backward;\n    }\n\n    // Test for the Range/TextRange and Selection features required\n    // Test for ability to retrieve selection\n    var implementsWinGetSelection = isHostMethod(window, \"getSelection\"),\n        implementsDocSelection = util.isHostObject(document, \"selection\");\n\n    features.implementsWinGetSelection = implementsWinGetSelection;\n    features.implementsDocSelection = implementsDocSelection;\n\n    var useDocumentSelection = implementsDocSelection && (!implementsWinGetSelection || api.config.preferTextRange);\n\n    if (useDocumentSelection) {\n        getNativeSelection = getDocSelection;\n        api.isSelectionValid = function(winParam) {\n            var doc = getWindow(winParam, \"isSelectionValid\").document, nativeSel = doc.selection;\n\n            // Check whether the selection TextRange is actually contained within the correct document\n            return (nativeSel.type != \"None\" || getDocument(nativeSel.createRange().parentElement()) == doc);\n        };\n    } else if (implementsWinGetSelection) {\n        getNativeSelection = getWinSelection;\n        api.isSelectionValid = function() {\n            return true;\n        };\n    } else {\n        module.fail(\"Neither document.selection or window.getSelection() detected.\");\n    }\n\n    api.getNativeSelection = getNativeSelection;\n\n    var testSelection = getNativeSelection();\n    var testRange = api.createNativeRange(document);\n    var body = getBody(document);\n\n    // Obtaining a range from a selection\n    var selectionHasAnchorAndFocus = util.areHostProperties(testSelection,\n        [\"anchorNode\", \"focusNode\", \"anchorOffset\", \"focusOffset\"]);\n\n    features.selectionHasAnchorAndFocus = selectionHasAnchorAndFocus;\n\n    // Test for existence of native selection extend() method\n    var selectionHasExtend = isHostMethod(testSelection, \"extend\");\n    features.selectionHasExtend = selectionHasExtend;\n    \n    // Test if rangeCount exists\n    var selectionHasRangeCount = (typeof testSelection.rangeCount == NUMBER);\n    features.selectionHasRangeCount = selectionHasRangeCount;\n\n    var selectionSupportsMultipleRanges = false;\n    var collapsedNonEditableSelectionsSupported = true;\n\n    var addRangeBackwardToNative = selectionHasExtend ?\n        function(nativeSelection, range) {\n            var doc = DomRange.getRangeDocument(range);\n            var endRange = api.createRange(doc);\n            endRange.collapseToPoint(range.endContainer, range.endOffset);\n            nativeSelection.addRange(getNativeRange(endRange));\n            nativeSelection.extend(range.startContainer, range.startOffset);\n        } : null;\n\n    if (util.areHostMethods(testSelection, [\"addRange\", \"getRangeAt\", \"removeAllRanges\"]) &&\n            typeof testSelection.rangeCount == NUMBER && features.implementsDomRange) {\n\n        (function() {\n            // Previously an iframe was used but this caused problems in some circumstances in IE, so tests are\n            // performed on the current document's selection. See issue 109.\n\n            // Note also that if a selection previously existed, it is wiped by these tests. This should usually be fine\n            // because initialization usually happens when the document loads, but could be a problem for a script that\n            // loads and initializes Rangy later. If anyone complains, code could be added to save and restore the\n            // selection.\n            var sel = window.getSelection();\n            if (sel) {\n                // Store the current selection\n                var originalSelectionRangeCount = sel.rangeCount;\n                var selectionHasMultipleRanges = (originalSelectionRangeCount > 1);\n                var originalSelectionRanges = [];\n                var originalSelectionBackward = winSelectionIsBackward(sel); \n                for (var i = 0; i < originalSelectionRangeCount; ++i) {\n                    originalSelectionRanges[i] = sel.getRangeAt(i);\n                }\n                \n                // Create some test elements\n                var body = getBody(document);\n                var testEl = body.appendChild( document.createElementNS(\"http://www.w3.org/1999/xhtml\", \"div\") );\n                testEl.contentEditable = \"false\";\n                var textNode = testEl.appendChild( document.createTextNode(\"\\u00a0\\u00a0\\u00a0\") );\n\n                // Test whether the native selection will allow a collapsed selection within a non-editable element\n                var r1 = document.createRange();\n\n                r1.setStart(textNode, 1);\n                r1.collapse(true);\n                sel.addRange(r1);\n                collapsedNonEditableSelectionsSupported = (sel.rangeCount == 1);\n                sel.removeAllRanges();\n\n                // Test whether the native selection is capable of supporting multiple ranges\n                if (!selectionHasMultipleRanges) {\n                    var r2 = r1.cloneRange();\n                    r1.setStart(textNode, 0);\n                    r2.setEnd(textNode, 3);\n                    r2.setStart(textNode, 2);\n                    sel.addRange(r1);\n                    sel.addRange(r2);\n\n                    selectionSupportsMultipleRanges = (sel.rangeCount == 2);\n                    r2.detach();\n                }\n\n                // Clean up\n                body.removeChild(testEl);\n                sel.removeAllRanges();\n                r1.detach();\n\n                for (i = 0; i < originalSelectionRangeCount; ++i) {\n                    if (i == 0 && originalSelectionBackward) {\n                        if (addRangeBackwardToNative) {\n                            addRangeBackwardToNative(sel, originalSelectionRanges[i]);\n                        } else {\n                            api.warn(\"Rangy initialization: original selection was backwards but selection has been restored forwards because browser does not support Selection.extend\");\n                            sel.addRange(originalSelectionRanges[i])\n                        }\n                    } else {\n                        sel.addRange(originalSelectionRanges[i])\n                    }\n                }\n            }\n        })();\n    }\n\n    features.selectionSupportsMultipleRanges = selectionSupportsMultipleRanges;\n    features.collapsedNonEditableSelectionsSupported = collapsedNonEditableSelectionsSupported;\n\n    // ControlRanges\n    var implementsControlRange = false, testControlRange;\n\n    if (body && isHostMethod(body, \"createControlRange\")) {\n        testControlRange = body.createControlRange();\n        if (util.areHostProperties(testControlRange, [\"item\", \"add\"])) {\n            implementsControlRange = true;\n        }\n    }\n    features.implementsControlRange = implementsControlRange;\n\n    // Selection collapsedness\n    if (selectionHasAnchorAndFocus) {\n        selectionIsCollapsed = function(sel) {\n            return sel.anchorNode === sel.focusNode && sel.anchorOffset === sel.focusOffset;\n        };\n    } else {\n        selectionIsCollapsed = function(sel) {\n            return sel.rangeCount ? sel.getRangeAt(sel.rangeCount - 1).collapsed : false;\n        };\n    }\n\n    function updateAnchorAndFocusFromRange(sel, range, backward) {\n        var anchorPrefix = backward ? \"end\" : \"start\", focusPrefix = backward ? \"start\" : \"end\";\n        sel.anchorNode = range[anchorPrefix + \"Container\"];\n        sel.anchorOffset = range[anchorPrefix + \"Offset\"];\n        sel.focusNode = range[focusPrefix + \"Container\"];\n        sel.focusOffset = range[focusPrefix + \"Offset\"];\n    }\n\n    function updateAnchorAndFocusFromNativeSelection(sel) {\n        var nativeSel = sel.nativeSelection;\n        sel.anchorNode = nativeSel.anchorNode;\n        sel.anchorOffset = nativeSel.anchorOffset;\n        sel.focusNode = nativeSel.focusNode;\n        sel.focusOffset = nativeSel.focusOffset;\n    }\n\n    function updateEmptySelection(sel) {\n        sel.anchorNode = sel.focusNode = null;\n        sel.anchorOffset = sel.focusOffset = 0;\n        sel.rangeCount = 0;\n        sel.isCollapsed = true;\n        sel._ranges.length = 0;\n    }\n\n    function getNativeRange(range) {\n        var nativeRange;\n        if (range instanceof DomRange) {\n            nativeRange = api.createNativeRange(range.getDocument());\n            nativeRange.setEnd(range.endContainer, range.endOffset);\n            nativeRange.setStart(range.startContainer, range.startOffset);\n        } else if (range instanceof WrappedRange) {\n            nativeRange = range.nativeRange;\n        } else if (features.implementsDomRange && (range instanceof dom.getWindow(range.startContainer).Range)) {\n            nativeRange = range;\n        }\n        return nativeRange;\n    }\n\n    function rangeContainsSingleElement(rangeNodes) {\n        if (!rangeNodes.length || rangeNodes[0].nodeType != 1) {\n            return false;\n        }\n        for (var i = 1, len = rangeNodes.length; i < len; ++i) {\n            if (!dom.isAncestorOf(rangeNodes[0], rangeNodes[i])) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function getSingleElementFromRange(range) {\n        var nodes = range.getNodes();\n        if (!rangeContainsSingleElement(nodes)) {\n            throw module.createError(\"getSingleElementFromRange: range \" + range.inspect() + \" did not consist of a single element\");\n        }\n        return nodes[0];\n    }\n\n    // Simple, quick test which only needs to distinguish between a TextRange and a ControlRange\n    function isTextRange(range) {\n        return !!range && typeof range.text != \"undefined\";\n    }\n\n    function updateFromTextRange(sel, range) {\n        // Create a Range from the selected TextRange\n        var wrappedRange = new WrappedRange(range);\n        sel._ranges = [wrappedRange];\n\n        updateAnchorAndFocusFromRange(sel, wrappedRange, false);\n        sel.rangeCount = 1;\n        sel.isCollapsed = wrappedRange.collapsed;\n    }\n\n    function updateControlSelection(sel) {\n        // Update the wrapped selection based on what's now in the native selection\n        sel._ranges.length = 0;\n        if (sel.docSelection.type == \"None\") {\n            updateEmptySelection(sel);\n        } else {\n            var controlRange = sel.docSelection.createRange();\n            if (isTextRange(controlRange)) {\n                // This case (where the selection type is \"Control\" and calling createRange() on the selection returns\n                // a TextRange) can happen in IE 9. It happens, for example, when all elements in the selected\n                // ControlRange have been removed from the ControlRange and removed from the document.\n                updateFromTextRange(sel, controlRange);\n            } else {\n                sel.rangeCount = controlRange.length;\n                var range, doc = getDocument(controlRange.item(0));\n                for (var i = 0; i < sel.rangeCount; ++i) {\n                    range = api.createRange(doc);\n                    range.selectNode(controlRange.item(i));\n                    sel._ranges.push(range);\n                }\n                sel.isCollapsed = sel.rangeCount == 1 && sel._ranges[0].collapsed;\n                updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], false);\n            }\n        }\n    }\n\n    function addRangeToControlSelection(sel, range) {\n        var controlRange = sel.docSelection.createRange();\n        var rangeElement = getSingleElementFromRange(range);\n\n        // Create a new ControlRange containing all the elements in the selected ControlRange plus the element\n        // contained by the supplied range\n        var doc = getDocument(controlRange.item(0));\n        var newControlRange = getBody(doc).createControlRange();\n        for (var i = 0, len = controlRange.length; i < len; ++i) {\n            newControlRange.add(controlRange.item(i));\n        }\n        try {\n            newControlRange.add(rangeElement);\n        } catch (ex) {\n            throw module.createError(\"addRange(): Element within the specified Range could not be added to control selection (does it have layout?)\");\n        }\n        newControlRange.select();\n\n        // Update the wrapped selection based on what's now in the native selection\n        updateControlSelection(sel);\n    }\n\n    var getSelectionRangeAt;\n\n    if (isHostMethod(testSelection, \"getRangeAt\")) {\n        // try/catch is present because getRangeAt() must have thrown an error in some browser and some situation.\n        // Unfortunately, I didn't write a comment about the specifics and am now scared to take it out. Let that be a\n        // lesson to us all, especially me.\n        getSelectionRangeAt = function(sel, index) {\n            try {\n                return sel.getRangeAt(index);\n            } catch (ex) {\n                return null;\n            }\n        };\n    } else if (selectionHasAnchorAndFocus) {\n        getSelectionRangeAt = function(sel) {\n            var doc = getDocument(sel.anchorNode);\n            var range = api.createRange(doc);\n            range.setStartAndEnd(sel.anchorNode, sel.anchorOffset, sel.focusNode, sel.focusOffset);\n\n            // Handle the case when the selection was selected backwards (from the end to the start in the\n            // document)\n            if (range.collapsed !== this.isCollapsed) {\n                range.setStartAndEnd(sel.focusNode, sel.focusOffset, sel.anchorNode, sel.anchorOffset);\n            }\n\n            return range;\n        };\n    }\n\n    function WrappedSelection(selection, docSelection, win) {\n        this.nativeSelection = selection;\n        this.docSelection = docSelection;\n        this._ranges = [];\n        this.win = win;\n        this.refresh();\n    }\n\n    WrappedSelection.prototype = api.selectionPrototype;\n\n    function deleteProperties(sel) {\n        sel.win = sel.anchorNode = sel.focusNode = sel._ranges = null;\n        sel.rangeCount = sel.anchorOffset = sel.focusOffset = 0;\n        sel.detached = true;\n    }\n\n    var cachedRangySelections = [];\n\n    function actOnCachedSelection(win, action) {\n        var i = cachedRangySelections.length, cached, sel;\n        while (i--) {\n            cached = cachedRangySelections[i];\n            sel = cached.selection;\n            if (action == \"deleteAll\") {\n                deleteProperties(sel);\n            } else if (cached.win == win) {\n                if (action == \"delete\") {\n                    cachedRangySelections.splice(i, 1);\n                    return true;\n                } else {\n                    return sel;\n                }\n            }\n        }\n        if (action == \"deleteAll\") {\n            cachedRangySelections.length = 0;\n        }\n        return null;\n    }\n\n    var getSelection = function(win) {\n        // Check if the parameter is a Rangy Selection object\n        if (win && win instanceof WrappedSelection) {\n            win.refresh();\n            return win;\n        }\n\n        win = getWindow(win, \"getNativeSelection\");\n\n        var sel = actOnCachedSelection(win);\n        var nativeSel = getNativeSelection(win), docSel = implementsDocSelection ? getDocSelection(win) : null;\n        if (sel) {\n            sel.nativeSelection = nativeSel;\n            sel.docSelection = docSel;\n            sel.refresh();\n        } else {\n            sel = new WrappedSelection(nativeSel, docSel, win);\n            cachedRangySelections.push( { win: win, selection: sel } );\n        }\n        return sel;\n    };\n\n    api.getSelection = getSelection;\n\n    api.getIframeSelection = function(iframeEl) {\n        module.deprecationNotice(\"getIframeSelection()\", \"getSelection(iframeEl)\");\n        return api.getSelection(dom.getIframeWindow(iframeEl));\n    };\n\n    var selProto = WrappedSelection.prototype;\n\n    function createControlSelection(sel, ranges) {\n        // Ensure that the selection becomes of type \"Control\"\n        var doc = getDocument(ranges[0].startContainer);\n        var controlRange = getBody(doc).createControlRange();\n        for (var i = 0, el, len = ranges.length; i < len; ++i) {\n            el = getSingleElementFromRange(ranges[i]);\n            try {\n                controlRange.add(el);\n            } catch (ex) {\n                throw module.createError(\"setRanges(): Element within one of the specified Ranges could not be added to control selection (does it have layout?)\");\n            }\n        }\n        controlRange.select();\n\n        // Update the wrapped selection based on what's now in the native selection\n        updateControlSelection(sel);\n    }\n\n    // Selecting a range\n    if (!useDocumentSelection && selectionHasAnchorAndFocus && util.areHostMethods(testSelection, [\"removeAllRanges\", \"addRange\"])) {\n        selProto.removeAllRanges = function() {\n            this.nativeSelection.removeAllRanges();\n            updateEmptySelection(this);\n        };\n\n        var addRangeBackward = function(sel, range) {\n            addRangeBackwardToNative(sel.nativeSelection, range);\n            sel.refresh();\n        };\n\n        if (selectionHasRangeCount) {\n            selProto.addRange = function(range, direction) {\n                if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n                    addRangeToControlSelection(this, range);\n                } else {\n                    if (isDirectionBackward(direction) && selectionHasExtend) {\n                        addRangeBackward(this, range);\n                    } else {\n                        var previousRangeCount;\n                        if (selectionSupportsMultipleRanges) {\n                            previousRangeCount = this.rangeCount;\n                        } else {\n                            this.removeAllRanges();\n                            previousRangeCount = 0;\n                        }\n                        // Clone the native range so that changing the selected range does not affect the selection.\n                        // This is contrary to the spec but is the only way to achieve consistency between browsers. See\n                        // issue 80.\n                        this.nativeSelection.addRange(getNativeRange(range).cloneRange());\n\n                        // Check whether adding the range was successful\n                        this.rangeCount = this.nativeSelection.rangeCount;\n\n                        if (this.rangeCount == previousRangeCount + 1) {\n                            // The range was added successfully\n\n                            // Check whether the range that we added to the selection is reflected in the last range extracted from\n                            // the selection\n                            if (api.config.checkSelectionRanges) {\n                                var nativeRange = getSelectionRangeAt(this.nativeSelection, this.rangeCount - 1);\n                                if (nativeRange && !rangesEqual(nativeRange, range)) {\n                                    // Happens in WebKit with, for example, a selection placed at the start of a text node\n                                    range = new WrappedRange(nativeRange);\n                                }\n                            }\n                            this._ranges[this.rangeCount - 1] = range;\n                            updateAnchorAndFocusFromRange(this, range, selectionIsBackward(this.nativeSelection));\n                            this.isCollapsed = selectionIsCollapsed(this);\n                        } else {\n                            // The range was not added successfully. The simplest thing is to refresh\n                            this.refresh();\n                        }\n                    }\n                }\n            };\n        } else {\n            selProto.addRange = function(range, direction) {\n                if (isDirectionBackward(direction) && selectionHasExtend) {\n                    addRangeBackward(this, range);\n                } else {\n                    this.nativeSelection.addRange(getNativeRange(range));\n                    this.refresh();\n                }\n            };\n        }\n\n        selProto.setRanges = function(ranges) {\n            if (implementsControlRange && ranges.length > 1) {\n                createControlSelection(this, ranges);\n            } else {\n                this.removeAllRanges();\n                for (var i = 0, len = ranges.length; i < len; ++i) {\n                    this.addRange(ranges[i]);\n                }\n            }\n        };\n    } else if (isHostMethod(testSelection, \"empty\") && isHostMethod(testRange, \"select\") &&\n               implementsControlRange && useDocumentSelection) {\n\n        selProto.removeAllRanges = function() {\n            // Added try/catch as fix for issue #21\n            try {\n                this.docSelection.empty();\n\n                // Check for empty() not working (issue #24)\n                if (this.docSelection.type != \"None\") {\n                    // Work around failure to empty a control selection by instead selecting a TextRange and then\n                    // calling empty()\n                    var doc;\n                    if (this.anchorNode) {\n                        doc = getDocument(this.anchorNode);\n                    } else if (this.docSelection.type == CONTROL) {\n                        var controlRange = this.docSelection.createRange();\n                        if (controlRange.length) {\n                            doc = getDocument( controlRange.item(0) );\n                        }\n                    }\n                    if (doc) {\n                        var textRange = getBody(doc).createTextRange();\n                        textRange.select();\n                        this.docSelection.empty();\n                    }\n                }\n            } catch(ex) {}\n            updateEmptySelection(this);\n        };\n\n        selProto.addRange = function(range) {\n            if (this.docSelection.type == CONTROL) {\n                addRangeToControlSelection(this, range);\n            } else {\n                api.WrappedTextRange.rangeToTextRange(range).select();\n                this._ranges[0] = range;\n                this.rangeCount = 1;\n                this.isCollapsed = this._ranges[0].collapsed;\n                updateAnchorAndFocusFromRange(this, range, false);\n            }\n        };\n\n        selProto.setRanges = function(ranges) {\n            this.removeAllRanges();\n            var rangeCount = ranges.length;\n            if (rangeCount > 1) {\n                createControlSelection(this, ranges);\n            } else if (rangeCount) {\n                this.addRange(ranges[0]);\n            }\n        };\n    } else {\n        module.fail(\"No means of selecting a Range or TextRange was found\");\n        return false;\n    }\n\n    selProto.getRangeAt = function(index) {\n        if (index < 0 || index >= this.rangeCount) {\n            throw new DOMException(\"INDEX_SIZE_ERR\");\n        } else {\n            // Clone the range to preserve selection-range independence. See issue 80.\n            return this._ranges[index].cloneRange();\n        }\n    };\n\n    var refreshSelection;\n\n    if (useDocumentSelection) {\n        refreshSelection = function(sel) {\n            var range;\n            if (api.isSelectionValid(sel.win)) {\n                range = sel.docSelection.createRange();\n            } else {\n                range = getBody(sel.win.document).createTextRange();\n                range.collapse(true);\n            }\n\n            if (sel.docSelection.type == CONTROL) {\n                updateControlSelection(sel);\n            } else if (isTextRange(range)) {\n                updateFromTextRange(sel, range);\n            } else {\n                updateEmptySelection(sel);\n            }\n        };\n    } else if (isHostMethod(testSelection, \"getRangeAt\") && typeof testSelection.rangeCount == NUMBER) {\n        refreshSelection = function(sel) {\n            if (implementsControlRange && implementsDocSelection && sel.docSelection.type == CONTROL) {\n                updateControlSelection(sel);\n            } else {\n                sel._ranges.length = sel.rangeCount = sel.nativeSelection.rangeCount;\n                if (sel.rangeCount) {\n                    for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                        sel._ranges[i] = new api.WrappedRange(sel.nativeSelection.getRangeAt(i));\n                    }\n                    updateAnchorAndFocusFromRange(sel, sel._ranges[sel.rangeCount - 1], selectionIsBackward(sel.nativeSelection));\n                    sel.isCollapsed = selectionIsCollapsed(sel);\n                } else {\n                    updateEmptySelection(sel);\n                }\n            }\n        };\n    } else if (selectionHasAnchorAndFocus && typeof testSelection.isCollapsed == BOOLEAN && typeof testRange.collapsed == BOOLEAN && features.implementsDomRange) {\n        refreshSelection = function(sel) {\n            var range, nativeSel = sel.nativeSelection;\n            if (nativeSel.anchorNode) {\n                range = getSelectionRangeAt(nativeSel, 0);\n                sel._ranges = [range];\n                sel.rangeCount = 1;\n                updateAnchorAndFocusFromNativeSelection(sel);\n                sel.isCollapsed = selectionIsCollapsed(sel);\n            } else {\n                updateEmptySelection(sel);\n            }\n        };\n    } else {\n        module.fail(\"No means of obtaining a Range or TextRange from the user's selection was found\");\n        return false;\n    }\n\n    selProto.refresh = function(checkForChanges) {\n        var oldRanges = checkForChanges ? this._ranges.slice(0) : null;\n        var oldAnchorNode = this.anchorNode, oldAnchorOffset = this.anchorOffset;\n\n        refreshSelection(this);\n        if (checkForChanges) {\n            // Check the range count first\n            var i = oldRanges.length;\n            if (i != this._ranges.length) {\n                return true;\n            }\n\n            // Now check the direction. Checking the anchor position is the same is enough since we're checking all the\n            // ranges after this\n            if (this.anchorNode != oldAnchorNode || this.anchorOffset != oldAnchorOffset) {\n                return true;\n            }\n\n            // Finally, compare each range in turn\n            while (i--) {\n                if (!rangesEqual(oldRanges[i], this._ranges[i])) {\n                    return true;\n                }\n            }\n            return false;\n        }\n    };\n\n    // Removal of a single range\n    var removeRangeManually = function(sel, range) {\n        var ranges = sel.getAllRanges();\n        sel.removeAllRanges();\n        for (var i = 0, len = ranges.length; i < len; ++i) {\n            if (!rangesEqual(range, ranges[i])) {\n                sel.addRange(ranges[i]);\n            }\n        }\n        if (!sel.rangeCount) {\n            updateEmptySelection(sel);\n        }\n    };\n\n    if (implementsControlRange) {\n        selProto.removeRange = function(range) {\n            if (this.docSelection.type == CONTROL) {\n                var controlRange = this.docSelection.createRange();\n                var rangeElement = getSingleElementFromRange(range);\n\n                // Create a new ControlRange containing all the elements in the selected ControlRange minus the\n                // element contained by the supplied range\n                var doc = getDocument(controlRange.item(0));\n                var newControlRange = getBody(doc).createControlRange();\n                var el, removed = false;\n                for (var i = 0, len = controlRange.length; i < len; ++i) {\n                    el = controlRange.item(i);\n                    if (el !== rangeElement || removed) {\n                        newControlRange.add(controlRange.item(i));\n                    } else {\n                        removed = true;\n                    }\n                }\n                newControlRange.select();\n\n                // Update the wrapped selection based on what's now in the native selection\n                updateControlSelection(this);\n            } else {\n                removeRangeManually(this, range);\n            }\n        };\n    } else {\n        selProto.removeRange = function(range) {\n            removeRangeManually(this, range);\n        };\n    }\n\n    // Detecting if a selection is backward\n    var selectionIsBackward;\n    if (!useDocumentSelection && selectionHasAnchorAndFocus && features.implementsDomRange) {\n        selectionIsBackward = winSelectionIsBackward;\n\n        selProto.isBackward = function() {\n            return selectionIsBackward(this);\n        };\n    } else {\n        selectionIsBackward = selProto.isBackward = function() {\n            return false;\n        };\n    }\n\n    // Create an alias for backwards compatibility. From 1.3, everything is \"backward\" rather than \"backwards\"\n    selProto.isBackwards = selProto.isBackward;\n\n    // Selection stringifier\n    // This is conformant to the old HTML5 selections draft spec but differs from WebKit and Mozilla's implementation.\n    // The current spec does not yet define this method.\n    selProto.toString = function() {\n        var rangeTexts = [];\n        for (var i = 0, len = this.rangeCount; i < len; ++i) {\n            rangeTexts[i] = \"\" + this._ranges[i];\n        }\n        return rangeTexts.join(\"\");\n    };\n\n    function assertNodeInSameDocument(sel, node) {\n        if (sel.win.document != getDocument(node)) {\n            throw new DOMException(\"WRONG_DOCUMENT_ERR\");\n        }\n    }\n\n    // No current browser conforms fully to the spec for this method, so Rangy's own method is always used\n    selProto.collapse = function(node, offset) {\n        assertNodeInSameDocument(this, node);\n        var range = api.createRange(node);\n        range.collapseToPoint(node, offset);\n        this.setSingleRange(range);\n        this.isCollapsed = true;\n    };\n\n    selProto.collapseToStart = function() {\n        if (this.rangeCount) {\n            var range = this._ranges[0];\n            this.collapse(range.startContainer, range.startOffset);\n        } else {\n            throw new DOMException(\"INVALID_STATE_ERR\");\n        }\n    };\n\n    selProto.collapseToEnd = function() {\n        if (this.rangeCount) {\n            var range = this._ranges[this.rangeCount - 1];\n            this.collapse(range.endContainer, range.endOffset);\n        } else {\n            throw new DOMException(\"INVALID_STATE_ERR\");\n        }\n    };\n\n    // The spec is very specific on how selectAllChildren should be implemented so the native implementation is\n    // never used by Rangy.\n    selProto.selectAllChildren = function(node) {\n        assertNodeInSameDocument(this, node);\n        var range = api.createRange(node);\n        range.selectNodeContents(node);\n        this.setSingleRange(range);\n    };\n\n    selProto.deleteFromDocument = function() {\n        // Sepcial behaviour required for IE's control selections\n        if (implementsControlRange && implementsDocSelection && this.docSelection.type == CONTROL) {\n            var controlRange = this.docSelection.createRange();\n            var element;\n            while (controlRange.length) {\n                element = controlRange.item(0);\n                controlRange.remove(element);\n                element.parentNode.removeChild(element);\n            }\n            this.refresh();\n        } else if (this.rangeCount) {\n            var ranges = this.getAllRanges();\n            if (ranges.length) {\n                this.removeAllRanges();\n                for (var i = 0, len = ranges.length; i < len; ++i) {\n                    ranges[i].deleteContents();\n                }\n                // The spec says nothing about what the selection should contain after calling deleteContents on each\n                // range. Firefox moves the selection to where the final selected range was, so we emulate that\n                this.addRange(ranges[len - 1]);\n            }\n        }\n    };\n\n    // The following are non-standard extensions\n    selProto.eachRange = function(func, returnValue) {\n        for (var i = 0, len = this._ranges.length; i < len; ++i) {\n            if ( func( this.getRangeAt(i) ) ) {\n                return returnValue;\n            }\n        }\n    };\n\n    selProto.getAllRanges = function() {\n        var ranges = [];\n        this.eachRange(function(range) {\n            ranges.push(range);\n        });\n        return ranges;\n    };\n\n    selProto.setSingleRange = function(range, direction) {\n        this.removeAllRanges();\n        this.addRange(range, direction);\n    };\n\n    selProto.callMethodOnEachRange = function(methodName, params) {\n        var results = [];\n        this.eachRange( function(range) {\n            results.push( range[methodName].apply(range, params) );\n        } );\n        return results;\n    };\n    \n    function createStartOrEndSetter(isStart) {\n        return function(node, offset) {\n            var range;\n            if (this.rangeCount) {\n                range = this.getRangeAt(0);\n                range[\"set\" + (isStart ? \"Start\" : \"End\")](node, offset);\n            } else {\n                range = api.createRange(this.win.document);\n                range.setStartAndEnd(node, offset);\n            }\n            this.setSingleRange(range, this.isBackward());\n        };\n    }\n\n    selProto.setStart = createStartOrEndSetter(true);\n    selProto.setEnd = createStartOrEndSetter(false);\n    \n    // Add select() method to Range prototype. Any existing selection will be removed.\n    api.rangePrototype.select = function(direction) {\n        getSelection( this.getDocument() ).setSingleRange(this, direction);\n    };\n\n    selProto.changeEachRange = function(func) {\n        var ranges = [];\n        var backward = this.isBackward();\n\n        this.eachRange(function(range) {\n            func(range);\n            ranges.push(range);\n        });\n\n        this.removeAllRanges();\n        if (backward && ranges.length == 1) {\n            this.addRange(ranges[0], \"backward\");\n        } else {\n            this.setRanges(ranges);\n        }\n    };\n\n    selProto.containsNode = function(node, allowPartial) {\n        return this.eachRange( function(range) {\n            return range.containsNode(node, allowPartial);\n        }, true );\n    };\n\n    selProto.getBookmark = function(containerNode) {\n        return {\n            backward: this.isBackward(),\n            rangeBookmarks: this.callMethodOnEachRange(\"getBookmark\", [containerNode])\n        };\n    };\n\n    selProto.moveToBookmark = function(bookmark) {\n        var selRanges = [];\n        for (var i = 0, rangeBookmark, range; rangeBookmark = bookmark.rangeBookmarks[i++]; ) {\n            range = api.createRange(this.win);\n            range.moveToBookmark(rangeBookmark);\n            selRanges.push(range);\n        }\n        if (bookmark.backward) {\n            this.setSingleRange(selRanges[0], \"backward\");\n        } else {\n            this.setRanges(selRanges);\n        }\n    };\n\n    selProto.toHtml = function() {\n        return this.callMethodOnEachRange(\"toHtml\").join(\"\");\n    };\n\n    function inspect(sel) {\n        var rangeInspects = [];\n        var anchor = new DomPosition(sel.anchorNode, sel.anchorOffset);\n        var focus = new DomPosition(sel.focusNode, sel.focusOffset);\n        var name = (typeof sel.getName == \"function\") ? sel.getName() : \"Selection\";\n\n        if (typeof sel.rangeCount != \"undefined\") {\n            for (var i = 0, len = sel.rangeCount; i < len; ++i) {\n                rangeInspects[i] = DomRange.inspect(sel.getRangeAt(i));\n            }\n        }\n        return \"[\" + name + \"(Ranges: \" + rangeInspects.join(\", \") +\n                \")(anchor: \" + anchor.inspect() + \", focus: \" + focus.inspect() + \"]\";\n    }\n\n    selProto.getName = function() {\n        return \"WrappedSelection\";\n    };\n\n    selProto.inspect = function() {\n        return inspect(this);\n    };\n\n    selProto.detach = function() {\n        actOnCachedSelection(this.win, \"delete\");\n        deleteProperties(this);\n    };\n\n    WrappedSelection.detachAll = function() {\n        actOnCachedSelection(null, \"deleteAll\");\n    };\n\n    WrappedSelection.inspect = inspect;\n    WrappedSelection.isDirectionBackward = isDirectionBackward;\n\n    api.Selection = WrappedSelection;\n\n    api.selectionPrototype = selProto;\n\n    api.addCreateMissingNativeApiListener(function(win) {\n        if (typeof win.getSelection == \"undefined\") {\n            win.getSelection = function() {\n                return getSelection(win);\n            };\n        }\n        win = null;\n    });\n});\n\ndefine(\"rangy-core\", [\"domReady\"], (function (global) {\n    return function () {\n        var ret, fn;\n       fn = function (domReady)\n            {\n                var rangi = this.rangy;\n                domReady(\n                function()\n                {\n                    rangi.init();\n                });\n                return this.rangy;\n            };\n        ret = fn.apply(global, arguments);\n        return ret || global.rangy;\n    };\n}(this)));\n\n",
@@ -125,7 +125,7 @@
     "//  LauncherOSX\n//\n//  Created by Boris Schneiderman.\n//  Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//  \n//  Redistribution and use in source and binary forms, with or without modification, \n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this \n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice, \n//  this list of conditions and the following disclaimer in the documentation and/or \n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be \n//  used to endorse or promote products derived from this software without specific \n//  prior written permission.\n//  \n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n//  OF THE POSSIBILITY OF SUCH DAMAGE.\ndefine('readium_shared_js/models/switches',[\"jquery\", \"underscore\"], function($, _) {\n/** \n * Switches in the epub publication.\n * \n * @class Models.Switches\n * @constructor\n */\nvar Switches = function() {\n\n};\n\n// Description: Parse the epub \"switch\" tags and hide\n// cases that are not supported\n\n/**\n *\n * Static Switches.apply method.\n * \n * @method Switches.apply\n * @param dom\n */\n\nSwitches.apply = function(dom) {\n\n    function isSupported(caseNode) {\n\n        var ns = caseNode.attributes[\"required-namespace\"];\n        if(!ns) {\n            // the namespace was not specified, that should\n            // never happen, we don't support it then\n            console.log(\"Encountered a case statement with no required-namespace\");\n            return false;\n        }\n        // all the xmlns that readium is known to support\n        // TODO this is going to require maintenance\n        var supportedNamespaces = [\"http://www.w3.org/1998/Math/MathML\"];\n        return _.include(supportedNamespaces, ns.value);\n    }\n\n    var getQuery = ((window.navigator.userAgent.indexOf(\"Trident\") > 0) || (window.navigator.userAgent.indexOf(\"Edge\") > 0))\n        ? function (elementName) { return 'epub\\\\:' + elementName; }\n        : function (elementName) { return elementName; };\n\n    _.each(dom.querySelectorAll(getQuery('switch')), function(switchNode) {\n\n        // keep track of whether or now we found one\n        var found = false;\n\n        _.each(switchNode.querySelectorAll(getQuery('case')), function(caseNode) {\n\n            if( !found && isSupported(caseNode) ) {\n                found = true; // we found the node, don't remove it\n            }\n            else {\n                $(caseNode).remove(); // remove the node from the dom\n            }\n\n        });\n\n        if (found) {\n\n            // if we found a supported case, remove the default\n            _.each(switchNode.querySelectorAll(getQuery('default')), function(defaultNode) {\n                $(defaultNode).remove();\n            });\n\n        }\n\n    });\n};\n    return Switches;\n});\n\n",
     "//  LauncherOSX\n//\n//  Created by Boris Schneiderman.\n//  Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//  \n//  Redistribution and use in source and binary forms, with or without modification, \n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this \n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice, \n//  this list of conditions and the following disclaimer in the documentation and/or \n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be \n//  used to endorse or promote products derived from this software without specific \n//  prior written permission.\n//  \n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n//  OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/trigger',[\"jquery\", \"../helpers\"], function($, Helpers) {\n/**\n * Trigger in an epub publication.\n *\n * @class Models.Trigger\n * @constructor\n * @param domNode\n */\n\nvar Trigger = function(domNode) {\n\n    var $el = $(domNode);\n    \n    /**\n     * epub trigger action\n     *\n     * @property action\n     * @type String\n     */\n\n    this.action     = $el.attr(\"action\");\n    \n    /**\n     * epub trigger ref\n     *\n     * @property ref\n     * @type String\n     */\n\n    this.ref         = $el.attr(\"ref\");\n    \n    /**\n     * epub trigger event\n     *\n     * @property event\n     * @type String\n     */\n\n    this.event         = $el.attr(\"ev:event\");\n    \n    /**\n     * epub trigger observer\n     *\n     * @property observer\n     * @type String\n     */\n\n    this.observer     = $el.attr(\"ev:observer\");\n    this.ref         = $el.attr(\"ref\");\n};\n\n/**\n * Static register method\n *\n * @method register\n * @param dom\n */\nTrigger.register = function(dom) {\n    $('trigger', dom).each(function() {\n        var trigger = new Trigger(this);\n        trigger.subscribe(dom);\n    });\n};\n\n/**\n * Prototype subscribe method\n *\n * @method subscribe\n * @param dom\n */\n\nTrigger.prototype.subscribe = function(dom) {\n    \n    var selector = \"#\" + this.observer;\n    var that = this;\n    $(selector, dom).on(this.event, function() {\n        return that.execute(dom);\n    });\n};\n\n/**\n * Prototype execute method\n *\n * @method execute\n * @param dom\n */\n\nTrigger.prototype.execute = function(dom) {\n\n    var $target = $( \"#\" + Helpers.escapeJQuerySelector(this.ref), dom);\n    switch(this.action)\n    {\n        case \"show\":\n            $target.css(\"visibility\", \"visible\");\n            break;\n        case \"hide\":\n            $target.css(\"visibility\", \"hidden\");\n            break;\n        case \"play\":\n            $target[0].currentTime = 0;\n            $target[0].play();\n            break;\n        case \"pause\":\n            $target[0].pause();\n            break;\n        case \"resume\":\n            $target[0].play();\n            break;\n        case \"mute\":\n            $target[0].muted = true;\n            break;\n        case \"unmute\":\n            $target[0].muted = false;\n            break;\n        default:\n            console.log(\"do not no how to handle trigger \" + this.action);\n            return null;\n    }\n    return false;   // do not propagate click event; it was already handled\n\n};\n\n    return Trigger;\n});\n\n",
     "//  Created by Juan Corona\n//  Copyright (c) 2016 Readium Foundation and/or its licensees. All rights reserved.\n//\n//  Redistribution and use in source and binary forms, with or without modification,\n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this\n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice,\n//  this list of conditions and the following disclaimer in the documentation and/or\n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be\n//  used to endorse or promote products derived from this software without specific\n//  prior written permission.\n//\n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n//  OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/models/node_range_info',[],function () {\n\n    /**\n     * @class Models.NodeRangePositionInfo\n     * @constructor\n     * @param {Node} node The actual DOM node\n     * @param {Number} offest The position offsetf for the node\n     */\n    var NodeRangePositionInfo = function (node, offset) {\n\n        /**\n         * The actual DOM node\n         * @property node\n         * @type Node\n         */\n        this.node = node;\n\n        /**\n         * The position offsetf for the node\n         * @property offset\n         * @type Number\n         */\n        this.offset = offset;\n\n    };\n\n    /**\n     * @class Models.NodeRangeInfo\n     * @constructor\n     * @param {ClientRect} clientRect\n     * @param {Models.NodeRangePositionInfo} startInfo\n     * @param {Models.NodeRangePositionInfo} endInfo\n     */\n    var NodeRangeInfo = function (clientRect, startInfo, endInfo) {\n\n        var self = this;\n        /**\n         * Client rectangle information for the range content bounds\n         * @property clientRect\n         * @type ClientRect\n         */\n        this.clientRect = clientRect;\n\n        /**\n         * Node and position information providing where and which node the range starts with\n         * @property startInfo\n         * @type Models.NodeRangePositionInfo\n         */\n        this.startInfo = startInfo;\n\n        /**\n         * Node and position information providing where and which node the range ends with\n         * @property endInfo\n         * @type Models.NodeRangePositionInfo\n         */\n        this.endInfo = endInfo;\n\n\n        this.setStartInfo = function (info) {\n            self.startInfo = new NodeRangePositionInfo(info);\n            return self;\n        };\n\n        this.setEndInfo = function (info) {\n            self.endInfo = new NodeRangePositionInfo(info);\n            return self;\n        };\n    };\n\n    return NodeRangeInfo;\n});\n",
-    "//  Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n//  Redistribution and use in source and binary forms, with or without modification,\n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this\n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice,\n//  this list of conditions and the following disclaimer in the documentation and/or\n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be\n//  used to endorse or promote products derived from this software without specific\n//  prior written permission.\n//\n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n//  OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/external_agent_support',[\"../globals\", \"underscore\"], function(Globals, _) {\n    /**\n     * This module helps external agents that interact with content documents from\n     * the level of the iframe browsing context:\n     *\n     *   - By providing a means of identifying the content through metadata\n     *     that's brought down from the package document level.\n     *\n     *   - By providing a direct link (bringing down the shareable URL) that could be used\n     *     to load the content in the proper context with the reader app instead of the actual\n     *     content document asset path.\n     *\n     *   - By responding to an event when the external agent wants to bring a\n     *     specific range of content into view.\n     *\n     * @param {Views.ReaderView} reader     The Reader instance\n     * @constructor\n     */\n    var ExternalAgentSupport = function(reader) {\n\n        var contentDocumentStates = {};\n        var contentDocuments = {};\n\n        Globals.on(Globals.Events.PLUGINS_LOADED, function() {\n            // Disable the AMD environment since it's not needed anymore at this point.\n            // This is done because external agents with their own module systems (Browserify)\n            // might load third-party scripts that are in the format of\n            // UMD (Universal Module Definition),\n            // and will mistakenly try to use Readium's AMD shim, almond.js, or require.js\n            if (window.define && window.define.amd) {\n                delete window.define.amd;\n            }\n        });\n\n        function appendMetaTag(_document, property, content) {\n            var tag = _document.createElement('meta');\n            tag.setAttribute('name', property);\n            tag.setAttribute('content', content);\n            _document.head.appendChild(tag);\n        }\n\n        function injectDublinCoreResourceIdentifiers(contentDocument, spineItem) {\n            var renditionIdentifier = reader.metadata().identifier; // the package unique identifier\n            var spineItemIdentifier = spineItem.idref; // use the spine item id as an identifier too\n            if (renditionIdentifier && spineItemIdentifier) {\n                appendMetaTag(contentDocument, 'dc.relation.ispartof', renditionIdentifier);\n                appendMetaTag(contentDocument, 'dc.identifier', spineItemIdentifier);\n            }\n        }\n\n        function injectAppUrlAsCanonicalLink(contentDocument, spineItem) {\n            if (contentDocument.defaultView && contentDocument.defaultView.parent) {\n                var parentWindow = contentDocument.defaultView.parent;\n                var isParentInSameDomain = Object.keys(parentWindow).indexOf('document') !== -1;\n                // Only do this if there's no potential cross-domain violation\n                // and the reader application URL has a CFI value in a 'goto' query param.\n                if (isParentInSameDomain && parentWindow.location.search.match(/goto=.*cfi/i)) {\n                    var link = contentDocument.createElement('link');\n                    link.setAttribute('rel', 'canonical');\n                    link.setAttribute('href', parentWindow.location.href);\n                    contentDocument.head.appendChild(link);\n                    contentDocumentStates[spineItem.idref].canonicalLinkElement = link;\n                }\n            }\n        }\n\n        var bringIntoViewDebounced = _.debounce(function (range) {\n            var target = reader.getRangeCfiFromDomRange(range);\n            var contentDocumentState = contentDocumentStates[target.idref];\n\n            if (contentDocumentState && contentDocumentState.isUpdated) {\n                reader.openSpineItemElementCfi(target.idref, target.contentCFI);\n            } else {\n                contentDocumentState.pendingNavRequest = {\n                    idref: target.idref,\n                    contentCFI: target.contentCFI\n                };\n            }\n        }, 100);\n\n        function bindBringIntoViewEvent(contentDocument) {\n            // 'scrolltorange' is a non-standard event that is emitted on the content frame\n            // by some external tools like Hypothes.is\n            contentDocument.addEventListener('scrolltorange', function (event) {\n                event.preventDefault();\n\n                var range = event.detail;\n                bringIntoViewDebounced(range);\n            });\n        }\n\n        function bindSelectionPopupWorkaround(contentDocument) {\n            // A hack to make the Hypothes.is 'adder' context menu popup work when the content doc body is positioned.\n            // When the content doc has columns and a body with position set to 'relative'\n            // the adder won't be positioned properly.\n            //\n            // The workaround is to clear the position property when a selection is active.\n            // Then restore the position property to 'relative' when the selection clears.\n            contentDocument.addEventListener('selectionchange', function () {\n                var selection = contentDocument.getSelection();\n                if (selection && selection.isCollapsed) {\n                    contentDocument.body.style.position = 'relative';\n                } else {\n                    contentDocument.body.style.position = '';\n                }\n            });\n        }\n\n        /***\n         *\n         * @param {Document} contentDocument    Document instance with DOM tree\n         * @param {Models.SpineItem} spineItem  The associated spine item object\n         */\n        this.bindToContentDocument = function(contentDocument, spineItem) {\n            contentDocuments[spineItem.idref] = contentDocument;\n            contentDocumentStates[spineItem.idref] = {};\n            injectDublinCoreResourceIdentifiers(contentDocument, spineItem);\n            injectAppUrlAsCanonicalLink(contentDocument, spineItem);\n            bindBringIntoViewEvent(contentDocument);\n\n            if (spineItem.isReflowable()) {\n                bindSelectionPopupWorkaround(contentDocument);\n            }\n        };\n\n        /***\n         *\n         * @param {Models.SpineItem} spineItem  The associated spine item object\n         */\n        this.updateContentDocument = function (spineItem) {\n            var contentDocument = contentDocuments[spineItem.idref];\n            var state = contentDocumentStates[spineItem.idref];\n\n            if (contentDocument && state) {\n\n                if (state.canonicalLinkElement &&\n                    contentDocument.defaultView &&\n                    contentDocument.defaultView.parent) {\n                    var parentWindow = contentDocument.defaultView.parent;\n                    var isParentInDifferentDomain = 'document' in Object.keys(parentWindow);\n                    if (!isParentInDifferentDomain) {\n                        state.canonicalLinkElement.setAttribute('href', parentWindow.location.href);\n                    }\n                }\n\n                state.isUpdated = true;\n\n                var pendingNavRequest = state.pendingNavRequest;\n                if (pendingNavRequest) {\n                    reader.openSpineItemElementCfi(pendingNavRequest.idref, pendingNavRequest.contentCFI);\n                    state.pendingNavRequest = null;\n                }\n            }\n        };\n    };\n\n    return ExternalAgentSupport;\n});\n\n",
+    "//  Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//\n//  Redistribution and use in source and binary forms, with or without modification,\n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this\n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice,\n//  this list of conditions and the following disclaimer in the documentation and/or\n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be\n//  used to endorse or promote products derived from this software without specific\n//  prior written permission.\n//\n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n//  OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/external_agent_support',[\"../globals\", \"underscore\"], function(Globals, _) {\n    /**\n     * This module helps external agents that interact with content documents from\n     * the level of the iframe browsing context:\n     *\n     *   - By providing a means of identifying the content through metadata\n     *     that's brought down from the package document level.\n     *\n     *   - By providing a direct link (bringing down the shareable URL) that could be used\n     *     to load the content in the proper context with the reader app instead of the actual\n     *     content document asset path.\n     *\n     *   - By responding to an event when the external agent wants to bring a\n     *     specific range of content into view.\n     *\n     * @param {Views.ReaderView} reader     The Reader instance\n     * @constructor\n     */\n    var ExternalAgentSupport = function(reader) {\n\n        var contentDocumentStates = {};\n        var contentDocuments = {};\n\n        Globals.on(Globals.Events.PLUGINS_LOADED, function() {\n            // Disable the AMD environment since it's not needed anymore at this point.\n            // This is done because external agents with their own module systems (Browserify)\n            // might load third-party scripts that are in the format of\n            // UMD (Universal Module Definition),\n            // and will mistakenly try to use Readium's AMD shim, almond.js, or require.js\n            if (window.define && window.define.amd) {\n                delete window.define.amd;\n            }\n        });\n\n        function appendMetaTag(_document, property, content) {\n            var tag = _document.createElement('meta');\n            tag.setAttribute('name', property);\n            tag.setAttribute('content', content);\n            _document.head.appendChild(tag);\n        }\n\n        function injectDublinCoreResourceIdentifiers(contentDocument, spineItem) {\n            var renditionIdentifier = reader.metadata().identifier; // the package unique identifier\n            var spineItemIdentifier = spineItem.idref; // use the spine item id as an identifier too\n            if (renditionIdentifier && spineItemIdentifier) {\n                appendMetaTag(contentDocument, 'dc.relation.ispartof', renditionIdentifier);\n                appendMetaTag(contentDocument, 'dc.identifier', spineItemIdentifier);\n            }\n        }\n\n        function determineCanonicalLinkHref(contentWindow) {\n            // Only grab the href if there's no potential cross-domain violation\n            // and the reader application URL has a CFI value in a 'goto' query param.\n            var isSameDomain = Object.keys(contentWindow).indexOf('document') !== -1;\n            if (isSameDomain && contentWindow.location.search.match(/goto=.*cfi/i)) {\n                return contentWindow.location.href.split(\"#\")[0];\n            }\n        }\n\n        function getContentDocumentCanonicalLink(contentDocument) {\n            var contentDocWindow = contentDocument.defaultView;\n            if (contentDocWindow && (contentDocWindow.parent|| contentDocWindow.top)) {\n                var parentWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.parent);\n                var topWindowCanonicalHref = determineCanonicalLinkHref(contentDocWindow.top);\n                return topWindowCanonicalHref || parentWindowCanonicalHref;\n            }\n        }\n\n        function injectAppUrlAsCanonicalLink(contentDocument, spineItem) {\n            if (contentDocument.defaultView && contentDocument.defaultView.parent) {\n                var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument);\n                if (canonicalLinkHref) {\n                    var link = contentDocument.createElement('link');\n                    link.setAttribute('rel', 'canonical');\n                    link.setAttribute('href', canonicalLinkHref);\n                    contentDocument.head.appendChild(link);\n                    contentDocumentStates[spineItem.idref].canonicalLinkElement = link;\n                }\n            }\n        }\n\n        var bringIntoViewDebounced = _.debounce(function (range) {\n            var target = reader.getRangeCfiFromDomRange(range);\n            var contentDocumentState = contentDocumentStates[target.idref];\n\n            if (contentDocumentState && contentDocumentState.isUpdated) {\n                reader.openSpineItemElementCfi(target.idref, target.contentCFI);\n            } else {\n                contentDocumentState.pendingNavRequest = {\n                    idref: target.idref,\n                    contentCFI: target.contentCFI\n                };\n            }\n        }, 100);\n\n        function bindBringIntoViewEvent(contentDocument) {\n            // 'scrolltorange' is a non-standard event that is emitted on the content frame\n            // by some external tools like Hypothes.is\n            contentDocument.addEventListener('scrolltorange', function (event) {\n                event.preventDefault();\n\n                var range = event.detail;\n                bringIntoViewDebounced(range);\n            });\n        }\n\n        function bindSelectionPopupWorkaround(contentDocument) {\n            // A hack to make the Hypothes.is 'adder' context menu popup work when the content doc body is positioned.\n            // When the content doc has columns and a body with position set to 'relative'\n            // the adder won't be positioned properly.\n            //\n            // The workaround is to clear the position property when a selection is active.\n            // Then restore the position property to 'relative' when the selection clears.\n            contentDocument.addEventListener('selectionchange', function () {\n                var selection = contentDocument.getSelection();\n                if (selection && selection.isCollapsed) {\n                    contentDocument.body.style.position = 'relative';\n                } else {\n                    contentDocument.body.style.position = '';\n                }\n            });\n        }\n\n        /***\n         *\n         * @param {Document} contentDocument    Document instance with DOM tree\n         * @param {Models.SpineItem} spineItem  The associated spine item object\n         */\n        this.bindToContentDocument = function(contentDocument, spineItem) {\n            contentDocuments[spineItem.idref] = contentDocument;\n            contentDocumentStates[spineItem.idref] = {};\n            injectDublinCoreResourceIdentifiers(contentDocument, spineItem);\n            injectAppUrlAsCanonicalLink(contentDocument, spineItem);\n            bindBringIntoViewEvent(contentDocument);\n\n            if (spineItem.isReflowable()) {\n                bindSelectionPopupWorkaround(contentDocument);\n            }\n        };\n\n        /***\n         *\n         * @param {Models.SpineItem} spineItem  The associated spine item object\n         */\n        this.updateContentDocument = function (spineItem) {\n            var contentDocument = contentDocuments[spineItem.idref];\n            var state = contentDocumentStates[spineItem.idref];\n\n            if (contentDocument && state) {\n\n                if (state.canonicalLinkElement) {\n                    var canonicalLinkHref = getContentDocumentCanonicalLink(contentDocument);\n                    if (canonicalLinkHref) {\n                        state.canonicalLinkElement.setAttribute('href', canonicalLinkHref);\n                    }\n                }\n\n                state.isUpdated = true;\n\n                var pendingNavRequest = state.pendingNavRequest;\n                if (pendingNavRequest) {\n                    reader.openSpineItemElementCfi(pendingNavRequest.idref, pendingNavRequest.contentCFI);\n                    state.pendingNavRequest = null;\n                }\n            }\n        };\n    };\n\n    return ExternalAgentSupport;\n});\n\n",
     "//  Created by Boris Schneiderman.\n// Modified by Daniel Weck\n//  Copyright (c) 2014 Readium Foundation and/or its licensees. All rights reserved.\n//  \n//  Redistribution and use in source and binary forms, with or without modification, \n//  are permitted provided that the following conditions are met:\n//  1. Redistributions of source code must retain the above copyright notice, this \n//  list of conditions and the following disclaimer.\n//  2. Redistributions in binary form must reproduce the above copyright notice, \n//  this list of conditions and the following disclaimer in the documentation and/or \n//  other materials provided with the distribution.\n//  3. Neither the name of the organization nor the names of its contributors may be \n//  used to endorse or promote products derived from this software without specific \n//  prior written permission.\n//  \n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \n//  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \n//  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n//  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \n//  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, \n//  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, \n//  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF \n//  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE \n//  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \n//  OF THE POSSIBILITY OF SUCH DAMAGE.\n\ndefine('readium_shared_js/views/reader_view',[\"../globals\", \"jquery\", \"underscore\", \"eventEmitter\", \"./fixed_view\", \"../helpers\", \"./iframe_loader\", \"./internal_links_support\",\n        \"./media_overlay_data_injector\", \"./media_overlay_player\", \"../models/package\", \"../models/metadata\", \"../models/page_open_request\",\n        \"./reflowable_view\", \"./scroll_view\", \"../models/style_collection\", \"../models/switches\", \"../models/trigger\",\n        \"../models/viewer_settings\", \"../models/bookmark_data\", \"../models/node_range_info\", \"./external_agent_support\"],\n    function (Globals, $, _, EventEmitter, FixedView, Helpers, IFrameLoader, InternalLinksSupport,\n              MediaOverlayDataInjector, MediaOverlayPlayer, Package, Metadata, PageOpenRequest,\n              ReflowableView, ScrollView, StyleCollection, Switches, Trigger,\n              ViewerSettings, BookmarkData, NodeRangeInfo, ExternalAgentSupport) {\n/**\n * Options passed on the reader from the readium loader/initializer\n *\n * @typedef {object} Globals.Views.ReaderView.ReaderOptions\n * @property {jQueryElement|string} el   The element the reader view should create itself in. Can be a jquery wrapped element or a query selector.\n * @property {Globals.Views.IFrameLoader} iframeLoader   An instance of an iframe loader or one expanding it.\n * @property {boolean} needsFixedLayoutScalerWorkAround\n */\n\n/**\n * Top level View object. Interface for view manipulation public APIs\n * @param {Views.ReaderView.ReaderOptions} options\n * @constructor\n */\nvar ReaderView = function (options) {\n    $.extend(this, new EventEmitter());\n\n    var self = this;\n    var _currentView = undefined;\n    var _package = undefined;\n    var _metadata = undefined;\n    var _spine = undefined;\n    var _viewerSettings = new ViewerSettings({});\n    //styles applied to the container divs\n    var _userStyles = new StyleCollection();\n    //styles applied to the content documents\n    var _bookStyles = new StyleCollection();\n    var _internalLinksSupport = new InternalLinksSupport(this);\n    var _externalAgentSupport = new ExternalAgentSupport(this);\n    var _mediaOverlayPlayer;\n    var _mediaOverlayDataInjector;\n    var _iframeLoader;\n    var _$el;\n\n    //We will call onViewportResize after user stopped resizing window\n    var lazyResize = Helpers.extendedThrottle(\n        handleViewportResizeStart,\n        handleViewportResizeTick,\n        handleViewportResizeEnd, 250, 1000, self);\n\n    $(window).on(\"resize.ReadiumSDK.readerView\", lazyResize);\n\n    this.fonts = options.fonts;\n\n\n    if (options.el instanceof $) {\n        _$el = options.el;\n        console.log(\"** EL is a jQuery selector:\" + options.el.attr('id'));\n    } else {\n        _$el = $(options.el);\n        console.log(\"** EL is a string:\" + _$el.attr('id'));\n    }\n\n    if (options.iframeLoader) {\n        _iframeLoader = options.iframeLoader;\n    }\n    else {\n        _iframeLoader = new IFrameLoader({mathJaxUrl: options.mathJaxUrl});\n    }\n\n\n    _needsFixedLayoutScalerWorkAround = options.needsFixedLayoutScalerWorkAround;\n    /**\n     * @returns {boolean}\n     */\n    this.needsFixedLayoutScalerWorkAround = function () {\n        return _needsFixedLayoutScalerWorkAround;\n    };\n\n    /**\n     * Create a view based on the given view type.\n     * @param {Views.ReaderView.ViewType} viewType\n     * @param {Views.ReaderView.ViewCreationOptions} options\n     * @returns {*}\n     */\n    this.createViewForType = function (viewType, options) {\n        var createdView;\n\n        // NOTE: _$el == options.$viewport\n        _$el.css(\"overflow\", \"hidden\");\n\n        switch (viewType) {\n            case ReaderView.VIEW_TYPE_FIXED:\n\n                _$el.css(\"overflow\", \"auto\"); // for content pan, see self.setZoom()\n\n                createdView = new FixedView(options, self);\n                break;\n            case ReaderView.VIEW_TYPE_SCROLLED_DOC:\n                createdView = new ScrollView(options, false, self);\n                break;\n            case ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS:\n                createdView = new ScrollView(options, true, self);\n                break;\n            default:\n                createdView = new ReflowableView(options, self);\n                break;\n        }\n\n        return createdView;\n    };\n\n    /**\n     * Returns the current view type of the reader view\n     * @returns {ReaderView.ViewType}\n     */\n    this.getCurrentViewType = function () {\n\n        if (!_currentView) {\n            return undefined;\n        }\n\n        if (_currentView instanceof ReflowableView) {\n            return ReaderView.VIEW_TYPE_COLUMNIZED;\n        }\n\n        if (_currentView instanceof FixedView) {\n            return ReaderView.VIEW_TYPE_FIXED;\n        }\n\n        if (_currentView instanceof ScrollView) {\n            if (_currentView.isContinuousScroll()) {\n                return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n            }\n\n            return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n        }\n\n        console.error(\"Unrecognized view type\");\n        return undefined;\n    };\n\n    this.getCurrentView = function () {\n        return _currentView;\n    };\n\n    //based on https://docs.google.com/spreadsheet/ccc?key=0AoPMUkQhc4wcdDI0anFvWm96N0xRT184ZE96MXFRdFE&usp=drive_web#gid=0 document\n    function deduceDesiredViewType(spineItem) {\n\n        //check settings\n        if (_viewerSettings.scroll == \"scroll-doc\") {\n            return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n        }\n\n        if (_viewerSettings.scroll == \"scroll-continuous\") {\n            return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n        }\n\n        //is fixed layout ignore flow\n        if (spineItem.isFixedLayout()) {\n            return ReaderView.VIEW_TYPE_FIXED;\n        }\n\n        //flow\n        if (spineItem.isFlowScrolledDoc()) {\n            return ReaderView.VIEW_TYPE_SCROLLED_DOC;\n        }\n\n        if (spineItem.isFlowScrolledContinuous()) {\n            return ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS;\n        }\n\n        return ReaderView.VIEW_TYPE_COLUMNIZED;\n    }\n\n    // returns true is view changed\n    function initViewForItem(spineItem, callback) {\n\n        var desiredViewType = deduceDesiredViewType(spineItem);\n\n        if (_currentView) {\n\n            if (self.getCurrentViewType() == desiredViewType) {\n                callback(false);\n                return;\n            }\n\n            resetCurrentView();\n        }\n\n        /**\n         * View creation options\n         * @typedef {object} Globals.Views.ReaderView.ViewCreationOptions\n         * @property {jQueryElement} $viewport  The view port element the reader view has created.\n         * @property {Globals.Models.Spine} spine The spine item collection object\n         * @property {Globals.Collections.StyleCollection} userStyles User styles\n         * @property {Globals.Collections.StyleCollection} bookStyles Book styles\n         * @property {Globals.Views.IFrameLoader} iframeLoader   An instance of an iframe loader or one expanding it.\n         */\n        var viewCreationParams = {\n            $viewport: _$el,\n            spine: _spine,\n            userStyles: _userStyles,\n            bookStyles: _bookStyles,\n            iframeLoader: _iframeLoader\n        };\n\n\n        _currentView = self.createViewForType(desiredViewType, viewCreationParams);\n        \n        Globals.logEvent(\"READER_VIEW_CREATED\", \"EMIT\", \"reader_view.js\");\n        self.emit(Globals.Events.READER_VIEW_CREATED, desiredViewType);\n\n        _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\n            var contentDoc = $iframe[0].contentDocument;\n\n            Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"ON\", \"reader_view.js (current view) [ \" + spineItem.href + \" ]\");\n\n            if (!Helpers.isIframeAlive($iframe[0])) return;\n\n            // performance degrades with large DOM (e.g. word-level text-audio sync)\n            _mediaOverlayDataInjector.attachMediaOverlayData($iframe, spineItem, _viewerSettings);\n\n            _internalLinksSupport.processLinkElements($iframe, spineItem);\n\n            _externalAgentSupport.bindToContentDocument(contentDoc, spineItem);\n\n            Trigger.register(contentDoc);\n            Switches.apply(contentDoc);\n\n            Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n            self.emit(Globals.Events.CONTENT_DOCUMENT_LOADED, $iframe, spineItem);\n        });\n\n        _currentView.on(Globals.Events.CONTENT_DOCUMENT_LOAD_START, function ($iframe, spineItem) {\n\n            Globals.logEvent(\"CONTENT_DOCUMENT_LOAD_START\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n            self.emit(Globals.Events.CONTENT_DOCUMENT_LOAD_START, $iframe, spineItem);\n        });\n\n        _currentView.on(Globals.Events.CONTENT_DOCUMENT_UNLOADED, function ($iframe, spineItem) {\n            \n            Globals.logEvent(\"CONTENT_DOCUMENT_UNLOADED\", \"EMIT\", \"reader_view.js [ \" + spineItem.href + \" ]\");\n            self.emit(Globals.Events.CONTENT_DOCUMENT_UNLOADED, $iframe, spineItem);\n        });\n\n        _currentView.on(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED, function (pageChangeData) {\n            \n            Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"ON\", \"reader_view.js\");\n\n            //we call on onPageChanged explicitly instead of subscribing to the Globals.Events.PAGINATION_CHANGED by\n            //mediaOverlayPlayer because we hve to guarantee that mediaOverlayPlayer will be updated before the host\n            //application will be notified by the same Globals.Events.PAGINATION_CHANGED event\n            _mediaOverlayPlayer.onPageChanged(pageChangeData);\n\n            _.defer(function () {\n                Globals.logEvent(\"PAGINATION_CHANGED\", \"EMIT\", \"reader_view.js\");\n                self.emit(Globals.Events.PAGINATION_CHANGED, pageChangeData);\n                \n                if (!pageChangeData.spineItem) return;\n                _.defer(function () {\n                    _externalAgentSupport.updateContentDocument(pageChangeData.spineItem);\n                });\n            });\n        });\n\n        _currentView.on(Globals.Events.FXL_VIEW_RESIZED, function () {\n            Globals.logEvent(\"FXL_VIEW_RESIZED\", \"EMIT\", \"reader_view.js\");\n            self.emit(Globals.Events.FXL_VIEW_RESIZED);\n        })\n\n        _currentView.render();\n\n        var docWillChange = true;\n        _currentView.setViewSettings(_viewerSettings, docWillChange);\n\n        // we do this to wait until elements are rendered otherwise book is not able to determine view size.\n        setTimeout(function () {\n\n            callback(true);\n\n        }, 50);\n\n    }\n\n    /**\n     * Returns a list of the currently active spine items\n     *\n     * @returns {Models.SpineItem[]}\n     */\n    this.getLoadedSpineItems = function () {\n\n        if (_currentView) {\n            return _currentView.getLoadedSpineItems();\n        }\n\n        return [];\n    };\n\n    function resetCurrentView() {\n\n        if (!_currentView) {\n            return;\n        }\n\n        Globals.logEvent(\"READER_VIEW_DESTROYED\", \"EMIT\", \"reader_view.js\");\n        self.emit(Globals.Events.READER_VIEW_DESTROYED);\n\n\n        Globals.logEvent(\"InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED\", \"OFF\", \"reader_view.js\");\n        _currentView.off(Globals.InternalEvents.CURRENT_VIEW_PAGINATION_CHANGED);\n        \n        _currentView.remove();\n        _currentView = undefined;\n    }\n\n    /**\n     * Returns the currently instanced viewer settings\n     *\n     * @returns {Models.ViewerSettings}\n     */\n    this.viewerSettings = function () {\n        return _viewerSettings;\n    };\n\n    /**\n     * Returns a data object based on the package document\n     *\n     * @returns {Models.Package}\n     */\n    this.package = function () {\n        return _package;\n    };\n\n    /**\n     * Returns a data object based on the package document metadata\n     *\n     * @returns {Models.Metadata}\n     */\n    this.metadata = function () {\n        return _metadata;\n    };\n\n    /**\n     * Returns a representation of the spine as a data object, also acts as list of spine items\n     *\n     * @returns {Models.Spine}\n     */\n    this.spine = function () {\n        return _spine;\n    };\n\n    /**\n     * Returns the user CSS styles collection\n     *\n     * @returns {Collections.StyleCollection}\n     */\n    this.userStyles = function () {\n        return _userStyles;\n    };\n\n    /**\n     * Open Book Data\n     *\n     * @typedef {object} Globals.Views.ReaderView.OpenBookData\n     * @property {Globals.Models.Package} package - packageData (required)\n     * @property {Globals.Models.PageOpenRequest} openPageRequest - openPageRequestData, (optional) data related to open page request\n     * @property {Globals.Views.ReaderView.SettingsData} [settings]\n     * @property {Globals.Collections.StyleCollection} styles: [cssStyles]\n     * @todo Define missing types\n     */\n\n    /**\n     * Triggers the process of opening the book and requesting resources specified in the packageData\n     *\n     * @param {Views.ReaderView.OpenBookData} openBookData Open book data object\n     */\n    this.openBook = function (openBookData) {\n\n        var packageData = openBookData.package ? openBookData.package : openBookData;\n\n        _package = new Package(packageData);\n        _metadata = new Metadata(packageData.metadata);\n\n        _spine = _package.spine;\n        _spine.handleLinear(true);\n\n        if (_mediaOverlayPlayer) {\n            _mediaOverlayPlayer.reset();\n        }\n\n        _mediaOverlayPlayer = new MediaOverlayPlayer(self, $.proxy(onMediaPlayerStatusChanged, self));\n        _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false); // just to ensure the internal var is set to the default settings (user settings are applied below at self.updateSettings(openBookData.settings);)\n\n        _mediaOverlayDataInjector = new MediaOverlayDataInjector(_package.media_overlay, _mediaOverlayPlayer);\n\n\n        resetCurrentView();\n\n        if (openBookData.settings) {\n            self.updateSettings(openBookData.settings);\n        }\n\n        if (openBookData.styles) {\n            self.setStyles(openBookData.styles);\n        }\n\n        var pageRequestData = undefined;\n\n        if (openBookData.openPageRequest && typeof(openBookData.openPageRequest) === 'function') {\n            openBookData.openPageRequest = openBookData.openPageRequest();\n        }\n\n        if (openBookData.openPageRequest) {\n\n            if (openBookData.openPageRequest.idref || (openBookData.openPageRequest.contentRefUrl && openBookData.openPageRequest.sourceFileHref)) {\n                pageRequestData = openBookData.openPageRequest;\n            }\n            else {\n                console.log(\"Invalid page request data: idref required!\");\n            }\n        }\n\n        var fallback = false;\n        if (pageRequestData) {\n\n            pageRequestData = openBookData.openPageRequest;\n\n            try {\n                if (pageRequestData.idref) {\n\n                    if (pageRequestData.spineItemPageIndex) {\n                        fallback = !self.openSpineItemPage(pageRequestData.idref, pageRequestData.spineItemPageIndex, self);\n                    }\n                    else if (pageRequestData.elementCfi) {\n                        fallback = !self.openSpineItemElementCfi(pageRequestData.idref, pageRequestData.elementCfi, self);\n                    }\n                    else {\n                        fallback = !self.openSpineItemPage(pageRequestData.idref, 0, self);\n                    }\n                }\n                else {\n                    fallback = !self.openContentUrl(pageRequestData.contentRefUrl, pageRequestData.sourceFileHref, self);\n                }\n            } catch (err) {\n                console.error(\"openPageRequest fail: fallback to first page!\")\n                console.log(err);\n                fallback = true;\n            }\n        }\n        else {\n            fallback = true;\n        }\n\n        if (fallback) {// if we where not asked to open specific page we will open the first one\n\n            var spineItem = _spine.first();\n            if (spineItem) {\n                var pageOpenRequest = new PageOpenRequest(spineItem, self);\n                pageOpenRequest.setFirstPage();\n                openPage(pageOpenRequest, 0);\n            }\n\n        }\n\n    };\n\n    function onMediaPlayerStatusChanged(status) {\n\n        Globals.logEvent(\"MEDIA_OVERLAY_STATUS_CHANGED\", \"EMIT\", \"reader_view.js (via MediaOverlayPlayer + AudioPlayer)\");\n        self.emit(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, status);\n    }\n\n    /**\n     * Flips the page from left to right.\n     * Takes to account the page progression direction to decide to flip to prev or next page.\n     */\n    this.openPageLeft = function () {\n\n        if (_package.spine.isLeftToRight()) {\n            self.openPagePrev();\n        }\n        else {\n            self.openPageNext();\n        }\n    };\n\n    /**\n     * Flips the page from right to left.\n     * Takes to account the page progression direction to decide to flip to prev or next page.\n     */\n    this.openPageRight = function () {\n\n        if (_package.spine.isLeftToRight()) {\n            self.openPageNext();\n        }\n        else {\n            self.openPagePrev();\n        }\n\n    };\n\n    /**\n     * Returns if the current child view is an instance of a fixed page view\n     *\n     * @returns {boolean}\n     */\n    this.isCurrentViewFixedLayout = function () {\n        return _currentView instanceof FixedView;\n    };\n\n    /**\n     * Zoom options\n     *\n     * @typedef {object} Globals.Views.ReaderView.ZoomOptions\n     * @property {string} style - \"user\"|\"fit-screen\"|\"fit-width\"\n     * @property {number} scale - 0.0 to 1.0\n     */\n\n    /**\n     * Set the zoom options.\n     *\n     * @param {Views.ReaderView.ZoomOptions} zoom Zoom options\n     */\n    this.setZoom = function (zoom) {\n        // zoom only handled by fixed layout views\n        if (self.isCurrentViewFixedLayout()) {\n            _currentView.setZoom(zoom);\n        }\n    };\n\n    /**\n     * Returns the current view scale as a percentage\n     *\n     * @returns {number}\n     */\n    this.getViewScale = function () {\n        if (self.isCurrentViewFixedLayout()) {\n            return 100 * _currentView.getViewScale();\n        }\n        else {\n            return 100;\n        }\n    };\n\n    /**\n     * Settings Data\n     *\n     * @typedef {object} Globals.Views.ReaderView.SettingsData\n     * @property {number} fontSize - Font size as percentage\n     * @property {number} fontSelection - Font selection as the number in the list of possible fonts, where 0 is special meaning default.\n     * @property {(string|boolean)} syntheticSpread - \"auto\"|\"single\"|\"double\"\n     * @property {(string|boolean)} scroll - \"auto\"|true|false\n     * @property {boolean} doNotUpdateView - Indicates whether the view should be updated after the settings are applied\n     * @property {boolean} mediaOverlaysEnableClick - Indicates whether media overlays are interactive on mouse clicks\n     */\n\n    /**\n     * Updates reader view based on the settings specified in settingsData object\n     *\n     * @param {Globals.Views.ReaderView.SettingsData} settingsData Settings data\n     * @fires Globals.Events.SETTINGS_APPLIED\n     */\n    this.updateSettings = function (settingsData) {\n\n//console.debug(\"UpdateSettings: \" + JSON.stringify(settingsData));\n\n        _viewerSettings.update(settingsData);\n\n        if (_mediaOverlayPlayer) {\n            _mediaOverlayPlayer.setAutomaticNextSmil(_viewerSettings.mediaOverlaysAutomaticPageTurn ? true : false);\n        }\n\n        if (_currentView && !settingsData.doNotUpdateView) {\n\n            var bookMark = _currentView.bookmarkCurrentPage();\n\n            if (bookMark && bookMark.idref) {\n\n                var wasPlaying = false;\n                if (_currentView.isReflowable && _currentView.isReflowable()) {\n                    wasPlaying = self.isPlayingMediaOverlay();\n                    if (wasPlaying) {\n                        self.pauseMediaOverlay();\n                    }\n                }\n\n                var spineItem = _spine.getItemById(bookMark.idref);\n\n                initViewForItem(spineItem, function (isViewChanged) {\n\n                    if (!isViewChanged) {\n                        var docWillChange = false;\n                        _currentView.setViewSettings(_viewerSettings, docWillChange);\n                    }\n\n                    self.once(ReadiumSDK.Events.PAGINATION_CHANGED, function (pageChangeData)\n                    {\n                        var cfi = new BookmarkData(bookMark.idref, bookMark.contentCFI);\n                        self.debugBookmarkData(cfi);\n                    });\n\n                    self.openSpineItemElementCfi(bookMark.idref, bookMark.contentCFI, self);\n\n                    if (wasPlaying) {\n                        self.playMediaOverlay();\n                        // setTimeout(function()\n                        // {\n                        // }, 60);\n                    }\n\n                    Globals.logEvent(\"SETTINGS_APPLIED 1 (view update)\", \"EMIT\", \"reader_view.js\");\n                    self.emit(Globals.Events.SETTINGS_APPLIED);\n                });\n                \n                return;\n            }\n        }\n\n        Globals.logEvent(\"SETTINGS_APPLIED 2 (no view update)\", \"EMIT\", \"reader_view.js\");\n        self.emit(Globals.Events.SETTINGS_APPLIED);\n    };\n\n    /**\n     * Opens the next page.\n     */\n    this.openPageNext = function () {\n\n        if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\n            _currentView.openPageNext(self);\n            return;\n        }\n\n        var paginationInfo = _currentView.getPaginationInfo();\n\n        if (paginationInfo.openPages.length == 0) {\n            return;\n        }\n\n        var lastOpenPage = paginationInfo.openPages[paginationInfo.openPages.length - 1];\n\n        if (lastOpenPage.spineItemPageIndex < lastOpenPage.spineItemPageCount - 1) {\n            _currentView.openPageNext(self);\n            return;\n        }\n\n        var currentSpineItem = _spine.getItemById(lastOpenPage.idref);\n\n        var nextSpineItem = _spine.nextItem(currentSpineItem);\n\n        if (!nextSpineItem) {\n            return;\n        }\n\n        var openPageRequest = new PageOpenRequest(nextSpineItem, self);\n        openPageRequest.setFirstPage();\n\n        openPage(openPageRequest, 2);\n    };\n\n    /**\n     * Opens the previous page.\n     */\n    this.openPagePrev = function () {\n\n        if (self.getCurrentViewType() === ReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS) {\n            _currentView.openPagePrev(self);\n            return;\n        }\n\n        var paginationInfo = _currentView.getPaginationInfo();\n\n        if (paginationInfo.openPages.length == 0) {\n            return;\n        }\n\n        var firstOpenPage = paginationInfo.openPages[0];\n\n        if (firstOpenPage.spineItemPageIndex > 0) {\n            _currentView.openPagePrev(self);\n            return;\n        }\n\n        var currentSpineItem = _spine.getItemById(firstOpenPage.idref);\n\n        var prevSpineItem = _spine.prevItem(currentSpineItem);\n\n        if (!prevSpineItem) {\n            return;\n        }\n\n        var openPageRequest = new PageOpenRequest(prevSpineItem, self);\n        openPageRequest.setLastPage();\n\n        openPage(openPageRequest, 1);\n    };\n\n    function getSpineItem(idref) {\n\n        if (!idref) {\n\n            console.log(\"idref parameter value missing!\");\n            return undefined;\n        }\n\n        var spineItem = _spine.getItemById(idref);\n        if (!spineItem) {\n            console.log(\"Spine item with id \" + idref + \" not found!\");\n            return undefined;\n        }\n\n        return spineItem;\n\n    }\n\n    /**\n     * Opens the page of the spine item with element with provided cfi\n     *\n     * @param {string} idref Id of the spine item\n     * @param {string} elementCfi CFI of the element to be shown\n     * @param {object} initiator optional\n     */\n    this.openSpineItemElementCfi = function (idref, elementCfi, initiator) {\n\n        var spineItem = getSpineItem(idref);\n\n        if (!spineItem) {\n            return false;\n        }\n\n        var pageData = new PageOpenRequest(spineItem, initiator);\n        if (elementCfi) {\n            pageData.setElementCfi(elementCfi);\n        }\n\n        openPage(pageData, 0);\n\n        return true;\n    };\n\n    /**\n     * Opens specified page index of the current spine item\n     *\n     * @param {number} pageIndex Zero based index of the page in the current spine item\n     * @param {object} initiator optional\n     */\n    this.openPageIndex = function (pageIndex, initiator) {\n\n        if (!_currentView) {\n            return false;\n        }\n\n        var pageRequest;\n\n        if (_package.isFixedLayout()) {\n            var spineItem = _spine.items[pageIndex];\n            if (!spineItem) {\n                return false;\n            }\n\n            pageRequest = new PageOpenRequest(spineItem, initiator);\n            pageRequest.setPageIndex(0);\n        }\n        else {\n\n            var spineItems = this.getLoadedSpineItems();\n            if (spineItems.length > 0) {\n                pageRequest = new PageOpenRequest(spineItems[0], initiator);\n                pageRequest.setPageIndex(pageIndex);\n            }\n        }\n\n        openPage(pageRequest, 0);\n\n        return true;\n    };\n\n    // dir: 0 => new or same page, 1 => previous, 2 => next\n    function openPage(pageRequest, dir) {\n\n        initViewForItem(pageRequest.spineItem, function (isViewChanged) {\n\n            if (!isViewChanged) {\n                var docWillChange = true;\n                _currentView.setViewSettings(_viewerSettings, docWillChange);\n            }\n\n            _currentView.openPage(pageRequest, dir);\n        });\n    }\n\n\n    /**\n     * Opens page index of the spine item with idref provided\n     *\n     * @param {string} idref Id of the spine item\n     * @param {number} pageIndex Zero based index of the page in the spine item\n     * @param {object} initiator optional\n     */\n    this.openSpineItemPage = function (idref, pageIndex, initiator) {\n\n        var spineItem = getSpineItem(idref);\n\n        if (!spineItem) {\n            return false;\n        }\n\n        var pageData = new PageOpenRequest(spineItem, initiator);\n        if (pageIndex) {\n            pageData.setPageIndex(pageIndex);\n        }\n\n        openPage(pageData, 0);\n\n        return true;\n    };\n\n    /**\n     * Set CSS Styles to the reader container\n     *\n     * @param {Collections.StyleCollection} styles   Style collection containing selector property and declarations object\n     * @param {boolean} doNotUpdateView                         Whether to update the view after the styles are applied.\n     */\n    this.setStyles = function (styles, doNotUpdateView) {\n\n        var count = styles.length;\n\n        for (var i = 0; i < count; i++) {\n            if (styles[i].declarations) {\n                _userStyles.addStyle(styles[i].selector, styles[i].declarations);\n            }\n            else {\n                _userStyles.removeStyle(styles[i].selector);\n            }\n        }\n\n        applyStyles(doNotUpdateView);\n\n    };\n\n    /**\n     * Set CSS Styles to the content documents\n     *\n     * @param {Collections.StyleCollection} styles    Style collection containing selector property and declarations object\n     */\n    this.setBookStyles = function (styles) {\n\n        var count = styles.length;\n\n        for (var i = 0; i < count; i++) {\n            if (styles[i].declarations) {\n                _bookStyles.addStyle(styles[i].selector, styles[i].declarations);\n            }\n            else {\n                _bookStyles.removeStyle(styles[i].selector);\n            }\n        }\n\n        if (_currentView) {\n            _currentView.applyBookStyles();\n        }\n\n    };\n\n    /**\n     * Gets an element from active content documents based on a query selector.\n     *\n     * @param {Models.SpineItem} spineItem       The spine item object associated with an active content document\n     * @param {string} selector                      The query selector\n     * @returns {HTMLElement|undefined}\n     */\n    this.getElement = function (spineItemIdref, selector) {\n\n        if (_currentView) {\n            return _currentView.getElement(spineItemIdref, selector);\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Gets an element from active content documents based on an element id.\n     *\n     * @param {string} spineItemIdref      The spine item idref associated with an active content document\n     * @param {string} id                                  The element id\n     * @returns {HTMLElement|undefined}\n     */\n    this.getElementById = function (spineItemIdref, id) {\n\n        if (_currentView) {\n            return _currentView.getElementById(spineItemIdref, id);\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Gets an element from active content documents based on a content CFI.\n     *\n     * @param {string} spineItemIdref     The spine item idref associated with an active content document\n     * @param {string} cfi                                The partial content CFI\n     * @param {string[]} [classBlacklist]\n     * @param {string[]} [elementBlacklist]\n     * @param {string[]} [idBlacklist]\n     * @returns {HTMLElement|undefined}\n     */\n    this.getElementByCfi = function (spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist) {\n\n        if (_currentView) {\n            return _currentView.getElementByCfi(spineItemIdref, cfi, classBlacklist, elementBlacklist, idBlacklist);\n        }\n\n        return undefined;\n\n    };\n\n    function applyStyles(doNotUpdateView) {\n\n        Helpers.setStyles(_userStyles.getStyles(), _$el);\n\n        if (_mediaOverlayPlayer)\n            _mediaOverlayPlayer.applyStyles();\n\n        if (doNotUpdateView) return;\n\n        if (_currentView) {\n            _currentView.applyStyles();\n        }\n    }\n\n    /**\n     * Opens a content url from a media player context\n     *\n     * @param {string} contentRefUrl\n     * @param {string} sourceFileHref\n     * @param offset\n     */\n    this.mediaOverlaysOpenContentUrl = function (contentRefUrl, sourceFileHref, offset) {\n        _mediaOverlayPlayer.mediaOverlaysOpenContentUrl(contentRefUrl, sourceFileHref, offset);\n    };\n\n\n    /**\n     * Opens the content document specified by the url\n     *\n     * @param {string} contentRefUrl Url of the content document\n     * @param {string | undefined} sourceFileHref Url to the file that contentRefUrl is relative to. If contentRefUrl is\n     * relative ot the source file that contains it instead of the package file (ex. TOC file) We have to know the\n     * sourceFileHref to resolve contentUrl relative to the package file.\n     * @param {object} initiator optional\n     */\n    this.openContentUrl = function (contentRefUrl, sourceFileHref, initiator) {\n\n        var combinedPath = Helpers.ResolveContentRef(contentRefUrl, sourceFileHref);\n\n        var hashIndex = combinedPath.indexOf(\"#\");\n        var hrefPart;\n        var elementId;\n        if (hashIndex >= 0) {\n            hrefPart = combinedPath.substr(0, hashIndex);\n            elementId = combinedPath.substr(hashIndex + 1);\n        }\n        else {\n            hrefPart = combinedPath;\n            elementId = undefined;\n        }\n\n        var spineItem = _spine.getItemByHref(hrefPart);\n        if (!spineItem) {\n            console.warn('spineItem ' + hrefPart + ' not found');\n            // sometimes that happens because spine item's URI gets encoded,\n            // yet it's compared with raw strings by `getItemByHref()` -\n            // so we try to search with decoded link as well\n            var decodedHrefPart = decodeURIComponent(hrefPart);\n            spineItem = _spine.getItemByHref(decodedHrefPart);\n            if (!spineItem) {\n                console.warn('decoded spineItem ' + decodedHrefPart + ' missing as well');\n                return false;\n            }\n        }\n\n        return self.openSpineItemElementId(spineItem.idref, elementId, initiator);\n    };\n\n    /**\n     * Opens the page of the spine item with element with provided cfi\n     *\n     * @param {string} idref Id of the spine item\n     * @param {string} elementId id of the element to be shown\n     * @param {object} initiator optional\n     */\n    this.openSpineItemElementId = function (idref, elementId, initiator) {\n\n        var spineItem = _spine.getItemById(idref);\n        if (!spineItem) {\n            return false;\n        }\n\n        var pageData = new PageOpenRequest(spineItem, initiator);\n\n        if (elementId) {\n            pageData.setElementId(elementId);\n        }\n\n\n        openPage(pageData, 0);\n\n        return true;\n    };\n\n    //var cfi = new BookmarkData(bookmark.idref, bookmark.contentCFI);\n    this.debugBookmarkData = function(cfi) {\n\n        if (!ReadiumSDK) return;\n\n        var DEBUG = true; // change this to visualize the CFI range\n        if (!DEBUG) return;\n            \n        var paginationInfo = this.getPaginationInfo();\n        console.log(JSON.stringify(paginationInfo));\n        \n        if (paginationInfo.isFixedLayout) return;\n    \n        try {\n            ReadiumSDK._DEBUG_CfiNavigationLogic.clearDebugOverlays();\n            \n        } catch (error) {\n            //ignore\n        }\n        \n        try {\n            console.log(cfi);\n            \n            var range = this.getDomRangeFromRangeCfi(cfi);\n            console.log(range);\n            \n            var res = ReadiumSDK._DEBUG_CfiNavigationLogic.drawDebugOverlayFromDomRange(range);\n            console.log(res);\n        \n            var cfiFirst = ReadiumSDK.reader.getFirstVisibleCfi();\n            console.log(cfiFirst);\n            \n            var cfiLast  = ReadiumSDK.reader.getLastVisibleCfi();\n            console.log(cfiLast);\n            \n        } catch (error) {\n            //ignore\n        }\n        \n        setTimeout(function() {\n            try {\n                ReadiumSDK._DEBUG_CfiNavigationLogic.clearDebugOverlays();\n            } catch (error) {\n                //ignore\n            }\n        }, 2000);\n    };\n\n    /**\n     * Returns the bookmark associated with currently opened page.\n     *\n     * @returns {string} Serialized ReadiumSDK.Models.BookmarkData object as JSON string.\n     *          {null} If a bookmark could not be created successfully.\n     */\n    this.bookmarkCurrentPage = function() {\n        var bookmark = _currentView.bookmarkCurrentPage();\n        return bookmark ? bookmark.toString() : null;\n    };\n\n    /**\n     * Resets all the custom styles set by setStyle callers at runtime\n     */\n    this.clearStyles = function () {\n\n        _userStyles.resetStyleValues();\n        applyStyles();\n        _userStyles.clear();\n    };\n\n    /**\n     * Resets all the custom styles set by setBookStyle callers at runtime\n     */\n    this.clearBookStyles = function () {\n\n        if (_currentView) {\n\n            _bookStyles.resetStyleValues();\n            _currentView.applyBookStyles();\n        }\n\n        _bookStyles.clear();\n    };\n\n    /**\n     * Returns true if media overlay available for one of the open pages.\n     *\n     * @returns {boolean}\n     */\n    this.isMediaOverlayAvailable = function () {\n\n        if (!_mediaOverlayPlayer) return false;\n\n        return _mediaOverlayPlayer.isMediaOverlayAvailable();\n    };\n\n    /*\n     this.setMediaOverlaySkippables = function(items) {\n\n     _mediaOverlayPlayer.setMediaOverlaySkippables(items);\n     };\n\n     this.setMediaOverlayEscapables = function(items) {\n\n     _mediaOverlayPlayer.setMediaOverlayEscapables(items);\n     };\n     */\n\n    /**\n     * Starts/Stop playing media overlay on current page\n     */\n    this.toggleMediaOverlay = function () {\n\n        _mediaOverlayPlayer.toggleMediaOverlay();\n    };\n\n\n    /**\n     * Plays next fragment media overlay\n     */\n    this.nextMediaOverlay = function () {\n\n        _mediaOverlayPlayer.nextMediaOverlay();\n\n    };\n\n    /**\n     * Plays previous fragment media overlay\n     */\n    this.previousMediaOverlay = function () {\n\n        _mediaOverlayPlayer.previousMediaOverlay();\n\n    };\n\n    /**\n     * Plays next available fragment media overlay that is outside of the current escapable scope\n     */\n    this.escapeMediaOverlay = function () {\n\n        _mediaOverlayPlayer.escape();\n    };\n\n    /**\n     * End media overlay TTS\n     * @todo Clarify what this does with Daniel.\n     */\n    this.ttsEndedMediaOverlay = function () {\n\n        _mediaOverlayPlayer.onTTSEnd();\n    };\n\n    /**\n     * Pause currently playing media overlays.\n     */\n    this.pauseMediaOverlay = function () {\n\n        _mediaOverlayPlayer.pause();\n    };\n\n    /**\n     * Start/Resume playback of media overlays.\n     */\n    this.playMediaOverlay = function () {\n\n        _mediaOverlayPlayer.play();\n    };\n\n    /**\n     * Determine if media overlays are currently playing.\n     * @returns {boolean}\n     */\n    this.isPlayingMediaOverlay = function () {\n\n        return _mediaOverlayPlayer.isPlaying();\n    };\n\n//\n// should use Globals.Events.SETTINGS_APPLIED instead!\n//    this.setRateMediaOverlay = function(rate) {\n//\n//        _mediaOverlayPlayer.setRate(rate);\n//    };\n//    this.setVolumeMediaOverlay = function(volume){\n//\n//        _mediaOverlayPlayer.setVolume(volume);\n//    };\n\n    /**\n     * Get the first visible media overlay element from the currently active content document(s)\n     * @returns {HTMLElement|undefined}\n     */\n    this.getFirstVisibleMediaOverlayElement = function () {\n\n        if (_currentView) {\n            return _currentView.getFirstVisibleMediaOverlayElement();\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Used to jump to an element to make sure it is visible when a content document is paginated\n     * @param {string}      spineItemId   The spine item idref associated with an active content document\n     * @param {HTMLElement} element       The element to make visible\n     * @param [initiator]\n     */\n    this.insureElementVisibility = function (spineItemId, element, initiator) {\n\n        if (_currentView) {\n            _currentView.insureElementVisibility(spineItemId, element, initiator);\n        }\n    };\n\n    var _resizeBookmark = null;\n    var _resizeMOWasPlaying = false;\n\n    function handleViewportResizeStart() {\n\n        _resizeBookmark = null;\n        _resizeMOWasPlaying = false;\n\n        if (_currentView) {\n\n            if (_currentView.isReflowable && _currentView.isReflowable()) {\n                _resizeMOWasPlaying = self.isPlayingMediaOverlay();\n                if (_resizeMOWasPlaying) {\n                    self.pauseMediaOverlay();\n                }\n            }\n\n            _resizeBookmark = _currentView.bookmarkCurrentPage(); // not self! (JSON string)\n        }\n    }\n\n    function handleViewportResizeTick() {\n        if (_currentView) {\n            self.handleViewportResize(_resizeBookmark);\n        }\n    }\n\n    function handleViewportResizeEnd() {\n        //same as doing one final tick for now\n        handleViewportResizeTick();\n\n        if (_resizeMOWasPlaying) self.playMediaOverlay();\n    }\n\n    this.handleViewportResize = function (bookmarkToRestore) {\n        if (!_currentView) return;\n\n        _currentView.onViewportResize();\n    };\n\n    /**\n     * Lets user to subscribe to iframe's window events\n     *\n     * @param {string} eventName              Event name.\n     * @param {function} callback             Callback function.\n     * @param {object} context                User specified data passed to the callback function.\n     * @returns {undefined}\n     */\n    this.addIFrameEventListener = function (eventName, callback, context) {\n        _iframeLoader.addIFrameEventListener(eventName, callback, context);\n    };\n\n    var BackgroundAudioTrackManager = function (readerView) {\n        var _spineItemIframeMap = {};\n        var _wasPlaying = false;\n\n        var _callback_playPause = undefined;\n        this.setCallback_PlayPause = function (callback) {\n            _callback_playPause = callback;\n        };\n\n        var _callback_isAvailable = undefined;\n        this.setCallback_IsAvailable = function (callback) {\n            _callback_isAvailable = callback;\n        };\n\n        this.playPause = function (doPlay) {\n            _playPause(doPlay);\n        };\n\n        var _playPause = function (doPlay) {\n            if (_callback_playPause) {\n                _callback_playPause(doPlay);\n            }\n\n            try {\n                var $iframe = undefined;\n\n                for (var prop in _spineItemIframeMap) {\n                    if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n                    var data = _spineItemIframeMap[prop];\n                    if (!data || !data.active) continue;\n\n                    if ($iframe) console.error(\"More than one active iframe?? (pagination)\");\n\n                    $iframe = data[\"$iframe\"];\n                    if (!$iframe) continue;\n\n                    var $audios = $(\"audio\", $iframe[0].contentDocument);\n\n                    $.each($audios, function () {\n\n                        var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\n\n                        if (!attr) return true; // continue\n\n                        if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\n\n                        if (doPlay && this.play) {\n                            this.play();\n                        }\n                        else if (this.pause) {\n                            this.pause();\n                        }\n\n                        return true; // continue (more than one track?)\n                    });\n                }\n            }\n            catch (err) {\n                console.error(err);\n            }\n        };\n\n        this.setPlayState = function (wasPlaying) {\n            _wasPlaying = wasPlaying;\n        };\n\n        readerView.on(Globals.Events.CONTENT_DOCUMENT_LOADED, function ($iframe, spineItem) {\n            Globals.logEvent(\"CONTENT_DOCUMENT_LOADED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager) [ \" + spineItem.href + \" ]\");;\n            \n            try {\n                if (spineItem && spineItem.idref && $iframe && $iframe[0]) {\n                    // console.log(\"CONTENT_DOCUMENT_LOADED\");\n                    // console.debug(spineItem.href);\n                    // console.debug(spineItem.idref);\n\n                    _spineItemIframeMap[spineItem.idref] = {\"$iframe\": $iframe, href: spineItem.href};\n                }\n            }\n            catch (err) {\n                console.error(err);\n            }\n        });\n\n        readerView.on(Globals.Events.PAGINATION_CHANGED, function (pageChangeData) {\n            Globals.logEvent(\"PAGINATION_CHANGED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager)\");\n            \n            // console.log(\"PAGINATION_CHANGED\");\n            // console.debug(pageChangeData);\n            //\n            // if (pageChangeData.spineItem)\n            // {\n            //     console.debug(pageChangeData.spineItem.href);\n            //     console.debug(pageChangeData.spineItem.idref);\n            // }\n            // else\n            // {\n            //     //console.error(pageChangeData);\n            // }\n            //\n            // if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages && pageChangeData.paginationInfo.openPages.length)\n            // {\n            //     for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++)\n            //     {\n            //         console.log(pageChangeData.paginationInfo.openPages[i].idref);\n            //     }\n            // }\n\n            var atLeastOne = false;\n\n            try {\n                for (var prop in _spineItemIframeMap) {\n                    if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n                    var isActive = pageChangeData.spineItem && pageChangeData.spineItem.idref === prop;\n\n                    var isDisplayed = false;\n\n                    if (pageChangeData.paginationInfo && pageChangeData.paginationInfo.openPages.length) {\n                        var allSame = true;\n\n                        for (var i = 0; i < pageChangeData.paginationInfo.openPages.length; i++) {\n                            if (pageChangeData.paginationInfo.openPages[i].idref === prop) {\n                                isDisplayed = true;\n                            }\n                            else {\n                                allSame = false;\n                            }\n                        }\n\n                        if (!isActive && allSame) isActive = true;\n                    }\n\n                    if (isActive || isDisplayed) {\n                        var data = _spineItemIframeMap[prop];\n                        if (!data) continue;\n\n                        _spineItemIframeMap[prop][\"active\"] = isActive;\n\n                        var $iframe = data[\"$iframe\"];\n                        var href = data.href;\n\n                        var $audios = $(\"audio\", $iframe[0].contentDocument);\n                        $.each($audios, function () {\n\n                            var attr = this.getAttribute(\"epub:type\") || this.getAttribute(\"type\");\n\n                            if (!attr) return true; // continue\n\n                            if (attr.indexOf(\"ibooks:soundtrack\") < 0 && attr.indexOf(\"media:soundtrack\") < 0 && attr.indexOf(\"media:background\") < 0) return true; // continue\n\n                            this.setAttribute(\"loop\", \"loop\");\n                            this.removeAttribute(\"autoplay\");\n\n                            // DEBUG!\n                            //this.setAttribute(\"controls\", \"controls\");\n\n                            if (isActive) {\n                                // DEBUG!\n                                //$(this).css({border:\"2px solid green\"});\n                            }\n                            else {\n                                if (this.pause) this.pause();\n\n                                // DEBUG!\n                                //$(this).css({border:\"2px solid red\"});\n                            }\n\n                            atLeastOne = true;\n\n                            return true; // continue (more than one track?)\n                        });\n\n                        continue;\n                    }\n                    else {\n                        if (_spineItemIframeMap[prop]) _spineItemIframeMap[prop][\"$iframe\"] = undefined;\n                        _spineItemIframeMap[prop] = undefined;\n                    }\n                }\n            }\n            catch (err) {\n                console.error(err);\n            }\n\n            if (_callback_isAvailable) {\n                _callback_isAvailable(atLeastOne);\n            }\n\n            if (atLeastOne) {\n                if (_wasPlaying) {\n                    _playPause(true);\n                }\n                else {\n                    _playPause(false); // ensure correct paused state\n                }\n            }\n            else {\n                _playPause(false); // ensure correct paused state\n            }\n        });\n\n        readerView.on(Globals.Events.MEDIA_OVERLAY_STATUS_CHANGED, function (value) {\n            Globals.logEvent(\"MEDIA_OVERLAY_STATUS_CHANGED\", \"ON\", \"reader_view.js (via BackgroundAudioTrackManager)\");\n            \n            if (!value.smilIndex) return;\n            var package = readerView.package();\n            var smil = package.media_overlay.smilAt(value.smilIndex);\n            if (!smil || !smil.spineItemId) return;\n\n            var needUpdate = false;\n            for (var prop in _spineItemIframeMap) {\n                if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n                var data = _spineItemIframeMap[prop];\n                if (!data) continue;\n\n                if (data.active) {\n                    if (prop !== smil.spineItemId) {\n                        _playPause(false); // ensure correct paused state\n                        data.active = false;\n                        needUpdate = true;\n                    }\n                }\n            }\n\n            if (needUpdate) {\n                for (var prop in _spineItemIframeMap) {\n                    if (!_spineItemIframeMap.hasOwnProperty(prop)) continue;\n\n                    var data = _spineItemIframeMap[prop];\n                    if (!data) continue;\n\n                    if (!data.active) {\n                        if (prop === smil.spineItemId) {\n                            data.active = true;\n                        }\n                    }\n                }\n\n                if (_wasPlaying) {\n                    _playPause(true);\n                }\n            }\n        });\n    };\n    this.backgroundAudioTrackManager = new BackgroundAudioTrackManager(self);\n\n    function getCfisForVisibleRegion() {\n        return {firstVisibleCfi: self.getFirstVisibleCfi(), lastVisibleCfi: self.getLastVisibleCfi()};\n    }\n\n\n    this.isVisibleSpineItemElementCfi = function(spineIdRef, partialCfi){\n        var spineItem = getSpineItem(spineIdRef);\n\n        if (!spineItem) {\n            return false;\n        }\n\n        if (_currentView) {\n\n            if(!partialCfi || (partialCfi && partialCfi === '')){\n                var spines = _currentView.getLoadedSpineItems();\n                for(var i = 0, count = spines.length; i < count; i++) {\n                    if(spines[i].idref == spineIdRef){\n                        return true;\n                    }\n                }\n            }\n            return _currentView.isVisibleSpineItemElementCfi(spineIdRef, partialCfi);\n\n        }\n        return false;\n    };\n\n    /**\n     * Gets all elements from active content documents based on a query selector.\n     *\n     * @param {string} spineItemIdref    The spine item idref associated with the content document\n     * @param {string} selector          The query selector\n     * @returns {HTMLElement[]}\n     */\n    this.getElements = function(spineItemIdref, selector) {\n\n        if(_currentView) {\n            return _currentView.getElements(spineItemIdref, selector);\n        }\n\n        return undefined;\n    };\n\n    /**\n     * Determine if an element is visible on the active content documents\n     *\n     * @param {HTMLElement} element The element.\n     * @returns {boolean}\n     */\n    this.isElementVisible = function (element) {\n        return _currentView.isElementVisible($(element));\n\n    };\n\n    /**\n     * Resolve a range CFI into an object containing info about it.\n     * @param {string} spineIdRef    The spine item idref associated with the content document\n     * @param {string} partialCfi    The partial CFI that is the range CFI to resolve\n     * @returns {Models.NodeRangeInfo}\n     */\n    this.getNodeRangeInfoFromCfi = function (spineIdRef, partialCfi) {\n        if (_currentView && spineIdRef && partialCfi) {\n            var nodeRangeInfo = _currentView.getNodeRangeInfoFromCfi(spineIdRef, partialCfi);\n            if (nodeRangeInfo) {\n                return new NodeRangeInfo(nodeRangeInfo.clientRect)\n                    .setStartInfo(nodeRangeInfo.startInfo)\n                    .setEndInfo(nodeRangeInfo.endInfo);\n            }\n        }\n        return undefined;\n    };\n\n    /**\n     * Get the pagination info from the current view\n     *\n     * @returns {ReadiumSDK.Models.CurrentPagesInfo}\n     */\n    this.getPaginationInfo = function(){\n        return _currentView.getPaginationInfo();\n    };\n    /**\n     * Get CFI of the first element visible in the viewport\n     * @returns {ReadiumSDK.Models.BookmarkData}\n     */\n    this.getFirstVisibleCfi = function() {\n        if (_currentView) {\n            return _currentView.getFirstVisibleCfi();\n        }\n        return undefined;\n    };\n\n    /**\n     * Get CFI of the last element visible in the viewport\n     * @returns {ReadiumSDK.Models.BookmarkData}\n     */\n    this.getLastVisibleCfi = function() {\n        if (_currentView) {\n            return _currentView.getLastVisibleCfi();\n        }\n        return undefined;\n    };\n\n    /**\n     * Get CFI of the first element from the base of the document\n     * @returns {ReadiumSDK.Models.BookmarkData}\n     */\n    this.getStartCfi = function() {\n        if (_currentView) {\n            return _currentView.getStartCfi();\n        }\n        return undefined;\n    };\n\n    /**\n     * Get CFI of the last element from the base of the document\n     * @returns {ReadiumSDK.Models.BookmarkData}\n     */\n    this.getEndCfi = function() {\n        if (_currentView) {\n            return _currentView.getEndCfi();\n        }\n        return undefined;\n    };\n\n    /**\n     *\n     * @param {string} rangeCfi\n     * @param {string} [rangeCfi2]\n     * @param {boolean} [inclusive]\n     * @returns {array}\n     */\n    this.getDomRangesFromRangeCfi = function(rangeCfi, rangeCfi2, inclusive) {\n        if (_currentView) {\n            if (_currentView.getDomRangesFromRangeCfi) {\n                return _currentView.getDomRangesFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n            } else {\n                return [_currentView.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n            }\n        }\n        return undefined;\n    };\n\n    /**\n     *\n     * @param {ReadiumSDK.Models.BookmarkData} startCfi starting CFI\n     * @param {ReadiumSDK.Models.BookmarkData} [endCfi] ending CFI\n     * optional - may be omited if startCfi is a range CFI\n     * @param {boolean} [inclusive] optional indicating if the range should be inclusive\n     * @returns {array}\n     */\n    this.getDomRangesFromRangeCfi = function(rangeCfi, rangeCfi2, inclusive) {\n        if (_currentView) {\n            if (_currentView.getDomRangesFromRangeCfi) {\n                return _currentView.getDomRangesFromRangeCfi(rangeCfi, rangeCfi2, inclusive);\n            } else {\n                return [_currentView.getDomRangeFromRangeCfi(rangeCfi, rangeCfi2, inclusive)];\n            }\n        }\n        return undefined;\n    };\n\n    /**\n     *\n     * @param {ReadiumSDK.Models.BookmarkData} startCfi starting CFI\n     * @param {ReadiumSDK.Models.BookmarkData} [endCfi] ending CFI\n     * optional - may be omited if startCfi is a range CFI\n     * @param {boolean} [inclusive] optional indicating if the range should be inclusive\n     * @returns {DOM Range} https://developer.mozilla.org/en-US/docs/Web/API/Range\n     */\n    this.getDomRangeFromRangeCfi = function(startCfi, endCfi, inclusive) {\n        if (_currentView) {\n            return _currentView.getDomRangeFromRangeCfi(startCfi, endCfi, inclusive);\n        }\n        return undefined;\n    };\n\n    /**\n     * Generate range CFI from DOM range\n     * @param {DOM Range} https://developer.mozilla.org/en-US/docs/Web/API/Range\n     * @returns {string} - represents Range CFI for the DOM range\n     */\n    this.getRangeCfiFromDomRange = function(domRange) {\n        if (_currentView) {\n            return _currentView.getRangeCfiFromDomRange(domRange);\n        }\n        return undefined;\n    };\n\n    /**\n     * @param x\n     * @param y\n     * @param [precisePoint]\n     * @param [spineItemIdref] Required for fixed layout views\n     * @returns {string}\n     */\n    this.getVisibleCfiFromPoint = function (x, y, precisePoint, spineItemIdref) {\n        if (_currentView) {\n            return _currentView.getVisibleCfiFromPoint(x, y, precisePoint, spineItemIdref);\n        }\n        return undefined;\n    };\n\n    /**\n     *\n     * @param startX\n     * @param startY\n     * @param endX\n     * @param endY\n     * @param [spineItemIdref] Required for fixed layout views\n     * @returns {*}\n     */\n    this.getRangeCfiFromPoints = function(startX, startY, endX, endY, spineItemIdref) {\n        if (_currentView) {\n            return _currentView.getRangeCfiFromPoints(startX, startY, endX, endY, spineItemIdref);\n        }\n        return undefined;\n    };\n\n    /**\n     *\n     * @param {HTMLElement} element\n     * @returns {*}\n     */\n    this.getCfiForElement = function(element) {\n        if (_currentView) {\n            return _currentView.getCfiForElement(element);\n        }\n        return undefined;\n    };\n       \n    /**\n     * Useful for getting a CFI that's as close as possible to an invisible (not rendered, zero client rects) element\n     * @param {HTMLElement} element\n     * @returns {*}\n     */\n    this.getNearestCfiFromElement = function(element) {\n        if (_currentView) {\n            return _currentView.getNearestCfiFromElement(element);\n        }\n        return undefined;\n    };\n    \n};\n\n/**\n * View Type\n * @typedef {object} Globals.Views.ReaderView.ViewType\n * @property {number} VIEW_TYPE_COLUMNIZED          Reflowable document view\n * @property {number} VIEW_TYPE_FIXED               Fixed layout document view\n * @property {number} VIEW_TYPE_SCROLLED_DOC        Scrollable document view\n * @property {number} VIEW_TYPE_SCROLLED_CONTINUOUS Continuous scrollable document view\n */\nReaderView.VIEW_TYPE_COLUMNIZED = 1;\nReaderView.VIEW_TYPE_FIXED = 2;\nReaderView.VIEW_TYPE_SCROLLED_DOC = 3;\nReaderView.VIEW_TYPE_SCROLLED_CONTINUOUS = 4;\nreturn ReaderView;\n});\n\n",
     "\nrequire([\"readium_cfi_js/cfi_API\", \"readium_shared_js/globalsSetup\"]);\n"
   ]