diff --git a/lib/interactive/TMB_DIGIT_SYMBOL_MATCHING/index.ts b/lib/interactive/TMB_DIGIT_SYMBOL_MATCHING/index.ts index d6572b1..f703aa8 100644 --- a/lib/interactive/TMB_DIGIT_SYMBOL_MATCHING/index.ts +++ b/lib/interactive/TMB_DIGIT_SYMBOL_MATCHING/index.ts @@ -109,6 +109,7 @@ export default defineInstrument({ html, render, staticAssets, + defaultFullscreen: true, enableLanguageLock: true, enableLanguageSelect: true }, diff --git a/lib/interactive/TMB_EMOTION_RECOGNITION/index.ts b/lib/interactive/TMB_EMOTION_RECOGNITION/index.ts index 6944f24..ec356d4 100644 --- a/lib/interactive/TMB_EMOTION_RECOGNITION/index.ts +++ b/lib/interactive/TMB_EMOTION_RECOGNITION/index.ts @@ -177,6 +177,7 @@ export default defineInstrument({ name: 'TMB_EMOTION_RECOGNITION' }, content: { + defaultFullscreen: true, meta: { charset: 'UTF-8', copyright: '2023 The Many Brains Project, Inc. and McLean Hospital LGPLv3', diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/TestHelper.v1.Oct23.js b/lib/interactive/TMB_FLANKER_ATTENTION/TestHelper.v1.Oct23.js new file mode 100644 index 0000000..977a6b3 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/TestHelper.v1.Oct23.js @@ -0,0 +1,913 @@ +/* eslint-disable */ + +/* + + Copyright 2023 The Many Brains Project, Inc. and McLean Hospital. + + This code is made available under a GNU Lesser General Public License 3.0 + (LGPLv3). + https://www.gnu.org/licenses/lgpl-3.0.html. + + Author: Paolo Martini, Roger Strong + Last updated: 10.19.2023 + Version: TestHelper.v1.Oct23 + + */ + +function debounce(func, wait, immediate) { + /* + Returns a function, that, as long as it continues to be invoked, + will not be triggered. The function will be called after it stops + being invoked for `wait` milliseconds. If `immediate` is passed, + the function is triggered on the leading edge, instead of the trailing. + + Usage: + + var resizeHandler = debounce(function() { your code here }, 100); + window.addEventListener('resize', resizeHandler); + + N.B. The event is passed to the returned function as arguments[0] + */ + + let timeout; + return function () { + const args = arguments, + context = this; + const later = function () { + timeout = null; + if (!immediate) { + func.apply(context, args); + } + }; + const callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + func.apply(context, args); + } + }; +} + +function disableSelect() { + const s = document.body.style; + + if (typeof s.webkitUserSelect !== 'undefined') s.webkitUserSelect = 'none'; + else if (typeof s.MozUserSelect !== 'undefined') s.MozUserSelect = 'none'; + else if (typeof s.msUserSelect !== 'undefined') s.msUserSelect = 'none'; + else if (typeof s.oUserSelect !== 'undefined') s.oUserSelect = 'none'; + else if (typeof s.userSelect !== 'undefined') s.userSelect = 'none'; + else if (typeof document.onselectstart !== 'undefined') + document.onselectstart = function () { + return false; + }; + + // disable 'save image' popup on iPhone + if (s.webkitTouchCallout !== undefined) s.webkitTouchCallout = 'none'; +} + +tmbUI.getInput = function () { + let downDebounce = false, + errorMessage = '', + highlightEl, + i, + timeStamp = now(), + upDebounce = true, + validUpEventTypes = []; + + // parse the tmbUI object + for (const key in tmbUI) { + // filter out prototype properties + if (tmbUI.hasOwnProperty(key)) { + switch (key) { + case 'downTimestamp': + tmbUI.downTimestamp = 0; + break; + case 'dwell': + tmbUI.dwell = 0; + break; + case 'getInput': + break; + // do we want to highlight the element + // the user responds to? + case 'highlight': + // must be empty string or valid css class + if (tmbUI.highlight !== '') { + const found = [].slice.call(document.styleSheets).some(function (sheet) { + return [].slice.call(sheet.cssRules).some(function (rule) { + return rule.selectorText === '.' + tmbUI.highlight; + }); + }); + if (!found) { + errorMessage += "'highlight' must be " + 'empty string or valid CSS class. '; + } + } + break; + case 'message': + tmbUI.message = ''; + break; + case 'onreadyUI': + break; + case 'response': + tmbUI.response = ''; + break; + case 'rt': + tmbUI.rt = 0; + break; + case 'status': + tmbUI.status = ''; + break; + // listening timeout in ms + case 'timeout': + // minimum timeout is 150 ms + if (tmbUI.timeout < 150) errorMessage += 'Timeout is ' + tmbUI.timeout + ' ms, ' + 'must be > 150 ms. '; + break; + // function has not raised readyUI event yet + case 'timeoutRef': + // called this function while still processing + if (tmbUI.timeoutRef !== 0) { + tmbUI.message += "'getInput' called again while " + 'still busy. '; + return false; + } + break; + // ids of elements to attach listeners to, + // or corresponding to keys + case 'UIelements': + // accept single argument not as array + if (!(tmbUI.UIelements instanceof Array)) { + tmbUI.UIelements = [tmbUI.UIelements]; + } + // must be DOM elements + for (i = 0; i < tmbUI.UIelements.length; i++) { + if (!getID(tmbUI.UIelements[i])) { + errorMessage += "'" + tmbUI.UIelements[i] + "' is not a valid element. "; + } + } + break; + // keys, clicks or taps + case 'UIevents': + // must specify input events + if (tmbUI.UIevents.length === 0) { + errorMessage += 'Must specify UIevents: ' + "'keys', 'clicks' or 'taps'. "; + } + // accept single argument not as array + if (!(tmbUI.UIevents instanceof Array)) { + tmbUI.UIevents = [tmbUI.UIevents]; + } + // veto invalid events + for (i = 0; i < tmbUI.UIevents.length; i++) { + if (!['clicks', 'keys', 'taps'].includes(tmbUI.UIevents[i])) { + errorMessage += "'" + tmbUI.UIevents[i] + "' is not a valid event. "; + } + } + // are touch events available? + if (tmbUI.UIevents.includes('taps') && !hasTouch && !hasPointer) { + errorMessage += "'taps' is not a valid event. "; + } + break; + // valid keyboard keys + case 'UIkeys': + // accept single argument not as array + if (!(tmbUI.UIkeys instanceof Array)) { + tmbUI.UIkeys = [tmbUI.UIkeys]; + } + // keys must be valid keycodes + for (i = 0; i < tmbUI.UIkeys.length; i++) { + if (!keyboardCodes[tmbUI.UIkeys[i]]) { + errorMessage += "'" + tmbUI.UIkeys[i] + "' is not a valid keyboard code. "; + } + } + break; + case 'upTimestamp': + tmbUI.upTimestamp = 0; + break; + default: + errorMessage += "Invalid parameter '" + key + "'. "; + } + } + } + + // need event "keys" for valid keys + if (tmbUI.UIkeys.length > 0 && !tmbUI.UIevents.includes('keys')) + errorMessage += "Need 'keys' in UIevents for valid keys. "; + // valid keys and elements must be same number + if (tmbUI.UIkeys.length && tmbUI.UIelements.length && tmbUI.UIelements.length < tmbUI.UIkeys.length) + errorMessage += 'Invalid number of UIelements, ' + "more 'keys' than 'UIelements'. "; + // elements must be specified for highlighting + if (tmbUI.UIelements.length === 0 && tmbUI.highlight !== '') errorMessage += 'No elements to highlight. '; + + // error handler + if (errorMessage) { + tmbUI.status = 'error'; + tmbUI.message = errorMessage; + + // fire readyUI event + const readyUI = new CustomEvent('readyUI'); + document.addEventListener('readyUI', tmbUI.onreadyUI, true); + document.dispatchEvent(readyUI); + document.removeEventListener('readyUI', tmbUI.onreadyUI, true); + + return false; + } + + // down event listener + function downResponseHandler(e) { + let r, responseEvent; + + responseEvent = e; //|| window.event; + + // prevent bubbling + if (responseEvent.cancelable) responseEvent.preventDefault(); + responseEvent.stopPropagation(); + + // process input only on first hit (i.e. debounce) + if (downDebounce === false) { + // process keyboard input for keys + if (tmbUI.UIevents.includes('keys') && responseEvent.type === 'keydown') { + r = responseEvent.charCode || responseEvent.keyCode; + + // key must be valid + if (tmbUI.UIkeys.includes(r) || tmbUI.UIkeys.length === 0) { + // determine response identity + tmbUI.response = codeToKey(r); + + // determine the element to highlight + if (tmbUI.highlight !== '' && tmbUI.UIkeys.length > 0) + highlightEl = getID(tmbUI.UIelements[tmbUI.UIkeys.indexOf(r)]); + + // set the debounce flags: + // - down event detected and debounced, so we don't record + // the same down event multiple times, e.g. on autorepeat + // - up event not yet detected + downDebounce = true; + upDebounce = false; + validUpEventTypes = ['keyup']; + } + } + // process mouse and pointer input for clicks + if (tmbUI.UIevents.includes('clicks')) { + if ( + responseEvent.type === 'mousedown' || + (responseEvent.type === 'pointerdown' && responseEvent.pointerType === 'mouse') || + (responseEvent.type === 'MSPointerDown' && responseEvent.pointerType === responseEvent.MSPOINTER_TYPE_MOUSE) + ) { + if (tmbUI.UIelements.length === 0) tmbUI.response = 'document'; + else tmbUI.response = responseEvent.target ? responseEvent.target.id : responseEvent.srcElement.id; + + if (tmbUI.highlight !== '') highlightEl = getID(tmbUI.response); + + downDebounce = true; + upDebounce = false; + validUpEventTypes = ['mouseup', 'pointerup-mouse', 'MSPointerUp-mouse']; + } + } + // process touch and pointer input for taps + if (tmbUI.UIevents.includes('taps')) { + if ( + responseEvent.type === 'touchstart' || + (responseEvent.type === 'pointerdown' && + (responseEvent.pointerType === 'touch' || responseEvent.pointerType === 'pen')) || + (responseEvent.type === 'MSPointerDown' && + (responseEvent.pointerType === responseEvent.MSPOINTER_TYPE_TOUCH || + responseEvent.pointerType === responseEvent.MSPOINTER_TYPE_PEN)) + ) { + if (tmbUI.UIelements.length === 0) tmbUI.response = 'document'; + else tmbUI.response = responseEvent.target ? responseEvent.target.id : responseEvent.srcElement.id; + + if (tmbUI.highlight !== '') highlightEl = getID(tmbUI.response); + + downDebounce = true; + upDebounce = false; + validUpEventTypes = ['touchend', 'pointerup-touch', 'pointerup-pen', 'MSPointerUp-touch', 'MSPointerUp-pen']; + } + } + + // if valid response, compute rt, + // clear timeout and highlight target if required + if (downDebounce === true) { + tmbUI.rt = timeStamp; + timeStamp = now(); + tmbUI.rt = timeStamp - tmbUI.rt; + tmbUI.rt = tmbUI.rt.round(2); + tmbUI.downTimestamp = timeStamp; + + if (tmbUI.timeoutRef) clearTimeout(tmbUI.timeoutRef); + + if (highlightEl) { + // HTML elements + if (['button', 'div', 'img', 'p', 'span'].includes(highlightEl.tagName.toLowerCase())) { + highlightEl.classList.add(tmbUI.highlight); + } + // SVG elements + else if ( + ['circle', 'ellipse', 'image', 'line', 'path', 'polygon', 'polyline', 'rect', 'text'].includes( + highlightEl.tagName.toLowerCase() + ) + ) { + highlightEl.classList.add(tmbUI.highlight); + } + } + } + } + } + + // up event listener + function upResponseHandler(e) { + let responseEvent; + const MSetypes = ['', '', 'touch', 'pen', 'mouse']; + let upType; + + responseEvent = e; // || window.event; + + // prevent bubbling + if (responseEvent.cancelable) responseEvent.preventDefault(); + responseEvent.stopPropagation(); + + // determine the up-event type + upType = responseEvent.type; + if (upType === 'pointerup') upType += '-' + responseEvent.pointerType; + else if (upType === 'MSPointerUp') upType += '-' + MSetypes[responseEvent.pointerType]; + + // process up-event only if preceded by valid down-event of same type + if (downDebounce === true && upDebounce === false && validUpEventTypes.includes(upType)) { + // compute dwell time + tmbUI.upTimestamp = now(); + tmbUI.dwell = tmbUI.upTimestamp - timeStamp; + tmbUI.dwell = tmbUI.dwell.round(2); + + // status returns event type + tmbUI.status = upType; + + // don't allow another up response until + // a valid down response has been made + upDebounce = true; + + removeHandlers(); + returnHandler(); + } + } + + // installs appropriate listeners depending on input type + function installHandlers() { + // listen to keyboard events + if (tmbUI.UIevents.includes('keys')) { + document.addEventListener('keydown', downResponseHandler, true); + document.addEventListener('keyup', upResponseHandler, true); + } + // listen to mouse events (mouse, touchpad and pen/stylus) + if (tmbUI.UIevents.includes('clicks')) { + if (tmbUI.UIelements.length === 0) { + if (window.PointerEvent) { + document.body.addEventListener('pointerdown', downResponseHandler, true); + document.body.addEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent) // IE10 + { + document.body.addEventListener('MSPointerDown', downResponseHandler, true); + document.body.addEventListener('MSPointerUp', upResponseHandler, true); + } else { + document.addEventListener('mousedown', downResponseHandler, true); + document.addEventListener('mouseup', upResponseHandler, true); + } + } else { + // we install the up handler on the document, so that an up + // event can be detected even on an element different from the + // target of the preceding down event + document.addEventListener('mouseup', upResponseHandler, true); + if (window.PointerEvent) document.addEventListener('pointerup', upResponseHandler, true); + else if (window.MSPointerEvent) document.addEventListener('MSPointerUp', upResponseHandler, true); // IE10 + + for (i = 0; i < tmbUI.UIelements.length; i++) { + if (window.PointerEvent) { + getID(tmbUI.UIelements[i]).addEventListener('pointerdown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent) // IE10 + { + getID(tmbUI.UIelements[i]).addEventListener('MSPointerDown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('MSPointerUp', upResponseHandler, true); + } else { + getID(tmbUI.UIelements[i]).addEventListener('mousedown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('mouseup', upResponseHandler, true); + } + } + } + } + // listen to touch events + if (tmbUI.UIevents.includes('taps')) { + if (tmbUI.UIelements.length === 0) { + if (window.PointerEvent && !tmbUI.UIevents.includes('clicks')) { + document.addEventListener('pointerdown', downResponseHandler, true); + document.addEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent && !tmbUI.UIevents.includes('clicks')) // IE10 + { + document.addEventListener('MSPointerDown', downResponseHandler, true); + document.addEventListener('MSPointerUp', upResponseHandler, true); + } else if (hasTouch && !hasPointer) { + document.addEventListener('touchstart', downResponseHandler, true); + document.addEventListener('touchend', upResponseHandler, true); + } + } else { + if (window.PointerEvent) document.addEventListener('pointerup', upResponseHandler, true); + else if (window.MSPointerEvent) document.addEventListener('MSPointerUp', upResponseHandler, true); + if (hasTouch) document.addEventListener('touchend', upResponseHandler, true); + + for (i = 0; i < tmbUI.UIelements.length; i++) { + if (window.PointerEvent && !tmbUI.UIevents.includes('clicks')) { + getID(tmbUI.UIelements[i]).addEventListener('pointerdown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent && !tmbUI.UIevents.includes('clicks')) // IE10 + { + getID(tmbUI.UIelements[i]).addEventListener('MSPointerDown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('MSPointerUp', upResponseHandler, true); + } else if (hasTouch && !hasPointer) { + getID(tmbUI.UIelements[i]).addEventListener('touchstart', downResponseHandler, true); + getID(tmbUI.UIelements[i]).addEventListener('touchend', upResponseHandler, true); + } + } + } + } + } + + // removes installed listeners + function removeHandlers() { + if (tmbUI.UIevents.includes('keys')) { + document.removeEventListener('keydown', downResponseHandler, true); + document.removeEventListener('keyup', upResponseHandler, true); + } + if (tmbUI.UIevents.includes('clicks')) { + if (tmbUI.UIelements.length === 0) { + if (window.PointerEvent) { + document.body.removeEventListener('pointerdown', downResponseHandler, true); + document.body.removeEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent) // IE10 + { + document.body.removeEventListener('MSPointerDown', downResponseHandler, true); + document.body.removeEventListener('MSPointerUp', upResponseHandler, true); + } else { + document.removeEventListener('mousedown', downResponseHandler, true); + document.removeEventListener('mouseup', upResponseHandler, true); + } + } else { + // remove up handlers on document body + if (window.PointerEvent) document.removeEventListener('pointerup', upResponseHandler, true); + else if (window.MSPointerEvent) document.removeEventListener('MSPointerUp', upResponseHandler, true); + document.removeEventListener('mouseup', upResponseHandler, true); + + for (i = 0; i < tmbUI.UIelements.length; i++) { + if (window.PointerEvent) { + getID(tmbUI.UIelements[i]).removeEventListener('pointerdown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent) // IE10 + { + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerDown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerUp', upResponseHandler, true); + } else { + getID(tmbUI.UIelements[i]).removeEventListener('mousedown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('mouseup', upResponseHandler, true); + } + } + } + } + if (tmbUI.UIevents.includes('taps')) { + if (tmbUI.UIelements.length === 0) { + if (window.PointerEvent && !tmbUI.UIevents.includes('clicks')) { + document.removeEventListener('pointerdown', downResponseHandler, true); + document.removeEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent && !tmbUI.UIevents.includes('clicks')) // IE10 + { + document.removeEventListener('MSPointerDown', downResponseHandler, true); + document.removeEventListener('MSPointerUp', upResponseHandler, true); + } else if (hasTouch && !hasPointer) { + document.removeEventListener('touchstart', downResponseHandler, true); + document.removeEventListener('touchend', upResponseHandler, true); + } + } else { + if (window.PointerEvent) document.removeEventListener('pointerup', upResponseHandler, true); + else if (window.MSPointerEvent) document.removeEventListener('MSPointerUp', upResponseHandler, true); + if (hasTouch) document.removeEventListener('touchend', upResponseHandler, true); + + for (i = 0; i < tmbUI.UIelements.length; i++) { + if (window.PointerEvent && !tmbUI.UIevents.includes('clicks')) { + getID(tmbUI.UIelements[i]).removeEventListener('pointerdown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('pointerup', upResponseHandler, true); + } else if (window.MSPointerEvent && !tmbUI.UIevents.includes('clicks')) // IE10 + { + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerDown', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerUp', upResponseHandler, true); + } else if (hasTouch && !hasPointer) { + getID(tmbUI.UIelements[i]).removeEventListener('touchstart', downResponseHandler, true); + getID(tmbUI.UIelements[i]).removeEventListener('touchend', upResponseHandler, true); + } + } + } + } + } + + function returnHandler() { + // clear the timeout trap + if (tmbUI.timeoutRef) clearTimeout(tmbUI.timeoutRef); + + // if we have highlighted something, wait to switch it off + // then fire readyUI event + if (highlightEl) { + setTimeout(function () { + if (['button', 'div', 'img', 'p', 'span'].includes(highlightEl.tagName.toLowerCase())) { + highlightEl.classList.remove(tmbUI.highlight); + } else if ( + ['circle', 'ellipse', 'image', 'line', 'path', 'polygon', 'polyline', 'rect', 'text'].includes( + highlightEl.tagName.toLowerCase() + ) + ) { + highlightEl.classList.remove(tmbUI.highlight); + } + + // zero timeoutRef, so we can listen to a new response + tmbUI.timeoutRef = 0; + + // fire readyUI event + const readyUI = new CustomEvent('readyUI'); + document.addEventListener('readyUI', tmbUI.onreadyUI, true); + document.dispatchEvent(readyUI); + document.removeEventListener('readyUI', tmbUI.onreadyUI, true); + }, 250); + } else { + // zero timeoutRef, so we can listen to a new response + tmbUI.timeoutRef = 0; + + const readyUI = new CustomEvent('readyUI'); + document.addEventListener('readyUI', tmbUI.onreadyUI, true); + document.dispatchEvent(readyUI); + document.removeEventListener('readyUI', tmbUI.onreadyUI, true); + } + } + + // set a timeout trap + // N.B. we start listening for a new response only when timeoutRef === 0 + tmbUI.timeoutRef = setTimeout(function () { + tmbUI.status = 'timeout'; + tmbUI.message += 'Timeout: no response in ' + tmbUI.timeout + ' ms.'; + removeHandlers(); + returnHandler(); + }, tmbUI.timeout); + + // finally, start listening! + installHandlers(); + + return false; +}; + +function mb_strwidth(s) { + // Returns the length of string 's', taking into account + // full- and half-width characters, e.g. in Asian and Latin alphabets + // Equivalent to homonymous PHP function + + let l = 0; + const chars = Array.from(s); + for (const char of chars) { + const c = char.codePointAt(0); + if (c === undefined) continue; + + if (0x1100 <= c && c <= 0x115f) { + l += 2; + } else if (0x11a3 <= c && c <= 0x11a7) { + l += 2; + } else if (0x11fa <= c && c <= 0x11ff) { + l += 2; + } else if (0x2329 <= c && c <= 0x232a) { + l += 2; + } else if (0x2e80 <= c && c <= 0x2e99) { + l += 2; + } else if (0x2e9b <= c && c <= 0x2ef3) { + l += 2; + } else if (0x2f00 <= c && c <= 0x2fd5) { + l += 2; + } else if (0x2ff0 <= c && c <= 0x2ffb) { + l += 2; + } else if (0x3000 <= c && c <= 0x303e) { + l += 2; + } else if (0x3041 <= c && c <= 0x3096) { + l += 2; + } else if (0x3099 <= c && c <= 0x30ff) { + l += 2; + } else if (0x3105 <= c && c <= 0x312d) { + l += 2; + } else if (0x3131 <= c && c <= 0x318e) { + l += 2; + } else if (0x3190 <= c && c <= 0x31ba) { + l += 2; + } else if (0x31c0 <= c && c <= 0x31e3) { + l += 2; + } else if (0x31f0 <= c && c <= 0x321e) { + l += 2; + } else if (0x3220 <= c && c <= 0x3247) { + l += 2; + } else if (0x3250 <= c && c <= 0x32fe) { + l += 2; + } else if (0x3300 <= c && c <= 0x4dbf) { + l += 2; + } else if (0x4e00 <= c && c <= 0xa48c) { + l += 2; + } else if (0xa490 <= c && c <= 0xa4c6) { + l += 2; + } else if (0xa960 <= c && c <= 0xa97c) { + l += 2; + } else if (0xac00 <= c && c <= 0xd7a3) { + l += 2; + } else if (0xd7b0 <= c && c <= 0xd7c6) { + l += 2; + } else if (0xd7cb <= c && c <= 0xd7fb) { + l += 2; + } else if (0xf900 <= c && c <= 0xfaff) { + l += 2; + } else if (0xfe10 <= c && c <= 0xfe19) { + l += 2; + } else if (0xfe30 <= c && c <= 0xfe52) { + l += 2; + } else if (0xfe54 <= c && c <= 0xfe66) { + l += 2; + } else if (0xfe68 <= c && c <= 0xfe6b) { + l += 2; + } else if (0xff01 <= c && c <= 0xff60) { + l += 2; + } else if (0xffe0 <= c && c <= 0xffe6) { + l += 2; + } else if (0x1b000 <= c && c <= 0x1b001) { + l += 2; + } else if (0x1f200 <= c && c <= 0x1f202) { + l += 2; + } else if (0x1f210 <= c && c <= 0x1f23a) { + l += 2; + } else if (0x1f240 <= c && c <= 0x1f248) { + l += 2; + } else if (0x1f250 <= c && c <= 0x1f251) { + l += 2; + } else if (0x20000 <= c && c <= 0x2fffd) { + l += 2; + } else if (0x30000 <= c && c <= 0x3fffd) { + l += 2; + } else { + l += 1; + } + } + return l; +} + +function showAlert(alertMessage, alertButtonText, action, fontSize, timeout, useSpaceBar, hideCursor) { + let alertBox, alertButton, alertContent, alertSpaceBar, bodyCursorStyle, buttonCursorStyle; + + // save the current body cursor style and set the required one + bodyCursorStyle = window.getComputedStyle(document.body)['cursor']; + if (!hideCursor && bodyCursorStyle === 'none') document.body.style.cursor = 'auto'; + else if (hideCursor && bodyCursorStyle !== 'none') document.body.style.cursor = 'none'; + + // create the container div if necessary + if (!(alertBox = getID('alertBox'))) { + // set sizes to inherit parent's + alertBox = document.createElement('div'); + alertBox.id = 'alertBox'; + alertBox.style.margin = 'auto'; + alertBox.style.height = 'inherit'; //document.body.clientHeight+'px'; + alertBox.style.width = 'inherit'; //document.body.clientWidth+'px'; + alertBox.style.verticalAlign = 'middle'; + alertBox.style.textAlign = 'center'; + document.body.appendChild(alertBox); + } + + // set the required font size + if (fontSize) alertBox.style.fontSize = fontSize; + + // create the message span if necessary, + // then set the message to display + if (!(alertContent = getID('alertContent'))) { + alertContent = document.createElement('span'); + alertContent.id = 'alertContent'; + alertContent.style.margin = 'auto'; + alertContent.style.display = 'inline'; + alertBox.appendChild(alertContent); + } + alertContent.innerHTML = alertMessage; + + // create the button if necessary + if (!(alertButton = getID('alertButton'))) { + alertButton = document.createElement('button'); + alertButton.id = 'alertButton'; + alertButton.className = 'button'; + alertButton.style.margin = 'auto'; + alertButton.style.maxWidth = '100%'; + alertButton.style.lineHeight = '1.5em'; + alertButton.style.textAlign = 'center'; + alertButton.style.fontSize = '1.2em'; + alertButton.style.padding = '0 1ch'; + alertButton.style.display = 'inline'; + alertBox.appendChild(alertButton); + } + // if args contain button text, + // show the button and set the required action for it, + // otherwise hide the button + if (alertButtonText && !useSpaceBar && !timeout) { + // save the current button cursor style and set the required one + buttonCursorStyle = window.getComputedStyle(alertButton)['cursor']; + if (!hideCursor && buttonCursorStyle === 'none') alertButton.style.cursor = 'pointer'; + else if (hideCursor && buttonCursorStyle !== 'none') alertButton.style.cursor = 'none'; + + alertButton.innerHTML = alertButtonText; + alertButton.onclick = function () { + document.body.style.cursor = bodyCursorStyle; + alertButton.style.cursor = buttonCursorStyle; + action(); + }; + alertButton.style.display = 'inline'; + } else alertButton.style.display = 'none'; + + // create the spaceBar span if necessary + if (!(alertSpaceBar = getID('alertSpaceBar'))) { + alertSpaceBar = document.createElement('span'); + alertSpaceBar.id = 'alertSpaceBar'; + alertSpaceBar.style.margin = 'auto'; + alertSpaceBar.style.display = 'inline'; + //alertSpaceBar.style.fontSize = '20px'; + alertBox.appendChild(alertSpaceBar); + } + // if args contain 'useSpaceBar', + // show the spaceBar span and set the required key listener, + // otherwise hide the span + if (useSpaceBar && !timeout) { + // alertSpaceBar.style.width = (mb_strwidth(useSpaceBar) + 3) + 'ch'; + alertSpaceBar.innerHTML = useSpaceBar; + alertSpaceBar.style.display = 'inline'; + + function spaceBarHandler(e) { + const key = e.charCode || e.keyCode; + if (key === 32) { + e.preventDefault(); + e.stopPropagation(); + if (e.type === 'keydown') { + document.removeEventListener('keydown', spaceBarHandler, true); + } else { + document.removeEventListener('keyup', spaceBarHandler, true); + document.body.style.cursor = bodyCursorStyle; + action(); + } + } + } + + document.addEventListener('keydown', spaceBarHandler, true); + document.addEventListener('keyup', spaceBarHandler, true); + } else alertSpaceBar.style.display = 'none'; + + // if args contain a timeout, + // trigger the action automatically when timeout expires + if (timeout) + setTimeout(function () { + document.body.style.cursor = bodyCursorStyle; + action(); + }, timeout); + + // hide everything else except this + showFrame(null); + alertBox.style.display = 'table-cell'; +} + +function setBodyScale(width, height) { + // Fail silently if visualViewport is not supported + if (!('visualViewport' in window)) return; + + // If the dimensions of the desired bounding box aren't specified, + // throw an error. + if (!width || !height) throw new TypeError('setBodyScale: dimensions not specified'); + + // Check if a viewport meta tag exists: if not, we create one. + let viewportMeta = document.getElementsByTagName('meta')['viewport']; + if (!viewportMeta) { + viewportMeta = document.createElement('meta'); + viewportMeta.name = 'viewport'; + viewportMeta.id = 'viewport'; + document.getElementsByTagName('head')[0].appendChild(viewportMeta); + } + + // Initialize the viewport to its ideal dimensions, in case it isn't + viewportMeta.content = 'width=device-width, initial-scale=1, viewport-fit=contain'; + + // initialize the body + const bodyStyle = document.body.style; + bodyStyle.position = 'absolute'; + bodyStyle.width = visualViewport.width + 'px'; + bodyStyle.left = visualViewport.width / 2 + 'px'; + bodyStyle.marginLeft = -visualViewport.width / 2 + 'px'; + bodyStyle.height = visualViewport.height + 'px'; + bodyStyle.top = visualViewport.height / 2 + 'px'; + bodyStyle.marginTop = -visualViewport.height / 2 + 'px'; + bodyStyle.overflow = 'hidden'; + + function bodyScaleHandler() { + // reset the body before resizing + bodyStyle.width = visualViewport.width + 'px'; + bodyStyle.height = visualViewport.height + 'px'; + bodyStyle.left = visualViewport.width / 2 + 'px'; + bodyStyle.top = visualViewport.height / 2 + 'px'; + bodyStyle.marginLeft = -visualViewport.width / 2 + 'px'; + bodyStyle.marginTop = -visualViewport.height / 2 + 'px'; + bodyStyle.overflow = 'hidden'; + bodyStyle.transform = 'scale(1)'; + + // if the body's width is smaller than the desired size, set it to + // the desired size and re-center + if (visualViewport.width < width) { + bodyStyle.width = width + 'px'; + bodyStyle.marginLeft = -width / 2 + 'px'; + } + // if the body's height is smaller than the desired size, set it to + // the desired size and re-center + if (visualViewport.height < height) { + bodyStyle.height = height + 'px'; + bodyStyle.marginTop = -height / 2 + 'px'; + } + // force reflow + document.body.offsetHeight; + + // if the viewport is smaller than the desired bounding box + // (vertically, or horizontally or both), compute the necessary + // scaling and apply to the body + if (visualViewport.width * visualViewport.scale < width || visualViewport.height * visualViewport.scale < height) { + const widthScale = (visualViewport.width * visualViewport.scale) / width; + const heightScale = (visualViewport.height * visualViewport.scale) / height; + + const scale = Math.min(widthScale, heightScale); + bodyStyle.transform = 'scale(' + scale + ')'; + } + document.body.offsetHeight; + + // recenter by adding viewport offset + bodyStyle.left = parseFloat(bodyStyle.left) + visualViewport.pageLeft + 'px'; + bodyStyle.top = parseFloat(bodyStyle.top) + visualViewport.pageTop + 'px'; + document.body.offsetHeight; + } + + // We attach listeners for the resize event to the window and + // to the viewport + // (orientationchange is added for browsers that don't fire a resize + // event on orientation change) + // the resize handler is debounced, so multiple (near-)simultaneous + // events only trigger it once + const resizeHandler = debounce(bodyScaleHandler, 1000); + window.addEventListener('resize', resizeHandler); + visualViewport.addEventListener('resize', resizeHandler); + if ('orientation' in screen) screen.orientation.addEventListener('change', resizeHandler); + else if ('onorientationchange' in window) window.addEventListener('orientationchange', resizeHandler); + + // on first call, set the desired scale + bodyScaleHandler(); +} + +function deviceScan() { + let scan = {}, + userAgent; + + userAgent = navigator.userAgent || navigator.vendor || window.opera; + scan.screenW = screen.width > screen.height ? screen.width : screen.height; + scan.screenH = screen.width < screen.height ? screen.width : screen.height; + scan.touch = + 'ontouchend' in window || + ('maxTouchPoints' in navigator && navigator.maxTouchPoints > 0) || + ('msMaxTouchPoints' in navigator && navigator.msMaxTouchPoints > 0) || + (window.matchMedia && window.matchMedia('(any-pointer: coarse)').matches) || + false; + scan.OS = /windows phone/i.test(userAgent) + ? 'WindowsPhone' + : /Kindle Fire|Silk|KFAPWA|KFSOWI|KFJWA|KFJWI|KFAPWI|KFOT|KFTT|KFTHWI|KFTHWA|KFASWI|KFTBWI|KFMEWI|KFFOWI|KFSAWA|KFSAWI|KFARWI/i.test( + userAgent + ) + ? 'KindleFire' + : /BlackBerry|BB10|PlayBook/i.test(userAgent) + ? 'BlackBerry' + : /MeeGO/i.test(userAgent) + ? 'MeeGO' + : /Bada/i.test(userAgent) + ? 'Bada' + : /Tizen/i.test(userAgent) + ? 'Tizen' + : /android/i.test(userAgent) + ? 'Android' + : /iPad|iPhone|iPod/i.test(userAgent) && !window.MSStream + ? 'iOS' + : /Win/i.test(userAgent) + ? 'Windows' + : /Mac/i.test(userAgent) + ? 'MacOS' + : /Linux|X11/i.test(userAgent) + ? 'Unix' + : 'unknown'; + scan.UTCoffset = new Date().getTimezoneOffset(); + + return scan; +} + +function parseQuery(queryStr) { + const query = {}; + const pairs = (queryStr[0] === '?' ? queryStr.substring(1) : queryStr).split('&'); + if (pairs[0] !== '') { + for (let i = 0; i < pairs.length; i++) { + const pair = pairs[i].split('='); + query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ''); + } + } + return query; +} diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/TestMyBrain.12.18.min.js b/lib/interactive/TMB_FLANKER_ATTENTION/TestMyBrain.12.18.min.js new file mode 100644 index 0000000..6616145 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/TestMyBrain.12.18.min.js @@ -0,0 +1,4129 @@ +/* eslint-disable */ + +/* + Copyright 2022 by the Many Brains Project, Inc. + =============================================== + + This code is made available under a GNU Lesser General Public License 3.0 + (LGPLv3). + https://www.gnu.org/licenses/lgpl-3.0.html. + + The following third party libraries and code are included in TestMyBrain.js + for convenience (copyright and licenses, where applicable, are by their + respective authors and can be found in the code or in the attached web + links): + + - rawdeflate.js at + https://github.com/dankogai/js-deflate + - rawinflate.js at + https://github.com/dankogai/js-deflate + - json2.js at + https://github.com/douglascrockford/JSON-js + - FileSaver.js at + https://github.com/ChenWenBrian/FileSaver.js + - Blob.js at + https://github.com/eligrey/Blob.js + - seedrandom.js at + https://github.com/davidbau/seedrandom/tree/master + - setImmediate.js at + https://github.com/YuzuJS/setImmediate + - requestAnimationFrame and cancelAnimationFrame at + https://github.com/darius/requestAnimationFrame + - atob and btoa at + https://github.com/davidchambers/Base64.js + - Object.create at + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create + - Object.keys at + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys + - Function.prototype.bind at + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind + - Array.isArray at + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray + - all standard HTML5 array prototype methods at + https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array + + */ + +function getID(e, t) { + return t ? (tmbObjs.elements[e] = tmbObjs.elements[e] || document.getElementById(e)) : document.getElementById(e); +} +function showFrame() { + var e, + t, + n = []; + if (1 === arguments.length && arguments[0] instanceof Array) n = arguments[0]; + else for (t = 0; t < arguments.length; t++) n[t] = arguments[t]; + for ( + tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; + t--; + ) + ((e = n.indexOf(tmbObjs.frames[t].id) > -1 ? 'block' : 'none'), + tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); +} +function showFrameClass() { + var e, + t, + n = []; + if (1 === arguments.length && arguments[0] instanceof Array) n = arguments[0]; + else for (t = 0; t < arguments.length; t++) n[t] = arguments[t]; + for ( + tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; + t--; + ) + ((e = n.indexOf(tmbObjs.frames[t].className) > -1 ? 'block' : 'none'), + tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); +} +function showSlide(e) { + tmbObjs.slides.length || (tmbObjs.slides = document.getElementsByClassName('slide')); + for (var t, n = tmbObjs.slides, r = tmbObjs.slides.length; r--; ) + ((t = n[r].id === e ? 'block' : 'none'), n[r].style.display !== t && (n[r].style.display = t)); +} +function showAlert(e, t, n, r, o) { + var i, a, s; + ((i = getID('alertBox', 1)) || + ((i = document.createElement('div')), + (i.id = 'alertBox'), + (i.style.margin = 'auto'), + (i.style.padding = '5%'), + (i.style.height = '100vh'), + (i.style.width = '100vw'), + (i.style.verticalAlign = 'middle'), + (i.style.textAlign = 'center'), + document.body.appendChild(i), + getID('alertBox', 1)), + r && (i.style.fontSize = r), + (a = getID('alertContent')) || ((a = document.createElement('span')), (a.id = 'alertContent'), i.appendChild(a)), + (a.innerHTML = e), + (s = getID('alertButton')) || + ((s = document.createElement('button')), + (s.id = 'alertButton'), + (s.className = 'button'), + (s.style.margin = '0 auto'), + (s.style.lineHeight = '1.5em'), + (s.style.textAlign = 'center'), + (s.style.fontSize = '1.2em'), + i.appendChild(s)), + t && !o + ? ((s.style.width = t.length + 'ch'), + (s.innerHTML = t), + (s.onclick = n), + (s.style.display = 'block'), + showCursor('document.body')) + : (s.style.display = 'none'), + o && setTimeout(n, o), + showFrame(null), + (i.style.display = 'table-cell')); +} +function injectScript(e, t, n) { + var r, + o = document.head || document.getElementsByTagName('head')[0]; + (t && null !== (r = document.getElementById(t)) && r.parentNode.removeChild(r), + (r = document.createElement('script')), + (r.type = 'text/javascript'), + t && (r.id = t), + n && (r.addEventListener ? r.addEventListener('load', n, !0) : r.readyState && (r.onreadystatechange = n)), + (r.src = e), + o.appendChild(r)); +} +function fixMobileOrientation(e) { + function t() { + var t; + ('orientation' in window + ? (t = 90 === Math.abs(window.orientation) ? 'landscape' : 'portrait') + : ((t = screen.orientation ? screen.orientation.type : screen.mozOrientation || screen.msOrientation), + (t = ~t.indexOf('landscape') ? 'landscape' : 'portrait')), + t !== e && alert(r)); + } + if ('orientation' in window || 'orientation' in screen || 'mozOrientation' in screen || 'msOrientation' in screen) { + if ('portrait' !== e && 'landscape' !== e) + throw new TypeError("fixMobileOrientation: specify either 'portrait' or 'landscape'"); + var n = 'portrait' === e ? 'upright' : 'sideways', + r = 'Please keep your device in ' + e + ' mode (' + n + ') for this test!'; + ('onorientationchange' in window + ? window.addEventListener('orientationchange', t, !0) + : 'orientation' in screen + ? screen.orientation.addEventListener('change', t, !0) + : 'onmsorientationchange' in screen + ? screen.addEventListener('MSOrientationChange', t, !0) + : 'onmozorientationchange' in screen && screen.addEventListener('mozorientationchange', t, !0), + t()); + } +} +function setMobileViewportScale(e, t) { + function n() { + var n, o, i, a, s, u, l, c; + ((r.content = 'width=device-width, initial-scale=1'), + 'orientation' in window + ? (i = 90 === Math.abs(window.orientation) ? 'landscape' : 'portrait') + : ((i = screen.orientation ? screen.orientation.type : screen.mozOrientation || screen.msOrientation), + (i = ~i.indexOf('landscape') ? 'landscape' : 'portrait')), + 'portrait' === i + ? ((n = Math.min(screen.width, screen.height)), (o = Math.max(screen.width, screen.height))) + : 'landscape' === i && + ((n = Math.max(screen.width, screen.height)), (o = Math.min(screen.width, screen.height))), + (a = n / e), + (s = o / t), + s > a ? ((u = a), (l = e)) : ((u = s), (l = n / u)), + (c = 'width=' + Math.round(l)), + (c += ', initial-scale=' + u), + (c += ', maximum-scale=' + u), + (r.content = c)); + } + if ('orientation' in window || 'orientation' in screen || 'mozOrientation' in screen || 'msOrientation' in screen) { + var r; + if (!e || !t) throw new TypeError('setMobileViewportScale: dimensions not specified'); + ((r = document.getElementsByTagName('meta').viewport), + r || + ((r = document.createElement('meta')), + (r.name = 'viewport'), + (r.id = 'viewport'), + document.getElementsByTagName('head')[0].appendChild(r)), + n(), + 'onorientationchange' in window + ? window.addEventListener('orientationchange', n, !0) + : 'orientation' in screen + ? screen.orientation.addEventListener('change', n, !0) + : 'onmsorientationchange' in screen + ? screen.addEventListener('MSOrientationChange', n, !0) + : 'onmozorientationchange' in screen && screen.addEventListener('mozorientationchange', n, !0)); + } +} +function showCursor(e) { + 'document.body' === e ? (document.body.style.cursor = 'auto') : (getID(e).style.cursor = 'auto'); +} +function hideCursor(e) { + 'document.body' === e ? (document.body.style.cursor = 'none') : (getID(e).style.cursor = 'none'); +} +function tmbSubmitToServer(e, t, n, r) { + var o, i, a, s; + ((r = r ? r : '/run'), + document.createElement && + (o = document.createElement('FORM')) && + (i = document.createElement('INPUT')) && + (a = document.createElement('INPUT')) && + (s = document.createElement('INPUT')) && + ((o.name = 'form'), + (o.method = 'post'), + (o.action = r), + (o.onsubmit = function () { + return !1; + }), + (i.type = 'hidden'), + (i.name = 'data'), + (i.value = JSON.stringify(e)), + o.appendChild(i), + (a.type = 'hidden'), + (a.name = 'score'), + (a.value = t), + o.appendChild(a), + (s.type = 'hidden'), + (s.name = 'outcomes'), + (s.value = JSON.stringify(n)), + o.appendChild(s), + document.body.appendChild(o), + o.submit())); +} +function tmbSubmitToURL(e, t) { + var n; + if (null === t || 'object' != typeof t) throw new TypeError("tmbSubmitToURL: 'tmbData' is not an object."); + if (document.createElement && (n = document.createElement('FORM'))) { + ((n.name = 'form'), + (n.method = 'post'), + (n.action = e), + (n.onsubmit = function () { + return !1; + })); + for (var r in t) + if (t.hasOwnProperty(r)) { + var o = document.createElement('INPUT'); + ((o.type = 'hidden'), (o.name = r), (o.value = t[r]), n.appendChild(o)); + } + (document.body.appendChild(n), n.submit(), document.body.removeChild(n)); + } +} +function tmbSubmitToFile(e, t, n) { + for (var r = [], o = '', i = '', a = !0, s = 0; s < e.length; s++) + for (var u in e[s]) e[s].hasOwnProperty(u) && -1 === r.indexOf(u) && (r.push(u), (i += '"' + u + '",')); + for (i = i.substring(0, i.length - 1), i += '\r\n', s = 0; s < e.length; s++) { + o = ''; + for (var l = 0; l < r.length; l++) + ('undefined' != typeof e[s][r[l]] && + null !== e[s][r[l]] && + (o += + e[s][r[l]] instanceof Object + ? '"' + JSON.stringify(e[s][r[l]]).replace(/\"/g, '""') + '"' + : '"' + e[s][r[l]] + '"'), + (o += ',')); + ((o = o.substring(0, o.length - 1)), (i += o + '\r\n')); + } + if (n) { + a = !saveTextAs(i, t); + try { + a ? alert('Could not save the data!!') : alert('Data have been saved in ' + t); + } catch (c) { + a ? console.log('Could not save the data!!') : console.log('Data have been saved in ' + t); + } + } + try { + var d = window.open('', '', 'width=500,height=500,menubar=yes,toolbar=yes,scrollbars=yes,status=yes,resizable=yes'); + if (null === d || 'undefined' == typeof d) throw new TypeError(); + } catch (c) { + (alert('Could not open data window. Try disabling popup blockers before closing this.'), + (d = window.open( + '', + '', + 'width=500,height=500,menubar=yes,toolbar=yes,scrollbars=yes,status=yes,resizable=yes' + ))); + } finally { + if (null === d || 'undefined' == typeof d) alert('Tried again and failed opening data window.'); + else { + d.document.write('
' + i + '

'); + var f = d.document.createElement('INPUT'); + ((f.type = 'text'), (f.value = t), d.document.body.appendChild(f)); + var m = d.document.createElement('BUTTON'), + p = d.document.createTextNode('Save'); + (m.appendChild(p), + d.document.body.appendChild(m), + (d.onbeforeunload = function () { + return a ? 'Have you saved the data?' : void 0; + }), + (m.onclick = function () { + ((t = f.value), (a = !saveTextAs(i, t)), a && alert('Could not save the data!!')); + }), + (d.document.title = t), + d.document.close()); + } + } +} +function logResults(e, t) { + if (e && e[0]) { + var n, + r = '', + o = e.length; + if ('cum' === t || ('cum' !== t && 1 === o)) { + for (n in e[0]) e[0].hasOwnProperty(n) && (r += n + ' '); + (console.log(r), (r = '')); + } + for (var i = t && 'inc' !== t ? 0 : o - 1; o > i; i++) { + for (n in e[i]) e[i].hasOwnProperty(n) && (r += e[i][n] + ' '); + r += '\n'; + } + console.log(r); + } +} +function getUrlParameters(e, t, n) { + var r, o, i, a; + if (((r = t.length ? t : window.location.search), !r)) return !1; + ((o = r.split('?')[1].split('&')), (a = !0)); + for (var s = 0; s < o.length; s++) { + if (((i = o[s].split('=')), i[0] === e)) return ((a = !0), n ? decodeURIComponent(i[1]) : i[1]); + a = !1; + } + return a ? void 0 : !1; +} +function urlEncode(e) { + return ( + (e = (e + '').toString()), + encodeURIComponent(e) + .replace(/!/g, '%21') + .replace(/'/g, '%27') + .replace(/\(/g, '%28') + .replace(/\)/g, '%29') + .replace(/\*/g, '%2A') + .replace(/%20/g, '+') + ); +} +function httpBuildQuery(e, t, n) { + var r, + o, + i = [], + a = this, + s = function (e, t, n) { + var r, + o = []; + if ((t === !0 ? (t = '1') : t === !1 && (t = '0'), null !== t)) { + if ('object' == typeof t) { + for (r in t) null !== t[r] && t.hasOwnProperty(r) && o.push(s(e + '[' + r + ']', t[r], n)); + return o.join(n); + } + if ('function' != typeof t) return a.urlEncode(e) + '=' + a.urlEncode(t); + throw new Error('There was an error processing for http_build_query().'); + } + return ''; + }; + n || (n = '&'); + for (o in e) + if (e.hasOwnProperty(o)) { + ((r = e[o]), t && !isNaN(o) && (o = String(t) + o)); + var u = s(o, r, n); + '' !== u && i.push(u); + } + return i.join(n); +} +function ajaxRequest(e) { + var t, + n, + r, + o, + i, + a = { + url: '.', + method: 'GET', + data: null, + async: !0, + timeout: 1e4, + user: null, + pass: null, + getHeaders: !1, + sendCredentials: !1, + callback: null + }; + (null !== e && + 'object' == typeof e && + (e.hasOwnProperty('url') && (a.url = e.url), + e.hasOwnProperty('method') && (a.method = e.method.toUpperCase()), + e.hasOwnProperty('data') && (a.data = e.data), + e.hasOwnProperty('async') && (a.async = e.async), + e.hasOwnProperty('timeout') && (a.timeout = e.timeout), + e.hasOwnProperty('user') && (a.user = e.user), + e.hasOwnProperty('pass') && (a.pass = e.pass), + e.hasOwnProperty('getHeaders') && (a.getHeaders = e.getHeaders), + e.hasOwnProperty('sendCredentials') && (a.sendCredentials = e.sendCredentials), + e.hasOwnProperty('callback') && (a.callback = e.callback)), + null !== a.data && ((r = httpBuildQuery(a.data)), 'GET' === a.method && (a.url += '?' + r)), + (t = new XMLHttpRequest())); + try { + (t.open(a.method, a.url, a.async), + a.async && + (void 0 !== t.timeout && + void 0 !== t.ontimeout && + ((t.timeout = a.timeout), + (t.ontimeout = function () { + console.log('ajaxRequest timed out.'); + })), + void 0 !== t.withCredentials && a.sendCredentials && (t.withCredentials = !0), + (t.onreadystatechange = function () { + if ( + (a.getHeaders && + 2 === t.readyState && + ((o = t.getAllResponseHeaders()), + console.log('Request Status: ' + t.status + ' ' + t.statusText), + o && console.log(o)), + 4 === t.readyState) + ) + if (t.status >= 200 && t.status < 400) { + if (((i = void 0 !== t.response ? t.response : t.responseText), null === a.callback)) return i; + a.callback(i); + } else { + if (((n = 'Error in ajaxRequest: ' + t.status + ' ' + t.statusText), console.log(n), null === a.callback)) + return null; + a.callback(null); + } + })), + t.setRequestHeader('X-Requested-With', 'XMLHttpRequest'), + a.user && a.pass && t.setRequestHeader('Authorization', 'Basic ' + btoa(a.user + ':' + a.pass)), + 'POST' === a.method && t.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')); + } catch (s) { + if (((n = "Error in ajaxRequest 'open': " + s.message), console.log(n), null === a.callback)) return null; + a.callback(null); + } + try { + 'POST' === a.method ? t.send(r) : t.send(); + } catch (s) { + if (((n = "Error in ajaxRequest 'send': " + s.message), console.log(n), null === a.callback)) return null; + a.callback(null); + } + if (!a.async) + if ( + (a.getHeaders && + ((o = t.getAllResponseHeaders()), + console.log('Request Status: ' + t.status + ' ' + t.statusText), + o && console.log(o)), + t.status >= 200 && t.status < 400) + ) { + if (((i = void 0 !== t.response ? t.response : t.responseText), null === a.callback)) return i; + a.callback(i); + } else { + if (((n = 'Error in ajaxRequest: ' + t.status + ' ' + t.statusText), console.log(n), null === a.callback)) + return null; + a.callback(null); + } +} +function imagePreLoad(e, t) { + var n = e.slice(), + r = 0, + o = { progress: !0, pipeline: !0, copy: !0, callBack: null }; + (void 0 === tmbObjs.images && (tmbObjs.images = []), + null !== t && + 'object' == typeof t && + (t.hasOwnProperty('progress') && (o.progress = t.progress), + t.hasOwnProperty('pipeline') && (o.pipeline = t.pipeline), + t.hasOwnProperty('copy') && (o.copy = t.copy), + t.hasOwnProperty('callBack') && (o.callBack = t.callBack))); + var i, + a, + s, + u, + l = o.pipeline ? 1 : n.length; + o.progress && + ((i = document.createElement('div')), + (a = document.createElement('span')), + (s = document.createElement('span')), + (u = document.createElement('progress')), + (i.id = '_preloadDiv'), + (i.style.textAlign = 'center'), + (i.style.position = 'absolute'), + (i.style.left = '50%'), + (i.style.top = '50%'), + (i.style.marginTop = '-30px'), + (i.style.marginLeft = '-150px'), + (a.id = '_preloadText'), + (a.style.textAlign = 'center'), + (a.innerHTML = 'Loading resources: '), + (s.id = '_preloadCount'), + (s.style.textAlign = 'center'), + (s.innerHTML = '0 / ' + e.length + '
'), + i.appendChild(a), + i.appendChild(s), + u && + void 0 !== u.max && + ((u.id = '_preloadBar'), + (u.style.width = '300px'), + (u.style.height = '30px'), + (u.max = 1), + (u.value = 0), + i.appendChild(u)), + document.body.appendChild(i), + (i.style.display = 'block')); + for ( + var c = function (t) { + var a = t.target; + (r++, + t.preventDefault(), + t.stopPropagation(), + a.removeEventListener('load', c, !0), + a.removeEventListener('error', c, !0), + 'error' === t.type && console.log('Error pre-loading image: ' + a.src), + o.progress && + ((s.innerHTML = r + ' / ' + e.length + '
'), u && void 0 !== u.max && (u.value = r / e.length)), + o.copy && tmbObjs.images.push(a), + o.pipeline && r < e.length && d(n.shift()), + r === e.length && (o.progress && document.body.removeChild(i), o.callBack && o.callBack())); + }, + d = function (e) { + var t = new Image(); + (t.addEventListener('load', c, !0), t.addEventListener('error', c, !0), (t.id = e), (t.src = e)); + }; + l > 0; + ) + (l--, d(n.shift())); +} +function chooseInput(e, t) { + function n(r) { + var a; + ((o = ''), + r.preventDefault(), + r.stopPropagation(), + 'keydown' === r.type + ? e.keyboard + ? (a = 'keys') + : (o = 'Keyboard') + : 'pointerdown' === r.type || 'MSPointerDown' === r.type + ? 'touch' === r.pointerType || r.pointerType === r.MSPOINTER_TYPE_TOUCH + ? e.touch + ? (a = 'taps') + : (o = 'Touch') + : 'mouse' === r.pointerType || r.pointerType === r.MSPOINTER_TYPE_MOUSE + ? e.mouse + ? (a = 'clicks') + : (o = 'Mouse/Trackpad') + : ('pen' !== r.pointerType && r.pointerType !== r.MSPOINTER_TYPE_PEN) || + (e.touch ? (a = 'taps') : (o = 'Pen')) + : 'touchstart' === r.type + ? e.touch + ? (a = 'taps') + : (o = 'Touch') + : 'mousedown' === r.type && (e.mouse ? (a = 'clicks') : (o = 'Mouse/Trackpad')), + o && (o += ' not valid for this test: try another input.'), + (document.getElementById('errMsg').innerHTML = o), + a && + (document.body.removeEventListener('keydown', n, !0), + hasTouch && document.body.removeEventListener('touchstart', n, !0), + document.body.removeEventListener('mousedown', n, !0), + hasPointer && + (window.PointerEvent + ? document.body.removeEventListener('pointerdown', n, !0) + : window.MSPointerEvent && document.body.removeEventListener('MSPointerDown', n, !0)), + 'touchAction' in document.body.style + ? (document.body.style.touchAction = i) + : 'msTouchAction' in document.body.style && (document.body.style.msTouchAction = i), + document.getElementById('centeredTable').remove(), + t && t(a))); + } + var r = '', + o = ' ', + i = ''; + if (null === e || 'object' != typeof e) throw new TypeError('chooseInput: missing or invalid inputTypes object.'); + ((r += '

Please choose how you will respond in this test:

'), + e.keyboard && (r += '- To use a keyboard, press any key now.

'), + e.mouse && (r += '- To use a mouse or track pad, click now.

'), + e.touch && (r += '- To use a touch screen, touch the screen now.

'), + 'touchAction' in document.body.style + ? ((i = document.body.style.touchAction), (document.body.style.touchAction = 'none')) + : 'msTouchAction' in document.body.style && + ((i = document.body.style.msTouchAction), (document.body.style.msTouchAction = 'none')), + document.body.addEventListener('keydown', n, !0), + document.body.addEventListener('mousedown', n, !0), + hasTouch && document.body.addEventListener('touchstart', n, !0), + hasPointer && + (window.PointerEvent + ? document.body.addEventListener('pointerdown', n, !0) + : window.MSPointerEvent && document.body.addEventListener('MSPointerDown', n, !0)), + (document.body.innerHTML += + "
" + + r + + "" + + o + + '
')); +} +function getKeyboardInput(e, t, n, r) { + if (!(e.highlight === !0 || e instanceof Array || 'any' === e)) + throw new TypeError('getKeyboardInput: invalid acceptedKeys parameter'); + var o = e.highlight === !0; + r && setTimeout(disableKeyboard, r); + var i = now(), + a = null, + s = 0, + u = function () { + if (((a = null), o)) + for (var t in e) e.hasOwnProperty(t) && 'highlight' !== t && (e[t].style.border = '5px solid transparent'); + }; + return ( + (document.onkeydown = function (t) { + s = now() - i; + var t = t || window.event, + n = t.charCode || t.keyCode, + r = codeToKey(n); + return ( + ('any' === e || (o && r in e) || (e instanceof Array && e.includes(r))) && + (a && a !== r + ? (u(), alert('Please press only one key!\n\nYour response was not recorded. Please try again.'), u()) + : ((a = r), o && e[r] && (e[r].style.border = '5px solid #afd6fd'))), + !1 + ); + }), + (document.onkeyup = function (r) { + var r = r || window.event, + i = r.charCode || r.keyCode, + l = codeToKey(i); + if ('any' === e || (o && l in e) || (e instanceof Array && e.contains(l))) { + r.preventDefault ? (r.preventDefault(), r.stopPropagation()) : ((r.returnValue = !1), (r.cancelBubble = !0)); + var c = function () { + if (l !== a) return !1; + o && (e[l].style.border = '5px solid transparent'); + var r = { response: l, rt: s }; + return (u(), n ? t(r, n) : t(r), !1); + }; + o ? window.setTimeout(c, 300) : c(); + } + }), + !1 + ); +} +function simulateMobileMouseEvent(e, t) { + var n = document.createEvent('MouseEvents'), + r = e.changedTouches[0]; + (n.initMouseEvent( + t, + !0, + !0, + window, + 1, + r.screenX, + r.screenY, + r.clientX, + r.clientY, + e.ctrlKey, + e.altKey, + e.shiftKey, + e.metaKey, + 0, + null + ), + e.target.dispatchEvent(n)); +} +function simulateKeyEvent(e, t) { + var n = null; + if (document.createEvent) { + try { + ((n = document.createEvent('KeyEvents')), n.initKeyEvent(e, !0, !0, window, !1, !1, !1, !1, t, 0)); + } catch (r) { + try { + n = document.createEvent('Events'); + } catch (o) { + n = document.createEvent('UIEvents'); + } finally { + (n.initEvent(e, !0, !0), + (n.view = window), + (n.altKey = !1), + (n.ctrlKey = !1), + (n.shiftKey = !1), + (n.metaKey = !1), + (n.keyCode = t), + (n.charCode = 0)); + } + } + document.dispatchEvent(n); + } else { + if (!document.createEventObject) throw 'simulateKeyEvent(): No event simulation framework present.'; + ((n = document.createEventObject()), + (n.bubbles = !0), + (n.cancelable = !0), + (n.view = window), + (n.ctrlKey = !1), + (n.altKey = !1), + (n.shiftKey = !1), + (n.metaKey = !1), + (n.keyCode = t), + document.fireEvent('on' + e, n)); + } +} +function codeToKey(e) { + return keyboardCodes[e] || 'nokey'; +} +function keyToCode(e) { + return keyboardKeys[e] || 0; +} +function disableKeyboard() { + ((document.onkeyup = null), (document.onkeydown = null)); +} +function disableTouch(e) { + if ('document' === e) document.ontouchend = null; + else for (var t = 0; t < e.length; t++) ((e[t].ontouchstart = null), (e[t].ontouchend = null)); +} +function disableSelect() { + var e = document.body.style; + 'undefined' != typeof e.webkitUserSelect + ? (e.webkitUserSelect = 'none') + : 'undefined' != typeof e.MozUserSelect + ? (e.MozUserSelect = 'none') + : 'undefined' != typeof e.msUserSelect + ? (e.msUserSelect = 'none') + : 'undefined' != typeof e.oUserSelect + ? (e.oUserSelect = 'none') + : 'undefined' != typeof e.userSelect + ? (e.userSelect = 'none') + : 'undefined' != typeof document.onselectstart && + (document.onselectstart = function () { + return !1; + }); +} +function disableRightClick() { + 'undefined' != typeof document.oncontextmenu && + (document.oncontextmenu = function () { + return !1; + }); +} +function disableDrag() { + 'undefined' != typeof document.ondragstart && + (document.ondragstart = function () { + return !1; + }); +} +function disableElasticScrolling() { + 'undefined' != typeof document.ontouchmove && + (document.ontouchmove = function (e) { + (e.preventDefault(), e.stopPropagation()); + }); +} +function disableDoubleTapZoom() { + 'touchAction' in document.body.style + ? (document.body.style.touchAction = 'manipulation') + : 'msTouchAction' in document.body.style && (document.body.style.msTouchAction = 'manipulation'); +} +function getWindowHeight() { + var e = 0; + return ( + self.innerHeight + ? (e = self.innerHeight) + : document.documentElement && document.documentElement.clientHeight + ? (e = document.documentElement.clientHeight) + : document.body && (e = document.body.clientHeight), + e + ); +} +function getWindowWidth() { + var e = 0; + return ( + self.innerWidth + ? (e = self.innerWidth) + : document.documentElement && document.documentElement.clientWidth + ? (e = document.documentElement.clientWidth) + : document.body && (e = document.body.clientWidth), + e + ); +} +function getAspectRatio() { + return screen.height < screen.width ? screen.width / screen.height : screen.height / screen.width; +} +function getBoundingClientRectWithScroll(e) { + var t = e.getBoundingClientRect(), + n = document.body, + r = document.documentElement, + o = window.pageYOffset || r.scrollTop || n.scrollTop, + i = window.pageXOffset || r.scrollLeft || n.scrollLeft, + a = r.clientTop || n.clientTop || 0, + s = r.clientLeft || n.clientLeft || 0, + u = t.top + o - a, + l = t.left + i - s, + c = t.right + i - s, + d = t.bottom + o - a, + f = t.bottom - t.top, + m = t.right - t.left; + return { + top: Math.round(u), + left: Math.round(l), + right: Math.round(c), + bottom: Math.round(d), + height: Math.round(f), + width: Math.round(m) + }; +} +function regularPolygon(e, t, n, r, o) { + if (!(3 > e)) { + var i = [], + a = (2 * Math.PI) / e; + o = (o * Math.PI) / 180; + for (var s = 0; e > s; s++) i.push({ x: t + r * Math.cos(s * a + o), y: n - r * Math.sin(s * a + o) }); + return i; + } +} +function svgPathString(e, t) { + var n; + n = 'M' + e[0].x + ' ' + e[0].y + 'L'; + for (var r = 1; r < e.length; r++) n = n + e[r].x + ' ' + e[r].y + ' '; + return (t && (n += 'Z'), n); +} +function randInt(e, t) { + return t ? Math.floor(Math.random() * (t - e + 1)) + e : ((e = e || 2), Math.floor(Math.random() * e)); +} +function randSign() { + return Math.random() < 0.5 ? -1 : 1; +} +function combinations(e, t) { + var n, + r, + o, + i, + a = []; + for (n = 0; n < e.length; n++) + if (1 === t) a.push([e[n]]); + else + for (o = combinations(e.slice(n + 1, e.length), t - 1), r = 0; r < o.length; r++) + ((i = o[r]), i.unshift(e[n]), a.push(i)); + return a; +} +function range(e, t) { + for (var n = [], r = e; t >= r; r++) n.push(r); + return n; +} +function linSpace(e, t, n) { + if (('undefined' == typeof n && (n = Math.max(Math.round(t - e) + 1, 1)), 2 > n)) return 1 === n ? [e] : []; + var r, + o = new Array(n); + for (n--, r = n; r >= 0; r--) o[r] = (r * t + (n - r) * e) / n; + return o; +} +function isEven(e) { + return e === parseFloat(e) ? !(e % 2) : void 0; +} +function wrapRads(e) { + for (; e > Math.PI; ) e -= 2 * Math.PI; + for (; e < -Math.PI; ) e += 2 * Math.PI; + return e; +} +function sizeToDegrees(e, t) { + return ((t = t || 57.294), (2 * Math.atan2(e, 2 * t) * 180) / Math.PI); +} +function degreesToSize(e, t) { + return ((t = t || 57.294), 2 * t * Math.tan((e * Math.PI) / 360)); +} +function euclidDistance(e, t, n, r) { + var o = e - n, + i = t - r; + return Math.sqrt(o * o + i * i); +} +function euclidDistanceSquared(e, t, n, r) { + var o, i; + return ((o = e - n), (i = t - r), o * o + i * i); +} +function vecPvector(e, t) { + var n = {}; + return ((n.x = t.x - e.x), (n.y = t.y - e.y), n); +} +function vecLength(e) { + return Math.sqrt(e.x * e.x + e.y * e.y); +} +function vecAngle(e) { + var t = Math.atan2(e.y, e.x); + return wrapRads(t); +} +function vecDotProduct(e, t) { + return e.x * t.x + e.y * t.y; +} +function vecCrossProduct(e, t) { + return e.x * t.y - e.y * t.x; +} +function vecAngleBetween(e, t) { + var n = Math.atan2(t.y, t.x) - Math.atan2(e.y, e.x); + return wrapRads(n); +} +function segmentsIntersect(e, t, n, r) { + function o(e, t) { + return e.x === t.x && e.y === t.y; + } + function i() { + for (var e = arguments[0], t = 1; t < arguments.length; t += 1) if (arguments[t] !== e) return !1; + return !0; + } + var a = vecPvector(e, n), + s = vecPvector(e, t), + u = vecPvector(n, r), + l = vecCrossProduct(s, u), + c = vecCrossProduct(a, s); + if (0 === l) { + if (0 === c) { + if ( + !i(n.x - e.x < 0, n.x - t.x < 0, r.x - e.x < 0, r.x - t.x < 0) || + !i(n.y - e.y < 0, n.y - t.y < 0, r.y - e.y < 0, r.y - t.y < 0) + ) + return 1; + if (o(e, n) || o(e, r) || o(t, n) || o(t, r)) return 2; + } + return 0; + } + var d = vecCrossProduct(a, u), + f = c / l, + m = d / l; + return (0 !== m && 1 !== m) || (0 !== f && 1 !== f) ? (m >= 0 && 1 >= m && f >= 0 && 1 >= f ? 4 : 0) : 3; +} +function pointSegmentDistance(e, t, n) { + function r(e, t) { + var n = e.x - t.x, + r = e.y - t.y; + return n * n + r * r; + } + var o = r(t, n); + if (0 === o) return Math.sqrt(r(e, t)); + var i = ((e.x - t.x) * (n.x - t.x) + (e.y - t.y) * (n.y - t.y)) / o; + return 0 > i + ? Math.sqrt(r(e, t)) + : i > 1 + ? Math.sqrt(r(e, n)) + : Math.sqrt(r(e, { x: t.x + i * (n.x - t.x), y: t.y + i * (n.y - t.y) })); +} +function polygonIsComplex(e) { + var t, n; + if ((n = e.length) > 2) { + for (var r = 1; n - 1 > r; r++) + for (var o = 0; r > o; o++) + if (((t = segmentsIntersect(e[o], e[o + 1], e[r], e[r + 1])), 0 !== t && 3 !== t)) return [t, o, r]; + for (o = 0; n - 1 > o; o++) + if (((t = segmentsIntersect(e[o], e[o + 1], e[n - 1], e[0])), 0 !== t && 3 !== t)) return [t, o, n - 1]; + } + return !1; +} +function autoCorr(e, t) { + var n, + r, + o, + i, + a, + s = 0, + u = 0, + l = []; + if (1 > t || t > e.length - 1) throw new TypeError("'hiLag' must be positive and less than 'series.length'."); + for (i = e.slice(), o = i.length, a = i.average(), n = 0; o > n; n++) ((i[n] = i[n] - a), (s += i[n] * i[n])); + for (l[0] = 1, r = 1; t + 1 > r; r++) { + for (u = 0, n = 0; o - r - 1 > n; n++) u += i[n] * i[n + r]; + l[r] = u / s; + } + return l; +} +function getTimerGrain(e, t) { + function n() { + var u, l, c, d, f; + for (c = a, f = s.length + 1, l = u = now(); c; ) ((d = now()), (s[f] = d - l) && (c--, f++, (l = d))); + ((r += l - u), (o += a), o === e ? ((d = s.median().round(7)), t(d)) : (o === e - i && (a = i), setImmediate(n))); + } + var r, + o, + i, + a, + s = []; + e && t + ? ((r = o = 0), e > 100 ? ((a = 100), (i = e % 100)) : (a = e), setImmediate(n)) + : console.log("getTimerGrain needs how many 'ticks' to measure and a 'callBack' function to return the result."); +} +function getFrameTime(e, t) { + function n() { + ((r = o), + (o = now()), + (r = o - r), + i.push(r), + e ? (e--, requestAnimationFrame(n)) : ((r = i.median().round(3)), t(r))); + } + var r, + o, + i = []; + e && t + ? requestAnimationFrame(function () { + ((o = now()), requestAnimationFrame(n)); + }) + : console.log("getFrameTime needs how many 'frames' to measure and a 'callback' function to return the result."); +} +function chainTimeouts() { + var e = arguments.length, + t = arguments[0]; + if ((1 === e && t instanceof Array && ((arguments = t), (e = arguments.length), (t = arguments[0])), e % 2 === 0)) + throw new Error('chainTimeouts(): number of arguments must be odd'); + t(); + for (var n = [], r = 2, o = arguments[1]; e > r; r += 2, o += arguments[r - 1]) n.push(setTimeout(arguments[r], o)); + return n; +} +function clearChainTimeouts(e) { + for (var t = 0, n = e.length; n > t; t++) clearTimeout(e[t]); +} +function getAllCookies() { + var e = {}; + if (document.cookie && '' != document.cookie) + for (var t = document.cookie.split('; '), n = 0; n < t.length; n++) { + var r = t[n].split(/=(.+)?/); + e[decodeURIComponent(r[0])] = decodeURIComponent(r[1]); + } + return e; +} +function createCookie(e, t, n, r, o, i) { + if (!e) return !1; + if (((t = t ? t : ''), void 0 !== n)) { + var a = new Date(); + (a.setTime(a.getTime() + 24 * n * 60 * 60 * 1e3), (n = '; expires=' + a.toUTCString())); + } else n = '; expires=0'; + ((r = r ? '; path=' + r : '; path=/'), + (o = o ? '; domain=' + o : ''), + (i = i || 'https:' === location.protocol ? ';secure' : ''), + (document.cookie = e + '=' + t + n + r + o + i)); +} +function readCookie(e) { + for (var t = e + '=', n = document.cookie.split(';'), r = 0; r < n.length; r++) { + for (var o = n[r]; ' ' === o.charAt(0); ) o = o.substring(1, o.length); + if (0 === o.indexOf(t)) return o.substring(t.length, o.length); + } + return null; +} +function eraseCookie(e, t, n) { + ((t = t ? '; path=' + t : ''), (n = n ? '; domain=' + n : ''), createCookie(e, '', -1, t, n)); +} +function safeDecode(e) { + return ((e = e.replace(/\!/g, '/').replace(/-/g, '+').replace(/\./g, '=')), atob(e)); +} +function safeEncode(e) { + return ((e = btoa(e)), (e = e.replace(/\//g, '!').replace(/\+/g, '-').replace(/\=/g, '.'))); +} +function getPastResults(e) { + return RawDeflate.inflate(safeDecode(readCookie('t.' + e))); +} +function insertAfter(e, t) { + e.parentNode.insertBefore(t, e.nextSibling); +} +function generateForm(survey, node, action, method, buttonText) { + function tag(e, t) { + var n = '<' + e + ' ', + r = []; + for (var o in t) t.hasOwnProperty(o) && 'content' !== o && r.push(o + '="' + t[o] + '"'); + return ((n += r.join(' ') + '>'), 'undefined' != typeof t.content && (n += t.content), (n += '')); + } + var self = generateForm; + 'undefined' == typeof self.numForms ? (self.numForms = 1) : self.numForms++; + var formId = '__form' + (self.numForms - 1); + ((method = void 0 === method ? 'POST' : method), (onsubmit = "alert('blart');")); + for ( + var str = "
    ", a = 0, b; + (b = survey[a]); + a++ + ) + if ('textdiv' !== b.type) { + switch ( + ('' !== b.question && + ((str += 'hidden' !== b.type ? '
  1. ' : ''), + (str += + "

    " + + b.question + + "
    ")), + b.type) + ) { + case '': + str += tag('input', { type: 'text', id: b.name }); + break; + case 'text': + str += tag('input', { type: 'text', maxlength: b.length, id: b.name, size: b.length }); + break; + case 'hidden': + ((b.optional = !0), (b.question = b.name), (str += tag('input', { type: 'hidden', id: b.name }))); + break; + case 'checkbox': + case 'radio': + b.options.map(function (e, t) { + var n = b.name + '[' + t + ']'; + str += tag('span', { + class: 'undefined' != typeof b.subtype ? 'zen_' + b.subtype : 'zen_' + b.type, + content: + tag('input', { + type: b.type, + name: b.name, + id: n, + value: 'undefined' != typeof b.values ? b.values[t] : b.options[t], + class: 'zen_' + b.type + }) + tag('label', { for: n, content: e }) + }); + }); + break; + case 'dropdown': + ((str += "')); + break; + case 'textarea': + str += tag('textarea', { + name: b.name, + rows: b.rows, + cols: b.cols, + id: b.name, + class: 'undefined' != typeof b.subtype ? ' zen_' + b.subtype : '' + }); + } + ((str += '

    '), (str += 'hidden' !== b.type ? '
  2. ' : '')); + } else + ((b.optional = !0), + (str += tag('div', { id: b.name, size: b.length, content: b.content, class: 'zen_infoblock' }))); + ((str = buttonText + ? str + + "
    ' + : str + + "
    "), + (str += ""), + (node.innerHTML += str), + (getID(formId).validate = function () { + var results = [], + score = 0, + finalCheck = !0, + error = !1, + form = getID(formId); + survey.map(function (item) { + var id = item.name, + el, + value, + answer; + if ('checkbox' === item.type || 'radio' === item.type) { + value = []; + for (var i = 0, len = item.options.length; len > i; i++) { + var option = getID(item.name + '[' + i + ']'); + option.checked && (value.push(option.value), item.values && (score += 1 * option.value)); + } + ('radio' === item.type + ? ((value = value.shift()), + (item.validate = function (e) { + return e; + })) + : (item.validate = function (e) { + return e.length; + }), + (answer = value), + (el = getID(item.name + '[' + (i - 1) + ']'))); + } else if ('dropdown' === item.type) { + for (var i = 0, len = item.options.length; len > i; i++) { + var option = getID(item.name + '[' + i + ']'); + option.selected && + ((answer = option.value), item.values && ((answer = 1 * option.value), (score += 1 * option.value))); + } + ((el = form[item.name]), + (value = getID(item.name).options[0].selected), + (value = !value), + (item.validate = function (e) { + return e; + })); + } else + ((value = []), + (el = form[item.name] ? form[item.name] : getID(item.name)), + (value = el.value), + (answer = el.value)); + if (item.optional) { + var ans = new Object(); + (eval('ans.zen_' + item.name + '= answer'), results.push(ans)); + } else { + var errorEl = getID(id + '.err'); + errorEl || + ((errorEl = document.createElement('span')), + (errorEl.id = id + '.err'), + (errorEl.className = 'zen_error'), + insertAfter(getID('zen_' + id + '_input'), errorEl)); + var notBlank = function (e) { + return !('' === e); + }, + validate = item.validate || notBlank; + if (validate(value)) { + errorEl.innerHTML = ''; + var ans = new Object(); + (eval('ans.zen_' + item.name + '= answer'), results.push(ans)); + } else ((error = !0), (finalCheck = !1), (errorEl.innerHTML = 'required')); + } + }); + var errorTot = getID(formId + '.err'); + return ( + errorTot || + ((errorTot = document.createElement('span')), + (errorTot.id = formId + '.err'), + (errorTot.className = 'zen_err_flag'), + insertAfter(getID('zen_submit'), errorTot)), + (getID('data').value = JSON.stringify(results)), + (getID('score').value = isNaN(score) ? 0 : score), + finalCheck + ? void getID(formId).submit() + : ((errorTot.innerHTML = + 'There is a problem with your form submission. Please check that you have filled out all required fields correctly.'), + finalCheck) + ); + })); +} +(Date.now || + (Date.now = function () { + return new Date().getTime(); + }), + (function () { + 'use strict'; + for (var e = ['webkit', 'moz'], t = 0; t < e.length && !window.requestAnimationFrame; ++t) { + var n = e[t]; + ((window.requestAnimationFrame = window[n + 'RequestAnimationFrame']), + (window.cancelAnimationFrame = + window[n + 'CancelAnimationFrame'] || window[n + 'CancelRequestAnimationFrame'])); + } + if ( + /iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || + !window.requestAnimationFrame || + !window.cancelAnimationFrame + ) { + var r = 0; + ((window.requestAnimationFrame = function (e) { + var t = Date.now(), + n = Math.max(r + 16, t); + return setTimeout(function () { + e((r = n)); + }, n - t); + }), + (window.cancelAnimationFrame = clearTimeout)); + } + })(), + (function () { + function e(e) { + this.message = e; + } + var t = 'undefined' != typeof exports ? exports : this, + n = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + ((e.prototype = new Error()), + (e.prototype.name = 'InvalidCharacterError'), + t.btoa || + (t.btoa = function (t) { + for ( + var r, o, i = String(t), a = 0, s = n, u = ''; + i.charAt(0 | a) || ((s = '='), a % 1); + u += s.charAt(63 & (r >> (8 - (a % 1) * 8))) + ) { + if (((o = i.charCodeAt((a += 0.75))), o > 255)) + throw new e("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); + r = (r << 8) | o; + } + return u; + }), + t.atob || + (t.atob = function (t) { + var r = String(t).replace(/=+$/, ''); + if (r.length % 4 == 1) throw new e("'atob' failed: The string to be decoded is not correctly encoded."); + for ( + var o, i, a = 0, s = 0, u = ''; + (i = r.charAt(s++)); + ~i && ((o = a % 4 ? 64 * o + i : i), a++ % 4) ? (u += String.fromCharCode(255 & (o >> ((-2 * a) & 6)))) : 0 + ) + i = n.indexOf(i); + return u; + })); + })()); +var base64decode = atob, + base64encode = btoa; +(document.getElementsByClassName || + (document.getElementsByClassName = function (e) { + for ( + var t = [], + n = document, + r = n.getElementsByTagName('*'), + o = r.length, + i = new RegExp('(^|\\s)' + e + '(\\s|$)'), + a = 0, + s = 0; + o > a; + a++ + ) + i.test(r[a].className) && ((t[s] = r[a]), s++); + return t; + }), + Object.prototype.hasOwnProperty || + (Object.prototype.hasOwnProperty = function (e) { + var t = this.__proto__ || this.constructor.prototype; + return e in this && (!(e in t) || t[e] !== this[e]); + }), + 'function' != typeof Object.create && + (Object.create = (function () { + var e = function () {}; + return function (t) { + if (arguments.length > 1) throw Error('Second argument not supported'); + if ('object' != typeof t) throw TypeError('Argument must be an object'); + e.prototype = t; + var n = new e(); + return ((e.prototype = null), n); + }; + })()), + Object.keys || + (Object.keys = (function () { + 'use strict'; + var e = Object.prototype.hasOwnProperty, + t = !{ toString: null }.propertyIsEnumerable('toString'), + n = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + r = n.length; + return function (o) { + if ('object' != typeof o && ('function' != typeof o || null === o)) + throw new TypeError('Object.keys called on non-object'); + var i, + a, + s = []; + for (i in o) e.call(o, i) && s.push(i); + if (t) for (a = 0; r > a; a++) e.call(o, n[a]) && s.push(n[a]); + return s; + }; + })()), + Function.prototype.bind || + (Function.prototype.bind = function (e) { + if ('function' != typeof this) + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + var t = Array.prototype.slice.call(arguments, 1), + n = this, + r = function () {}, + o = function () { + return n.apply(this instanceof r ? this : e, t.concat(Array.prototype.slice.call(arguments))); + }; + return ((r.prototype = this.prototype), (o.prototype = new r()), o); + }), + Array.isArray || + (Array.isArray = function (e) { + return '[object Array]' === Object.prototype.toString.call(e); + }), + Array.prototype.indexOf || + (Array.prototype.indexOf = function (e, t) { + if (void 0 === this || null === this) throw new TypeError('"this" is null or not defined'); + var n = this.length >>> 0; + for (t = +t || 0, Math.abs(t) === 1 / 0 && (t = 0), 0 > t && ((t += n), 0 > t && (t = 0)); n > t; t++) + if (this[t] === e) return t; + return -1; + }), + Array.prototype.lastIndexOf || + (Array.prototype.lastIndexOf = function (e) { + 'use strict'; + if (null == this) throw new TypeError(); + var t, + n, + r = Object(this), + o = r.length >>> 0; + if (0 === o) return -1; + for ( + t = o, + arguments.length > 1 && + ((t = Number(arguments[1])), + t != t ? (t = 0) : 0 != t && t != 1 / 0 && t != -(1 / 0) && (t = (t > 0 || -1) * Math.floor(Math.abs(t)))), + n = t >= 0 ? Math.min(t, o - 1) : o - Math.abs(t); + n >= 0; + n-- + ) + if (n in r && r[n] === e) return n; + return -1; + }), + Array.prototype.every || + (Array.prototype.every = function (e) { + 'use strict'; + if (void 0 === this || null === this) throw new TypeError(); + var t = Object(this), + n = t.length >>> 0; + if ('function' != typeof e) throw new TypeError(); + for (var r = arguments.length >= 2 ? arguments[1] : void 0, o = 0; n > o; o++) + if (o in t && !e.call(r, t[o], o, t)) return !1; + return !0; + }), + Array.prototype.some || + (Array.prototype.some = function (e) { + 'use strict'; + if (void 0 === this || null === this) throw new TypeError(); + var t = Object(this), + n = t.length >>> 0; + if ('function' != typeof e) throw new TypeError(); + for (var r = arguments.length >= 2 ? arguments[1] : void 0, o = 0; n > o; o++) + if (o in t && e.call(r, t[o], o, t)) return !0; + return !1; + }), + Array.prototype.forEach || + (Array.prototype.forEach = function (e) { + 'use strict'; + if (void 0 === this || null === this) throw new TypeError(); + var t = Object(this), + n = t.length >>> 0; + if ('function' != typeof e) throw new TypeError(); + for (var r = arguments.length >= 2 ? arguments[1] : void 0, o = 0; n > o; o++) o in t && e.call(r, t[o], o, t); + }), + Array.prototype.map || + (Array.prototype.map = function (e) { + 'use strict'; + if (void 0 === this || null === this) throw new TypeError(); + var t = Object(this), + n = t.length >>> 0; + if ('function' != typeof e) throw new TypeError(); + for (var r = new Array(n), o = arguments.length >= 2 ? arguments[1] : void 0, i = 0; n > i; i++) + i in t && (r[i] = e.call(o, t[i], i, t)); + return r; + }), + Array.prototype.filter || + (Array.prototype.filter = function (e) { + 'use strict'; + if (void 0 === this || null === this) throw new TypeError(); + var t = Object(this), + n = t.length >>> 0; + if ('function' != typeof e) throw new TypeError(); + for (var r = [], o = arguments.length >= 2 ? arguments[1] : void 0, i = 0; n > i; i++) + if (i in t) { + var a = t[i]; + e.call(o, a, i, t) && r.push(a); + } + return r; + }), + 'function' != typeof Array.prototype.reduce && + (Array.prototype.reduce = function (e, t) { + 'use strict'; + if (null === this || 'undefined' == typeof this) + throw new TypeError('Array.prototype.reduce called on null or undefined'); + if ('function' != typeof e) throw new TypeError(e + ' is not a function'); + var n, + r, + o = this.length >>> 0, + i = !1; + for (1 < arguments.length && ((r = t), (i = !0)), n = 0; o > n; ++n) + this.hasOwnProperty(n) && (i ? (r = e(r, this[n], n, this)) : ((r = this[n]), (i = !0))); + if (!i) throw new TypeError('Reduce of empty array with no initial value'); + return r; + }), + 'function' != typeof Array.prototype.reduceRight && + (Array.prototype.reduceRight = function (e, t) { + 'use strict'; + if (null === this || 'undefined' == typeof this) + throw new TypeError('Array.prototype.reduceRight called on null or undefined'); + if ('function' != typeof e) throw new TypeError(e + ' is not a function'); + var n, + r, + o = this.length >>> 0, + i = !1; + for (1 < arguments.length && ((r = t), (i = !0)), n = o - 1; n > -1; --n) + this.hasOwnProperty(n) && (i ? (r = e(r, this[n], n, this)) : ((r = this[n]), (i = !0))); + if (!i) throw new TypeError('Reduce of empty array with no initial value'); + return r; + }), + (function () { + 'use strict'; + var e = Array.prototype.slice; + try { + e.call(document.documentElement); + } catch (t) { + Array.prototype.slice = function (t, n) { + if ( + ((n = 'undefined' != typeof n ? n : this.length), '[object Array]' === Object.prototype.toString.call(this)) + ) + return e.call(this, t, n); + var r, + o, + i = [], + a = this.length, + s = t || 0; + s = s >= 0 ? s : a + s; + var u = n ? n : a; + if ((0 > n && (u = a + n), (o = u - s), o > 0)) + if (((i = new Array(o)), this.charAt)) for (r = 0; o > r; r++) i[r] = this.charAt(s + r); + else for (r = 0; o > r; r++) i[r] = this[s + r]; + return i; + }; + } + })(), + this.Element && + Element.prototype.attachEvent && + !Element.prototype.addEventListener && + (function () { + function e(e, t) { + Window.prototype[e] = HTMLDocument.prototype[e] = Element.prototype[e] = t; + } + function t() { + t.interval && + document.body && + ((t.interval = clearInterval(t.interval)), document.dispatchEvent(new CustomEvent('DOMContentLoaded'))); + } + (e('addEventListener', function (e, t) { + var n = this, + r = (n._c1_listeners = n._c1_listeners || {}), + o = (r[e] = r[e] || []); + (o.length || + n.attachEvent( + 'on' + e, + (o.event = function (e) { + var t = (n.document && n.document.documentElement) || + n.documentElement || { scrollLeft: 0, scrollTop: 0 }; + ((e.currentTarget = n), + (e.pageX = e.clientX + t.scrollLeft), + (e.pageY = e.clientY + t.scrollTop), + (e.preventDefault = function () { + e.returnValue = !1; + }), + (e.relatedTarget = e.fromElement || null), + (e.stopImmediatePropagation = function () { + ((l = !1), (e.cancelBubble = !0)); + }), + (e.stopPropagation = function () { + e.cancelBubble = !0; + }), + (e.target = e.srcElement || n), + (e.timeStamp = +new Date())); + var r = {}; + for (var i in e) r[i] = e[i]; + for (var a, s = 0, u = [].concat(o), l = !0; l && (a = u[s]); ++s) + for (var c, d = 0; (c = o[d]); ++d) + if (c == a) { + c.call(n, r); + break; + } + }) + ), + o.push(t)); + }), + e('removeEventListener', function (e, t) { + for ( + var n, r = this, o = (r._c1_listeners = r._c1_listeners || {}), i = (o[e] = o[e] || []), a = i.length - 1; + (n = i[a]); + --a + ) + if (n == t) { + i.splice(a, 1); + break; + } + !i.length && i.event && r.detachEvent('on' + e, i.event); + }), + e('dispatchEvent', function (e) { + var t = this, + n = e.type, + r = (t._c1_listeners = t._c1_listeners || {}), + o = (r[n] = r[n] || []); + try { + return t.fireEvent('on' + n, e); + } catch (i) { + return void (o.event && o.event(e)); + } + })); + try { + new window.CustomEvent('?'); + } catch (n) { + Object.defineProperty(Window.prototype, 'CustomEvent', { + get: function () { + var e = this; + return function (t, n) { + n = n || {}; + var r, + o = e.document.createEventObject(); + ((o.type = t), (o.returnValue = !n.cancelable), (o.cancelBubble = !n.bubbles)); + for (r in n) o[r] = n[r]; + return o; + }; + } + }); + } + ((t.interval = setInterval(t, 1)), window.addEventListener('load', t)); + })()); +try { + new window.CustomEvent('?'); +} catch (e) { + !(function () { + window.CustomEvent = function (e, t) { + var n; + t = t || { bubbles: !1, cancelable: !1, detail: void 0 }; + try { + ((n = document.createEvent('CustomEvent')), n.initCustomEvent(e, t.bubbles, t.cancelable, t.detail)); + } catch (r) { + ((n = document.createEvent('Event')), n.initEvent(e, t.bubbles, t.cancelable), (n.detail = t.detail)); + } + return n; + }; + })(); +} +('remove' in Element.prototype || + (Element.prototype.remove = function () { + this.parentNode && this.parentNode.removeChild(this); + }), + window.Node || + (window.Node = { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + ENTITY_REFERENCE_NODE: 5, + ENTITY_NODE: 6, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, + NOTATION_NODE: 12 + }), + 'function' != typeof Number.isInteger && + (Number.isInteger = function (e) { + return 'number' == typeof e && isFinite(e) && Math.floor(e) === e; + }), + String.prototype.trim || + (String.prototype.trim = function () { + return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }), + (function (e) { + var t = 32768, + n = 0, + r = 1, + o = 2, + i = 6, + a = !0, + s = 32768, + u = 64, + l = 8192, + c = 2 * t, + d = 3, + f = 258, + m = 16, + p = 8192, + h = 13; + (p > s && alert('error: zip_INBUFSIZ is too small'), + t << 1 > 1 << m && alert('error: zip_WSIZE is too large'), + h > m - 1 && alert('error: zip_HASH_BITS is too large'), + (8 > h || 258 != f) && alert('error: Code too clever')); + var y, + v, + b, + g, + w, + I, + E, + U, + T, + A, + k, + O, + x, + S, + M, + _, + C, + L, + P, + D, + N, + R, + j, + B, + z, + F, + q, + H, + W, + K, + X, + J, + Y, + G, + V, + $, + Z, + Q, + ee, + te, + ne, + re, + oe, + ie, + ae, + se, + ue, + le, + ce, + de, + fe, + me, + pe, + he, + ye, + ve, + be = p, + ge = 1 << h, + we = ge - 1, + Ie = t - 1, + Ee = 0, + Ue = 4096, + Te = f + d + 1, + Ae = t - Te, + ke = 1, + Oe = 15, + xe = 7, + Se = 29, + Me = 256, + _e = 256, + Ce = Me + 1 + Se, + Le = 30, + Pe = 19, + De = 16, + Ne = 17, + Re = 18, + je = 2 * Ce + 1, + Be = parseInt((h + d - 1) / d), + ze = null, + Fe = function () { + ((this.fc = 0), (this.dl = 0)); + }, + qe = function () { + ((this.dyn_tree = null), + (this.static_tree = null), + (this.extra_bits = null), + (this.extra_base = 0), + (this.elems = 0), + (this.max_length = 0), + (this.max_code = 0)); + }, + He = function (e, t, n, r) { + ((this.good_length = e), (this.max_lazy = t), (this.nice_length = n), (this.max_chain = r)); + }, + We = function () { + ((this.next = null), (this.len = 0), (this.ptr = new Array(l)), (this.off = 0)); + }, + Ke = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0), + Xe = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13), + Je = new Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7), + Ye = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15), + Ge = new Array( + new He(0, 0, 0, 0), + new He(4, 4, 8, 4), + new He(4, 5, 16, 8), + new He(4, 6, 32, 32), + new He(4, 4, 16, 16), + new He(8, 16, 32, 32), + new He(8, 16, 128, 128), + new He(8, 32, 128, 256), + new He(32, 128, 258, 1024), + new He(32, 258, 258, 4096) + ), + Ve = function (e) { + var t; + if ((e ? (1 > e ? (e = 1) : e > 9 && (e = 9)) : (e = i), (q = e), (g = !1), (j = !1), null == ze)) { + for ( + y = v = b = null, + ze = new Array(l), + U = new Array(c), + T = new Array(be), + A = new Array(s + u), + k = new Array(1 << m), + K = new Array(je), + t = 0; + je > t; + t++ + ) + K[t] = new Fe(); + for (X = new Array(2 * Le + 1), t = 0; 2 * Le + 1 > t; t++) X[t] = new Fe(); + for (J = new Array(Ce + 2), t = 0; Ce + 2 > t; t++) J[t] = new Fe(); + for (Y = new Array(Le), t = 0; Le > t; t++) Y[t] = new Fe(); + for (G = new Array(2 * Pe + 1), t = 0; 2 * Pe + 1 > t; t++) G[t] = new Fe(); + ((V = new qe()), + ($ = new qe()), + (Z = new qe()), + (Q = new Array(Oe + 1)), + (ee = new Array(2 * Ce + 1)), + (re = new Array(2 * Ce + 1)), + (oe = new Array(f - d + 1)), + (ie = new Array(512)), + (ae = new Array(Se)), + (se = new Array(Le)), + (ue = new Array(parseInt(p / 8)))); + } + }, + $e = function (e) { + ((e.next = y), (y = e)); + }, + Ze = function () { + var e; + return (null != y ? ((e = y), (y = y.next)) : (e = new We()), (e.next = null), (e.len = e.off = 0), e); + }, + Qe = function (e) { + return k[t + e]; + }, + et = function (e, n) { + return (k[t + e] = n); + }, + tt = function (e) { + ((ze[I + w++] = e), I + w == l && Lt()); + }, + nt = function (e) { + ((e &= 65535), l - 2 > I + w ? ((ze[I + w++] = 255 & e), (ze[I + w++] = e >>> 8)) : (tt(255 & e), tt(e >>> 8))); + }, + rt = function () { + ((M = ((M << Be) ^ (255 & U[N + d - 1])) & we), (_ = Qe(M)), (k[N & Ie] = _), et(M, N)); + }, + ot = function (e, t) { + Mt(t[e].fc, t[e].dl); + }, + it = function (e) { + return 255 & (256 > e ? ie[e] : ie[256 + (e >> 7)]); + }, + at = function (e, t, n) { + return e[t].fc < e[n].fc || (e[t].fc == e[n].fc && re[t] <= re[n]); + }, + st = function (e, t, n) { + var r; + for (r = 0; n > r && ve < ye.length; r++) e[t + r] = 255 & ye.charCodeAt(ve++); + return r; + }, + ut = function () { + var e; + for (e = 0; ge > e; e++) k[t + e] = 0; + if ( + ((F = Ge[q].max_lazy), + (H = Ge[q].good_length), + a || (W = Ge[q].nice_length), + (z = Ge[q].max_chain), + (N = 0), + (S = 0), + (B = st(U, 0, 2 * t)), + 0 >= B) + ) + return ((j = !0), void (B = 0)); + for (j = !1; Te > B && !j; ) ct(); + for (M = 0, e = 0; d - 1 > e; e++) M = ((M << Be) ^ (255 & U[e])) & we; + }, + lt = function (e) { + var t, + n, + r = z, + o = N, + i = D, + s = N > Ae ? N - Ae : Ee, + u = N + f, + l = U[o + i - 1], + c = U[o + i]; + D >= H && (r >>= 2); + do + if (((t = e), U[t + i] == c && U[t + i - 1] == l && U[t] == U[o] && U[++t] == U[o + 1])) { + ((o += 2), t++); + do; + while ( + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + U[++o] == U[++t] && + u > o + ); + if (((n = f - (u - o)), (o = u - f), n > i)) { + if (((R = e), (i = n), a)) { + if (n >= f) break; + } else if (n >= W) break; + ((l = U[o + i - 1]), (c = U[o + i])); + } + } + while ((e = k[e & Ie]) > s && 0 != --r); + return i; + }, + ct = function () { + var e, + n, + r = c - B - N; + if (-1 == r) r--; + else if (N >= t + Ae) { + for (e = 0; t > e; e++) U[e] = U[e + t]; + for (R -= t, N -= t, S -= t, e = 0; ge > e; e++) ((n = Qe(e)), et(e, n >= t ? n - t : Ee)); + for (e = 0; t > e; e++) ((n = k[e]), (k[e] = n >= t ? n - t : Ee)); + r += t; + } + j || ((e = st(U, N + B, r)), 0 >= e ? (j = !0) : (B += e)); + }, + dt = function () { + for (; 0 != B && null == v; ) { + var e; + if ((rt(), _ != Ee && Ae >= N - _ && ((P = lt(_)), P > B && (P = B)), P >= d)) + if (((e = Ot(N - R, P - d)), (B -= P), F >= P)) { + P--; + do (N++, rt()); + while (0 != --P); + N++; + } else ((N += P), (P = 0), (M = 255 & U[N]), (M = ((M << Be) ^ (255 & U[N + 1])) & we)); + else ((e = Ot(0, 255 & U[N])), B--, N++); + for (e && (kt(0), (S = N)); Te > B && !j; ) ct(); + } + }, + ft = function () { + for (; 0 != B && null == v; ) { + if ( + (rt(), + (D = P), + (C = R), + (P = d - 1), + _ != Ee && F > D && Ae >= N - _ && ((P = lt(_)), P > B && (P = B), P == d && N - R > Ue && P--), + D >= d && D >= P) + ) { + var e; + ((e = Ot(N - 1 - C, D - d)), (B -= D - 1), (D -= 2)); + do (N++, rt()); + while (0 != --D); + ((L = 0), (P = d - 1), N++, e && (kt(0), (S = N))); + } else 0 != L ? (Ot(0, 255 & U[N - 1]) && (kt(0), (S = N)), N++, B--) : ((L = 1), N++, B--); + for (; Te > B && !j; ) ct(); + } + }, + mt = function () { + j || + ((O = 0), + (x = 0), + yt(), + ut(), + (v = null), + (w = 0), + (I = 0), + (L = 0), + 3 >= q ? ((D = d - 1), (P = 0)) : ((P = d - 1), (L = 0), (L = 0)), + (E = !1)); + }, + pt = function (e, t, n) { + var r; + return g || (mt(), (g = !0), 0 != B) + ? (r = ht(e, t, n)) == n + ? n + : E + ? r + : (3 >= q ? dt() : ft(), + 0 == B && (0 != L && Ot(0, 255 & U[N - 1]), kt(1), (E = !0)), + r + ht(e, r + t, n - r)) + : ((E = !0), 0); + }, + ht = function (e, t, n) { + var r, o, i; + for (r = 0; null != v && n > r; ) { + for (o = n - r, o > v.len && (o = v.len), i = 0; o > i; i++) e[t + r + i] = v.ptr[v.off + i]; + if (((v.off += o), (v.len -= o), (r += o), 0 == v.len)) { + var a; + ((a = v), (v = v.next), $e(a)); + } + } + if (r == n) return r; + if (w > I) { + for (o = n - r, o > w - I && (o = w - I), i = 0; o > i; i++) e[t + r + i] = ze[I + i]; + ((I += o), (r += o), w == I && (w = I = 0)); + } + return r; + }, + yt = function () { + var e, t, n, r, o; + if (0 == Y[0].dl) { + for ( + V.dyn_tree = K, + V.static_tree = J, + V.extra_bits = Ke, + V.extra_base = Me + 1, + V.elems = Ce, + V.max_length = Oe, + V.max_code = 0, + $.dyn_tree = X, + $.static_tree = Y, + $.extra_bits = Xe, + $.extra_base = 0, + $.elems = Le, + $.max_length = Oe, + $.max_code = 0, + Z.dyn_tree = G, + Z.static_tree = null, + Z.extra_bits = Je, + Z.extra_base = 0, + Z.elems = Pe, + Z.max_length = xe, + Z.max_code = 0, + n = 0, + r = 0; + Se - 1 > r; + r++ + ) + for (ae[r] = n, e = 0; e < 1 << Ke[r]; e++) oe[n++] = r; + for (oe[n - 1] = r, o = 0, r = 0; 16 > r; r++) for (se[r] = o, e = 0; e < 1 << Xe[r]; e++) ie[o++] = r; + for (o >>= 7; Le > r; r++) for (se[r] = o << 7, e = 0; e < 1 << (Xe[r] - 7); e++) ie[256 + o++] = r; + for (t = 0; Oe >= t; t++) Q[t] = 0; + for (e = 0; 143 >= e; ) ((J[e++].dl = 8), Q[8]++); + for (; 255 >= e; ) ((J[e++].dl = 9), Q[9]++); + for (; 279 >= e; ) ((J[e++].dl = 7), Q[7]++); + for (; 287 >= e; ) ((J[e++].dl = 8), Q[8]++); + for (wt(J, Ce + 1), e = 0; Le > e; e++) ((Y[e].dl = 5), (Y[e].fc = _t(e, 5))); + vt(); + } + }, + vt = function () { + var e; + for (e = 0; Ce > e; e++) K[e].fc = 0; + for (e = 0; Le > e; e++) X[e].fc = 0; + for (e = 0; Pe > e; e++) G[e].fc = 0; + ((K[_e].fc = 1), (pe = he = 0), (le = ce = de = 0), (fe = 0), (me = 1)); + }, + bt = function (e, t) { + for (var n = ee[t], r = t << 1; te >= r && (te > r && at(e, ee[r + 1], ee[r]) && r++, !at(e, n, ee[r])); ) + ((ee[t] = ee[r]), (t = r), (r <<= 1)); + ee[t] = n; + }, + gt = function (e) { + var t, + n, + r, + o, + i, + a, + s = e.dyn_tree, + u = e.extra_bits, + l = e.extra_base, + c = e.max_code, + d = e.max_length, + f = e.static_tree, + m = 0; + for (o = 0; Oe >= o; o++) Q[o] = 0; + for (s[ee[ne]].dl = 0, t = ne + 1; je > t; t++) + ((n = ee[t]), + (o = s[s[n].dl].dl + 1), + o > d && ((o = d), m++), + (s[n].dl = o), + n > c || + (Q[o]++, + (i = 0), + n >= l && (i = u[n - l]), + (a = s[n].fc), + (pe += a * (o + i)), + null != f && (he += a * (f[n].dl + i)))); + if (0 != m) { + do { + for (o = d - 1; 0 == Q[o]; ) o--; + (Q[o]--, (Q[o + 1] += 2), Q[d]--, (m -= 2)); + } while (m > 0); + for (o = d; 0 != o; o--) + for (n = Q[o]; 0 != n; ) + ((r = ee[--t]), r > c || (s[r].dl != o && ((pe += (o - s[r].dl) * s[r].fc), (s[r].fc = o)), n--)); + } + }, + wt = function (e, t) { + var n, + r, + o = new Array(Oe + 1), + i = 0; + for (n = 1; Oe >= n; n++) ((i = (i + Q[n - 1]) << 1), (o[n] = i)); + for (r = 0; t >= r; r++) { + var a = e[r].dl; + 0 != a && (e[r].fc = _t(o[a]++, a)); + } + }, + It = function (e) { + var t, + n, + r = e.dyn_tree, + o = e.static_tree, + i = e.elems, + a = -1, + s = i; + for (te = 0, ne = je, t = 0; i > t; t++) 0 != r[t].fc ? ((ee[++te] = a = t), (re[t] = 0)) : (r[t].dl = 0); + for (; 2 > te; ) { + var u = (ee[++te] = 2 > a ? ++a : 0); + ((r[u].fc = 1), (re[u] = 0), pe--, null != o && (he -= o[u].dl)); + } + for (e.max_code = a, t = te >> 1; t >= 1; t--) bt(r, t); + do + ((t = ee[ke]), + (ee[ke] = ee[te--]), + bt(r, ke), + (n = ee[ke]), + (ee[--ne] = t), + (ee[--ne] = n), + (r[s].fc = r[t].fc + r[n].fc), + re[t] > re[n] + 1 ? (re[s] = re[t]) : (re[s] = re[n] + 1), + (r[t].dl = r[n].dl = s), + (ee[ke] = s++), + bt(r, ke)); + while (te >= 2); + ((ee[--ne] = ee[ke]), gt(e), wt(r, a)); + }, + Et = function (e, t) { + var n, + r, + o = -1, + i = e[0].dl, + a = 0, + s = 7, + u = 4; + for (0 == i && ((s = 138), (u = 3)), e[t + 1].dl = 65535, n = 0; t >= n; n++) + ((r = i), + (i = e[n + 1].dl), + (++a < s && r == i) || + (u > a ? (G[r].fc += a) : 0 != r ? (r != o && G[r].fc++, G[De].fc++) : 10 >= a ? G[Ne].fc++ : G[Re].fc++, + (a = 0), + (o = r), + 0 == i ? ((s = 138), (u = 3)) : r == i ? ((s = 6), (u = 3)) : ((s = 7), (u = 4)))); + }, + Ut = function (e, t) { + var n, + r, + o = -1, + i = e[0].dl, + a = 0, + s = 7, + u = 4; + for (0 == i && ((s = 138), (u = 3)), n = 0; t >= n; n++) + if (((r = i), (i = e[n + 1].dl), !(++a < s && r == i))) { + if (u > a) { + do ot(r, G); + while (0 != --a); + } else + 0 != r + ? (r != o && (ot(r, G), a--), ot(De, G), Mt(a - 3, 2)) + : 10 >= a + ? (ot(Ne, G), Mt(a - 3, 3)) + : (ot(Re, G), Mt(a - 11, 7)); + ((a = 0), (o = r), 0 == i ? ((s = 138), (u = 3)) : r == i ? ((s = 6), (u = 3)) : ((s = 7), (u = 4))); + } + }, + Tt = function () { + var e; + for (Et(K, V.max_code), Et(X, $.max_code), It(Z), e = Pe - 1; e >= 3 && 0 == G[Ye[e]].dl; e--); + return ((pe += 3 * (e + 1) + 5 + 5 + 4), e); + }, + At = function (e, t, n) { + var r; + for (Mt(e - 257, 5), Mt(t - 1, 5), Mt(n - 4, 4), r = 0; n > r; r++) Mt(G[Ye[r]].dl, 3); + (Ut(K, e - 1), Ut(X, t - 1)); + }, + kt = function (e) { + var t, i, a, s; + if ( + ((s = N - S), + (ue[de] = fe), + It(V), + It($), + (a = Tt()), + (t = (pe + 3 + 7) >> 3), + (i = (he + 3 + 7) >> 3), + t >= i && (t = i), + t >= s + 4 && S >= 0) + ) { + var u; + for (Mt((n << 1) + e, 3), Ct(), nt(s), nt(~s), u = 0; s > u; u++) tt(U[S + u]); + } else + i == t + ? (Mt((r << 1) + e, 3), xt(J, Y)) + : (Mt((o << 1) + e, 3), At(V.max_code + 1, $.max_code + 1, a + 1), xt(K, X)); + (vt(), 0 != e && Ct()); + }, + Ot = function (e, t) { + if ( + ((A[le++] = t), + 0 == e ? K[t].fc++ : (e--, K[oe[t] + Me + 1].fc++, X[it(e)].fc++, (T[ce++] = e), (fe |= me)), + (me <<= 1), + 0 == (7 & le) && ((ue[de++] = fe), (fe = 0), (me = 1)), + q > 2 && 0 == (4095 & le)) + ) { + var n, + r = 8 * le, + o = N - S; + for (n = 0; Le > n; n++) r += X[n].fc * (5 + Xe[n]); + if (((r >>= 3), ce < parseInt(le / 2) && r < parseInt(o / 2))) return !0; + } + return le == p - 1 || ce == be; + }, + xt = function (e, t) { + var n, + r, + o, + i, + a = 0, + s = 0, + u = 0, + l = 0; + if (0 != le) + do + (0 == (7 & a) && (l = ue[u++]), + (r = 255 & A[a++]), + 0 == (1 & l) + ? ot(r, e) + : ((o = oe[r]), + ot(o + Me + 1, e), + (i = Ke[o]), + 0 != i && ((r -= ae[o]), Mt(r, i)), + (n = T[s++]), + (o = it(n)), + ot(o, t), + (i = Xe[o]), + 0 != i && ((n -= se[o]), Mt(n, i))), + (l >>= 1)); + while (le > a); + ot(_e, e); + }, + St = 16, + Mt = function (e, t) { + x > St - t ? ((O |= e << x), nt(O), (O = e >> (St - x)), (x += t - St)) : ((O |= e << x), (x += t)); + }, + _t = function (e, t) { + var n = 0; + do ((n |= 1 & e), (e >>= 1), (n <<= 1)); + while (--t > 0); + return n >> 1; + }, + Ct = function () { + (x > 8 ? nt(O) : x > 0 && tt(O), (O = 0), (x = 0)); + }, + Lt = function () { + if (0 != w) { + var e, t; + for (e = Ze(), null == v ? (v = b = e) : (b = b.next = e), e.len = w - I, t = 0; t < e.len; t++) + e.ptr[t] = ze[I + t]; + w = I = 0; + } + }, + Pt = function (e, t) { + var n, r; + ((ye = e), (ve = 0), 'undefined' == typeof t && (t = i), Ve(t)); + for (var o = new Array(1024), a = []; (n = pt(o, 0, o.length)) > 0; ) { + var s = new Array(n); + for (r = 0; n > r; r++) s[r] = String.fromCharCode(o[r]); + a[a.length] = s.join(''); + } + return ((ye = null), a.join('')); + }; + (e.RawDeflate || (e.RawDeflate = {}), (e.RawDeflate.deflate = Pt)); + })(this), + (function (e) { + var t, + n, + r, + o, + i, + a, + s, + u, + l, + c, + d, + f, + m, + p, + h, + y, + v, + b = 32768, + g = 0, + w = 9, + I = 6, + E = null, + U = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535), + T = new Array( + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 13, + 15, + 17, + 19, + 23, + 27, + 31, + 35, + 43, + 51, + 59, + 67, + 83, + 99, + 115, + 131, + 163, + 195, + 227, + 258, + 0, + 0 + ), + A = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99), + k = new Array( + 1, + 2, + 3, + 4, + 5, + 7, + 9, + 13, + 17, + 25, + 33, + 49, + 65, + 97, + 129, + 193, + 257, + 385, + 513, + 769, + 1025, + 1537, + 2049, + 3073, + 4097, + 6145, + 8193, + 12289, + 16385, + 24577 + ), + O = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13), + x = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15), + S = function () { + ((this.next = null), (this.list = null)); + }, + M = function () { + ((this.e = 0), (this.b = 0), (this.n = 0), (this.t = null)); + }, + _ = function (e, t, n, r, o, i) { + ((this.BMAX = 16), (this.N_MAX = 288), (this.status = 0), (this.root = null), (this.m = 0)); + var a, + s, + u, + l, + c, + d, + f, + m, + p, + h, + y, + v, + b, + g, + w, + I, + E, + U = new Array(this.BMAX + 1), + T = new Array(this.BMAX + 1), + A = new M(), + k = new Array(this.BMAX), + O = new Array(this.N_MAX), + x = new Array(this.BMAX + 1); + for (E = this.root = null, d = 0; d < U.length; d++) U[d] = 0; + for (d = 0; d < T.length; d++) T[d] = 0; + for (d = 0; d < k.length; d++) k[d] = null; + for (d = 0; d < O.length; d++) O[d] = 0; + for (d = 0; d < x.length; d++) x[d] = 0; + ((s = t > 256 ? e[256] : this.BMAX), (p = e), (h = 0), (d = t)); + do (U[p[h]]++, h++); + while (--d > 0); + if (U[0] == t) return ((this.root = null), (this.m = 0), void (this.status = 0)); + for (f = 1; f <= this.BMAX && 0 == U[f]; f++); + for (m = f, f > i && (i = f), d = this.BMAX; 0 != d && 0 == U[d]; d--); + for (l = d, i > d && (i = d), g = 1 << f; d > f; f++, g <<= 1) + if ((g -= U[f]) < 0) return ((this.status = 2), void (this.m = i)); + if ((g -= U[d]) < 0) return ((this.status = 2), void (this.m = i)); + for (U[d] += g, x[1] = f = 0, p = U, h = 1, b = 2; --d > 0; ) x[b++] = f += p[h++]; + ((p = e), (h = 0), (d = 0)); + do 0 != (f = p[h++]) && (O[x[f]++] = d); + while (++d < t); + for (t = x[l], x[0] = d = 0, p = O, h = 0, c = -1, v = T[0] = 0, y = null, w = 0; l >= m; m++) + for (a = U[m]; a-- > 0; ) { + for (; m > v + T[1 + c]; ) { + if (((v += T[1 + c]), c++, (w = (w = l - v) > i ? i : w), (u = 1 << (f = m - v)) > a + 1)) + for (u -= a + 1, b = m; ++f < w && !((u <<= 1) <= U[++b]); ) u -= U[b]; + for (v + f > s && s > v && (f = s - v), w = 1 << f, T[1 + c] = f, y = new Array(w), I = 0; w > I; I++) + y[I] = new M(); + ((E = null == E ? (this.root = new S()) : (E.next = new S())), + (E.next = null), + (E.list = y), + (k[c] = y), + c > 0 && + ((x[c] = d), + (A.b = T[c]), + (A.e = 16 + f), + (A.t = y), + (f = (d & ((1 << v) - 1)) >> (v - T[c])), + (k[c - 1][f].e = A.e), + (k[c - 1][f].b = A.b), + (k[c - 1][f].n = A.n), + (k[c - 1][f].t = A.t))); + } + for ( + A.b = m - v, + h >= t + ? (A.e = 99) + : p[h] < n + ? ((A.e = p[h] < 256 ? 16 : 15), (A.n = p[h++])) + : ((A.e = o[p[h] - n]), (A.n = r[p[h++] - n])), + u = 1 << (m - v), + f = d >> v; + w > f; + f += u + ) + ((y[f].e = A.e), (y[f].b = A.b), (y[f].n = A.n), (y[f].t = A.t)); + for (f = 1 << (m - 1); 0 != (d & f); f >>= 1) d ^= f; + for (d ^= f; (d & ((1 << v) - 1)) != x[c]; ) ((v -= T[c]), c--); + } + ((this.m = T[1]), (this.status = 0 != g && 1 != l ? 1 : 0)); + }, + C = function () { + return y.length == v ? -1 : 255 & y.charCodeAt(v++); + }, + L = function (e) { + for (; e > s; ) ((a |= C() << s), (s += 8)); + }, + P = function (e) { + return a & U[e]; + }, + D = function (e) { + ((a >>= e), (s -= e)); + }, + N = function (e, r, o) { + var i, a, s; + if (0 == o) return 0; + for (s = 0; ; ) { + for (L(p), a = f.list[P(p)], i = a.e; i > 16; ) { + if (99 == i) return -1; + (D(a.b), (i -= 16), L(i), (a = a.t[P(i)]), (i = a.e)); + } + if ((D(a.b), 16 != i)) { + if (15 == i) break; + for (L(i), c = a.n + P(i), D(i), L(h), a = m.list[P(h)], i = a.e; i > 16; ) { + if (99 == i) return -1; + (D(a.b), (i -= 16), L(i), (a = a.t[P(i)]), (i = a.e)); + } + for (D(a.b), L(i), d = n - a.n - P(i), D(i); c > 0 && o > s; ) + (c--, (d &= b - 1), (n &= b - 1), (e[r + s++] = t[n++] = t[d++])); + if (s == o) return o; + } else if (((n &= b - 1), (e[r + s++] = t[n++] = a.n), s == o)) return o; + } + return ((u = -1), s); + }, + R = function (e, r, o) { + var i; + if (((i = 7 & s), D(i), L(16), (i = P(16)), D(16), L(16), i != (65535 & ~a))) return -1; + for (D(16), c = i, i = 0; c > 0 && o > i; ) (c--, (n &= b - 1), L(8), (e[r + i++] = t[n++] = P(8)), D(8)); + return (0 == c && (u = -1), i); + }, + j = function (e, t, n) { + if (null == E) { + var a, + s, + u = new Array(288); + for (a = 0; 144 > a; a++) u[a] = 8; + for (; 256 > a; a++) u[a] = 9; + for (; 280 > a; a++) u[a] = 7; + for (; 288 > a; a++) u[a] = 8; + if (((o = 7), (s = new _(u, 288, 257, T, A, o)), 0 != s.status)) + return (alert('HufBuild error: ' + s.status), -1); + for (E = s.root, o = s.m, a = 0; 30 > a; a++) u[a] = 5; + if (((i = 5), (s = new _(u, 30, 0, k, O, i)), s.status > 1)) + return ((E = null), alert('HufBuild error: ' + s.status), -1); + ((r = s.root), (i = s.m)); + } + return ((f = E), (m = r), (p = o), (h = i), N(e, t, n)); + }, + B = function (e, t, n) { + var r, + o, + i, + a, + s, + u, + l, + c, + d, + y = new Array(316); + for (r = 0; r < y.length; r++) y[r] = 0; + if ((L(5), (l = 257 + P(5)), D(5), L(5), (c = 1 + P(5)), D(5), L(4), (u = 4 + P(4)), D(4), l > 286 || c > 30)) + return -1; + for (o = 0; u > o; o++) (L(3), (y[x[o]] = P(3)), D(3)); + for (; 19 > o; o++) y[x[o]] = 0; + if (((p = 7), (d = new _(y, 19, 19, null, null, p)), 0 != d.status)) return -1; + for (f = d.root, p = d.m, a = l + c, r = i = 0; a > r; ) + if ((L(p), (s = f.list[P(p)]), (o = s.b), D(o), (o = s.n), 16 > o)) y[r++] = i = o; + else if (16 == o) { + if ((L(2), (o = 3 + P(2)), D(2), r + o > a)) return -1; + for (; o-- > 0; ) y[r++] = i; + } else if (17 == o) { + if ((L(3), (o = 3 + P(3)), D(3), r + o > a)) return -1; + for (; o-- > 0; ) y[r++] = 0; + i = 0; + } else { + if ((L(7), (o = 11 + P(7)), D(7), r + o > a)) return -1; + for (; o-- > 0; ) y[r++] = 0; + i = 0; + } + if (((p = w), (d = new _(y, l, 257, T, A, p)), 0 == p && (d.status = 1), 0 != d.status)) + return (1 == d.status, -1); + for (f = d.root, p = d.m, r = 0; c > r; r++) y[r] = y[r + l]; + return ( + (h = I), + (d = new _(y, c, 0, k, O, h)), + (m = d.root), + (h = d.m), + 0 == h && l > 257 ? -1 : (1 == d.status, 0 != d.status ? -1 : N(e, t, n)) + ); + }, + z = function () { + (null == t && (t = new Array(2 * b)), (n = 0), (a = 0), (s = 0), (u = -1), (l = !1), (c = d = 0), (f = null)); + }, + F = function (e, r, o) { + var i, a; + for (i = 0; o > i; ) { + if (l && -1 == u) return i; + if (c > 0) { + if (u != g) for (; c > 0 && o > i; ) (c--, (d &= b - 1), (n &= b - 1), (e[r + i++] = t[n++] = t[d++])); + else { + for (; c > 0 && o > i; ) (c--, (n &= b - 1), L(8), (e[r + i++] = t[n++] = P(8)), D(8)); + 0 == c && (u = -1); + } + if (i == o) return i; + } + if (-1 == u) { + if (l) break; + (L(1), 0 != P(1) && (l = !0), D(1), L(2), (u = P(2)), D(2), (f = null), (c = 0)); + } + switch (u) { + case 0: + a = R(e, r + i, o - i); + break; + case 1: + a = null != f ? N(e, r + i, o - i) : j(e, r + i, o - i); + break; + case 2: + a = null != f ? N(e, r + i, o - i) : B(e, r + i, o - i); + break; + default: + a = -1; + } + if (-1 == a) return l ? 0 : -1; + i += a; + } + return i; + }, + q = function (e) { + var t, n; + (z(), (y = e), (v = 0)); + for (var r = new Array(1024), o = []; (t = F(r, 0, r.length)) > 0; ) { + var i = new Array(t); + for (n = 0; t > n; n++) i[n] = String.fromCharCode(r[n]); + o[o.length] = i.join(''); + } + return ((y = null), o.join('')); + }; + (e.RawDeflate || (e.RawDeflate = {}), (e.RawDeflate.inflate = q)); + })(this), + 'object' != typeof JSON && (JSON = {}), + (function () { + 'use strict'; + function f(e) { + return 10 > e ? '0' + e : e; + } + function this_value() { + return this.valueOf(); + } + function quote(e) { + return ( + (escapable.lastIndex = 0), + escapable.test(e) + ? '"' + + e.replace(escapable, function (e) { + var t = meta[e]; + return 'string' == typeof t ? t : '\\u' + ('0000' + e.charCodeAt(0).toString(16)).slice(-4); + }) + + '"' + : '"' + e + '"' + ); + } + function str(e, t) { + var n, + r, + o, + i, + a, + s = gap, + u = t[e]; + switch ( + (u && 'object' == typeof u && 'function' == typeof u.toJSON && (u = u.toJSON(e)), + 'function' == typeof rep && (u = rep.call(t, e, u)), + typeof u) + ) { + case 'string': + return quote(u); + case 'number': + return isFinite(u) ? String(u) : 'null'; + case 'boolean': + case 'null': + return String(u); + case 'object': + if (!u) return 'null'; + if (((gap += indent), (a = []), '[object Array]' === Object.prototype.toString.apply(u))) { + for (i = u.length, n = 0; i > n; n += 1) a[n] = str(n, u) || 'null'; + return ( + (o = + 0 === a.length + ? '[]' + : gap + ? '[\n' + gap + a.join(',\n' + gap) + '\n' + s + ']' + : '[' + a.join(',') + ']'), + (gap = s), + o + ); + } + if (rep && 'object' == typeof rep) + for (i = rep.length, n = 0; i > n; n += 1) + 'string' == typeof rep[n] && + ((r = rep[n]), (o = str(r, u)), o && a.push(quote(r) + (gap ? ': ' : ':') + o)); + else + for (r in u) + Object.prototype.hasOwnProperty.call(u, r) && + ((o = str(r, u)), o && a.push(quote(r) + (gap ? ': ' : ':') + o)); + return ( + (o = + 0 === a.length + ? '{}' + : gap + ? '{\n' + gap + a.join(',\n' + gap) + '\n' + s + '}' + : '{' + a.join(',') + '}'), + (gap = s), + o + ); + } + } + 'function' != typeof Date.prototype.toJSON && + ((Date.prototype.toJSON = function () { + return isFinite(this.valueOf()) + ? this.getUTCFullYear() + + '-' + + f(this.getUTCMonth() + 1) + + '-' + + f(this.getUTCDate()) + + 'T' + + f(this.getUTCHours()) + + ':' + + f(this.getUTCMinutes()) + + ':' + + f(this.getUTCSeconds()) + + 'Z' + : null; + }), + (Boolean.prototype.toJSON = this_value), + (Number.prototype.toJSON = this_value), + (String.prototype.toJSON = this_value)); + var cx, escapable, gap, indent, meta, rep; + ('function' != typeof JSON.stringify && + ((escapable = + /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g), + (meta = { '\b': '\\b', ' ': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }), + (JSON.stringify = function (e, t, n) { + var r; + if (((gap = ''), (indent = ''), 'number' == typeof n)) for (r = 0; n > r; r += 1) indent += ' '; + else 'string' == typeof n && (indent = n); + if (((rep = t), t && 'function' != typeof t && ('object' != typeof t || 'number' != typeof t.length))) + throw new Error('JSON.stringify'); + return str('', { '': e }); + })), + 'function' != typeof JSON.parse && + ((cx = + /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g), + (JSON.parse = function (text, reviver) { + function walk(e, t) { + var n, + r, + o = e[t]; + if (o && 'object' == typeof o) + for (n in o) + Object.prototype.hasOwnProperty.call(o, n) && + ((r = walk(o, n)), void 0 !== r ? (o[n] = r) : delete o[n]); + return reviver.call(e, t, o); + } + var j; + if ( + ((text = String(text)), + (cx.lastIndex = 0), + cx.test(text) && + (text = text.replace(cx, function (e) { + return '\\u' + ('0000' + e.charCodeAt(0).toString(16)).slice(-4); + })), + /^[\],:{}\s]*$/.test( + text + .replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, '') + )) + ) + return ((j = eval('(' + text + ')')), 'function' == typeof reviver ? walk({ '': j }, '') : j); + throw new SyntaxError('JSON.parse'); + }))); + })()); +var saveAs = + saveAs || + (function (e) { + 'use strict'; + if ('undefined' == typeof navigator || !/MSIE [1-9]\./.test(navigator.userAgent)) { + var t = e.document, + n = function () { + return e.URL || e.webkitURL || e; + }, + r = t.createElementNS('http://www.w3.org/1999/xhtml', 'a'), + o = 'download' in r, + i = function (e) { + var t = new MouseEvent('click'); + e.dispatchEvent(t); + }, + a = /Version\/[\d\.]+.*Safari/.test(navigator.userAgent), + s = e.webkitRequestFileSystem, + u = e.requestFileSystem || s || e.mozRequestFileSystem, + l = function (t) { + (e.setImmediate || e.setTimeout)(function () { + throw t; + }, 0); + }, + c = 'application/octet-stream', + d = 0, + f = 4e4, + m = function (e) { + var t = function () { + 'string' == typeof e ? n().revokeObjectURL(e) : e.remove(); + }; + setTimeout(t, f); + }, + p = function (e, t, n) { + t = [].concat(t); + for (var r = t.length; r--; ) { + var o = e['on' + t[r]]; + if ('function' == typeof o) + try { + o.call(e, n || e); + } catch (i) { + l(i); + } + } + }, + h = function (e) { + return /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type) + ? new Blob(['\ufeff', e], { type: e.type }) + : e; + }, + y = function (t, l, f) { + f || (t = h(t)); + var y, + v, + b, + g = this, + w = t.type, + I = !1, + E = function () { + p(g, 'writestart progress write writeend'.split(' ')); + }, + U = function () { + if (v && a && 'undefined' != typeof FileReader) { + var r = new FileReader(); + return ( + (r.onloadend = function () { + var e = r.result; + ((v.location.href = 'data:attachment/file' + e.slice(e.search(/[,;]/))), + (g.readyState = g.DONE), + E()); + }), + r.readAsDataURL(t), + void (g.readyState = g.INIT) + ); + } + if (((!I && y) || (y = n().createObjectURL(t)), v)) v.location.href = y; + else { + var o = e.open(y, '_blank'); + void 0 === o && a && (e.location.href = y); + } + ((g.readyState = g.DONE), E(), m(y)); + }, + T = function (e) { + return function () { + return g.readyState !== g.DONE ? e.apply(this, arguments) : void 0; + }; + }, + A = { create: !0, exclusive: !1 }; + return ( + (g.readyState = g.INIT), + l || (l = 'download'), + o + ? ((y = n().createObjectURL(t)), + void setTimeout(function () { + ((r.href = y), (r.download = l), i(r), E(), m(y), (g.readyState = g.DONE)); + })) + : (e.chrome && w && w !== c && ((b = t.slice || t.webkitSlice), (t = b.call(t, 0, t.size, c)), (I = !0)), + s && 'download' !== l && (l += '.download'), + (w === c || s) && (v = e), + u + ? ((d += t.size), + void u( + e.TEMPORARY, + d, + T(function (e) { + e.root.getDirectory( + 'saved', + A, + T(function (e) { + var n = function () { + e.getFile( + l, + A, + T(function (e) { + e.createWriter( + T(function (n) { + ((n.onwriteend = function (t) { + ((v.location.href = e.toURL()), + (g.readyState = g.DONE), + p(g, 'writeend', t), + m(e)); + }), + (n.onerror = function () { + var e = n.error; + e.code !== e.ABORT_ERR && U(); + }), + 'writestart progress write abort'.split(' ').forEach(function (e) { + n['on' + e] = g['on' + e]; + }), + n.write(t), + (g.abort = function () { + (n.abort(), (g.readyState = g.DONE)); + }), + (g.readyState = g.WRITING)); + }), + U + ); + }), + U + ); + }; + e.getFile( + l, + { create: !1 }, + T(function (e) { + (e.remove(), n()); + }), + T(function (e) { + e.code === e.NOT_FOUND_ERR ? n() : U(); + }) + ); + }), + U + ); + }), + U + )) + : void U()) + ); + }, + v = y.prototype, + b = function (e, t, n) { + return new y(e, t, n); + }; + return 'undefined' != typeof navigator && navigator.msSaveOrOpenBlob + ? function (e, t, n) { + return (n || (e = h(e)), navigator.msSaveOrOpenBlob(e, t || 'download')); + } + : ((v.abort = function () { + var e = this; + ((e.readyState = e.DONE), p(e, 'abort')); + }), + (v.readyState = v.INIT = 0), + (v.WRITING = 1), + (v.DONE = 2), + (v.error = v.onwritestart = v.onprogress = v.onwrite = v.onabort = v.onerror = v.onwriteend = null), + b); + } + })(('undefined' != typeof self && self) || ('undefined' != typeof window && window) || this.content); +('undefined' != typeof module && module.exports + ? (module.exports.saveAs = saveAs) + : 'undefined' != typeof define && + null !== define && + null !== define.amd && + define([], function () { + return saveAs; + }), + String.prototype.endsWithAny || + (String.prototype.endsWithAny = function () { + for (var e = Array.prototype.slice.call(arguments), t = this.toLowerCase().toString(), n = 0; n < e.length; n++) + if (-1 !== t.indexOf(e[n], t.length - e[n].length)) return !0; + return !1; + })); +var saveTextAs = + saveTextAs || + function (e, t, n) { + if (((t = t || 'download.txt'), (n = n || 'utf-8'), (e = (e || '').replace(/\r?\n/g, '\r\n')), saveAs && Blob)) { + var r = new Blob([e], { type: 'text/plain;charset=' + n }); + return (saveAs(r, t), !0); + } + var o = window.frames.saveTxtWindow; + if ( + !o && + ((o = document.createElement('iframe')), + (o.id = 'saveTxtWindow'), + (o.style.display = 'none'), + document.body.insertBefore(o, null), + (o = window.frames.saveTxtWindow), + !o && ((o = window.open('', '_temp', 'width=100,height=100')), !o)) + ) + return (window.alert('Sorry, download file could not be created.'), !1); + var i = o.document; + (i.open('text/plain', 'replace'), + (i.charset = n), + t.endsWithAny('.htm', '.html') + ? (i.close(), (i.body.innerHTML = '\r\n' + e + '\r\n')) + : (t.endsWithAny('.txt') || (t += '.txt'), i.write(e), i.close())); + var a = i.execCommand('SaveAs', null, t); + return (o.close(), a); + }; +(!(function (e) { + 'use strict'; + if (((e.URL = e.URL || e.webkitURL), e.Blob && e.URL)) + try { + return void new Blob(); + } catch (t) {} + var n = + e.BlobBuilder || + e.WebKitBlobBuilder || + e.MozBlobBuilder || + (function (e) { + var t = function (e) { + return Object.prototype.toString.call(e).match(/^\[object\s(.*)\]$/)[1]; + }, + n = function () { + this.data = []; + }, + r = function (e, t, n) { + ((this.data = e), (this.size = e.length), (this.type = t), (this.encoding = n)); + }, + o = n.prototype, + i = r.prototype, + a = e.FileReaderSync, + s = function (e) { + this.code = this[(this.name = e)]; + }, + u = + 'NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR'.split( + ' ' + ), + l = u.length, + c = e.URL || e.webkitURL || e, + d = c.createObjectURL, + f = c.revokeObjectURL, + m = c, + p = e.btoa, + h = e.atob, + y = e.ArrayBuffer, + v = e.Uint8Array, + b = /^[\w-]+:\/*\[?[\w\.:-]+\]?(?::[0-9]+)?/; + for (r.fake = i.fake = !0; l--; ) s.prototype[u[l]] = l + 1; + return ( + c.createObjectURL || + (m = e.URL = + function (e) { + var t, + n = document.createElementNS('http://www.w3.org/1999/xhtml', 'a'); + return ( + (n.href = e), + 'origin' in n || + ('data:' === n.protocol.toLowerCase() + ? (n.origin = null) + : ((t = e.match(b)), (n.origin = t && t[1]))), + n + ); + }), + (m.createObjectURL = function (e) { + var t, + n = e.type; + return ( + null === n && (n = 'application/octet-stream'), + e instanceof r + ? ((t = 'data:' + n), + 'base64' === e.encoding + ? t + ';base64,' + e.data + : 'URI' === e.encoding + ? t + ',' + decodeURIComponent(e.data) + : p + ? t + ';base64,' + p(e.data) + : t + ',' + encodeURIComponent(e.data)) + : d + ? d.call(c, e) + : void 0 + ); + }), + (m.revokeObjectURL = function (e) { + 'data:' !== e.substring(0, 5) && f && f.call(c, e); + }), + (o.append = function (e) { + var n = this.data; + if (v && (e instanceof y || e instanceof v)) { + for (var o = '', i = new v(e), u = 0, l = i.length; l > u; u++) o += String.fromCharCode(i[u]); + n.push(o); + } else if ('Blob' === t(e) || 'File' === t(e)) { + if (!a) throw new s('NOT_READABLE_ERR'); + var c = new a(); + n.push(c.readAsBinaryString(e)); + } else + e instanceof r + ? 'base64' === e.encoding && h + ? n.push(h(e.data)) + : 'URI' === e.encoding + ? n.push(decodeURIComponent(e.data)) + : 'raw' === e.encoding && n.push(e.data) + : ('string' != typeof e && (e += ''), n.push(unescape(encodeURIComponent(e)))); + }), + (o.getBlob = function (e) { + return (arguments.length || (e = null), new r(this.data.join(''), e, 'raw')); + }), + (o.toString = function () { + return '[object BlobBuilder]'; + }), + (i.slice = function (e, t, n) { + var o = arguments.length; + return (3 > o && (n = null), new r(this.data.slice(e, o > 1 ? t : this.data.length), n, this.encoding)); + }), + (i.toString = function () { + return '[object Blob]'; + }), + (i.close = function () { + ((this.size = 0), delete this.data); + }), + n + ); + })(e); + e.Blob = function (e, t) { + var r = t ? t.type || '' : '', + o = new n(); + if (e) + for (var i = 0, a = e.length; a > i; i++) + Uint8Array && e[i] instanceof Uint8Array ? o.append(e[i].buffer) : o.append(e[i]); + var s = o.getBlob(r); + return (!s.slice && s.webkitSlice && (s.slice = s.webkitSlice), s); + }; + var r = + Object.getPrototypeOf || + function (e) { + return e.__proto__; + }; + e.Blob.prototype = r(new e.Blob()); +})(('undefined' != typeof self && self) || ('undefined' != typeof window && window) || this.content || this), + (function (e, t) { + function n(n, l, c) { + var m = []; + l = 1 == l ? { entropy: !0 } : l || {}; + var b = a(i(l.entropy ? [n, u(e)] : null == n ? s() : n, 3), m), + g = new r(m), + w = function () { + for (var e = g.g(f), t = h, n = 0; y > e; ) ((e = (e + n) * d), (t *= d), (n = g.g(1))); + for (; e >= v; ) ((e /= 2), (t /= 2), (n >>>= 1)); + return (e + n) / t; + }; + return ( + (w.int32 = function () { + return 0 | g.g(4); + }), + (w.quick = function () { + return g.g(4) / (4 * (1 << 30)); + }), + (w['double'] = w), + a(u(g.S), e), + ( + l.pass || + c || + function (e, n, r, i) { + return ( + i && + (i.S && o(i, g), + (e.state = function () { + return o(g, {}); + })), + r ? ((t[p] = e), n) : e + ); + } + )(w, b, 'global' in l ? l.global : this == t, l.state) + ); + } + function r(e) { + var t, + n = e.length, + r = this, + o = 0, + i = (r.i = r.j = 0), + a = (r.S = []); + for (n || (e = [n++]); d > o; ) a[o] = o++; + for (o = 0; d > o; o++) ((a[o] = a[(i = b & (i + e[o % n] + (t = a[o])))]), (a[i] = t)); + (r.g = function (e) { + for (var t, n = 0, o = r.i, i = r.j, a = r.S; e--; ) + ((t = a[(o = b & (o + 1))]), (n = n * d + a[b & ((a[o] = a[(i = b & (i + t))]) + (a[i] = t))])); + return ((r.i = o), (r.j = i), n); + })(d); + } + function o(e, t) { + return ((t.i = e.i), (t.j = e.j), (t.S = e.S.slice()), t); + } + function i(e, t) { + var n, + r = [], + o = typeof e; + if (t && 'object' == o) + for (n in e) + try { + r.push(i(e[n], t - 1)); + } catch (a) {} + return r.length ? r : 'string' == o ? e : e + '\x00'; + } + function a(e, t) { + for (var n, r = e + '', o = 0; o < r.length; ) t[b & o] = b & ((n ^= 19 * t[b & o]) + r.charCodeAt(o++)); + return u(t); + } + function s() { + try { + if (l) return u(l.randomBytes(d)); + var t = new Uint8Array(d); + return (c.crypto.getRandomValues(t), u(t)); + } catch (n) { + var r = c.navigator, + o = r && r.plugins; + return [+new Date(), c, o, c.screen, u(e)]; + } + } + function u(e) { + return String.fromCharCode.apply(0, e); + } + var l, + c = this, + d = 256, + f = 6, + m = 52, + p = 'random', + h = t.pow(d, f), + y = t.pow(2, m), + v = 2 * y, + b = d - 1; + if (((t['seed' + p] = n), a(t.random(), e), 'object' == typeof module && module.exports)) { + module.exports = n; + try { + l = require('crypto'); + } catch (g) {} + } else + 'function' == typeof define && + define.amd && + define(function () { + return n; + }); + })([], Math), + Math.seedrandom('TestMyBrain'), + (function (e, t) { + 'use strict'; + function n(e) { + return ((p[m] = r.apply(t, e)), m++); + } + function r(e) { + var n = [].slice.call(arguments, 1); + return function () { + 'function' == typeof e ? e.apply(t, n) : new Function('' + e)(); + }; + } + function o(e) { + if (h) setTimeout(r(o, e), 0); + else { + var t = p[e]; + if (t) { + h = !0; + try { + t(); + } finally { + (i(e), (h = !1)); + } + } + } + } + function i(e) { + delete p[e]; + } + function a() { + f = function () { + var e = n(arguments); + return (process.nextTick(r(o, e)), e); + }; + } + function s() { + if (e.postMessage && !e.importScripts) { + var t = !0, + n = e.onmessage; + return ( + (e.onmessage = function () { + t = !1; + }), + e.postMessage('', '*'), + (e.onmessage = n), + t + ); + } + } + function u() { + var t = 'setImmediate$' + Math.random() + '$', + r = function (n) { + n.source === e && 'string' == typeof n.data && 0 === n.data.indexOf(t) && o(+n.data.slice(t.length)); + }; + (e.addEventListener ? e.addEventListener('message', r, !1) : e.attachEvent('onmessage', r), + (f = function () { + var r = n(arguments); + return (e.postMessage(t + r, '*'), r); + })); + } + function l() { + var e = new MessageChannel(); + ((e.port1.onmessage = function (e) { + var t = e.data; + o(t); + }), + (f = function () { + var t = n(arguments); + return (e.port2.postMessage(t), t); + })); + } + function c() { + var e = y.documentElement; + f = function () { + var t = n(arguments), + r = y.createElement('script'); + return ( + (r.onreadystatechange = function () { + (o(t), (r.onreadystatechange = null), e.removeChild(r), (r = null)); + }), + e.appendChild(r), + t + ); + }; + } + function d() { + f = function () { + var e = n(arguments); + return (setTimeout(r(o, e), 0), e); + }; + } + if (!e.setImmediate) { + var f, + m = 1, + p = {}, + h = !1, + y = e.document, + v = Object.getPrototypeOf && Object.getPrototypeOf(e); + ((v = v && v.setTimeout ? v : e), + '[object process]' === {}.toString.call(e.process) + ? a() + : s() + ? u() + : e.MessageChannel + ? l() + : y && 'onreadystatechange' in y.createElement('script') + ? c() + : d(), + (v.setImmediate = f), + (v.clearImmediate = i)); + } + })(new Function('return this')()), + Array.prototype.shuffle || + (Array.prototype.shuffle = function () { + for ( + var e, t, n = this.length; + n; + e = parseInt(Math.random() * n), t = this[--n], this[n] = this[e], this[e] = t + ); + return this; + }), + Array.prototype.random || + (Array.prototype.random = function () { + return this[randInt(this.length)]; + }), + Array.prototype.invoke || + (Array.prototype.invoke = function (e) { + var t = this.length >>> 0; + if ('function' != typeof e) throw new TypeError('Argument is not a function.', 'Array.prototype.invoke'); + for (var n = arguments[1], r = [], o = 0; t > o; o++) o in this && r.push(e.call(n, this[o])); + return r; + }), + Array.prototype.pluck || + (Array.prototype.pluck = function (e) { + 'use strict'; + if (!e || 'string' != typeof e) throw new TypeError('Argument must be a string.'); + return this.map(function (t) { + var n; + return (n = void 0 !== t[e] ? ('function' == typeof t[e] ? t[e]() : t[e]) : void 0); + }); + }), + Array.prototype.unique || + (Array.prototype.unique = function () { + 'use strict'; + return this.reduce(function (e, t) { + return (-1 === e.indexOf(t) && e.push(t), e); + }, []); + }), + Array.prototype.includes || + (Array.prototype.includes = function (e) { + 'use strict'; + var t = Object(this), + n = parseInt(t.length) || 0; + if (0 === n) return !1; + var r, + o = parseInt(arguments[1]) || 0; + o >= 0 ? (r = o) : ((r = n + o), 0 > r && (r = 0)); + for (var i; n > r; ) { + if (((i = t[r]), e === i || (e !== e && i !== i))) return !0; + r++; + } + return !1; + }), + Array.prototype.contains || (Array.prototype.contains = Array.prototype.includes), + Array.prototype.fill || + (Array.prototype.fill = function (e) { + if (null === this) throw new TypeError("'this' is null or not defined"); + for ( + var t = Object(this), + n = t.length >>> 0, + r = arguments[1], + o = r >> 0, + i = 0 > o ? Math.max(n + o, 0) : Math.min(o, n), + a = arguments[2], + s = void 0 === a ? n : a >> 0, + u = 0 > s ? Math.max(n + s, 0) : Math.min(s, n); + u > i; + ) + ((t[i] = e), i++); + return t; + }), + Array.prototype.flatten || + (Array.prototype.flatten = function e() { + for (var t = [], n = 0, r = this.length; r > n; n++) { + var o = Object.prototype.toString.call(this[n]).split(' ').pop().split(']').shift().toLowerCase(); + o && (t = t.concat(/^(array|collection|arguments)$/.test(o) ? e.call(this[n]) : this[n])); + } + return t; + }), + Array.prototype.partition || + (Array.prototype.partition = function (e) { + if ('function' != typeof e) throw new TypeError('Argument of Array.prototype.partition must be a function.'); + for (var t, n = [], r = [], o = 0, i = this.length; i > o; o++) ((t = this[o]), e(t) ? n.push(t) : r.push(t)); + return [n, r]; + }), + Array.prototype.zip || + (Array.prototype.zip = function (e) { + var t = []; + if (e.length !== this.length) throw new TypeError('Array.prototype.zip: arrays must be equal length'); + for (var n = 0, r = this.length; r > n; n++) t.push([this[n], e[n]]); + return t; + }), + Array.prototype.sum || + (Array.prototype.sum = function () { + for (var e = this.length, t = 0; e--; ) t += this[e]; + return t; + }), + Array.prototype.average || + (Array.prototype.average = function () { + return this.length ? this.sum() / this.length : null; + }), + Array.prototype.variance || + (Array.prototype.variance = function () { + if (!this.length) return null; + var e, + t, + n, + r, + o = 0, + i = 0; + for (t = this.average(), n = this.length, e = 0; n > e; e++) ((r = this[e] - t), (o += r * r), (i += r)); + return ((i *= i / n), (o - i) / (n - 1)); + }), + Array.prototype.sd || + (Array.prototype.sd = function () { + if (!this.length) return null; + var e = this.variance(); + return Math.sqrt(e); + }), + Array.prototype.median || + (Array.prototype.median = function () { + if (!this.length) return null; + var e = this.slice(), + t = Math.floor(e.length / 2); + return ( + e.sort(function (e, t) { + return e - t; + }), + e.length % 2 === 1 ? e[t] : (e[t - 1] + e[t]) / 2 + ); + })); +var tmbObjs = { params: {}, elements: {}, frames: {}, slides: {} }; +tmbObjs.params = location.href.split('?')[1] + ? location.href + .split('?')[1] + .split('&') + .reduce(function (e, t) { + return ((e[t.split('=')[0]] = t.split('=')[1]), e); + }, {}) + : {}; +var zen = tmbObjs, + hasTouch = 'ontouchend' in window || navigator.maxTouchPoints || navigator.msMaxTouchPoints || !1, + hasPointer = window.PointerEvent || window.MSPointerEvent || !1; +(!(function () { + for ( + var e, + t = function () {}, + n = [ + 'assert', + 'clear', + 'count', + 'debug', + 'dir', + 'dirxml', + 'error', + 'exception', + 'group', + 'groupCollapsed', + 'groupEnd', + 'info', + 'log', + 'markTimeline', + 'profile', + 'profileEnd', + 'table', + 'time', + 'timeEnd', + 'timeline', + 'timelineEnd', + 'timeStamp', + 'trace', + 'warn' + ], + r = n.length, + o = (window.console = window.console || {}); + r--; + ) + ((e = n[r]), o[e] || (o[e] = t)); +})(), + (function () { + var e, t; + document.createElement && + (e = document.createElement('div')) && + ((e.id = '____loading_slide'), + (e.style.display = 'none'), + (e.style.textAlign = 'center'), + (e.style.paddingTop = '40px'), + (e.style.fontWeight = 'bold'), + (e.style.fontSize = 'x-large'), + (e.innerHTML = 'Working....'), + (t = setInterval(function () { + 'loading' !== document.readyState && (clearInterval(t), document.body.appendChild(e)); + }, 100)), + window.addEventListener( + 'beforeunload', + function () { + showFrame('____loading_slide'); + }, + !0 + )); + })()); +var $$$ = getID, + fixOrientation = fixMobileOrientation, + tmbUI = { + UIevents: [], + UIkeys: [], + UIelements: [], + highlight: '', + timeout: 1e4, + timeoutRef: 0, + onreadyUI: function () {}, + getInput: function () {}, + status: '', + message: '', + response: '', + downTimestamp: 0, + rt: 0, + upTimestamp: 0, + dwell: 0 + }; +tmbUI.getInput = function () { + function e(e) { + var t, n; + ((t = e), + t.preventDefault(), + t.stopPropagation(), + d === !1 && + (tmbUI.UIevents.includes('keys') && + 'keydown' === t.type && + ((n = t.charCode || t.keyCode), + (tmbUI.UIkeys.includes(n) || 0 === tmbUI.UIkeys.length) && + ((tmbUI.response = codeToKey(n)), + '' !== tmbUI.highlight && tmbUI.UIkeys.length > 0 && (a = getID(tmbUI.UIelements[tmbUI.UIkeys.indexOf(n)])), + (d = !0))), + tmbUI.UIevents.includes('clicks') && + ('mousedown' === t.type || + ('pointerdown' === t.type && 'mouse' === t.pointerType) || + ('MSPointerDown' === t.type && t.pointerType === t.MSPOINTER_TYPE_MOUSE)) && + (0 === tmbUI.UIelements.length + ? (tmbUI.response = 'document') + : (tmbUI.response = t.target ? t.target.id : t.srcElement.id), + '' !== tmbUI.highlight && (a = getID(tmbUI.response)), + (d = !0)), + tmbUI.UIevents.includes('taps') && + (('touchstart' !== t.type && + ('pointerdown' !== t.type || ('touch' !== t.pointerType && 'pen' !== t.pointerType)) && + ('MSPointerDown' !== t.type || + (t.pointerType !== t.MSPOINTER_TYPE_TOUCH && t.pointerType !== t.MSPOINTER_TYPE_PEN))) || + (0 === tmbUI.UIelements.length + ? (tmbUI.response = 'document') + : (tmbUI.response = t.target ? t.target.id : t.srcElement.id), + '' !== tmbUI.highlight && (a = getID(tmbUI.response)), + (d = !0))), + d === !0 && + ((tmbUI.rt = c), + (c = now()), + (tmbUI.rt = c - tmbUI.rt), + (tmbUI.rt = tmbUI.rt.round(2)), + (tmbUI.downTimestamp = c), + tmbUI.timeoutRef && clearTimeout(tmbUI.timeoutRef), + a && + (['div', 'span', 'button', 'p', 'img'].includes(a.tagName.toLowerCase()) + ? ((s = a.style.border), (a.style.border = '5px solid ' + tmbUI.highlight)) + : ['circle', 'rect', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'image', 'text'].includes( + a.tagName.toLowerCase() + ) + ? ((u = a.style.stroke), + (l = a.style.strokeWidth), + (a.style.stroke = tmbUI.highlight), + (a.style.strokeWidth = 5)) + : ['shape'].includes(a.tagName.toLowerCase()) && + ((u = a.strokecolor), + (l = a.strokeweight), + (a.strokecolor = tmbUI.highlight), + (a.strokeweight = 5)))))); + } + function t(e) { + var t, + n = ['', '', 'touch', 'pen', 'mouse']; + ((t = e), + t.preventDefault(), + t.stopPropagation(), + d === !0 && + ((tmbUI.upTimestamp = now()), + (tmbUI.dwell = tmbUI.upTimestamp - c), + (tmbUI.dwell = tmbUI.dwell.round(2)), + (tmbUI.status = t.type), + 'pointerup' === t.type + ? (tmbUI.status += '-' + t.pointerType) + : 'MSPointerUp' === t.type && (tmbUI.status += '-' + n[t.pointerType]), + r(), + o())); + } + function n() { + if ( + (tmbUI.UIevents.includes('keys') && + (document.addEventListener('keydown', e, !0), document.addEventListener('keyup', t, !0)), + tmbUI.UIevents.includes('clicks')) + ) + if (0 === tmbUI.UIelements.length) + window.PointerEvent + ? (document.body.addEventListener('pointerdown', e, !0), document.body.addEventListener('pointerup', t, !0)) + : window.MSPointerEvent + ? (document.body.addEventListener('MSPointerDown', e, !0), + document.body.addEventListener('MSPointerUp', t, !0)) + : (document.addEventListener('mousedown', e, !0), document.addEventListener('mouseup', t, !0)); + else + for (i = 0; i < tmbUI.UIelements.length; i++) + window.PointerEvent + ? (getID(tmbUI.UIelements[i]).addEventListener('pointerdown', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('pointerup', t, !0)) + : window.MSPointerEvent + ? (getID(tmbUI.UIelements[i]).addEventListener('MSPointerDown', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('MSPointerUp', t, !0)) + : (getID(tmbUI.UIelements[i]).addEventListener('mousedown', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('mouseup', t, !0)); + if (tmbUI.UIevents.includes('taps')) + if (0 === tmbUI.UIelements.length) + window.PointerEvent && !tmbUI.UIevents.includes('clicks') + ? (document.addEventListener('pointerdown', e, !0), document.addEventListener('pointerup', t, !0)) + : window.MSPointerEvent && !tmbUI.UIevents.includes('clicks') + ? (document.addEventListener('MSPointerDown', e, !0), document.addEventListener('MSPointerUp', t, !0)) + : hasTouch && + !hasPointer && + (document.addEventListener('touchstart', e, !0), document.addEventListener('touchend', t, !0)); + else + for (i = 0; i < tmbUI.UIelements.length; i++) + window.PointerEvent && !tmbUI.UIevents.includes('clicks') + ? (getID(tmbUI.UIelements[i]).addEventListener('pointerdown', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('pointerup', t, !0)) + : window.MSPointerEvent && !tmbUI.UIevents.includes('clicks') + ? (getID(tmbUI.UIelements[i]).addEventListener('MSPointerDown', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('MSPointerUp', t, !0)) + : hasTouch && + !hasPointer && + (getID(tmbUI.UIelements[i]).addEventListener('touchstart', e, !0), + getID(tmbUI.UIelements[i]).addEventListener('touchend', t, !0)); + } + function r() { + if ( + (tmbUI.UIevents.includes('keys') && + (document.removeEventListener('keydown', e, !0), document.removeEventListener('keyup', t, !0)), + tmbUI.UIevents.includes('clicks')) + ) + if (0 === tmbUI.UIelements.length) + window.PointerEvent + ? (document.body.removeEventListener('pointerdown', e, !0), + document.body.removeEventListener('pointerup', t, !0)) + : window.MSPointerEvent + ? (document.body.removeEventListener('MSPointerDown', e, !0), + document.body.removeEventListener('MSPointerUp', t, !0)) + : (document.removeEventListener('mousedown', e, !0), document.removeEventListener('mouseup', t, !0)); + else + for (i = 0; i < tmbUI.UIelements.length; i++) + window.PointerEvent + ? (getID(tmbUI.UIelements[i]).removeEventListener('pointerdown', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('pointerup', t, !0)) + : window.MSPointerEvent + ? (getID(tmbUI.UIelements[i]).removeEventListener('MSPointerDown', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerUp', t, !0)) + : (getID(tmbUI.UIelements[i]).removeEventListener('mousedown', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('mouseup', t, !0)); + if (tmbUI.UIevents.includes('taps')) + if (0 === tmbUI.UIelements.length) + window.PointerEvent && !tmbUI.UIevents.includes('clicks') + ? (document.removeEventListener('pointerdown', e, !0), document.removeEventListener('pointerup', t, !0)) + : window.MSPointerEvent && !tmbUI.UIevents.includes('clicks') + ? (document.removeEventListener('MSPointerDown', e, !0), document.removeEventListener('MSPointerUp', t, !0)) + : hasTouch && + !hasPointer && + (document.removeEventListener('touchstart', e, !0), document.removeEventListener('touchend', t, !0)); + else + for (i = 0; i < tmbUI.UIelements.length; i++) + window.PointerEvent && !tmbUI.UIevents.includes('clicks') + ? (getID(tmbUI.UIelements[i]).removeEventListener('pointerdown', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('pointerup', t, !0)) + : window.MSPointerEvent && !tmbUI.UIevents.includes('clicks') + ? (getID(tmbUI.UIelements[i]).removeEventListener('MSPointerDown', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('MSPointerUp', t, !0)) + : hasTouch && + !hasPointer && + (getID(tmbUI.UIelements[i]).removeEventListener('touchstart', e, !0), + getID(tmbUI.UIelements[i]).removeEventListener('touchend', t, !0)); + } + function o() { + if ((tmbUI.timeoutRef && (clearTimeout(tmbUI.timeoutRef), (tmbUI.timeoutRef = 0)), a)) + setTimeout(function () { + ['div', 'span', 'button', 'p', 'img'].includes(a.tagName.toLowerCase()) + ? (a.style.border = s) + : ['circle', 'rect', 'ellipse', 'line', 'path', 'polygon', 'polyline', 'image', 'text'].includes( + a.tagName.toLowerCase() + ) + ? ((a.style.stroke = u), (a.style.strokeWidth = l)) + : ['shape'].includes(a.tagName.toLowerCase()) && ((a.strokecolor = u), (a.strokeweight = l)); + var e = new CustomEvent('readyUI'); + (document.addEventListener('readyUI', tmbUI.onreadyUI, !0), + document.dispatchEvent(e), + document.removeEventListener('readyUI', tmbUI.onreadyUI, !0)); + }, 250); + else { + var e = new CustomEvent('readyUI'); + (document.addEventListener('readyUI', tmbUI.onreadyUI, !0), + document.dispatchEvent(e), + document.removeEventListener('readyUI', tmbUI.onreadyUI, !0)); + } + } + var i, + a, + s, + u, + l, + c = now(), + d = !1, + f = ''; + for (var m in tmbUI) + if (tmbUI.hasOwnProperty(m)) + switch (m) { + case 'UIevents': + for ( + 0 === tmbUI.UIevents.length && (f += "Must specify UIevents: 'keys', 'clicks' or 'taps'. "), + tmbUI.UIevents instanceof Array || (tmbUI.UIevents = [tmbUI.UIevents]), + i = 0; + i < tmbUI.UIevents.length; + i++ + ) + ['keys', 'clicks', 'taps'].includes(tmbUI.UIevents[i]) || + (f += "'" + tmbUI.UIevents[i] + "' is not a valid event. "); + !tmbUI.UIevents.includes('taps') || hasTouch || hasPointer || (f += "'taps' is not a valid event. "); + break; + case 'UIkeys': + for (tmbUI.UIkeys instanceof Array || (tmbUI.UIkeys = [tmbUI.UIkeys]), i = 0; i < tmbUI.UIkeys.length; i++) + keyboardCodes[tmbUI.UIkeys[i]] || (f += "'" + tmbUI.UIkeys[i] + "' is not a valid keyboard code. "); + break; + case 'UIelements': + for ( + tmbUI.UIelements instanceof Array || (tmbUI.UIelements = [tmbUI.UIelements]), i = 0; + i < tmbUI.UIelements.length; + i++ + ) + getID(tmbUI.UIelements[i]) || (f += "'" + tmbUI.UIelements[i] + "' is not a valid element. "); + break; + case 'timeout': + tmbUI.timeout < 150 && (f += 'Timeout is ' + tmbUI.timeout + ' ms, must be > 150 ms. '); + break; + case 'timeoutRef': + if (0 !== tmbUI.timeoutRef) return ((tmbUI.message += "'getInput' called again while still busy. "), !1); + break; + case 'highlight': + if ('' !== tmbUI.highlight) { + var p = document.createElement('div'); + ((p.style.color = 'rgb(0, 0, 0)'), + (p.style.color = tmbUI.highlight), + 'rgb(0, 0, 0)' === p.style.color && + ((p.style.color = 'rgb(255, 255, 255)'), + (p.style.color = tmbUI.highlight), + 'rgb(255, 255, 255)' === p.style.color && + (f += "'highlight' must be empty string or valid CSS color. "))); + } + break; + case 'onreadyUI': + break; + case 'getInput': + break; + case 'status': + tmbUI.status = ''; + break; + case 'message': + tmbUI.message = ''; + break; + case 'response': + tmbUI.response = ''; + break; + case 'downTimestamp': + tmbUI.downTimestamp = 0; + break; + case 'rt': + tmbUI.rt = 0; + break; + case 'upTimestamp': + tmbUI.upTimestamp = 0; + break; + case 'dwell': + tmbUI.dwell = 0; + break; + default: + f += "Invalid parameter '" + m + "'. "; + } + if ( + (tmbUI.UIkeys.length > 0 && !tmbUI.UIevents.includes('keys') && (f += "Need 'keys' in UIevents for valid keys. "), + tmbUI.UIkeys.length && + tmbUI.UIelements.length && + tmbUI.UIelements.length < tmbUI.UIkeys.length && + (f += "Invalid number of UIelements, more 'keys' than 'UIelements'. "), + 0 === tmbUI.UIelements.length && '' !== tmbUI.highlight && (f += 'No elements to highlight. '), + f) + ) { + ((tmbUI.status = 'error'), (tmbUI.message = f)); + var h = new CustomEvent('readyUI'); + return ( + document.addEventListener('readyUI', tmbUI.onreadyUI, !0), + document.dispatchEvent(h), + document.removeEventListener('readyUI', tmbUI.onreadyUI, !0), + !1 + ); + } + return ( + (tmbUI.timeoutRef = setTimeout(function () { + ((tmbUI.status = 'timeout'), (tmbUI.message += 'Timeout: no response in ' + tmbUI.timeout + ' ms.'), r(), o()); + }, tmbUI.timeout)), + n(), + !1 + ); +}; +var simulateMobileMouse = function (e) { + (e.addEventListener('touchstart', mobileTouchHandler), + e.addEventListener('touchmove', mobileTouchHandler), + e.addEventListener('touchend', mobileTouchHandler), + e.addEventListener('touchcancel', mobileTouchHandler)); + }, + mobileTouchHandler = function (e) { + switch ((e.preventDefault(), e.type)) { + case 'touchstart': + if (1 !== e.changedTouches.length) return; + ((this.touchMoved = !1), + simulateMobileMouseEvent(e, 'mouseover'), + simulateMobileMouseEvent(e, 'mousemove'), + simulateMobileMouseEvent(e, 'mousedown')); + break; + case 'touchmove': + if (1 !== e.changedTouches.length) return; + ((this.touchMoved = !0), simulateMobileMouseEvent(e, 'mousemove')); + break; + case 'touchend': + if (1 !== e.changedTouches.length) return; + (simulateMobileMouseEvent(e, 'mouseup'), + simulateMobileMouseEvent(e, 'mouseout'), + this.touchMoved || simulateMobileMouseEvent(e, 'click')); + break; + default: + return; + } + }, + keyboardCodes = { + 8: 'backspace', + 9: 'tab', + 13: 'enter', + 16: 'shift', + 17: 'control', + 18: 'alt', + 19: 'pause', + 20: 'capslock', + 27: 'escape', + 32: 'space', + 33: 'pageup', + 34: 'pagedown', + 35: 'end', + 36: 'home', + 37: 'left', + 38: 'up', + 39: 'right', + 40: 'down', + 45: 'insert', + 46: 'delete', + 48: '0', + 49: '1', + 50: '2', + 51: '3', + 52: '4', + 53: '5', + 54: '6', + 55: '7', + 56: '8', + 57: '9', + 59: ';', + 61: '=', + 65: 'a', + 66: 'b', + 67: 'c', + 68: 'd', + 69: 'e', + 70: 'f', + 71: 'g', + 72: 'h', + 73: 'i', + 74: 'j', + 75: 'k', + 76: 'l', + 77: 'm', + 78: 'n', + 79: 'o', + 80: 'p', + 81: 'q', + 82: 'r', + 83: 's', + 84: 't', + 85: 'u', + 86: 'v', + 87: 'w', + 88: 'x', + 89: 'y', + 90: 'z', + 91: 'OSleft', + 92: 'OSright', + 93: 'OSright', + 96: 'numpad0', + 97: 'numpad1', + 98: 'numpad2', + 99: 'numpad3', + 100: 'numpad4', + 101: 'numpad5', + 102: 'numpad6', + 103: 'numpad7', + 104: 'numpad8', + 105: 'numpad9', + 106: 'numpadmultiply', + 107: 'numpadadd', + 109: 'numpadsubtract', + 110: 'numpaddecimal', + 111: 'numpaddivide', + 112: 'f1', + 113: 'f2', + 114: 'f3', + 115: 'f4', + 116: 'f5', + 117: 'f6', + 118: 'f7', + 119: 'f8', + 120: 'f9', + 121: 'f10', + 122: 'f11', + 123: 'f12', + 124: 'f13', + 125: 'f14', + 126: 'f15', + 144: 'numlock', + 145: 'scrolllock', + 173: '-', + 186: ';', + 187: '=', + 188: ',', + 189: '-', + 190: '.', + 191: '/', + 192: '`', + 219: '[', + 220: '\\', + 221: ']', + 222: "'", + 224: 'command' + }, + keyValue = codeToKey, + keyboardKeys = { + backspace: 8, + tab: 9, + enter: 13, + return: 13, + shift: 16, + control: 17, + ctrl: 17, + alt: 18, + pause: 19, + capslock: 20, + escape: 27, + esc: 27, + space: 32, + spacebar: 32, + ' ': 32, + pageup: 33, + pagedown: 34, + end: 35, + home: 36, + leftarrow: 37, + left: 37, + uparrow: 38, + up: 38, + rightarrow: 39, + right: 39, + downarrow: 40, + down: 40, + insert: 45, + delete: 46, + 0: 48, + 1: 49, + 2: 50, + 3: 51, + 4: 52, + 5: 53, + 6: 54, + 7: 55, + 8: 56, + 9: 57, + a: 65, + b: 66, + c: 67, + d: 68, + e: 69, + f: 70, + g: 71, + h: 72, + i: 73, + j: 74, + k: 75, + l: 76, + m: 77, + n: 78, + o: 79, + p: 80, + q: 81, + r: 82, + s: 83, + t: 84, + u: 85, + v: 86, + w: 87, + x: 88, + y: 89, + z: 90, + A: 65, + B: 66, + C: 67, + D: 68, + E: 69, + F: 70, + G: 71, + H: 72, + I: 73, + J: 74, + K: 75, + L: 76, + M: 77, + N: 78, + O: 79, + P: 80, + Q: 81, + R: 82, + S: 83, + T: 84, + U: 85, + V: 86, + W: 87, + X: 88, + Y: 89, + Z: 90, + OSleft: 91, + commandleft: 91, + Windows: 91, + OSright: 92, + commandright: 93, + numpad0: 96, + numpad1: 97, + numpad2: 98, + numpad3: 99, + numpad4: 100, + numpad5: 101, + numpad6: 102, + numpad7: 103, + numpad8: 104, + numpad9: 105, + numpadmultiply: 106, + numpadadd: 107, + numpadsubtract: 109, + numpaddecimal: 110, + numpaddivide: 111, + f1: 112, + f2: 113, + f3: 114, + f4: 115, + f5: 116, + f6: 117, + f7: 118, + f8: 119, + f9: 120, + f10: 121, + f11: 122, + f12: 123, + f13: 124, + f14: 125, + f15: 126, + numlock: 144, + scrolllock: 145, + semicolon: 186, + ';': 186, + equal: 187, + '=': 187, + comma: 188, + ',': 188, + minus: 189, + '-': 189, + period: 190, + '.': 190, + slash: 191, + '/': 191, + backquote: 192, + '`': 192, + bracketleft: 219, + '[': 219, + backslash: 220, + '\\': 220, + bracketright: 221, + ']': 221, + quote: 222, + "'": 222, + command: 224 + }, + coinFlip = randInt; +Number.prototype.round || + (Number.prototype.round = function (e) { + if (('undefined' == typeof e && (e = 0), 'number' != typeof e || (e + 1) % 1 !== 0 || !(e + 1 > 0))) + throw new TypeError('Numer.prototype.round requires 0 or a natural number for precision argument'); + var t = Math.pow(10, e); + return Math.round(this * t) / t; + }); +var centimetersToDegrees = sizeToDegrees, + degreesToCentimeters = degreesToSize, + now = function () { + var e = window.performance || {}; + return ( + (e.now = (function () { + return ( + e.now || + e.webkitNow || + e.msNow || + e.oNow || + e.mozNow || + function () { + return new Date().getTime(); + } + ); + })()), + e.now() + ); + }, + chain = chainTimeouts, + clearChain = clearChainTimeouts, + urlsafedecode = safeDecode; diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/chooseInput.v1.Feb24.js b/lib/interactive/TMB_FLANKER_ATTENTION/chooseInput.v1.Feb24.js new file mode 100644 index 0000000..ef43bd7 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/chooseInput.v1.Feb24.js @@ -0,0 +1,265 @@ +/* eslint-disable */ + +/* + + Copyright 2024 The Many Brains Project, Inc. and McLean Hospital. + + This code is made available under a GNU Lesser General Public License 3.0 + (LGPLv3). + https://www.gnu.org/licenses/lgpl-3.0.html. + + Author: Paolo Martini + Last updated: 02.27.2024 + Version: chooseInput.v1.Feb24 + +*/ + +function chooseInput(inputTypes, callback) { + /* Given valid inputTypes {'keyboard','mouse','touch'}, it returns + the user's choice as one of ['keys','clicks','taps'] + + Usage: + + chooseInput({keyboard: true, mouse: false, touch: true}, + function(input) {console.log(input);}); + */ + + let divs = [], + els, + errMsg = ' ', + lang, + msg = '', + oldAction = ''; + let centeredCell, centeredTable, choiceSpan, chooseInputBox, errSpan; + + if (inputTypes === null || typeof inputTypes !== 'object') + throw new TypeError('chooseInput: missing or invalid inputTypes object.'); + inputTypes.keyboard = inputTypes.keyboard || false; + inputTypes.mouse = inputTypes.mouse || false; + inputTypes.touch = inputTypes.touch || false; + + // dictionary + els = [ + { + en: 'Keyboard', // 0 + es: 'Teclado', + fr: 'Clavier', + zh: 'Keyboard', + 'zh-hk': 'Keyboard', + nl: 'Toetsenbord' + }, + { + en: 'Touch', // 1 + es: 'Pantalla táctil', + fr: 'Touche', + zh: 'Touch', + 'zh-hk': 'Touch', + nl: 'Scherm' + }, + { + en: 'Mouse / Trackpad', // 2 + es: 'Mouse / Trackpad', + fr: 'Souris / pavé tactile', + zh: 'Mouse / Trackpad', + 'zh-hk': 'Mouse / Trackpad', + nl: 'Muis / Trackpad' + }, + { + en: 'Pen', // 3 + es: 'El lápiz óptico', + fr: 'Stylo', + zh: 'Pen', + 'zh-hk': 'Pen', + nl: 'Pen' + }, + { + en: ' not valid for this test: try another input.', // 4 + es: ' no es válido para esta prueba: intente con otra entrada.', + fr: ' non valide pour ce test: essayez une autre entrée.', + zh: ' not valid for this test: try another input.', + 'zh-hk': ' not valid for this test: try another input.', + nl: ' niet mogelijk voor deze taak, probeer een andere reactiemethode.' + }, + { + en: '

    Please click here
    to choose how you will
    respond in this test.

    ', // 5 + es: '

    Por favor presione aquí para elegir cómo responderá en esta prueba.

    ', + fr: '

    Veuillez cliquer ici pour choisir comment vous allez répondre à ce test.

    ', + zh: '

    Please click here
    to choose how you will
    respond in this test.

    ', + 'zh-hk': '

    Please click here
    to choose how you will
    respond in this test.

    ', + nl: '

    Klik hier om te bepalen hoe
    je in deze test wil reageren.

    ' + }, + { + en: '- To use a keyboard, press any key now.

    ', // 6 + es: '- Para usar un teclado, presione cualquier tecla ahora.

    ', + fr: '- Pour utiliser le clavier, appuyez sur une touche maintenant.

    ', + zh: '- To use a keyboard, press any key now.

    ', + 'zh-hk': '- To use a keyboard, press any key now.

    ', + nl: '- Om het toetsenbord te gebruiken, druk nu op een toets

    ' + }, + { + en: '- To use a mouse or trackpad, click here now.

    ', // 7 + es: '- Para utilizar un mouse o un trackpad, presione aquí ahora.

    ', + fr: '- Pour utiliser une souris ou un pavé tactile, cliquez ici maintenant.

    ', + zh: '- To use a mouse or trackpad, click here now.

    ', + 'zh-hk': '- To use a mouse or trackpad, click here now.

    ', + nl: '- Om je muis of trackpad te gebruiken, klik nu hier.

    ' + }, + { + en: '- To use a touch screen, touch here now.

    ', // 8 + es: '- Para utilizar una pantalla táctil, toque aquí ahora.

    ', + fr: '- Pour utiliser un écran tactile, touchez ici maintenant.', + zh: '- To use a touch screen, touch here now.

    ', + 'zh-hk': '- To use a touch screen, touch here now.

    ', + nl: '- Om je touch screen te gebruiken, raak dit aan.

    ' + } + ]; + + // get the language + lang = document.documentElement.lang; + if (!els[0][lang]) lang = 'en'; + + // choice event handler + function getinput(e) { + let input; + errMsg = ''; + + e.preventDefault(); + e.stopPropagation(); + + // identify the event and validate by allowed input types; + // the order of checking is IMPORTANT: + // - pointer events with pen device will output pen->touch + // in Chrome + if (e.type === 'keyup') { + if (inputTypes.keyboard) input = 'keys'; + else errMsg = els[0][lang]; + } else if (e.type === 'pointerup' || e.type === 'MSPointerUp') { + if (e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) { + if (inputTypes.touch) input = 'taps'; + else errMsg = els[1][lang]; + } else if (e.pointerType === 'mouse' || e.pointerType === e.MSPOINTER_TYPE_MOUSE) { + if (inputTypes.mouse) input = 'clicks'; + else errMsg = els[2][lang]; + } else if (e.pointerType === 'pen' || e.pointerType === e.MSPOINTER_TYPE_PEN) { + if (inputTypes.touch) input = 'taps'; + else errMsg = els[3][lang]; + } + } else if (e.type === 'touchend') { + if (inputTypes.touch) input = 'taps'; + else errMsg = els[1][lang]; + } else if (e.type === 'mouseup') { + if (inputTypes.mouse) input = 'clicks'; + else errMsg = els[2][lang]; + } + + // warn if the user entered an invalid input + if (errMsg) errMsg += els[4][lang]; + errSpan.innerHTML = errMsg; + + // if we got a valid input, remove the listeners, + // remove the chooseInput div from the DOM, restore original display + // mode for other divs and return the input type + // to the callback function + if (input) { + document.removeEventListener('keyup', getinput, true); + if ('ontouchend' in window || navigator.maxTouchPoints || navigator.msMaxTouchPoints) + document.removeEventListener('touchend', getinput, true); + document.removeEventListener('mouseup', getinput, true); + if (window.PointerEvent) document.removeEventListener('pointerup', getinput, true); + else if (window.MSPointerEvent) document.removeEventListener('MSPointerUp', getinput, true); + + if ('touchAction' in document.body.style) document.body.style.touchAction = oldAction; + else if ('msTouchAction' in document.body.style) document.body.style.msTouchAction = oldAction; + + centeredTable.remove(); + + divs.forEach(function (d) { + d[0].style.display = d[1]; + }); + + if (callback) callback(input); + } + } + + function setup() { + // prevent default touch action + if ('touchAction' in document.body.style) { + oldAction = document.body.style.touchAction; + document.body.style.touchAction = 'none'; + } else if ('msTouchAction' in document.body.style) { + oldAction = document.body.style.msTouchAction; + document.body.style.msTouchAction = 'none'; + } + + // setup input listeners + document.addEventListener('keyup', getinput, true); + document.addEventListener('mouseup', getinput, true); + if ('ontouchend' in window || navigator.maxTouchPoints || navigator.msMaxTouchPoints) + document.addEventListener('touchend', getinput, true); + if (window.PointerEvent) document.addEventListener('pointerup', getinput, true); + else if (window.MSPointerEvent) document.addEventListener('MSPointerUp', getinput, true); + } + + function trigger() { + msg = ''; + if (inputTypes.keyboard) msg += els[6][lang]; + if (inputTypes.mouse) msg += els[7][lang]; + if (inputTypes.touch) msg += els[8][lang]; + + chooseInputBox.style.textAlign = 'left'; + choiceSpan.innerHTML = msg; + chooseInputBox.removeEventListener('click', trigger, true); + setup(); + } + + // hide all existing divs + [].forEach.call(document.getElementsByTagName('div'), function (d) { + divs.push([d, window.getComputedStyle(d).getPropertyValue('display')]); + d.style.display = 'none'; + }); + + // create elements to output the choice message + centeredTable = document.createElement('div'); + centeredTable.id = 'centeredTable'; + centeredTable.style.boxSizing = 'border-box'; + centeredTable.style.display = 'table'; + centeredTable.style.margin = 'auto'; + centeredTable.style.height = 'inherit'; //document.body.clientHeight + "px"; + centeredTable.style.width = 'inherit'; //document.body.clientWidth + "px"; + centeredTable.style.padding = '0 5% 0 5%'; + centeredTable.style.textAlign = 'center'; + centeredTable.style.fontFamily = '\"Helvetica Neue\",Helvetica,Arial,sans-serif'; + document.body.appendChild(centeredTable); + + centeredCell = document.createElement('div'); + centeredCell.id = 'centeredCell'; + centeredCell.style.display = 'table-cell'; + centeredCell.style.verticalAlign = 'middle'; + centeredTable.appendChild(centeredCell); + + chooseInputBox = document.createElement('div'); + chooseInputBox.id = 'chooseInput'; + chooseInputBox.style.margin = 'auto'; + chooseInputBox.style.maxWidth = '450px'; + chooseInputBox.style.border = 'solid 2px #f1c40f'; + chooseInputBox.style.borderRadius = '1em'; + chooseInputBox.style.background = '#f7f7f7'; + chooseInputBox.style.padding = '10px'; + chooseInputBox.style.fontSize = '18pt'; + centeredCell.appendChild(chooseInputBox); + + choiceSpan = document.createElement('span'); + choiceSpan.id = 'choiceMsg'; + chooseInputBox.appendChild(choiceSpan); + choiceSpan.innerHTML = els[5][lang]; + + errSpan = document.createElement('span'); + errSpan.id = 'errMsg'; + errSpan.style.color = 'red'; + errSpan.style.fontSize = '14pt'; + chooseInputBox.appendChild(errSpan); + errSpan.innerHTML = ' '; + + // trigger the choice + chooseInputBox.addEventListener('click', trigger, true); +} diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/fingerLeft.png b/lib/interactive/TMB_FLANKER_ATTENTION/fingerLeft.png new file mode 100644 index 0000000..e08252c Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/fingerLeft.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/fingerRight.png b/lib/interactive/TMB_FLANKER_ATTENTION/fingerRight.png new file mode 100644 index 0000000..d1679c2 Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/fingerRight.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/fingerUp.png b/lib/interactive/TMB_FLANKER_ATTENTION/fingerUp.png new file mode 100644 index 0000000..1c57ebe Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/fingerUp.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/font.ts b/lib/interactive/TMB_FLANKER_ATTENTION/font.ts new file mode 100644 index 0000000..a90427e --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/font.ts @@ -0,0 +1,5 @@ +// Inconsolata-Regular.ttf encoded as a base64 data URL so the monospace arrow +// glyphs render identically to the original TestMyBrain task, without relying +// on bundler-specific font asset handling. Injected as an @font-face in render.js. +export const inconsolataFontUrl = + 'data:font/ttf;base64,AAEAAAASAQAABAAgR0RFRlazVJkAAVfkAAABNEdQT1OmiyTyAAFZGAAAHcpHU1VCosa1JAABduQAAAnET1MvMl+VIzMAAQ2gAAAAYFNUQVT1zt+wAAGAqAAAAERjbWFwLWXcegABDgAAAApAY3Z0IBbrDboAASqQAAAA8GZwZ23iGZ5aAAEYQAAAD5RnYXNwAAAAEAABV9wAAAAIZ2x5Zh0an+wAAAEsAAD1aGhlYWQZQY0QAAD+PAAAADZoaGVhCL0GxgABDXwAAAAkaG10eHE+Af0AAP50AAAPCGxvY2GIM0uoAAD2tAAAB4ZtYXhwB3oQ1AAA9pQAAAAgbmFtZZ7RwLUAASuAAAAFwHBvc3SiGLO2AAExQAAAJppwcmVwK/pyOgABJ9QAAAK7AAIAEwAAAkUCegADAAoAG0ANBAYCAQEGBwNyCgYIcgArxCsROS8zETkwMWUhNzMnAyMBMwEjAbb+4RfydcxMARQKARRPtDrx/iECev2G//8AEwAAAkUDGQYmAAEAAAEGA6PpAAALtgILBwEBGlYAKzQA//8AEwAAAkUDFgYmAAEAAAEGA6cAAAALtgIPBwEBJVYAKzQA//8AEwAAAkUDiAYmAAEAAAAmA6cAAAEGA6MLbwAVQA4DGhYBATRWAg8HAQElVgArNCs0AP//ABP/awJFAxYGJgABAAAAJgOKDQABBgOnAAAAGEAMAxsHAQElVgIRCgEBuP/UsFYAKzQrNP//ABMAAAJFA70GJgABAAAAJgOnAAABBwOi/+8ApAAVQA4DGhYBAWlWAg8HAQElVgArNCs0AP//ABMAAAJFA7gGJgABAAAAJgOnAAABBwOFAAUA9wAVQA4DIRYBATNWAg8HAQElVgArNCs0AP//ABMAAAJFA6IGJgABAAAAJgOnAAABBwO0//EA9wAVQA4DHhYBAWZWAg8HAQElVgArNCs0AP//ABMAAAJFAxcGJgABAAABBgOlAAAAC7YCCwcBARVWACs0AP//ABMAAAKCA4MGJgABAAABBgO9/wAAFUAOAxMLAQGZVgILBwEBFVYAKzQrNAD//wAT/2sCRQMXBiYAAQAAACYDig0AAQYDpQAAABhADAMXBwEBFVYCEQoBAbj/1LBWACs0KzT//wATAAACRQOjBiYAAQAAAQYDvgAAABVADgMSCwEBj1YCCwcBARVWACs0KzQA//8AEwAAAkUDowYmAAEAAAEGA7/7AAAVQA4DGQsBAV5WAgsHAQEVVgArNCs0AP//ABMAAAJFA6UGJgABAAABBgPAAAAAFUAOAxYLAQGpVgILBwEBFVYAKzQrNAD//wATAAACRQNQBiYAAQAAAQcDhv/nAKYADbcDAgsHAQEnVgArNDQA//8AEwAAAkUDGAYmAAEAAAEGA6D/AAANtwMCCwcBATZWACs0NAD//wAT/2sCRQJ6BiYAAQAAAQYDig0AAA60AhEKAQG4/9SwVgArNP//ABMAAAJFAxkGJgABAAABBgOi7wAAC7YCCwcBARpWACs0AP//ABMAAAJFA2cGJgABAAABBwOFABIApgALtgISBwEBN1YAKzQA//8AEwAAAkUDKwYmAAEAAAEHA4f/9gCmAAu2AgsHAQE8VgArNAD//wATAAACRQMWBiYAAQAAAQcDhAAAAKYAC7YCCwcBAWFWACs0AP//ABP/HQJFAnoGJgABAAABBwOOAM4AAAALtgIVCgAAAFYAKzQA//8AEwAAAkUDGwYmAAEAAAEGA6j/AAAQtQMCCwcAALj/8bBWACs0NP//ABMAAAJFA8UGJgABAAAAJgOo/wABBwOj/+kArAAaQA0EJwcBAcZWAwILBwAAuP/xsFYAKzQ0KzT//wATAAACRQMdBiYAAQAAAQYDqf8AAAu2Ag8HAQE2VgArNAAAAgASAAACUgJwAA8AEwArQBUQDgUIDggOCAATBAQBAnIJDAwACHIAKzIvMysyETMROTkvLxEzETMwMXMTIRUjFTMVIxUzFSE1Iwc3MxEjEusBVdCxsc7+76c/UpQYAnBAykLkQKio5AFM//8AEgAAAlIDGQYmABoAAAEGA6MAAAALtgIUAQEBJFYAKzQAAAMAOgAAAiUCbwAVACAALAAdQA4LISEgIAAsAQJyFgAIcgArMisyETkvMxI5MDFzETMyHgIVFAYGBx4DFRQOAiMnMzI2NjU0JiYjIzUzMjY2NTQuAiMjOtRDXjwcGTEkHjMmFSBCa0uKmDtULSxbSYR/QlImEylCL4wCbxYoOCEfOCgKCR8rMhspQS0YQBYzKiU4IT0aLBwVIxoPAAEAM//2AjMCdAApACFAECYlJSEhKQlyEQ4QEBcLA3IAKzIyETMzKzIRMxEzMDFFIi4CNTQ+AzMyFhcHByc2JicmJiMiDgIVFB4CMzI2NjcXBgYjAVY+ak8sITlKUSlRdB0+CQMDBwkfRiguTTkfIjpOLB48MxE4JGVJCiZPd1JJbEotFEM4HwQHCAwNIxcgQWA+PGBEJBIiFyQyNAD//wAz//YCMwMZBiYAHQAAAQYDowEAAAu2ASoLAQEgVgArNAD//wAz//YCMwMZBiYAHQAAAQYDphgAAAu2AS0LAQEdVgArNAD//wAz/zsCMwJ0BiYAHQAAAQYDjQsAAAu2ATkpAAAKVgArNAD//wAz/zsCMwMZBiYAHQAAACYDjQsAAQYDowEAABVADgJCCwEBIFYBOSkAAApWACs0KzQA//8AM//2AjMDFwYmAB0AAAEGA6UYAAALtgEqCwEBG1YAKzQA//8AM//2AjMDHgYmAB0AAAEGA6EXAAALtgEqCwEBQVYAKzQAAAIAQf//AigCbwAPABoAELcaAQJyEAAIcgArMisyMDFXETMyFhYXHgIVDgMjJzMyNjYnLgIjI0GuQFk9GRkhEAMmTXpYWFVYcjgBATRrVGIBAnAUJhwcRVMxSHJQKzo4b1BScj0AAAIAJP//Ai8CbwAUACMAIUAQFQADIAIgIyMAHwUCcgAIcgArKzIROS8zMxEzETMwMVcRIzUzETMyHgIXHgIVFA4CIyczMjY2NTQmJiMjFTMVI2I+PqQ4UTknDwsXDypQdUpOTExtOjNmTVmCggEBLTwBBxQhKRYQNk0zSnRPKT05bk9RcjzJPP//ADn//wIoAxkGJgAkAAABBgOm0QAAC7YCHgEBASJWACs0AP//ACT//wIvAm8GBgAlAAD//wBB/2sCKAJvBiYAJAAAAQYDigIAAA60AiEAAQG4/9WwVgArNP//AEH/ZgIoAm8GJgAkAAABBgOQ+AAADrQCHAABAbj/nrBWACs0AAEARQAAAhMCcAALABlADAUICAAEAQJyCQAIcgArMisyETkvMzAxcxEhFSEVIRUhFSEVRQHO/nkBRf67AYQCcEDKQuRAAP//AEUAAAITAxkGJgAqAAABBgOj+AAAC7YBDAEBASRWACs0AP//AEUAAAITAxYGJgAqAAABBgOnDwAAC7YBEAEBAS9WACs0AP//AEUAAAITAxkGJgAqAAABBgOmDwAAC7YBDwEBASFWACs0AP//AEX/OwITAxYGJgAqAAAAJgON5wABBgOnDwAAFUAOAigBAQEvVgEbAAEAAFYAKzQrNAD//wBFAAACEwMXBiYAKgAAAQYDpQ8AAAu2AQwBAQEfVgArNAD//wBFAAACkgODBiYAKgAAAQYDvQ4AABVADgITDAEBb1YBDAEBAR9WACs0KzQA//8ARf9rAhMDFwYmACoAAAAmA4oNAAEGA6UPAAAYQAwCGAEBAR9WARIAAQG4/9SwVgArNCs0//8ARQAAAhMDowYmACoAAAEGA74PAAAVQA4CEwEBAa5WAQwBAQEfVgArNCs0AP//AEUAAAIpA6MGJgAqAAABBgO/CgAAFUAOAhoMAQFeVgEMAQEBH1YAKzQrNAD//wBFAAACEwOlBiYAKgAAAQYDwA8AABVADgIXAQEByFYBDAEBAR9WACs0KzQA//8ARQAAAhMDUAYmACoAAAEHA4b/9gCmAA23AgEMAQEBMVYAKzQ0AP//AEUAAAITAxgGJgAqAAABBgOgDgAADbcCAQwBAQFAVgArNDQA//8ARQAAAhMDHgYmACoAAAEGA6EOAAALtgEMAQEBRVYAKzQA//8ARf9rAhMCcAYmACoAAAEGA4oNAAAOtAESAAEBuP/UsFYAKzT//wBFAAACEwMZBiYAKgAAAQYDov4AAAu2AQwBAQEkVgArNAD//wBFAAACEwNnBiYAKgAAAQcDhQAhAKYAC7YBEwEBAUFWACs0AP//AEUAAAITAysGJgAqAAABBwOHAAYApgALtgEMAQEBRlYAKzQA//8ARQAAAhMDFgYmACoAAAEHA4QADwCmAAu2AQwBAQFrVgArNAD//wBFAAACEwOzBiYAKgAAACcDhAAPAKYBBwOj//gAmgAVQA4CEAwBAVNWAQwBAQFrVgArNCs0AP//AEUAAAITA7MGJgAqAAAAJwOEAA8ApgEHA6L//gCaABVADgIQDAEBU1YBDAEBAWtWACs0KzQA//8ARf8dAhMCcAYmACoAAAEGA58AAAALtgEWAAAAAFYAKzQA//8ARQAAAhMDHQYmACoAAAEGA6kOAAALtgEQAQEBQFYAKzQAAAIAVf/1AgMCbwAgACcAIUARCicmAwsLFCAhJSUiAnIgCXIAKysyETMRMzkvFzMwMUUiJiY1ND4CMzMVJg4CFRQWFjMyNjc2Nic3FxcGBiMDNSEVIRcHAUJPaTUjQVk2TjVaQSQqTDIlNhYMCAEFByknYjjYAW7+8sxXCzNTMSlIOCA2Ag4iOScmOR8REQwMCAYINyMkAjs/QbkEAAEAXAAAAg4CcAAJABdACwUICAAEAQJyAAhyACsrMhE5LzMwMXMRIRUhFSEVIRFcAbL+mAEl/tsCcEDAP/7PAAABACj/9gImAnYAMAAhQBArKioKIzAJchEOEBAYCgNyACsyMhEzMysyEjkvMzAxRSImJjUmPgMzMhYWFwcHJzYmJy4CIyIOAxUUHgIzMj4CNzUjNTMVBgYjAUtZg0YBJT9NTSEsVkYVNAgEAQgLEysyHCE9NikWIDlPMBEoKCUPj9U1bjgKTo5eUXFKKhAbLiAqBwYIDAwSFwsPIjlUOUFiRCIFCQ8KkD/1ICH//wAo//YCJgMWBiYAQwAAAQYDpxsAAAu2ATUKAQEpVgArNAD//wAo//YCJgMZBiYAQwAAAQYDphsAAAu2ATQKAQEbVgArNAD//wAo//YCJgMXBiYAQwAAAQYDpRsAAAu2ATEKAQEZVgArNAD//wAo/u0CJgJ2BiYAQwAAAQYDjCIAAA60AT0wAQG4/+qwVgArNP//ACj/9gImAx4GJgBDAAABBgOhGgAAC7YBMQoBAT9WACs0AP//ACj/9gImAxYGJgBDAAABBwOEABsApgALtgExCgEBZVYAKzQAAAEAOQAAAhwCbwAVABlADAcTEwARFQhyCQACcgArMisyEjkvMzAxUzMzFQYGFRUhETMzFQYGFREjESERIzlMCgYDAUBMCgYDTv7BTQJvBwYOEd0BCQcGDhH9vQEo/tgAAAIACgAAAkYCbwADABkAIEAPFwsAAAsLBBUZCHINBAJyACsyKzISOS8zfS8RMzAxUzUhFSUzMxUGBhUVIREzMxUGBhURIxEhESMKAjz980wKBgMBQEwKBgNO/sFNAfA7O38HBg4R3QEJBwYOEf29ASj+2AD//wA5/1ACHAJvBiYASgAAAQYDjwIAAA60ARYRAQG4/8WwVgArNP//ADkAAAIcAxcGJgBKAAABBgOlAAAAC7YBFgABASBWACs0AP//ADn/awIcAm8GJgBKAAABBgOKDQAADrQBHBEBAbj/1LBWACs0AAEAXwAAAeMCbwALABlADAgEBAUCcgEJCQAIcgArMhEzKzIRMzAxczUzESM1IRUjETMVX5qSAXWYnz4B8z4+/gw9//8AXwAAAeMDGQYmAE8AAAEGA6PcAAALtgEMBQEBJVYAKzQA//8AXwAAAeMDFgYmAE8AAAEGA6fzAAALtgEQBQEBMFYAKzQA//8AXwAAAeMDFwYmAE8AAAEGA6XzAAALtgEMBQEBIFYAKzQA//8AVgAAAeMDUAYmAE8AAAEHA4b/2QCmAA23AgEMBQEBMlYAKzQ0AP//AF8AAAHjAxgGJgBPAAABBgOg8QAADbcCAQwFAQFBVgArNDQA//8AXwAAAeMDpwYmAE8AAAAmA6DxAAEHA6P/2QCOABdADwMkEgEADVYCAQwFAQFBVgArNDQrNAD//wBfAAAB4wMeBiYATwAAAQYDofEAAAu2AQwFAQFGVgArNAD//wBf/2sB4wJvBiYATwAAAQYDig0AAA60ARIAAQG4/9SwVgArNP//AF8AAAHjAxkGJgBPAAABBgOi4gAAC7YBDAUBASVWACs0AP//AF8AAAHjA2cGJgBPAAABBwOFAAUApgALtgETBQEBQlYAKzQA//8AXwAAAeMDKwYmAE8AAAEHA4f/6QCmAAu2AQwFAQFHVgArNAD//wBfAAAB4wMWBiYATwAAAQcDhP/zAKYAC7YBDAUBAWxWACs0AP//AF//HQHjAm8GJgBPAAABBgOOfAAAC7YBFgAAAABWACs0AP//AF8AAAHsA1EGJgBPAAABBgOz5yQAC7YBEAUBAXVWACs0AAABADv/9QIkAm8AHAAVQAoMHAlyFhISEwJyACsyETMrMjAxVyImJzc3FxYWFxYWMzI2NjURIzUhFSMRFg4CI+s1WCMpBwUCCA0XMRwpNRqVAVZ3Ah83RigLIyI1CAQJDQoOEB1EOgFhPj7+oDxUNRf//wA7//UCRAMXBiYAXgAAAQYDpVsAAAu2AR0TAQEgVgArNAAAAQA0//sCNwJ0ABUAGkAOAQALEwQDEgQCchQDCHIAKzIrMhIXOTAxUwcRIxEzMxUGBhUVAR4DMzMBAQfKR09OCgYDAUcHDw8PBx/+4QEyYQE8O/7/Am8HBg4R8wEkAQIBAf73/poFAP//ADT+7QI3AnQGJgBgAAABBgOMAAAADrQBIgMBAbj/4LBWACs0AAIANP/7AjgCcwAgACQAHkARJBIeByEiBAAgEhgMA3IAAnIAKysyPxIXOT8wMVMzMxUGBhUVPgMzMhYXBxUjJiYnIiIjIg4DBxUjEzcBBzROCgYDOmtgVyYLFgkBBwYOEQMFBA8rO1FpRE92OgFUZAJvBwYOEfxUdEUfAgJJCgYIAQohRXZZ7AFSK/6DBQABAE0AAAIRAm8ACgAOtgcKCHIAAnIAKysyMDFTMzMVBgYVESEVIU1MCgYDAXf+PAJvBwYOEf38PwAAAgBN/2kCHgJvABsAJQAdQA4MACMSExMdHAhyHQJyAAAvKysRMxEzMhEzMDFFIiYnNx4CFx4CMzI2NjURIzUzFTERFg4CJREzFAYGFREzFQFVNFkjMQcEBAcGHysYJjkfpe4DIDlI/tBXBQTWlyAiOwMKCwcGDgodRDoB7T47/hE8VDQYlwJvBwMIEP3zQAD//wBNAAACEQMZBiYAYwAAAQYDo60AAAu2AQsAAQElVgArNAAAAgBNAAACEQJ1ABEAHAAVQAsZHAhyEgJyAAsDcgArzCsrMjAxQSc2NjU0JiY1NDYzMhYVFAYGJTMzFQYGFREhFSEBlhwaHxUVGxcXIhYp/phMCgYDAXf+PAGYGxQvDwwSFA4UHCYdFzI1uwcGDhH9/D///wBN/u0CEQJvBiYAYwAAAQYDjBEAAA60ARcKAQG4/+CwVgArNP//AE0AAAIRAm8GJgBjAAABBgIiSAAADrQBEQACALj/FbBWACs0//8ATf9rAhECbwYmAGMAAAEGA4oNAAAOtAERCgEBuP/UsFYAKzQAAwBP/1ICBgKRAAgAJQAxAB9AECwmJh4fBnIXCQECcgYACHIAKzIrLzMrMjIvMzAxcxEzFAYVETMVByImJic3HgMXHgIzMj4CNREjNSERFA4CEyImNTQ2MzIWFRQGT1YJyz0jPDIVNQYDBxQZCRUXCRwtIxO6AQchOk55Fh8eFxYgIAJvCg0L/fNArg8eFT8FDA0OCgMFAg8fMyIBdT7+UTdLLhYC0h8WFx8gFhYfAP//AE3/ZgIRAm8GJgBjAAABBgOQAgAADrQBDAoBAbj/nbBWACs0AAEAGAAAAhcCbwAWABhADQETBA0EAAUCchQACHIAKzIrEhc5MDFzNQc1NxEzMhYVFAYHETc2NjcVBxUhFV1FRVQCAQgCzAoQBOoBbfMSPxMBPAEBBAoS/vs3AwUCQj7KPwAAAQAxAAACKAJwAAwAGkAOCgMLCAQHBQICcgcACHIAKzIrMhIXOTAxcxEzExMzESMRAyMnETE9vsI6SKkhngJv/s0BNP2QAd3+//7+JgD//wAx/2sCKAJwBiYAbQAAAQYDig0AAA60ARMHAQG4/9SwVgArNAABADsAAAIiAm8ADgAXQAsMAgELDghyAwECcgArMisyETk5MDFTMwERMzMVBgYVESMBESM7SQFNRwoGAzn+o0gCb/4rAdUHBg4R/b0B8f4P//8AOwAAAiIDGQYmAG8AAAEGA6PpAAALtgEPAAEBJVYAKzQA//8AOwAAAiIDGQYmAG8AAAEGA6YAAAALtgESAwEBIlYAKzQA//8AO/7tAiICbwYmAG8AAAEGA4wRAAAOtAEbCwEBuP/gsFYAKzT//wA7AAACIgMeBiYAbwAAAQYDof8AAAu2AQ8DAQFGVgArNAD//wA7/2sCIgJvBiYAbwAAAQYDig0AAA60ARULAQG4/9SwVgArNAABADz/RwIgAm8AHAAbQA4WHBcDGQEbAnIZCHISCQAvMysrMhIXOTAxQTMUBhURFAYGIyImJzceAzMyNjY1AREjETMBAdBQCCxSOBw0GCcHCAoWFiUuF/60SEkBSwJvBwkL/aw+UikMDkACCAkGHT8yAdv+DwJv/isA//8AO/9mAiICbwYmAG8AAAEGA5ACAAAOtAEQDgEBuP+dsFYAKzT//wA7AAACIgMdBiYAbwAAAQYDqf8AAAu2ARMDAQFBVgArNAAAAgAg//UCOAJzAA8AHwAQtxgIA3IQAAlyACsyKzIwMUUiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWASxUeEBAeFRVd0BAd1U7Vi4uVjs7Vi4uVgtLj2Vij05Oj2Jlj0tAO3JSTnI/P3JOUnI7AP//ACD/9QI4AxkGJgB4AAABBgOj6QAAC7YCIAgBASFWACs0AP//ACD/9QI4AxYGJgB4AAABBgOnAAAAC7YCJAgBASxWACs0AP//ACD/9QI4AxcGJgB4AAABBgOlAAAAC7YCIAgBARxWACs0AP//ACD/9QKCA4MGJgB4AAABBgO9/wAAFUAOAycIAQGLVgIgCAEBHFYAKzQrNAD//wAg/2sCOAMXBiYAeAAAACYDig0AAQYDpQAAABhADAMsCAEBHFYCJgABAbj/37BWACs0KzT//wAg//UCOAOjBiYAeAAAAQYDvgAAABVADgMnCAEBq1YCIAgBARxWACs0KzQA//8AIP/1AjgDowYmAHgAAAEGA7/7AAAVQA4DLggBAXpWAiAIAQEcVgArNCs0AP//ACD/9QI4A6UGJgB4AAABBgPAAAAAFUAOAysIAQHFVgIgCAEBHFYAKzQrNAD//wAg//UCOANQBiYAeAAAAQcDhv/nAKYADbcDAiAIAQEuVgArNDQA//8AIP/1AjgDGAYmAHgAAAEGA6D/AAANtwMCIAgBAT1WACs0NAD//wAg//UCOAOkBiYAeAAAACYDoP8AAQcDhP/+ATQAF0APBDgmAQFUVgMCIAgBAT1WACs0NCs0AP//ACD/9QI4A4YGJgB4AAAAJgOh/wABBwOE//4BFgAVQA4DLCYBAS9WAiAIAQFCVgArNCs0AP//ACD/awI4AnMGJgB4AAABBgOKDQAADrQCJgABAbj/37BWACs0//8AIP/1AjgDGQYmAHgAAAEGA6LvAAALtgIgCAEBIVYAKzQA//8AIP/1AjgDZwYmAHgAAAEHA4UAEgCmAAu2AicIAQE+VgArNAD//wAg//UCOAKmBiYAeAAAAQYDqt3ZAA60AiAIAQG4/6SwVgArNP//ACD/9QI4AxkGJgCIAAABBgOj6QAAC7YDKggBASFWACs0AP//ACD/awI4AqYGJgCIAAABBgOKDQAADrQDMAABAbj/37BWACs0//8AIP/1AjgDGQYmAIgAAAEGA6LvAAALtgMqCAEBIVYAKzQA//8AIP/1AjgDZwYmAIgAAAEHA4UAEgCmAAu2AzEIAQE+VgArNAD//wAg//UCOAMdBiYAiAAAAQYDqf8AAAu2Ay4IAQE9VgArNAD//wAg//UCOAMrBiYAeAAAAQYDpOAAAA23AwIgCAEBElYAKzQ0AP//ACD/9QI4AysGJgB4AAABBwOH//YApgALtgIgCAEBQ1YAKzQA//8AIP/1AjgDFgYmAHgAAAEHA4QAAACmAAu2AiAIAQFoVgArNAD//wAg//UCOAOzBiYAeAAAACcDhAAAAKYBBwOj/+kAmgAVQA4DJAgBAbtWAiAIAQFoVgArNCs0AP//ACD/9QI4A7MGJgB4AAAAJwOEAAAApgEHA6L/7wCaABVADgMkCAEBu1YCIAgBAWhWACs0KzQA//8AIP8nAjgCcwYmAHgAAAEGA44tCgALtgIpAAAAJlYAKzQAAAMAIP/WAjgCqgADABMAIwAeQA4DAgIcDANyAQAAFAQJcgArMjJ8LzMrMjIvMzAxVycBFwMiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWXi0Byiv6VHhAQHhUVXdAQHdVO1YuLlY7O1YuLlYqGgK6HP1nS49lYo9OTo9iZY9LQDtyUk5yPz9yTlJyOwD//wAg/9YCOAMZBiYAlAAAAQYDo+kAAAu2AyQMAQEhVgArNAD//wAg//UCOAMdBiYAeAAAAQYDqf8AAAu2AiQIAQE9VgArNAD//wAg//UCOAO0BiYAeAAAACYDqf8AAQcDo//pAJsAFUAOAzgIAQG8VgIkCAEBPVYAKzQrNAD//wAg//UCOAOzBiYAeAAAACYDqf8AAQcDoP//AJsAF0APBAM4CAEB2FYCJAgBAT1WACs0KzQ0AP//ACD/9QI4A6kGJgB4AAAAJwO0//QApgEHA4T/+wE5ABVADgM4CAEB+1YCJAgBAXFWACs0KzQAAAIAC//5AkUCeAAbACsALUAYFRgIchANAnIMIyMRFBQACQNyGRwcAAlyACsyETkrETkvMzIROSsyKzIwMVciLgI1NDY2MzIWFzUhFSMVMxUjFTMVITUGBicyNjcRJiYjIg4CFRQWFs4qSTQcMVk9GjEWARLOr6/L/vAVMxMfMQsQLyQYLSQWIT0HJ094UWmOSREUHUDKQuRAHxQSQCcfAWkiMRo8Y0lRcj0AAgBHAAACIwJvAA0AGAAXQAsODAwAGAECcgAIcgArKzIROS8zMDFzETMyFhYVFA4CIyMRETMyNjY1NCYmIyNH+FFkLxk3UzuyqDlEHx9EOKkCbzBPMSQ+MRr+7gFSGzAgHzEeAAIARQAAAiICbwAUAB8AH0APFRMfCRMJEwkAAQJyAAhyACsrETk5Ly8RMxEzMDFzETMWFhUUBgcVMzIWFhUUBgYjIxU1MzI2NjU0JiYjI0VTAQEJAqZUaDEwZVKsrDZEISNIOKQCbwEBAQMNCVgwUTAwTi+d3BsxICAyHQACACL/bQI4AnYAHgAxABlADCkOA3IfGAUJchwACQB8PzIrMjIrMjAxRQYuAjUuAjU0PgIzMh4CBxQOAgceAjM3BycyPgI1NC4CIyIOAhUUFhYB4TpQMBVAbUMvT18uM2FMKwIdOlU2AhIoIWID3SFCNiIiOUQiLkkxGjFakQINIjYnB0qIYlp8SyEnT3hRRW1QMgoWIRMFRcsZOVpAUGk9GidEVzFQeEEAAAIAQwAAAi0CbwAPABkAHUAOChAQDg4AGQECcgwACHIAKzIrMhE5LzMSOTAxcxEzMhYWFRQGBgcTIwMjEREzMjY1NCYmIyND7VFmMSVFLq1YpaKqTkcfQzWoAm8sUDYlRzMI/uoBEv7uAVI6MR8yHf//AEMAAAItAxkGJgCeAAABBgOj6QAAC7YCGgEBASVWACs0AP//AEMAAAItAxkGJgCeAAABBgOmAAAAC7YCHQEBASJWACs0AP//AEP+7QItAm8GJgCeAAABBgOMEQAADrQCJgwBAbj/4LBWACs0//8AQwAAAi0DUAYmAJ4AAAEHA4b/5wCmAA23AwIaAQEBMlYAKzQ0AP//AEP/awItAm8GJgCeAAABBgOKDQAADrQCIAwBAbj/1LBWACs0//8AQwAAAi0DKwYmAJ4AAAEHA4f/9gCmAAu2AhoBAQFHVgArNAD//wBD/2YCLQJvBiYAngAAAQYDkAIAAA60AhsAAQG4/52wVgArNAABAD7/9gIiAncAQAAXQAsbER8MQAlyLB8DcgArMisyETk5MDFFIiYnNzcXFhYXFhYzMj4CNTQuAycuAjU0NjYzMhYWFwcHJyYmJyYmIyIOAhUUHgMXHgMVFAYGIwEoSXQtKAUGAgcMIFc3IjsuGgsZKj0qTlomN2ZHKExDGSkHBQEICx9ILh0yJhUMGy1CLjdJKhI0blgKKCc/CQUHDwsWGhEcJxYSHBYXGg8ZOkEkLkUnEyIZNggFCA4LFxINGSASEBwaGhoPEyUpMR0sUjb//wA+//YCIgMZBiYApgAAAQYDo/YAAAu2AUEfAQEdVgArNAD//wA+//YCIgOUBiYApgAAACYDo/YAAQYDoQx2ABVADgJFHwEBtFYBQR8BAR1WACs0KzQA//8APv/2AiIDGQYmAKYAAAEGA6YNAAALtgFEHwEBGlYAKzQA//8APv/2AiIDugYmAKYAAAAmA6YNAAEHA6EADACcABVADgJIHwEB3FYBRB8BARpWACs0KzQA//8APv87AiICdwYmAKYAAAEGA43jAAALtgFQQAAAClYAKzQA//8APv/2AiIDFwYmAKYAAAEGA6UNAAALtgFBHwEBGFYAKzQA//8APv7tAiICdwYmAKYAAAEGA4wNAAAOtAFNQAEBuP/qsFYAKzT//wA+//YCIgMeBiYApgAAAQYDoQwAAAu2AUEfAQE+VgArNAD//wA+/2sCIgJ3BiYApgAAAQYDigoAAA60AUdAAQG4/96wVgArNP//AD7/awIiAx4GJgCmAAAAJgOKCgABBgOhDAAAGEAMAk0fAQE+VgFHQAEBuP/esFYAKzQrNAABAEL/9gItAp0AMwAhQA8qKysTERISABglAXIfCAAALzIvKzIROS8zMzMRMzAxRSImJzceAjMyPgI1NCYmIyM1NzQmJiMiDgIVESMRND4CMzIWFhUHJzIWFhUUDgIBVCVAHRoPIiAOHjcsGiFUTCSuHDwvHDguG0koQlEqR10uzA1UeEEjPE8KDxA6CAsFESIyIR89KTt5HDAeDiA0Jv4oAc46UDAVMVIyjSIrWUQzSC4WAP//ACD/9QI4AnMGBgB4AAAAAQAkAAACLQJwAAcAE0AJBgICAwJyAAhyACsrMhEzMDFzESM1IRUjEf/bAgnjAi9BQf3RAAIAJAAAAi0CcAAHAAsAGkAMCQgIAAYCAgMCcgAIAD8rMhEzETkvMzAxcxEjNSEVIxEDNSEV/9sCCePgAYQCL0FB/dEBGT09//8AJAAAAi0DGQYmALMAAAEGA6YAAAALtgELAwEBIVYAKzQA//8AJP87Ai0CcAYmALMAAAEGA43nAAALtgEXAAEAAFYAKzQA//8AJP7tAi0CcAYmALMAAAEGA4wRAAAOtAEUAAEBuP/gsFYAKzT//wAk/2sCLQJwBiYAswAAAQYDig0AAA60AQ4AAQG4/9SwVgArNP//ACT/ZgItAnAGJgCzAAABBgOQAgAADrQBCQABAbj/nbBWACs0AAEAPP/1AiECbwAYABC3DhgJchMEAnIAKzIrMjAxRSImNREzMxUGBhURFBYzMjY1ETMRFAYGIwEteHlJCgYDUFhaUkc8bkoLenABkAcGDhH+m1BbW1MBjv5zUmkyAP//ADz/9QIhAxkGJgC6AAABBgOj6QAAC7YBGQQBASVWACs0AP//ADz/9QIhAxYGJgC6AAABBgOnAAAAC7YBHRIBATBWACs0AP//ADz/9QIhAxcGJgC6AAABBgOlAAAAC7YBGQQBASBWACs0AP//ADz/9QIhA1AGJgC6AAABBwOG/+cApgANtwIBGQQBATJWACs0NAD//wA8//UCIQMYBiYAugAAAQYDoP8AAA23AgEZBAEBQVYAKzQ0AP//ADz/awIhAm8GJgC6AAABBgOKDQAADrQBHxgBAbj/37BWACs0//8APP/1AiEDGQYmALoAAAEGA6LvAAALtgEZEgEBJVYAKzQA//8APP/1AiEDZwYmALoAAAEHA4UAEgCmAAu2ASASAQFCVgArNAD//wA2//UCUALNBiYA5wAAAQYDqgAAAA60ARkEAQG4/8+wVgArNP//ADb/9QJQAxkGJgDDAAABBgOjyQAAC7YCIwQBASVWACs0AP//ADb/awJQAs0GJgDDAAABBgOK7AAADrQCKRgBAbj/37BWACs0//8ANv/1AlADGQYmAMMAAAEGA6LPAAALtgIjEgEBJVYAKzQA//8ANv/1AlADZwYmAMMAAAEHA4X/8gCmAAu2AioSAQFCVgArNAD//wA2//UCUAMdBiYAwwAAAQYDqd4AAAu2AicSAQFBVgArNAD//wA8//UCIQMrBiYAugAAAQYDpOAAAA23AgEZEgEBFlYAKzQ0AP//ADz/9QIhAysGJgC6AAABBwOH//YApgALtgEZBAEBR1YAKzQA//8APP/1AiEDFgYmALoAAAEHA4QAAACmAAu2ARkEAQFsVgArNAD//wA8//UCIQOyBiYAugAAACcDhAAAAKYBBwOg//8AmgAXQA8DAh0aAQE3VgEZBAEBbFYAKzQrNDQA//8APP8nAiECbwYmALoAAAEGA44/CgALtgEiGAAAJlYAKzQA//8APP/1AiEDGwYmALoAAAEGA6j/AAAQtQIBGRIBALj//LBWACs0NP//ADz/9QIhAx0GJgC6AAABBgOp/wAAC7YBHRIBAUFWACs0AP//ADz/9QIhA7QGJgC6AAAAJgOp/wABBwOj/+kAmwAVQA4CMRIBAcBWAR0SAQFBVgArNCs0AAABAB3//AI+AnAABgATQAkDAAIFAnIACHIAKysyEjkwMUUDMxMTMwMBHP9QyL9K+wQCdP4XAej9jQAAAQAUAAACSgJvAAwAHUAPBgMLAwQEAAgBAnIKAAhyACsyKzISOS8XOTAxcwMzExMzExMzAyMDA456SFN9GHhNQXkffoUCb/5NAYX+egG0/ZEBnf5jAP//ABQAAAJKAxkGJgDSAAABBgOj9QAAC7YBDQEBASVWACs0AP//ABQAAAJKAxcGJgDSAAABBgOlDAAAC7YBDQEBASBWACs0AP//ABQAAAJKAxgGJgDSAAABBgOgCwAADbcCAQ0BAQFBVgArNDQA//8AFAAAAkoDGQYmANIAAAEGA6L7AAALtgENBwEBJVYAKzQAAAEALwAAAjQCcAALABxADwoBBwQEAAYGAgJyCQAIcgArMisyLxEXOTAxcxMDMxc3MwMTIycHL9HNVKWiT8LZWq2oAT4BMvHx/s/+wfv7AAEAIAAAAjoCbwAIABpADggIcgcBBAMABgICcgAIAD8rMhIXOSswMWE1AzMTEzMDFQEO7ljBsFHd9gF5/tEBL/6H9gD//wAgAAACOgMZBiYA2AAAAQYDo+kAAAu2AQkCAQElVgArNAD//wAgAAACOgMXBiYA2AAAAQYDpQAAAAu2AQkCAQEgVgArNAD//wAgAAACOgMYBiYA2AAAAQYDoP8AAA23AgEJAgEBQVYAKzQ0AP//ACAAAAI6Ax4GJgDYAAABBgOh/wAAC7YBCQUBAUZWACs0AP//ACD/awI6Am8GJgDYAAABBgOKFwAADrQBDwABAbj/1LBWACs0//8AIAAAAjoDGQYmANgAAAEGA6LvAAALtgEJBQEBJVYAKzQA//8AIAAAAjoDZwYmANgAAAEHA4UAEgCmAAu2ARAFAQFCVgArNAD//wAgAAACOgMWBiYA2AAAAQcDhAAAAKYAC7YBCQIBAWxWACs0AP//ACAAAAI6Ax0GJgDYAAABBgOp/wAAC7YBDQUBAUFWACs0AAABADwAAAIsAm8ADgAZQAwABgYOCHIFAgIDAnIAKzIRMysyETMwMXcBITUhFQEhMjY3MxUVITwBf/6PAc7+iAFgEQ4GB/4QMwH7QTP+BAQGCkD//wA8AAACLAMZBiYA4gAAAQYDo/UAAAu2AQ8DAQElVgArNAD//wA8AAACLAMZBiYA4gAAAQYDpgwAAAu2ARIDAQEiVgArNAD//wA8AAACLAMeBiYA4gAAAQYDoQsAAAu2AQ8DAQFGVgArNAD//wA8/2sCLAJvBiYA4gAAAQYDiiUAAA60ARUOAQG4/9SwVgArNAABADb/9QHrAm8AGAAQtw4YCXITBAJyACsyKzIwMUUiJjURMzMVBgYVERQWMzI2NREzERQGBiMBD2xtQQkFA0hQUkhBNmNDC3pwAZAHBg4R/ptQW1tTAY7+c1JpMgAAAQA7//UCFwHTADcAJ0AUMQpyDAgIDRERACQrB3IzGxsAC3IAKzIRMysyETkvMzMRMyswMVciJjU0PgIzMhYWFxcuAiMiDgIVFB4CMzI+AjUuAiMiBgcnNjYzMh4CFRUjNQ4D/l5lK0xlOBUtMhkCFTAuFCxKOSAVIy0ZL0w3HAEqTzsnTSApJmU4N1hAI1EQMDg4C0c3JTsqFgEEAzkDAwMMGCYaFBwRCBkvRS1ESyAYGi4gIBYzVkHzRhkgEQf//wA7//UCFwKqBiYA6AAAAQYDffMAAAu2ATgrAQEoVgArNAD//wA7//UCFwKRBiYA6AAAAQYDgfUAAAu2ATwrAQFHVgArNAD//wA7//UCFwMtBiYA6AAAAQYDtfUAABVADgJHPAEBZFYBPCsBAUdWACs0KzQA//8AO/9rAhcCkQYmAOgAAAAmA4oCAAEGA4H1AAAYQAwCSCsBAUdWAT4AAQG4/9+wVgArNCs0//8AO//1AhcDLQYmAOgAAAEGA7b1AAAVQA4CRzwBAWRWATwrAQFHVgArNCs0AP//ADv/9QIXA0AGJgDoAAABBgO39QAAFUAOAk48AQFwVgE8KwEBR1YAKzQrNAD//wA7//UCFwMiBiYA6AAAAQYDuPAAABVADgJLPAEBm1YBPCsBAUdWACs0KzQA//8AO//1AhcCrQYmAOgAAAEGA3/+AAALtgE4KwEBLFYAKzQA//8AO//1AjkDJgYmAOgAAAEGA7n3AAAVQA4CPzgBAXhWATgrAQEsVgArNCs0AP//ADv/awIXAq0GJgDoAAAAJgOKAgABBgN//gAAGEAMAkQrAQEsVgE+AAEBuP/fsFYAKzQrNP//ADv/9QIXAzsGJgDoAAABBgO69wAAFUAOAj84AQGNVgE4KwEBLFYAKzQrNAD//wA7//UCHwMlBiYA6AAAAQYDu/0AABVADgJGOAEBcFYBOCsBASxWACs0KzQA//8AO//1AhcDOAYmAOgAAAEGA7z1AAAVQA4CQzgBAcxWATgrAQEsVgArNCs0AP//ADv/9QIXAqoGJgDoAAABBgOG5QAADbcCATgrAQEoVgArNDQA//8AO//1AhcCmwYmAOgAAAEGA3r9AAANtwIBOCsBAWFWACs0NAD//wA7/2sCFwHTBiYA6AAAAQYDigIAAA60AT4AAQG4/9+wVgArNP//ADv/9QIXAqoGJgDoAAABBgN88QAAC7YBOCsBAShWACs0AP//ADv/9QIXAsEGJgDoAAABBgOFEAAAC7YBPysBAThWACs0AP//ADv/9QIXAoUGJgDoAAABBgOH9QAAC7YBOCsBAT1WACs0AP//ADv/9QIXAnAGJgDoAAABBgOE/gAAC7YBOCsBAWJWACs0AP//ADv/HQIXAdMGJgDoAAABBgOfEwAAC7YBQjIAAABWACs0AP//ADv/9QIXArUGJgDoAAABBgOC9gAADbcCATgrAQEyVgArNDQA//8AO//1AhcDlgYmAOgAAAAmA4L2AAEHA33/8wDsABdADwNUQAEBMlYCATgrAQEyVgArNDQrNAD//wA7//UCFwKrBiYA6AAAAQYDg/IAAAu2ATwrAQFrVgArNAAAAwAM//UCUQHTADcAQwBMADlAHEVERCIJPDwhIiIASRwcGA0UB3I0ODgoMDAAC3IAKzIRMzIRMysyMjIRMxE5LzMzETMRMxEzMDFXIiYmNTQ+Ajc0JiYjIgYHJzY2MzIWFhc+AjMyFhYVFQcVFB4CMzI2NjcXBgYjIiYmJw4CJzI2NjUOAhUUFhY3NzQmJiMiBgaoOEUfID5iQRUsIhoyEyYbRCwdMygNDigvGDdEH/0SIy4dEyMeCyMaRSoeOzAPDSo0HCkrEEBUKRUowr4TJx4eLhoLJDwlIzooFwIsOBwUFi4cGw8cFRUcDzBZPicHLR0wIRIJEQwtGhsSIRYWIRI+LEwvARUpIRseDuUFKDccHjn//wAM//UCUQKqBiYBAQAAAQYDfQAAAAu2A00UAQEoVgArNAAAAgBG//UCJwKZAB0AMQAhQBIEMTEdC3IOKCgTB3IHAHIGCnIAKysrMhEzKzIRMzAxRSImJicHIxEzMxUGBhUVPgMzMh4CFRQOAiMnMj4CNTQuAiMiBgYVFB4CMwFAJkQ0ERswTAoGAw0oMTQYMlM9ICdCUysJHjovGxgrOyIxSyoUJz4rCxIhFj4CmQcGDhHsEx8WCx07WDs9XD0eQhIoRDAsQysVK1A2KEAtFwAAAwAg//UCOAJzAA8AHwArABlADCYgIAAYCAVyEAANcgArMisyEjkvMzAxRSImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhY3IiY1NDYzMhYVFAYBLFR4QEB4VFV3QEB3VTtWLi5WOztWLi5WNhIbGxIUGxsLS49lYo9OTo9iZY9LQDtyUk5yPz9yTlJyO9UbExQbHBMTGwAAAQBC//UCIwHSACgAE0AJICgWCgdyKAtyACsrMhEzMDFFIi4CNTQ+AjMyFhcHByc0JicmJiMiDgIVFB4CMzI2NjcXBgYjAVU8ZUkpKUllO0NrIS8HBQgMHUQpI0I1ICA3SikbNjETLClkOQsjQFc1NFdAIy0oLgcFCA0LFREXLD8oKEEvGg4aEjQkJP//AEL/9QIjAqoGJgEFAAABBgN9HwAAC7YBKQoBASlWACs0AP//AEL/9QIjArAGJgEFAAABBgOAIwAAC7YBLgoBATBWACs0AP//AEL/OwIjAdIGJgEFAAABBgONEQAAC7YBOCgAAAtWACs0AP//AEL/OwIjAqoGJgEFAAAAJgONEQABBgN9HwAAFUAOAkEKAQEpVgE4KAAAC1YAKzQrNAD//wBC//UCIwKtBiYBBQAAAQYDfyoAAAu2ASkKAQEtVgArNAD//wBC//UCIwKSBiYBBQAAAQYDeyUAAAu2ASkKAQFXVgArNAAAAgA0//YCGwKZACIANQAhQBIeNTUiC3IaCnIPAHIOLCwKB3IAKzIRMysrKzIRMzAxRSIuAjU0PgIzMhYWFxEzMxUGBhUTFBYXIy4CNQ4CIzcyPgI1NCYmIyIOAhUUFhYzARsrUkMnKUVTKipCMAxHCgYDAQQHTQUEAg8yQCcNKTolEiRINSU8KxYpTDQKHjxbPT9aORsVJRgBFgcGDhH92hIjEgwYFwwYJRRBGS9BJzVPLBYqPSg6VC0AAgAw//QCKAKgACgAPQAdQA8RHxQcBBkZNAoHcikAC3IAKzIrMjJ8Lxc5MDFFIi4CNTQ+AjMyFhYXJiYnByc3LgInNxYWFzcXBx4DFRQOAicyPgI1NC4DIyIOAhUUHgIBMzRdSSkpRVctIDYxExMzIZkTdhImKRdhGzQZhBJmITMjESA+WzwgPDAcFSItMBcfPzMfHTJADCM+VzM0WEMlChYSJkMdJTMcDRUVCBANHRMdLhkgSFBWLjxiRSZAFC1DMCg6JxgLFSxAKylDLxkAAAMAKf/2AjgCnAAhADQARwAjQBEdNDQhCxkKPDU1DgANKioKBwA/MxEzPzMvzD8/MxEzMDFXIi4CNTQ+AjMyFhcRMzMVBgYVERQWFyMuAjUOAiM3MjY2NTQmJiMiDgIVFB4CMwEyFhUUBgYHJz4CNTQmJjU0Nt4iQDQfHzZCIzBDDkIKBgMDBkUEBAIMJjIfDSk0GRw2KBwuIBESIi8cARsVHRcmFB0MFA0RERkKGzldQUNbNxgpJAERBwYOEf3aEiMSCxYWDBcjE0ApTzk6TigUKD0rMkgtFgJmHhYWNTYWGAwZGg4KDxMRDxr//wA0//YCWAKZBiYBDAAAAQcDkQCDAOoAC7YCNgoBATNWACs0AP//ADT/awIbApkGJgEMAAABBgOKDQAADrQCPBoBAbj/1LBWACs0//8ANP9mAhsCmQYmAQwAAAEGA5ACAAAOtAI3GgEBuP+dsFYAKzQAAgA5//YCGQHUACAAKwAbQA0YABMhIQAnCgdyAAtyACsrMhE5LzMRMzAxRSIuAjU0PgIzMh4CFRQGByEeAzMyNjY3Fw4CAyE0LgIjIg4CAUc8Y0gnKEZdMy9SPiMBAv5sAyI4RSUdMy0TMBc8RuoBRRgqNyEcODAhCh88WTk6Wj0gGjZSOAgRCCxAKBMLFhEoFyAPAR0gMiQSDyIzAP//ADn/9gIZAqoGJgESAAABBgN9AQAAC7YCLAoBASdWACs0AP//ADn/9gIZApEGJgESAAABBgOBAwAAC7YCMAoBAUZWACs0AP//ADn/9gIZArAGJgESAAABBgOABQAAC7YCMQoBAS5WACs0AP//ADn/OwIZApEGJgESAAAAJgONCAABBgOBAwAAFUAOA0gKAQFGVgI7AAAAClYAKzQrNAD//wA5//YCGQKtBiYBEgAAAQYDfwwAAAu2AiwKAQErVgArNAD//wA5//YCRwMmBiYBEgAAAQYDuQUAABVADgMzLAEBeFYCLAoBAStWACs0KzQA//8AOf9rAhkCrQYmARIAAAAmA4ovAAEGA38MAAAYQAwDOAoBAStWAjIAAQG4/96wVgArNCs0//8AOf/2AhkDOwYmARIAAAEGA7oFAAAVQA4DMywBAY1WAiwKAQErVgArNCs0AP//ADn/9gItAyUGJgESAAABBgO7CwAAFUAOAzosAQFwVgIsCgEBK1YAKzQrNAD//wA5//YCGQM4BiYBEgAAAQYDvAMAABVADgM3LAEBzFYCLAoBAStWACs0KzQA//8AOf/2AhkCqgYmARIAAAEGA4bzAAANtwMCLAoBASdWACs0NAD//wA5//YCGQKbBiYBEgAAAQYDegsAAA23AwIsCgEBYFYAKzQ0AP//ADn/9gIZApIGJgESAAABBgN7BwAAC7YCLAoBAVVWACs0AP//ADn/awIZAdQGJgESAAABBgOKLwAADrQCMgABAbj/3rBWACs0//8AOf/2AhkCqgYmARIAAAEGA3z/AAALtgIsCgEBJ1YAKzQA//8AOf/2AhkCwQYmARIAAAEGA4UeAAALtgIzCgEBN1YAKzQA//8AOf/2AhkChQYmARIAAAEGA4cDAAALtgIsCgEBPFYAKzQA//8AOf/2AhkCcAYmARIAAAEGA4QMAAALtgIsCgEBYVYAKzQA//8AOf/2AhkDRAYmARIAAAAmA4QMAAEHA30AAQCaABVADgMwLAEBYFYCLAoBAWFWACs0KzQA//8AOf/2AhkDRAYmARIAAAAmA4QMAAEHA3z//wCaABVADgMwLAEBYFYCLAoBAWFWACs0KzQA//8AOf8pAhkB1AYmARIAAAEGA5/ZDAALtgI1AAAAKlYAKzQAAAIANv/4AiAB0wAWADcAHUAOCCcnLy8AHw8GchcAC3IAKzIrMhE5LzMSOTAxRS4CNTQ2NjcmJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhYzMjI3FS4CIyIOAhUUFhYBG0NoOhktICMhNV07THA/QXZON1EuK082KDUcGjYpCA4HBw4OCB0zJhYoQwgBJ0QqHC0fBhEvHCQ3ID1rRkVsPD4pTTozTy0RHRQSHA8BRQEBAQkTHBQZJhT//wA5//YCGQKrBiYBEgAAAQYDgwAAAAu2AjAKAQFqVgArNAAAAgA///UCHwHTACAAKwAZQAwSIiIAJwoLchgAB3IAKzIrMhI5LzMwMUEyHgIVFA4CIyIuAjU0NjchLgMjIgYGByc+AhMhFB4CMzI+AgERPGNIJyhGXDQvUj4jAgEBlAMiOEUlHDQtEzAYO0bq/rsYKjchHDgwIQHTHzxZOTpaPSAaNlI4CBEILEAoEwsWESgYHw/+4yAyJBIPIjP//wBt/08CGwHJBAcAQQAY/1oAAQA/AAACKwKfAB4AG0AOHgpyARwcAhkGchQIAXIAKzIrMjIRMyswMVMjNTM1NDY2MzIWFwcHJzQmJyYmIyIGBhUVMxUjESO1dnY0XDo0Wh4pBwYHDBUrICU7I76+SgGNPCY8TiYfIDYJBAkPCw8MFzIrJjz+cwAABAAq/1QCOwHZADYARgBWAF4APUAiV1xcWyUkR0c3Tz8pIS0JChsXBzc3AFhbPwdyWwdyEwAPcgArMisrETMSOS8XOREzETMSOTkRMxEzMDFFIi4CNTQ2NjcXDgIVFB4CMzI2NjU0JiYjIi4DNTQ2NxcOAhUUFhYzMh4CFRQOAgMiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWNyc2NhcXJgYBJzpdQyMcLx0lFSASGzFEKDdLJxlCPSpGOCYTIyAlDBIII05AQE8sERo4XFs7VzAwVzs8VjAwVjwmOyIiOyYkPCMiO8giI0s0CyhFrA8dLB4cLB0HEgsWHBQRGhIKEiEVFhsOBg4VHhQaMBYbChIPCRAUCRAgKhkbMicXAUgqSSwsSCoqSCwsSSo9Gi0bHCwZGSwcGy0apCIdGwM8AwoA//8AKv9UAjsChgYmAS0AAAEGA5oLAAALtgRfPwEBMlYAKzQA//8AKv9UAjsCsAYmAS0AAAEGA4DhAAALtgRkPwEBKFYAKzQA//8AKv9UAjsCrQYmAS0AAAEGA3/oAAALtgRfPwEBJVYAKzQA//8AKv9UAjsDKwYmAS0AAAEGA4j59gALtgRrPwEBQlYAKzQA//8AKv9UAjsCkgYmAS0AAAEGA3vjAAALtgRfPwEBT1YAKzQA//8AKv9UAjsCcAYmAS0AAAEGA4ToAAALtgRfPwEBW1YAKzQAAAEAVAAAAgsCmQAeABlADREeCnIHFhYLB3IAAHIAKysyETMrMjAxUzMzFQYGFRU+AjMyFhYVESMRNCYmIyIOAxURI1RJCgYDFj1HJzRNK0ofNCEVMC4mFkoCmQcGDhH3HSoXJ1VF/u0BETA5GQwXIiwb/vn////1AAACCwKZBiYBNAAAAQcDkf9kAOoAC7YBHwsBATRWACs0AP//AFT/UAILApkGJgE0AAABBgOPBAAADrQBHxEBAbj/xbBWACs0////xwAAAgsDQQYmATQAAAEHA6X/WAAqAAu2AR8AAQEgVgArNAD//wBU/2sCCwKZBiYBNAAAAQYDig4AAA60ASURAQG4/9SwVgArNP//AHkAAAHcApIGJgE6AAABBgN7/AAAC7YBCgUAAWBWACs0AAABAHkAAAHcAckACQAXQAsHAQEABAUGcgAKcgArKzIRMxEzMDFzNTMRIzUzETMVeZKL14U9AU89/nQ9AP//AHkAAAHcArkGJgE6AAABBgOW9gAAC7YBCgUBAUFWACs0AP//AHkAAAHcApEGJgE6AAABBgOB9wAAC7YBDgUBAVFWACs0AP//AHgAAAHiAq0GJgE6AAABBgN/AQAAC7YBCgUBATZWACs0AP//AGQAAAHcAqoGJgE6AAABBgOG6AAADbcCAQoFAQEyVgArNDQA//8AeQAAAdwCmwYmAToAAAEGA5P2AAANtwIBCgUBAWtWACs0NAD//wB5AAAB3AM+BiYBOgAAACYDegAAAQcDff/3AJQAGrQDIhABALj/9kAJVgIBCgUBAWtWACs0NCs0//8AeQAAAdwCkgYmAToAAAEGA3v8AAALtgEKBQEBYFYAKzQA//8Aef9rAdwCkgYmATkAAAEGA4oOAAAOtAIcAAEBuP/UsFYAKzT//wB5AAAB3AKqBiYBOgAAAQYDfPQAAAu2AQoFAQEyVgArNAD//wB5AAAB3ALBBiYBOgAAAQYDhRMAAAu2AREFAQFCVgArNAD//wB5AAAB3AKFBiYBOgAAAQYDh/cAAAu2AQoFAQFHVgArNAD//wB5AAAB3AJwBiYBOgAAAQYDhAEAAAu2AQoFAQFsVgArNAD//wB5/x0B3AKSBiYBOgAAACYDe/wAAQYDjnQAABVADgIgAAAAAFYBCgUBAWBWACs0KzQA//8AeQAAAdwCqwYmAToAAAEGA7T1AAALtgEOBQEBdVYAKzQA//8APP9SAcECkgYmAUoAAAEGA3tbAAALtgEaEwEBYFYAKzQAAAEAPP9SAbgByQAZABNACQwZEhMGchkPcgArKzIRMzAxVyImJzc3FxYWFxYWMzI2NjURIzUhERQGBiPrNF0eLgYGAQgLEjAeJDsi0QEeN1w6riIgNwcECA4LDA8bOjEBcz7+U0hZKQD//wA8/1ICQQKtBiYBSgAAAQYDf2AAAAu2ARoTAQE2VgArNAAAAQBT//wCPgKZABUAHEAQAQALEwQDEgZyBAByFAMKcgArMisrEhc5MDF3BxUjETMzFQYGFRElHgMzMwcBB+1NTUwKBgMBGwcPEBIIHe4BFGXmOa0CmQcGDhH+itQBAgEBtf7vBAD//wBT/u0CPgKZBiYBTAAAAQYDjBAAAA60ASIDAQG4/+CwVgArNAABAFP//AI+AcsAFQAiQBIMEhIBAAsTBAMEBnIVFBQDCnIAKzIvMysSFzkzLzMwMXcHFSMRMzMVBgYVFSUeAzMzBwEH7U1NTAoGAwEbBw8QEggd7gEUZeY5rQHJBwYOEabUAQIBAbX+7wQAAQBfAAAB+QKZAAkAFUAKBAUAcgcBAQAKcgArMhEzKzIwMXM1MxEjNTMRMxVfp6Dtpj0CHz39pD0A//8AXwAAAfkDQwYmAU8AAAEGA6PpKgALtgEKBQEBJVYAKzQA//8AXwAAAh4CnwYmAU8AAAEHA28AxQAAAAu2ARcFAAAGVgArNAD//wBf/u0B+QKZBiYBTwAAAQYDjBEAAA60ARYAAQG4/+CwVgArNAACAFMAAAIQApkACQAVAB1ADhAKCgAEBQByBwEBAApyACsyETMrMhI5LzMwMXM1MxEjNTMRMxUDIiY1NDYzMhYVFAZTj4jVvhsZJCUYGCYkPQIfPf2kPQEPIxgZIyMZGCMA//8AX/9rAfkCmQYmAU8AAAEGA4oNAAAOtAEQAAEBuP/UsFYAKzQAAwAX/1ICAwKZABkAIwAvACVAFB4fAHIhGxsaCnIqJBITBnIMAA9yACsyKzLOMisyETMrMjAxRSImJzceAxcWFjMyNjY1ESM1MxEUDgIlNTMRIzUzETMVEyImNTQ2MzIWFRQGASo1VB8xBQQIGBoNHRAkOyKu+iA4Tv7AU0yZmnwWHx4XFSEhriAgQAQMDQ8JBQUaOS4Bdz7+TzRKLhisPQIfPf2kPQInHxYXHyAWFh8A//8AX/9mAfkCmQYmAU8AAAEGA5ACAAAOtAELAAEBuP+dsFYAKzQAAQBfAAAB+QKZABEAHkAQAw4GCwQACAkAcg8BAQAKcgArMhEzKzISFzkwMXM1MzUHNTcRIzUzETcVBxUzFV+nZGSg7XNzpj3aHEQbAQI9/tkiRx/xPQABAC0AAAIzAdQAKwAlQBMDJQsbGw8PJQcHcgEGciEWAApyACsyMisrMjIRMxEzETMwMXMRMxU+AjMyFhYXPgIzMh4CBxEjETQmJiMiBgYVESMRNCYjIg4CFREtRwwjLBcYKR0FCiYxGyErGQkBRw8bEhYqG0kfIw0dGhEByTIRHBATIBQUIBMWIi0X/qgBPiooDSM2HP7YATg5KhEcKRr+1f//AC3/awIzAdQGJgFYAAABBgOKDQAADrQBMiEBAbj/1LBWACs0AAEAUgAAAgoB1AAYABlADQMSEgcHcgEGcg0ACnIAKzIrKzIRMzAxcxEzFT4CMzIWFhURIxE0JiYjIg4CFRFSShM6TCwxSy1LHDUlID0yHgHJUxsqGSdVRf7tAREwORkUJTQh/vsA//8AUgAAAgoCqgYmAVoAAAEGA30HAAALtgEZBwEBJ1YAKzQA//8AUgAAAgoCsAYmAVoAAAEGA4ALAAALtgEeBwEBLlYAKzQA//8AUv7tAgoB1AYmAVoAAAEGA4wdAAAOtAElDQEBuP/gsFYAKzT//wBSAAACCgKSBiYBWgAAAQYDew0AAAu2ARkHAQFVVgArNAD//wBS/2sCCgHUBiYBWgAAAQYDihkAAA60AR8NAQG4/9SwVgArNAABAFD/UAIKAdQALQAdQBAeExMjB3IcBnIbCnIJAA9yACsyKysrMhEzMDFFIiYnNx4DMzI2NjU1NC4CIyIOAxURIxEzFT4DMzIeAhUVFA4CATofPBkkBQUOHh0oOx8TISoXFzAtJBZMTBAqMjcbJUAwGyA5S7AREkUBCg4KIUQz5CQyHg4NFyIsGv75AclTFiMYDRYtSjTbPVg4G///AFL/ZgIKAdQGJgFaAAABBgOQDgAADrQBGgABAbj/nbBWACs0//8AUgAAAgsCqwYmAVoAAAEGA4MGAAALtgEdBwEBalYAKzQAAAIALv/4AicB0wAPAB8AE0AJEAAYCAdyAAtyACsrMhEzMDFFIiYmNTQ2NjMyFhYVFAYGJzI2NjU0JiYjIgYGFRQWFgErSnNAQHNKS3FAQHFLM00sLE0zMU8tLU8IPGtGRms9PWtGRms8Pi1PNDVOLCxONTRPLf//AC7/+AInAqoGJgFjAAABBgN99AAAC7YCIAgBAShWACs0AP//AC7/+AInApEGJgFjAAABBgOB9gAAC7YCJAgBAUdWACs0AP//AC7/+AInAq0GJgFjAAABBgN//wAAC7YCIAgBASxWACs0AP//AC7/+AI7AyYGJgFjAAABBgO5+AAAFUAOAycgAQF4VgIgCAEBLFYAKzQrNAD//wAu/2sCJwKtBiYBYwAAACYDig0AAQYDf/8AABhADAMsCAEBLFYCJgABAbj/3LBWACs0KzT//wAu//gCJwM7BiYBYwAAAQYDuvgAABVADgMnIAEBjVYCIAgBASxWACs0KzQA//8ALv/4AicDJQYmAWMAAAEGA7v+AAAVQA4DLiABAXBWAiAIAQEsVgArNCs0AP//AC7/+AInAzgGJgFjAAABBgO89gAAFUAOAysgAQHMVgIgCAEBLFYAKzQrNAD//wAu//gCJwKqBiYBYwAAAQYDhuYAAA23AwIgCAEBKFYAKzQ0AP//AC7/+AInApsGJgFjAAABBgN6/gAADbcDAiAIAQFhVgArNDQA//8ALv/4AicDBAYmAWMAAAAmA3r+AAEHA4QAAQCUABdADwQ4JgEBMFYDAiAIAQFhVgArNDQrNAD//wAu//gCJwMEBiYBYwAAACYDe/oAAQcDhP//AJQAFUAOAywmAQE5VgIgCAEBVlYAKzQrNAD//wAu/2sCJwHTBiYBYwAAAQYDig0AAA60AiYAAQG4/9ywVgArNP//AC7/+AInAqoGJgFjAAABBgN88gAAC7YCIAgBAShWACs0AP//AC7/+AInAsEGJgFjAAABBgOFEQAAC7YCJwgBAThWACs0AP//AC7/+AInAggGJgFjAAABBgOJ0+sADrQCJAgBAbj/sLBWACs0//8ALv/4AicCqgYmAXMAAAEGA330AAALtgMpCAEBKFYAKzQA//8ALv9rAicCCAYmAXMAAAEGA4oNAAAOtAMvAAEBuP/csFYAKzT//wAu//gCJwKqBiYBcwAAAQYDfPIAAAu2AykIAQEoVgArNAD//wAu//gCJwLBBiYBcwAAAQYDhREAAAu2AzAIAQE4VgArNAD//wAu//gCJwKrBiYBcwAAAQYDg/MAAAu2Ay0IAQFrVgArNAD//wAu//gCJwK5BiYBYwAAAQYDfg0AAA23AwIgCAEBN1YAKzQ0AP//AC7/+AInAoUGJgFjAAABBgOH9gAAC7YCIAgBAT1WACs0AP//AC7/+AInAnAGJgFjAAABBgOE/wAAC7YCIAgBAWJWACs0AP//AC7/+AInA0QGJgFjAAAAJgOE/wABBwN9//QAmgAVQA4DJCEBAShWAiAIAQFiVgArNCs0AP//AC7/+AInA0QGJgFjAAAAJgOE/wABBwN8//IAmgAVQA4DJCEBAShWAiAIAQFiVgArNCs0AP//AC7/JwInAdMGJgFjAAAABgOOKwoAAwAu/8ECJwIGAAMAEwAjAB5ADgMCAhwMB3IBAAAUBAtyACsyMnwvMysyMi8zMDFXJwEXAyImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhaLNwFvOtJKc0BAc0pLcUBAcUszTSwsTTMxTy0tTz8bAioc/g48a0ZGaz09a0ZGazw+LU80NU4sLE41NE8tAP//AC7/wQInAqoGJgF/AAABBgN99AAAC7YDJAwBAShWACs0AP//AC7/+AInAqsGJgFjAAABBgOD8wAAC7YCJAgBAWtWACs0AP//AC7/+AInA10GJgFjAAAAJgOD8wABBwN9//QAswAVQA4DODABAANWAiQIAQFrVgArNCs0AP//AC7/+AInA04GJgFjAAAAJgOD8wABBwN6//4AswAXQA8EAzgwAQE8VgIkCAEBa1YAKzQrNDQA//8ALv/4AicDIwYmAWMAAAAmA4PzAAEHA4T//wCzABVADgM4MAEBPVYCJAgBAWtWACs0KzQAAAMACf/0Ak8B0AAlAEIASwAvQBdIFRUmHx8AQxsAGwAbBjsSDwdyAwYLcgArMisyMhE5OS8vETMRMxEzMhEzMDFFIiYnBgYjIi4CNTQ2NjMyFhc2NjMyFhYVFSEeAjMyNjcXBgYlMj4CNTQmJy4CNTQ2NjU0LgIjIgYGFRQWFjczNCYmIyIGBgG8KkccGjshHz40HzNTMCQ5FRg9JTNIJv7qAx03JyU8FSUfS/7fDBcSCwICBQUCBQYKExcMHDUjHzaY1hcwIx8xHAwWFRUVFzZcRlZnLxcXFxcpUj47RkobFBMuGxtABgsOCQILChgrJhInMh0ECQ8MBiBHPUFSJ+MvNxkdOAACAEb/WQItAdMAFgAqACFAEhUXFxELcgMgIAcHcgEGcgAOcgArKysyETMrMhEzMDFXETMVPgIzMh4CFRQOAiMiJiYnFTcyPgI1NCYmJyYOAhUeBEZMDzdJKC5SPyUnQlIrJkY3EaUdOjEeJ0QuIUA0HgESHykxpwJwWCEsFRw6WD09XD0eEiIW5d0QJ0Q0OEwoAgITLko1IDQmGQwAAAIARv9ZAi0CmQAbADAAIUASGRwcFQtyGw5yByUlCwdyAAByACsrMhEzKysyETMwMVMzMxUGBhUVPgIzMh4CFRQOAiMiJiYnFSM3Mj4CNTQmJicmDgIVHgQzRksKBgMPN0koLlI/JSdCUismRjcRTfIdOjEeJ0QuIUA0HgESHykxGgKZBwYOEfwhLBUcOlg9PVw9HhIiFuXdECdENDhMKAICEy5KNSA0JhkMAAACADP/WQIUAdUAFwArACFAEhcOchYGchQiIg8HcgEYGAULcgArMhEzKzIRMysrMDFFNQ4CIyIuAjU0PgIzMh4CFzUzEScyPgI1NC4CIyIOAhUUHgIByBEzQigvU0AlKENXMB80KiAJSe0iOiwXFik2ISNAMRwZLT2n7xkmEyI+WDc6WT4fDBUeE0b9kN4UK0gzLkAnERQqQy4qQi0YAAEAiv//AiIB1AAbABtADhsKcgMCAhQUCAdyAAZyACsrMhEzETMrMDFTMwcnPgMzMhYXBwcnJiYnJiYjIg4CFRUjik8DCgcmNz8gK0sdIgQHAgkNFicXHj81IE0ByYUPHzAhERkZOwkECA0JDAgSKD0r8wD//wCK//8CIgKqBiYBiQAAAQYDfScAAAu2ARwIAQEnVgArNAD//wCK//8CIgKwBiYBiQAAAQYDgCsAAAu2ASEIAQEuVgArNAD//wCK/u0CIgHUBiYBiQAAAQYDjCsAAA60ASgbAQG4/+GwVgArNP//AIr//wIiAqoGJgGJAAABBgOGGQAADbcCARwAAQEyVgArNDQA//8Aiv9rAiIB1AYmAYkAAAEGA4ooAAAOtAEiGwEBuP/VsFYAKzQAAQAd/08CSAHKAC4AGUANIi4PchwGcgYWFgoLcgArMhEzKysyMDFFIi4CNzcOAiMiJic3NxcWFhcWFjMyPgI1NTMRFBYWMzI2Njc+AjcXBgYjAdoaNSsbAQEPNEEjJj4fIwUGAggNDyAVHDgvHE0VJhoIEBEIBgUEAx4TNySxDSA3KncfKxUZGToJBAgOCgkIEig9K/P+ExsiEQIFBAMHCAI5EhQA//8Aiv//AiIChQYmAYkAAAEGA4cpAAALtgEcAAEBR1YAKzQA//8Aiv9mAiIB1AYmAYkAAAEGA5AdAAAOtAEdGwEBuP+esFYAKzQAAgAq//8CIgHUAAMAHwAfQA8BAAAeBwYGGBgMB3IEBnIAKysyETMRMy85LzMwMXc1IRUDMwcnPgMzMhYXBwcnJiYnJiYjIg4CFRUjKgFE5E8DCgcmNz8gK0sdIgQHAgkNFicXHj81IE2qPDwBH4UPHzAhERkZOwkECA0JDAgSKD0r8wAAAQBG//YCEAHUADsAGkAOETcaLwQ7LB4Hcg07C3IAKzIrMhIXOTAxRSImJic3NxcWFhcWFjMyNjY1NC4CJy4CNTQ2NjMyHgIXBwcnNCYnJiYjIgYVFBYWFx4CFRQGBiMBLjFRRx8tBgYCBgwaSjkuQiUQIzgpQV0wLVpCKT80KhUvBwUJDBtHJjdJHkk+RFMlMWVMChAhGEMJBAgPCxYbEiAVDxcTEwoPJzUjIzQeCRMbEjIIBQgNChITGxwQHBwOEiUwIidBJv//AEb/9gIQAqoGJgGTAAABBgN9AAAAC7YBPB4BASdWACs0AP//AEb/9gIQAyoGJgGTAAAAJgN9AAABBwN7ABkAmAAVQA4CQD4BARdWATweAQEnVgArNCs0AP//AEb/9gIQArAGJgGTAAABBgOAAAAAC7YBQR4BAS5WACs0AP//AEb/9gIQAyUGJgGTAAAAJgOAAAABBwN7AAIAkwAVQA4CQzwBAAxWAUEeAQEuVgArNCs0AP//AEb/OwIQAdQGJgGTAAABBgONAAAAC7YBSzsAAApWACs0AP//AEb/9gIQAq0GJgGTAAABBgN/AAAAC7YBPB4BAStWACs0AP//AEb+7QIQAdQGJgGTAAABBgOMAAAADrQBSDsBAbj/6rBWACs0//8ARv/2AhACkgYmAZMAAAEGA3sAAAALtgE8HgEBVVYAKzQA//8ARv9rAhAB1AYmAZMAAAEGA4oAAAAOtAFCOwEBuP/esFYAKzT//wBG/2sCEAKSBiYBkwAAACYDigAAAQYDewAAABhADAJIHgEBVVYBQjsBAbj/3rBWACs0KzQAAQBC//YCLQKdADoAIUARMhMTEhIAHyoBciUKcgcAC3IAKzIrKzIROS8zEjkwMUUiJic3FhYzMj4CNTQuAiMjNTMyPgM1NC4CIyIGBhURIxE0NjYzMhYWFRQGBgceAxUUBgYBUSM+HCUTMBoaNCoZGTFIMCQrEiUiGhEXKDMdMEMkSDZfPkNmOhYpHiM2JRQ2YwoPEDoMDBQlMh4bMCMUOwkTGiMWGiogES5SOP5XAadTbTYvTzAcNCkOCiIuOCE2VjMAAAIAUv/4AhECSAAaAB4AGUANHgAIAQiAGwZyExoLcgArMisazF0zMDFFIi4CNxM3NxcGBgcHFwcGFhYzMjY3FwYGIwEhFSEBYzVCIgoDDlAKAQUHAgsDCAQSLScoQCEYKVYv/u8Bh/55CB5AYEIBRgkBBwcOEXESpUxSHxsUOxkZAdE+AAMASv/4AhECSAADAB4AIgAhQBEAAQEiIgAMAQyAHwZyFx4LcgArMisazF0zETMvMzAxdzUhFQciLgI3Ezc3FwYGBwcXBwYWFjMyNjcXBgYjASEVIUoBh241QiIKAw5QCgEFBwILAwgEEi0nKEAhGClWL/7vAYf+eds7O+MeQGBCAUYJAQcHDhFxEqVMUh8bFDsZGQHRPgD//wBS//gCKgLCBiYBnwAAAQcDbwDRACMADrQCHwgBAbj/obBWACs0//8AUv87AhECSAYmAZ8AAAEGA43jAAALtgIuGgEAB1YAKzQA//8AUv7tAhECSAYmAZ8AAAEGA4wNAAAOtAIrGgEBuP/nsFYAKzT//wBS//gCEQMZBiYBnwAAAQYDeuh+AA23AwIfCAEBalYAKzQ0AP//AFL/awIRAkgGJgGfAAABBgOKCgAADrQCJRoBAbj/27BWACs0//8AUv9mAhECSAYmAZ8AAAEGA5D/AAAOtAIgGgEAuP+ksFYAKzQAAQBK//UCFAHJACIAGUANGgpyFQcGch4ODgALcgArMhEzKzIrMDFFIi4DNTczFRQeAjMyPgI1NTMRFBYXIy4CNQ4DAQkoPy0dDgFLECE0Ix04LxxKBAhJBgUBDicxNQsTJTVFKPr6KDsnFBMnPCn5/n4SIxIMFxgLEx4VCwD//wBK//UCFAKqBiYBpwAAAQYDffUAAAu2ASMUAQEyVgArNAD//wBK//UCFAKRBiYBpwAAAQYDgfYAAAu2AScUAQFRVgArNAD//wBK//UCFAKtBiYBpwAAAQYDfwAAAAu2ASMHAQE2VgArNAD//wBK//UCFAKqBiYBpwAAAQYDhucAAA23AgEjBwEBMlYAKzQ0AP//AEr/9QIUApsGJgGnAAABBgN6/wAADbcCASMHAQFrVgArNDQA//8ASv9rAhQByQYmAacAAAEGA4r6AAAOtAEpAAEBuP/fsFYAKzT//wBK//UCFAKqBiYBpwAAAQYDfPMAAAu2ASMUAQEyVgArNAD//wBK//UCFALBBiYBpwAAAQYDhRIAAAu2ASoUAQFCVgArNAD//wAt//UCMgIdBiYB1AAAAQYDie4AAA60AScHAQG4/8+wVgArNP//AC3/9QIyAqoGJgGwAAABBgN93QAAC7YCLBQBATJWACs0AP//AC3/awIyAh0GJgGwAAABBgOK6QAADrQCMgABAbj/37BWACs0//8ALf/1AjICqgYmAbAAAAEGA3zbAAALtgIsFAEBMlYAKzQA//8ALf/1AjICwQYmAbAAAAEGA4X6AAALtgIzFAEBQlYAKzQA//8ALf/1AjICqwYmAbAAAAEGA7TcAAALtgIwFAEBdVYAKzQA//8ASv/1AhQCuQYmAacAAAEGA34NAAANtwIBIxQBAUFWACs0NAD//wBK//UCFAKFBiYBpwAAAQYDh/YAAAu2ASMHAQFHVgArNAD//wBK//UCFAJwBiYBpwAAAQYDhAAAAAu2ASMHAQFsVgArNAD//wBK//UCFAM1BiYBpwAAACYDhAAAAQcDev//AJoAF0APAwInJAEBYVYBIwcBAWxWACs0KzQ0AP//AEr/HQIUAckGJgGnAAABBwOOAKMAAAALtgEsGgAAEVYAKzQA//8ASv/1AhQCtQYmAacAAAEGA4L4AAANtwIBIxQBATxWACs0NAD//wBK//UCFAKrBiYBpwAAAQYDg/QAAAu2AScUAQF1VgArNAD//wBK//UCFANdBiYBpwAAACYDg/QAAQcDff/1ALMAFUAOAjszAQADVgEnFAEBdVYAKzQrNAAAAQAwAAACIwHJAA0AFUAKBAMACQEGcgAKcgArKzISOTkwMWEDMxMjNzY2NzMGBgcDAQvbUbkUaB0kCEwKKh6EAcn+gsE3XigqZDr+/wAAAQAU//8CQgHJABQAG0AOAwYTAwANBAEGchIACnIAKzIrzDMSFzkwMVcDMxMTMxM+AzU3Mw4CByMDA4t3RV9gMHISGA0GAUoNICQUSGZfAQHK/pIBQ/68WHFJMxkRTZmYTAEr/tX//wAU//8CQgKqBiYBvwAAAQYDffYAAAu2ARUMAQEyVgArNAD//wAU//8CQgKtBiYBvwAAAQYDfwEAAAu2ARUBAQE2VgArNAD//wAU//8CQgKbBiYBvwAAAQYDev8AAA23AgEVAQEBa1YAKzQ0AP//ABT//wJCAqoGJgG/AAABBgN88wAAC7YBFQwBATJWACs0AAABADYAAAIlAckACwAaQA4KAQcEBAAGAgZyCQAKcgArMisyEhc5MDFzNyczFzczBxcjJwc2xMFalpBUtc1enpbo4ays3uu1tQACAB7/UgIXAckAHAAgABpADhkgEB8EHBUdBnIMHA9yACsyKzISFzkwMVciJic3NxcWFhcWFjMyNjY3EzY2NzMGBgcDBgYjAzMTB5wmQRclBwUCCw4MGxAgLyUQahIiBk4IJBWIHVo7YVK5IK4VFDMJBQgJCQQEGTQpAQ0uWi4uXi/+vkM3Anf+fVkA//8AHv9SAhcCqgYmAcUAAAEGA338AAALtgIhFAEBMlYAKzQA//8AHv9SAhcCrQYmAcUAAAEGA38HAAALtgIhHQEBNlYAKzQA//8AHv9SAhcCmwYmAcUAAAEGA3oGAAANtwMCIR0BAWtWACs0NAD//wAe/1ICFwKSBiYBxQAAAQYDewIAAAu2AiEUAQFgVgArNAD//wAe/1ICFwHJBiYBxQAAAQcDigChAAAAC7YCIRwBARtWACs0AP//AB7/UgIXAqoGJgHFAAABBgN8+gAAC7YCIRQBATJWACs0AP//AB7/UgIXAsEGJgHFAAABBgOFGQAAC7YCKBQBAUJWACs0AP//AB7/UgIXAnAGJgHFAAABBgOEBwAAC7YCIR0BAWxWACs0AP//AB7/UgIXAqsGJgHFAAABBgOD+wAAC7YCJRQBAXVWACs0AAABADwAAAIcAckADgAZQAwABgYOCnIFAgIDBnIAKzIRMysyETMwMXcBITUhFQEhMjY3MxUVITwBXf64AbP+qgFCEQ4GB/4gMwFVQTP+qgQGCkD//wA8AAACHAKqBiYBzwAAAQYDffUAAAu2AQ8DAQEyVgArNAD//wA8AAACHAKwBiYBzwAAAQYDgPkAAAu2ARQDAQE5VgArNAD//wA8AAACHAKSBiYBzwAAAQYDlAAAAAu2AQ8DAQFgVgArNAD//wA8/2sCHAHJBiYBzwAAAQYDig0AAA60ARUOAQG4/9SwVgArNAABAC3/9QHgAckAIgAYQAwaChUHBnIeDg4AC3IAKzIRMysyPzAxVyIuAzU3MxUUHgIzMj4CNTUzERQWFyMuAjUOA+ImPCsbDQFHEB8xIhs2LBpGBAhGBAUCDCYuMwsTJTVFKPr6KDsnFBMnPCn5/n4SIxIMFxgLEx4VCwAAAgBgAJ0B+QJ0ADMANwAsQBQ3NDQALxgYABAHBwAuLgAAISgDcgArMjIvMy8ROS8zETMRMxEzfS8zMDFBIiY1NDY2MzIWFhcXLgIjIgYGFRQWFjMyPgI1LgIjIgYHJzY2MzIWFhUVIzUOAwchFSEBCERLNl47Dh8iEgEOIiAOK0IkFygXITQkFAEcNigeNhgjHUsrNlAsRAsiJye6AZn+ZwECOCsnOB4BAgIxAgICECAYExgKESI1IzI3FxEUKBoXHklDvzISFw0FLzYAAwBgAJ0B+QJ0AA8AHwAjABhACiMgIBAAABgIA3IAKzIyLzMzfS8zMDFBIiYmNTQ2NjMyFhYVFAYGJzI2NjU0JiYjIgYGFRQWFgchFSEBLDdVMDBVNzdTMDBTNyM1Hx82IiM3Hx83qQGZ/mcBBC5TNzdTLi5TNzdTLjYgOygoOiAgOigoOyBnNgD//wBSAAACCgHUBgYBWgAAAAIAPAAAAi0CbwAMABQAIkAQEg0NCw8PEAJyFAoAAQEJCAA/MxEzMzMrMhEzMxEzMDF3JyEyNjczFRUhNQEzFxchNSEVASNiFgG0EQ4GB/4QAVQzRhf+HgHv/rg2FRcEBgosMwI3ERctM/3TAAMARP/1AhQCcwADABMAIwAdQA4CAQEcDAVyAAMDFAQNcgArMjIRMysyMhEzMDF3ARcBFyImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhaAAUEb/sCQSWg3N2hJSWg3N2hJMEUnJ0UwMEUnJ0WaAVcv/q16S49lYo9OTo9iZY9LQDtyUk5yPz9yTlJyOwAAAQBqAAABYwJwAAYAF0ALBgxyAgMDAQEEBHIAKzIRMxEzKzAxYREHJzczEQEZnBPDNgIbKSlV/ZAAAAEARgAAAg8CcwArABVACgAjIysMcgsZBXIAKzIrMhEzMDF3PgQ1NC4CIyIGBgcGBhcHJyc+AjMyFhYVFA4DByEyNjczFRUhWEBuWT8hFyYyGh47NBQKBQEFBzUXSFwzQGA3Iz1TXjIBGxEOBgf+STg3WkxFQyYgKxoLDhwWDQ4JBAUrJjYcKlA4KkxJSU4rBAYKQAABAFP/9QIAAnMAOAAdQA4wFhYVFSgMOA1yICgFcgArMisyETkvMxI5MDFFIiYnNzcXFhYXFhYzMjY2NTQuAgc1Mj4CNTQuAiMiBgYHJzY2MzIWFhUUBgYHHgIVFAYGIwEgO2wmNwgEAQcMFTYnMEQkITtQMDpMKxITICoYGC8sFjIpYTA9Vi8XMiUoPSIzZEkLJCM3CAYIDAwPEh04JSQyHAsEOhMhLRkWIRcLCBQRLCMdJkYvITkpCwsqPiwyUzEAAAIAOgAAAjYCcAAKAA0AIUAQAwsLBgYCDQkJBAoMcgQEcgArKxI5LzkzMxEzETMwMWE1ITUBMxEzFSMVJTMRAYP+twFYP2Vl/sbsmDQBpP5kPZfVASEAAQBN//UCFgJvAC0AHUAOIBYWJCQcDC0Nch8cBHIAKzIrMhI5LzMSOTAxRSImJzc3FwYWFxYWMzI+AjU0LgIjIgYGBycTIRUhBz4CMzIeAhUUBgYjAStFdCU7CAQBCAsaQi4cOCwbGy47IBkzLRM1GQF7/sUMFCwtFDFSPSI+akMLMi4sBgUIDA0WFhMlNyMkNiUSDBkTEgE9QbEICwUcN00xQV0xAAIAUP/2Ag8CdgAoAD0AHUAOGzMzHx8IPSgNchUIBXIAKzIrMhI5LzMRMzAxRSImJjU0NjYzMhYXBwcnJiYnLgIjIg4DBz4CMzIeAhUUBgYjNzI+AjU0LgIjIg4CBwYeAjMBOUppNkJ3Ty9TIy4HBQEIDgsaHQ8UMTMsGwERNkAfKks4ITpgPAQZMScXGSoxFxUtKiMMBRMrPicKSIRacJpQHB00CAUIDAoHBwMLHTVUPBghEh03Sy4+XjRBEiM1JCY2IhENFx4SIkc7JQAAAQBfAAACBgJvAA0AE0AJCAUFBgRyAAxyACsrMhEzMDFzPgI3ITUhFQ4DB8EiS08p/rkBpyFCPjcZYLm3WkUpSI+SkksAAAMASP/2AhECdwAhADMARQAaQA4rCBk0BAA9EAVyIgANcgArMisyEhc5MDFFIiYmNTQ2NjcuAjU0NjYzMhYWFRQOAgceAxUUBgYnMjY2NTQuAicOAxUUFhYTPgM1NCYmIyIGBgcUHgIBLEdmNyRDLSIyHCxYQkVXKhAfKxsgNCYUOGZFL0QlGS0+JBsyJhcnRj4WKCATHzonKDgdARcoMgotTC8lQTYRDyw3HyxFKihDKhcsJiEMDCQsMhwyTS1CGzAfFyokHQkJGyQoGB8xHQEuChsfIxMZKBgXJxgXJB0ZAAABAFL/9gIPAnMAOgAZQAwfKCgyDDoNchUyBXIAKzIrMhI5LzMwMUUiJic3NxcUFhcWFjMyPgI1NCYmIyIOAhUUHgIzMjY2NxcOAiMiLgI1ND4CMzIWFhUUBgYHARI3WSMyBwUKDBIqGzBHLxcjRTMeNSgWGCk0HCo8MRUGFjRAKS9POyAhO04sSWc3PXFPCh0cMwcFCAsKCggsTWEzU2szESQzIh8vIBEQJB1JFSASGzJFKy1KNh5Ed01+pFECAAADAET/9QIUAnMACwAbACsAGUAMBgAADCQUBXIcDA1yACsyKzISOS8zMDFlIiY1NDYzMhYVFAYDIiYmNTQ2NjMyFhYVFAYGJzI2NjU0JiYjIgYGFRQWFgEsGSQlGBgmJBpJaDc3aElJaDc3aEkwRScnRTAwRScnRf0jGBkjIxkYI/74S49lYo9OTo9iZY9LQDtyUk5yPz9yTlJyOwACAET/9QIUAnMADwAfABC3GAgFchAADXIAKzIrMjAxRSImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhYBLEloNzdoSUloNzdoSTBFJydFMDBFJydFC0uPZWKPTk6PYmWPS0A7clJOcj8/ck5ScjsA//8Aiv/zAc4BgAYHAgMAAP8E//8Apf/vAVUBcgYHAgQAAP75//8Ai//5AckBfwYHAgUAAP8D//8Ak//qAcABdwYHAgYAAP77//8Ahf/6AeIBfQYHAgcAAP8E//8Akv/zAc8BfAYHAggAAP8E//8Ak//0AckBgQYHAgkAAP8E//8Anf/6AcMBfAYHAgoAAP8E//8Ajv/0AcsBggYHAgsAAP8E//8Ak//0AckBgAYHAgwAAP8E//8Aiv/zAc4BgAYGAeUAAP//AKX/7wFVAXIGBgHmAAD//wCL//kByQF/BgcCBQAA/wP//wCT/9cBwAFkBgcCBgAA/uj//wCF//oB4gF9BgcCBwAA/wT//wCS//MBzwF8BgYB6gAA//8Ak//0AckBgQYGAesAAP//AJ3/+gHDAXwGBgHsAAD//wCO//QBywGCBgYB7QAA//8Ak//0AckBgAYGAe4AAP//AIoA7wHOAnwGBgIDAAD//wClAPYBVQJ5BgYCBAAA//8AiwD2AckCfAYGAgUAAP//AJMA7wHAAnwGBgIGAAD//wCFAPYB4gJ5BgYCBwAA//8AkgDvAc8CeAYGAggAAP//AJMA8AHJAn0GBgIJAAD//wCdAPYBwwJ4BgYCCgAA//8AjgDwAcsCfgYGAgsAAP//AJMA8AHJAnwGBgIMAAAAAwCKAO8BzgJ8AAMAEwAhABdADAMAAgEEFAR3GwwFcgArMuQyFzkwMVM3FwcXIiYmNTQ2NjMyFhYVFAYGJzI2NTQmJiMiBgYVFBa22xPbYzJJJydJMjNIJydIMzE4GS8hIC8aOQFdziTMTC9ZPj1ZMTFZPT5ZLy9PSC5EJSVELkhPAAEApQD2AVUCeQAGABZACgMCAgEBAHcEBHIAK+0zETMRMzAxZREHJzczEQEbZw+ELPYBRRoiNv59AAABAIsA9gHJAnwAJgAUQAkAHh4mdwkVBXIAKzLkMhEzMDFTPgM1NCYmIyIGBwYGFQcnJzY2MzIWFhUUDgIHMzI2NzMVFSGYOFpAIhgqGRozEwsHBAgoGlY2K0QmITlKK6YRDgYH/s8BHytANTIbGBwLDQ0MDQgFBiEiKBsxIyA4NjkgBAYKMAAAAQCTAO8BwAJ8ADIAHUAOKhQUExMkMgwdMnckBXIAK+QzPxI5LzMSOTAxZSImJzc3FxYWFxYWMzI2NTQmJgc1Mj4CNTQmJiMiBgcnNjYzMhYVFAYHHgIVFAYGIwEjKksbJwgEAQkODSAWLzUmQywnMx4MFSMWGS8VJxxFIz9LJSQZKBglRTPvFxYnCAUICgoFByUgHCAMAy0JExkPERYMDBAiFxM1LCAuCgcZJxshMx4AAAIAhQD2AeICeQAKAA0AH0AOAwYGDAwJDQQBAQB3BAUAP+05LxI5MzMRMxEzMDFlNSM1EzMVMxUjFSczNQFi3ekvRUXQlfZcJQEC+S9biqMAAQCSAO8BzwJ4ACoAF0AKDB4UISEqdx0aBQA/M+Q5LzMzMjAxZSImJzc3FwYWFxYWMzI2NjU0JiYjIgYGByc3IRUjBzY2MzIeAhUUBgYjASwwUhgrCAQBCgwQKBgaMB0eMR0RIh4NKBEBB9UHEy8VITgpFytJL+8fHSEHBggKCwkIEiUbHCUSBw8LDscwZAgHESEwHyk7HwACAJMA8AHJAn0AJAA2ABZACi4cHDYkdxMHBXIAKzLkMjkvMzAxZSImNTQ2NjMyFhcHBycmJicmJiMiDgIHPgIzMhYWFRQGBiM3MjY2NTQuAiMiBgYHBhYWMwE0TVQuUjcgOxkgBwUBDA4KFQsRKycbAgwkKhUnQCYnQysDFygbERwfDxMnIgsCGDEh8GNTRWAyERMmCAUICAgCAgkdNCoOEwogOCgmPCEwEyQbFR8TCg0VDhw1IgAAAQCdAPYBwwJ4AAwAEbcIBQUAdwYEcgAr5DMRMzAxdz4CNyM1IRUOAgfeGDM3G94BJh86Nhb2OnFuNjMgOnR2PgAAAwCOAPABywJ+ABwALAA8ABdADActFSUEHQB3NQ4FcgArMuQyFzkwMWUiJjU0NjY3LgI1NDYzMhYVFAYGBx4CFRQGBicyNjY1NCYmJw4CFRQWFjc+AjU0JiYjIgYGFRQWFgEsSVUXKx4WIRFHREZEEiEXHCgWJ0cwHy0ZHjMhFykZGy4qEyEVFSYaGCYUGivwPC0YKCALCRsgEyo5NygTIxwKCh8mGCAwHDEPGxISHxgHCBcdEhMcD7QJFRsODxYNDRUOEhoTAAABAJMA8AHJAnwAMgAUQAkcJCQydxQsBXIAKzLkOS8zMDFlIiYnNzcXFhYXFhYzMjY2NTQmJiMiBgYVHgIzMjY2NxcGBiMiJiY1NDY2MzIWFRQGBwEZJUAZJAcFAQwNCxYOKjccFi4iGysaARssGBsoIQ4GFzopKkQoKEYpTVJcVPAQEygHBQgICQIDK0gqMz8eEiQbFyEQCRYRNRMYHjckJTohXExzcAEAAAEAZP/WAgMCmQADAAyzAwIBAAAvMi8zMDFXJwEXlDABbzAqGwKoHAADABj/ugJFAq4ABgAkACgAN0AZJiUlBwgiIgcRGRkHKCcnBAIBAQMDBAAABAAvMy8RMxEzETMRMy8zLzMvMxEzETMRMy8zMDFTNQcnNzMREzU+AzU0JiYjIgYGByc2NjMyFhYVFA4CBzMVJScBF3RQDGgnqyxHMhoSIBQUJR0LIhRFKiM2IBkrOSGf/k8wAW8wAXz9FiAr/s7+PiMjMyglFRIUCQoTDxwbIBUoHBkrKCwaKhwbAqgcAAAEABj/ugJMAq4ABgARABQAGABBQB4WFRUHDQoTExAUCwgIBwsLBxgXFwQCAQEDAwQAAAQALzMvETMRMxEzETMvMy8zLxI5LxI5MzMRMzMRMy8zMDFTNQcnNzMRATUjNTczFTMVIxUnMzUFJwEXdFAMaCcBOqy3KTc3oG3+sjABbzABfP0WICv+zv4+SCDKwilHcHfLGwKoHAAABAAJ/7oCTAKxADAAOwA+AEIAPUAdQD8/OzM2Njk5PD00MTE7NDQ7QkFBEyoUAyQwMCQALzMvEhc5Mi8zLzMvEjkvEjkzMxEzETMRMy8zMDFTIiYnNzcXFBYXFhYzMjY1NCYmBzUyPgI1NCYmIyIGByc2NjMyFhUUBgcWFhUUBiMBIzU3MxUzFSMVIzc1BwcnARd8Ij0UIAcFCg0IFw8kKR00Ih4oFgoQGxETJREhFzgbMz0eGx0oQD4BZay3KTc3NAFt4TABbzABdhISIwgECAoJAwQcFxYYCgMnBw4SCg0RCQkNHhMQKiQaIwgHJiEmNP6MIMrCKUdwd3dUGwKoHAD//wCK/+kBzgF2BgcCFAAA/vr//wCK/+kBzgF2BgcCFAAA/vr//wCKAO8BzgJ8BgYCFAAAAAIAigDvAc4CfAAPAB0AD7YQAHcXCAVyACsy5DIwMWUiJiY1NDY2MzIWFhUUBgYnMjY1NCYmIyIGBhUUFgEsMkknJ0kyM0gnJ0gzMTgZLyEgLxo57y9ZPj1ZMTFZPT5ZLy9PSC5EJSVELkhP//8Aiv/zAc4BgAYHAhgAAP8E//8Aiv/zAc4BgAYGAhUAAP//AIoA7wHOAnwGBgIYAAAAAwCKAO8BzgJ8AAsAGwApABZACgYAABwMdyMUBXIAKzLkMjkvMzAxQSImNTQ2MzIWFRQGByImJjU0NjYzMhYWFRQGBicyNjU0JiYjIgYGFRQWAS8QFRYPDRgWEjJJJydJMjNIJydIMzE4GS8hIC8aOQGdFRAOFRUODxauL1k+PVkxMVk9PlkvL09ILkQlJUQuSE8AAAEA5P/1AVsAbAALAAqzBgALcgArMjAxRSImNTQ2MzIWFRQGASAZIyMZGCMjCyMYGCQkGBgjAAEAz/9YAWcAbAATAAqyAMAMAC8azDAxVyc2NjU0LgI1NDYzMhYVFA4C8SIgKBAVECIcHCsPHiyoIRo5FAsRERUOGSMvJRYtMDMAAgDj//UBXgGqAAsAFwAOtRIMC3IABgAvMysyMDFBIiY1NDYzMhYVFAYDIiY1NDYzMhYVFAYBIBglJRgYJiUZGSQlGBgmJAEzIxgZIyMZGCP+wiIZGSMjGRgjAAACAM7/WAFkAaoAEwAfAA60FBoAwA0ALxrMLzMwMVcnNjY1NC4CNTQ2NjMyFhUUBgYTIiY1NDYzMhYVFAbwIiAoEBUPDxsSHCoaMwkYJSUYGCYlqCEaORQLEREVDhEaES8lHT5BAbcjGBkjIxkYIwAAAwAT//UCLABsAAsAFwAjABlACxgMDB4SEgYGAAtyACsyETMRMzIRMzAxVyImNTQ2MzIWFRQGMyImNTQ2MzIWFRQGMyImNTQ2MzIWFRQGTxkjIxkYIyO4GSMjGRgjI7oZIyMZGCMjCyMYGCQkGBgjIxgYJCQYGCMjGBgkJBgYIwACAOT/9QFfApwACgAWABRACQAREQsLcgUBcgArKzJ8EM4wMWUDNDY2MzIWFhUDByImNTQ2MzIWFRQGAQgaDRcQERYNGxoZJCQZGSUlwgGQGCERESUe/nrNIxkZJSUZGCQAAAIA5P+vAV8CVgAKABYAD7QAERELBgAvLzN8EM4wMUEzExQGBiMiJiY1EzIWFRQGIyImNTQ2AQgzGw0WERAXDTMZJSUZGSQkAYn+eh4lEREiFwJdJBgZJSUZGSMAAgBN//UCCQKZACYAMgAXQAsmJi0tJwtyDBkBcgArMisyETMvMDFlND4ENTQuAiMiBgcGBhUHJyc+AjMyFhYVFA4EFRUjFyImNTQ2MzIWFRQGARQYKCwnGRYoNB0xSx0LBgQHLxo+VTs/YDUZKCwoGUclGSMjGRgjI+QlMigiJC8hFyMaDRgaDA0IBgYqIS4ZJkYwKDkpIyIsHyjGIxgYJCQYGCMAAAIATP+FAggCKQAmADMAErYlJS0tJwwZAC8zLzMRMy8wMUEUDgQVFB4CMzI2NzY2JzcXFw4CIyImJjU0PgQ1NTMnMhYVFAYjIiY1NDYzAUIZJywoGRcnNB0xTB0LBgEECC4ZPlQ8QGA1GictJxpHJRkjIxkYIyMYATokMygiJC8hFiQaDRgaDA0IBgYqIC8ZJkYwKTgpIyItHijGIxgYJCQYGCMAAQDhAQ8BXAGGAAsACLEGAAAvMjAxQSImNTQ2MzIWFRQGAR4ZJCUYGCYkAQ8jGBkjIxkYIwAAAQDUANIBhAF/AA8ACLEIAAAvMjAxZSImJjU0NjYzMhYWFRQGBgEsGCgYGSgXGCgYGCfSGCcXGScXGCcYFycYAAEAMQB7AiYCGAAOABtADwIFCA4LAwQKCQkGDQAABgAvMy8yERc5MDF3JzcnNxcnMwc3FwcXByemO5vVIMURUxPCH9KXPYJ7Kpg1QEqwsEc9NJcrpQAAAQDw/34BjQCLABAADrQBAMAICQAvMxrOMjAxVzUyNjU0JiYjNTIWFhUUBgbwLDIWKh4vRignR4I4LyAVJBc2JT0lJD0lAAIAHgAKAjsCcgAbAB8AQUAfEw8PDBYfHwkJDBccHAgIBRoCAgUMBQwFBBINAnIABAAvMysyEjk5Ly8RMxEzETMRMxEzETMRMxEzETMRMzAxZTcjBwc3IzczNyM3Mzc3BzM3NwczByMHMwcjByczNyMBSRqPGT0ZeQV7GIcDihhAGY0YQRhyB3IZewZ7G6yNGY4KtLABrzCoMasCq6cBpjKmMLPgpwABAFX/1gIEApkAAwAMswMCAQAALzIvMzAxVycBF5Q/AW9AKiECoiMAAQBV/9YCBAKZAAMADLMBAgMAAC8yLzMwMUUBNwEBxv6PPwFwKgKgI/1eAP//AOEBDwFcAYYGBgIiAAAAAQAxALcCJgJUAA4AG0AQAgUIDgsDBAoJCQ0AAAYCcgArMi8zFzkwMXcnNyc3FyczBzcXBxcHJ6Y7m9UgxRFTE8If0pc9grcqmDVASrCwRz00lyulAAABAIv/mAHpAt8AEwAMswkIEwAALzIvMzAxRS4CNTQ2NjcXDgMVFB4CFwHTZJNRT5BiFDlhRycoSGQ9aCeApF1coH0mQRpJWmo6O2pcShsAAAEAhf+YAeMC3wATAAyzCwwBAAAvMi8zMDFXJz4DNTQuAic3HgIVFAYGnBc9ZEknJ0dgOhVhkE9QlGg/G0pcajs6alpJGkEmfaBcXaSAAAEARP+hAeoCvQArABdACSALCwoKGBUpAAAvMi8zOS8zEjkwMUUiJiY3NzQmJiMjNTMyNjY1JzQ2NjMzFSMiBhUXFAYGBx4CFQcUFhYzMxUBvVZxNgQEGTAjGBclMhkDL19ITGM3PQITKSEgKBMEIkU1PV8dTEZkLDASPBUuJkg6TSc8MzRGJTkpDQkpPitULDMWOwABAFD/oQH1Ar0AKwAZQAoMICAjIwEVFgIBAC8zLzMSOS8zEjkwMVcjNTMyNjY1JzQ2NjcuAjU3NCYjIzUzMhYWFQcUFhYzMxUjIgYGFRcWBgZ8Kz02RSEDEygfICkUAzw5YkxJXi4CGTIkFxgiMBoFBDVyXzsWMyxUKz4pCQ0pOSVGNDM8J006SCYuFTwSMCxkRkwdAAABAKH/pwH2Ap4ABwAMswQBBQAALzIvMzAxVxEhFSERIRWhAVP+8gEQWQL3P/2EPAABAIr/pwHeAp4ABwAMswUGAgEALzMvMzAxRSE1IREhNSEB3v6sAQ/+8gFTWTwCfD8AAAEAhQEYAdUBXQADAAixAQAALzIwMVM1IRWFAVABGEVFAP//AIUBGAHVAV0GBgIxAAAAAQBVARgCBQFdAAMACLEBAAAvMjAxUzUhFVUBsAEYRUUAAAEADAEYAkwBXQADAAixAQAALzIwMVM1IRUMAkABGEVFAP//AFUBGAIFAV0GBgIzAAD//wAMARgCTAFdBgYCNAAA//8AhQEYAdUBXQYGAjEAAAABACr/rQIv/+0AAwAIsQEAAC8yMDFXNSEVKgIFU0BA//8Ay/9YAWUAawYHAj4AAP3tAAIAT/9YAeUAawATACcAFLcVFBQBAMAhDQAvMxrMMjIRMzAxVyc+AjU0LgI1NDYzMhYVFAYGFyc+AjU0LgI1NDYzMhYVFAYGcyQWIRMQFQ8iGxwrGTTTJBYhExAVDyIbHCsZNKghEyckDAsREBQOGSEuJRo9QyYhEyckDAsREBQOGSEuJRo9QwACAGUBagH1An4AEwAnABdAChUUFCENwAEAA3IAKzIazDIzETMwMVMXDgIVFB4CFRQGIyImNTQ2NiUXDgIVFB4CFRQGIyImNTQ2NtskFSITEBUPIhwbKxk0AR8kFSITEBUPIhwbKxk0An4hEikiDQsREBQOGSIuJRs9RCUhEikiDQsREBQOGSIuJRs9RAAAAgBsAWoB/QJ+ABMAJwAXQAoBAAAVFMANIQNyACsyGswyMhEzMDFBJz4CNTQuAjU0NjMyFhUUBgYFJz4CNTQuAjU0NjMyFhUUBgYBhyUXIRIPFQ8iGxwrGTT+4SUXIRIPFQ8iGxwrGTQBaiITJyQMCxAQFQ4YIi4lGj1DJyITJyQMCxAQFQ4YIi4lGj1DAAEA3QFqAXcCfgATAA61AQ3AAANyACsazDMwMUEXDgIVFB4CFRQGIyImNTQ2NgFTJBUiExAVDyIcGysZNAJ+IRIpIg0LERAUDhkiLiUbPUQAAQDLAWoBZQJ+ABMADrUBAMANA3IAKxrMMjAxUyc+AjU0LgI1NDYzMhYVFAYG7yQWIRMQFQ8iGxwrGTQBaiITJyQMCxAQFQ4YIi4lGj1DAAACAFAAPQIRAZAABgANAAyzBwoDAAAvLzMyMDFlJzU3FwcXFyc1NxcHFwEOvrcpkJivvLUpj5c9qReTKnWLKakXkyp1iwAAAgBcAD0CHQGQAAYADQAMswcLBAAALy8zMjAxZSc3JzcXFQUnNyc3FxUBYCqXjym2/mkqmI8ptT0pi3UqkxepKYt1KpMXAAEArgA9AZgBkAAGAAixAwAALy8wMWUnNTcXBxcBbL62K42WPakXkyt0igAAAQCyAD0BnAGQAAYACLEEAAAvLzAxdyc3JzcXFd4slo4rtz0qinQrkxf//wCrAZcBrQKZBCYCRKoAAAYCRFYAAAEBAQGXAVcCmQALAAixBwAAL80wMUEzFA4CByMuAwEBVgMFBgM0AwYFAwKZPEgxLSAgLTBJ//8AjwGXAc4CmQQmAkaOAAAGAkZUAAABAQEBlwF6ApkADwAKsgEACQAvzTIwMUEnPgImNTQ2MzIWFRQGBgE5OA4MAQIXGRcZDRwBlxIkNSkjEhseHBoYNkkAAAIANgAbBGUCYAAGAAoAG0AMBgIFAwMEBAgIAQAHAC8zMjMRMxEzFzkwMWU1JSU1ARUFNSEVAgUB+/4FAmD70QLYG0nc2Ej++zYHQEAAAAQANv+ABtICSgADAAcACwAPAClAEgEAAAwMDQ0IAwICBQUEBAkJCAAvMxEzLzMRMy8zETMvMxEzLzIwMUUnARcFNSEVBTUhFQU1IRUC3zQBezb72gac+jAFBPowBpyAHQKtH6c/P78/P74/PwAAAgAz/7kCMwKjAAMALQAVQAolAC0NchsBDwVyACvNMyvNMzAxRREzESciLgI1ND4DMzIWFwcHJzYmJyYmIyIOAhUUHgIzMjY2NxcGBiMBKEASPmpPLCE5SlEpUXQdPgkDAwcJH0YoLk05HyI6TiwePDMROCRlSUcC6v0WPSZPd1JJbEotFEM4HwQHCAwNIxcgQWA+PGBEJBIiFyQyNAACAEL/twIjAm8AAwAsABlACiQsAAAsGg4CAg4ALzMvETMvMy8RMzAxRSMTMwMiLgI1ND4CMzIWFwcHJzQmJyYmIyIOAhUUHgIzMjY2NxcGBiMBJTpyNz88ZUkpKUllO0NrIS8HBQgMHUQpI0I1ICA3SikbNjETLClkOUkCuP2xI0BXNTRXQCMtKC4HBQgNCxURFyw/KChBLxoOGhI0JCQAAwAz/7kCMwKjAAMABwAxABlADAcDKTENcgEFHxMFcgArMs4yKzLOMjAxVxMzAyMTMwM3Ii4CNTQ+AzMyFhcHByc2JicmJiMiDgIVFB4CMzI2NjcXBgYjzvAt8H/wLPCuPmpPLCE5SlEpUXQdPgkDAwcJH0YoLk05HyI6TiwePDMROCRlSUcC6v0WAur9Fj0mT3dSSWxKLRRDOB8EBwgMDSMXIEFgPjxgRCQSIhckMjQAAAIAUgCkAgYCDwAjADMADLMkICwOAC8zLzMwMXcnNyYmNTQ2Nyc3FzY2MzIWFzcXBxYWFRQGBxcHJwYGIyImJzcyNjY1NCYmIyIGBhUUFhZ3JUEPERIQQyVJGDceHDYZSSVAEBEREUElSBg3HR43GW0nOB4eOCclOB8eOKQoNRMuFxguEzUoOA4PDg43KDQULRkZLRM0KDcPDg8PHRssGRsrGxsrGxorGwAAAwBI/9ECKAKLADYAPwBIAEJAJixBQRYjJCQ7MT8OLUASRQgBHxcPFh8WfxYDFgQFBgY3DQ01AAEMAD/NMzMRMzMRMz9dzTMSFzkzETMRMxEzMDFFNS4CJzcWBhceAhc1LgI1NDY2NzUzFhQVFAYHFR4CFwcmJicuAycVHgIVFAYGBxU1PgI1NCYmJyc1DgIVFBYWARwrTEIbLgUBBBMyOx4+VCstVTtIAQcBJkI4FSwGAQYLGyEjEkZZLC9bQSg8IR87K0EmNRscNC89AxMiGD8DDgQSGQ8D2BIrOSUmPSgGPAEBAQIJByYDFCAVOgIOBQoRDAkDvRIqOionRzEGP3wFHioXGCIbC1mpAxcfFRIhHAAABABM//wCEQJ/AAMAJQA3ADsAJUAQEzg4OzsuDg43HR0lgAADDAA/MxrMMi8yMi8zM3wvMxEzMDF3IRUhNyIuAjU0PgIzMhYWFzUzMxUGFRMUFhcjLgI1DgIjNzI2NjU0JiYjIg4CFRQWFjMDIRUhZAGW/mqhIkE2ICE3QyEiNSYKOQgIAQMGPgQDAQ0nNB8KLDYaHTkrHi8iEyE9KUIBRP68NTlnGDBIMTNILhURHRPeBgcW/kgOHQ4KExMJEx4QNCRAKSs+JBIiMR8vQyQBozkAAQAo//UCLQJ0ADcAL0AXIg4OJQssBAQpBwsHCwcAHRMFcjAADXIAKzIrMhI5OS8vETMzETMRMzMRMzAxRSImJicjNzM0NDY3IzczPgMzMhYXBy4EIyIOAgchByEGBhQVMwcjHgIzMjY2NxcGBgGERnRODEgTLwECRRM8DzlLVisxUh8dCQsOGSskIj83KAoBKxz+5gEB+x7XDDxYMxkuKhIhI1QLM2VLPgobHAs+O1EyFhsbQgQPEQ8JEiQ6KD4LFRoSPjdJJAgTDTQZGgABABb/UQJAAqEALgAfQA8qDw8nEBAAIhYBcgkAD3IAKzIrMhE5LzMzETMwMVciJic3HgMzMjY2NxMjNTM3PgIzMhYXByImJy4DIyIGBgcHMxUjAw4CeB4wFCsFBQoYFhYlGQQalZoICC5NNShEGiUEBQECERgdDh0uHgUHmJ4dBy9IrxIRQAEJDAgdPCwBKT1aRVcqGxpDBgULEg0HFz8+UD3+1ElYJv//ABkAAAIOAnAGJgBCAAABBwOR/4j/dAALtgEKAAEBklYAKzQAAAIAKv+5AigCowADAC8AHUAOKisrBBoBDgVyJAAEDXIAK80zK80zEjkvMzAxRREzESciJiY1Jj4DMzIeAhcHLgQjIg4DFRQWFjMyNjY3NSM1MxUGBgEZQAxZg0UCJD1JTCEzSjMlECkGDRUmPzAdOjQpFzhiPho0MhVTmTRvRwLq/RY9To5eUXFKKREPHCYYMAIUGhgRDyI5VDlXdjwJEgyPQPUgIQADABH/+wJPAnQAAwAHAB0AKEATAgMDBRsTDAgJBAQLGgwEchwLDAA/MysyEjkvOTkSOTkzMxEzMDFTNSEVITUzFRcHESMRMzMVBgYVFQEeAzMzAQEH7wEs/fZjbkdPTgoGAwFHBw8PDwcf/uEBMmEBSTc3NzcNO/7/Am8HBg4R8wEkAQIBAf73/poF//8AL//xAjQCbwYGAmQAAAADACEAAAIXAm8AAwAHABsAMEAWAgMDAQAHBgYEBQAABQgJBHIVFQ8IDAA/MzMvKxI5OS99LzMzGC8zETMzLzMwMVM1JRUFNSUVAREzFAYGFREyPgM1MxQOAiMhAZn+ZwGZ/shXBQQpTUIxHEIuVHRHAW4+eD7tPng+/o8CbwYJCgn98wgWJjooO1c4HAAAAgA8AAACIAKZAAMAHQAXQAkAAAQZGQkPAQQAL80zLzMREjkvMDFlETMRAzIWFhURIxE0JiYjIgYGFREUFhYVIxE0NjYBCEgjSm08SCNLPDtLIwQDUDZrYwI2/coB5jJnUf6hAWA3TCgoSzX+vQkKCAUBYkpnNgAAAgARAAACSwJvAAMAEgAhQBADAQYSEAAABA8SDHIHBARyACsyKzISOS85EjkzMzAxUyEVIRMzAREzMxUGBhURIwERIxECOv3GQUIBK0AJBQMz/sZBAUo3AVz+KwHVBwYOEf29AfH+DwAFAD3/8gJJAm8ADAAoACwAYQBsADlAG1RILTktFhYpKSwsISENKA0oDGEtDS0MDGsABAA/Mj8zPzMRMz8zMxEzLzMRM3wvETMYEMQyMDFTMzIWFhUUBgYjIxEjFyImJjc3NT8CFwYGHQIHBhYWMzI2NxcGBiMDMwcjBSImJzc3FxYWFxYWMzI2NjU0JiYnJiY1NDY2MzIWFwcHJzQmJyYmIyIGFRQWFx4CFRQGIwEyNjY1NCYmIyMVPVk7SiMiRzkfQOwkKQ8DBQE5CgEEBwYBBhIQEB4XFRYwG43DCsEBOiZBGSEFBQMGCwwfGBMcDwscGzI1GzAeKDoWIQYGCQsNGQ4ZGSIjJS0TQzj+xSYvFhYvJRcCbylEKC1JK/7HDBw6LnkGOgoCBwcPERcGcyMmDw0QLxARAREz4BgXNQkECBAMCAkHDQkIDw4HDiUfGB8RFhkpCAUIDQsHBA0KDA8LChkcFCgvAX8YLyAZKRnCAAQAEAAAAlYCbwAHAA8AHQAoACVAEBweQAgJgAABASgoEQRyEAwAPysyETN9LzMaGN4yGnzMMjAxUzUhFSMjISMHNSEVIyMhIwMRMzIWFhUUDgIjIxERMzI2NjU0JiYjIxACRlkT/pANXQJGWhL+iw8f+FFkLxk3UzuyqDlEHx9EOKkB0ioqUioq/oACbzBPMSQ+MRr+7gFSGzAgHzEeAAAEABcAAAIvAm8AAwAHABUAIAAgQA8EBQIDAxYUFAggCQRyCAwAPysyEjkvMzMRM8wyMDFTNTMVBzUhFQURMzIWFhUUDgIjIxERMzI2NjU0JiYjIxdqagFQ/uz4UWQvGTdTO7KoOUQfH0Q4qQESQEB1Pj6dAm8wTzEkPjEa/u4BUhswIB8xHgAAAwA9AAACKgJvABgAHAAgACBADxQYGAAegAkZGQwaBHIWDAA/KzIyETMa3swyETMwMVMzMjY2NTQmJiMjNRcyFhYVFAYGBxMjAyMDNSEVBTUhFT6kNUciIkc1pZtZai8lRC6tVaWoAQHt/hMB7QFSGjEgHzIeQx4nRzAhQzEJ/usBEgEfPj6XPz8AAQAv//ECNAJvAD0AK0AWCyAgCCMjEi82DXIZEgRyKjs7AQANcgArMjIRMysyKzIROS8zMxEzMDFXJz4CNTQmJyM1MyYmNTQ2NjMyFhcHJiYjIgYGFRQWFzMVIxYWFRQGBgc2HgIzMjY3FwYGIyIuAiMiBk4fMTsbCQlUQwUDN146LE4iLxU3MyA2HwUEoI8ICAgSDSA+OjcbFi0VHB8/HxE2QD8ZGkYIOxQrPS8TMB87ER8PN1EtGRo4FBseNSUNHxQ7HDAUGC8pFAMLEQ4ODjYVFQ4RDhMAAgARAAACSwJvAAMAEAAmQBIBDwUHCgQAAAQLCAgFBHIOBAwAPzMrMi8yETkvEjk5EjkzMDFTNSEVAQMzExMzExMzAyMDAxECOv5ObkFLcBZsRTptG3F4AR0qKv7jAm/+TQGF/noBtP2RAZ3+YwAFACsAAAIvAnAAAwAHAAsADwAYADVAGgcBAQQCDwkJDAoSGBUDEwIKAgoRFhMEchEMAD8rMhI5OS98LxIXOREzMxEzETMzETMwMWUjNTsCFSMHIzU7AhUjFyMRAzMTEzMDASC7uyyzsyy7uyyzsw5J5lW2qk/V2Tk5dzg4YgEnAUn++AEH/rgAAQAxAIgCJgIlAA4AG0APAgUIDgsDBAoJCQYNAAAGAC8zLzIRFzkwMXcnNyc3FyczBzcXBxcHJ6Y7m9UgxRFTE8If0pc9gogqmDVASrCwRz00lyulAAABAL0AoAGaAXUADwAIsQgAAC8yMDFlIiYmNTQ2NjMyFhYVFAYGASseMh4fMh0cMyAeMqAcMR4eMBwcMB4dMR0AAQBD/2YB/QMJAAMADLMDAgEAAC8yLzMwMVcnARd5NgGENpoaA4kbAAIANAAEAhYBxQAVABkAFLYYGRkLCBMAAC8yfC8zORgvMzAxZSImJjU0NjYzMxUjIgYGFRQWFjMzFSUnIRUBRFV7QEJ6UtTBTm87OG5Swf45AQHIBDVkREVmOSgsUz08USgoyigo//8ANgEiAiMBYQYGAm0AAAABADYAaAIjAgsACwAUtwcFBAQKAMABAC8azTMzEM0zMDFlNSM1MzUzFTMVIxUBDtjYRdDQaLo/qqo/ugABADYBIgIjAWEAAwAIsQEAAC8yMDFTNSEVNgHtASI/PwAAAQBmAJECBAH3AAsAFkAKAQQKBwQCCAYCAAAvMi8zEhc5MDFlJwcnNyc3FzcXBxcB1aSiKZmZLKGjLp6akYaCMH+BMoSEMIKCAAADAFUAZgIFAgwAAwAPABsAF0AJEBYBgAoEBAABAC8zMy8zGhDMMjAxUzUhFSciJjU0NjMyFhUUBgMiJjU0NjMyFhUUBlUBsNMTGxwSFBsbExMcHRISHBsBGEVFlhsTFBwdExMb/rgaFBQcHRMTGwAAAgA2ALQCIwHEAAMABwAOtAQFBQEAAC8yMi8zMDFTNSEVBTUhFTYB7f4TAe0Bg0FBz0FBAAMANgAkAiMCVQADAAcACwAhQA4DAgIICAkJBAEAAAUFBAAvMxEzLzIRMy8zETMvMzAxQRcBJwM1IRUFNSEVAdAs/owsJgHt/hMB7QJVHP3rGwFEQUHPQUEAAAEAMAAvAi8CNwAGABK3BgIFAwMEAQAALzIvMxc5MDF3NSUlNQUVMAGj/l8B/S9MxLFH3zAAAAEAKgAvAikCNwAGABK3AQUCAwQDBgAALzIvMxc5MDFlJTUlFQUFAin+AQH8/mUBni/5MN9IsMQAAgAqABECJgIPAAYACgAbQAwGAgUDAwQEAQCACQgALzMazjIyLzMXOTAxdzUlJTUFFQMhNSEqAaD+YAH8Dv4TAe1rQpx/R60w/t8/AAIAKgARAiYCDwAGAAoAG0AMAQUCAwQDAwYAgAgHAC8zGswyMi8zFzkwMWUlNSUVDQI1IRUCJv4EAfz+XwGh/hEB7WvHMK1Hf5ycPz8AAAIANgAQAiQCPwALAA8AHUAMBwUEBAEMDQ0AwAoBAC8zGs0yLzMRMxDNMzAxZTUjNTM1MxUzFSMVBTUhFQEO2NhF0ND+5AHtm7s/qqo/u4tBQf//AFcAuAIpAdMGJgJ4AFoCBgJ4ALAAAQBXAQgCKQF5ABkAHEAMFhUVBQ2ACQgIEgASAD8yMhEzGs0yMhEzMDFBIi4CIyIGByc+AjMyHgIzMjY3Fw4CAaIfMCkoGB4sFzIPKTcjHi4oKBkbKRcwFSktAQgRFhEVGxoXJBQRFhEWGyAcIA4AAAEAbQCdAfEBWwAFAAqyAgADAC/MMzAxZTUhNSEVAaz+wQGEnX5AvgABAHcBVwHbAm8ABgAXQAoGAAICcgQFBQEAAC8yMhEzKxI5MDFTJzczFwcnrDWwG5k3dAFXHPz7HbEAAwAOAK4CTAGvABsAKgA6ACdAEi8YGAczHBUECh8SEgo3BAQnCgAvMzMRMxEzfC8zEhc5MxEzMDFBFAYGIyImJwYGIyImJjU0NjYzMhYXNjYzMhYWBSYmIyIGBhUUFhYzMjY2JTQmJiMiBgYHHgIzMjY2AkwjQSsrSB4fRykqQCUlQCorSB4dRywqQSP+vhg1HRclFhYlFxYmIAEQFSUWFSYhDw8iJRQYJRQBLiQ6IiYpKCchOiUlOiIjLCkmIDomJx8SHxUUIBIRHxUVIBEPHxgXIA8SIAAAAwAQAGgCSwImAAMAFwArABdACQMCAiIOAQAYBAAvMzMyLzMzETMwMXcnARcBIi4CNTQ+AjMyHgIVFA4CJzI+AjU0LgIjIg4CFRQeAi8fAh0e/uE2XkgpKUheNjZgSCkpSGA2Kkg4Hx84SCopSDcfHzdIaCABniD+ZCI9UC0tUDwiIjxQLS1QPSI4GS47IiI6LRkZLToiIjsuGQAAAQBY/xACCwL4AB8ADLMXEAcAAC8yLzMwMVciJic1FhYzMjY2NRE0NjYzMhYXFSYmIyIGBhURFAYGrRgpFBAkFh8wHCdOOxgmEBAmESAwGypN8AYHQAYHGDcuAm1CVCgHBT8FBhY6Nv2UP1EmAAABABcAAAJJAqMAKQAfQA8AFgFyCSIiHh4hIQwLEnIAKzIyETMRMxEzKzIwMUEiBgYVFB4CFxUjNTMuAzU0NjYzMhYWFRQGBgczFSM1PgI1NCYmATI/XzQbMD0g2IQiOSoYRX9XVX1FJ0Ywhds3TSgzXQJeO3RXMFVINBBHRRM2SVcza49IR49tQ25RGUVHF09rP1l0OgACACYAAQIwApkABQAJABlADAQBCQkHAAMScgABcgArKxE5MhEzMzAxQRMVITUTEwMxAwFa1v322uCztgKZ/ZgwMQJn/aYCG/3lAAEAQf9CAhgCbwALABC2CAAKAQJyAAAvKzIRMzAxVxEhFAYGBxEjESERQQHXAwMBS/7IvgMtBAgGBPzpAvD9EAABAC//VQIpApwADQAdQAwIAwcHCQIECgELCwAALzIRMzMvOTkzETMzMDFXNRMDNSEVITcTAychFS/q6gH6/kcU6O8TAb+rNQFvAWg7PQj+lP6QBz0AAAEADv/5AkoCowAIABC2AwICBgATcgArLzkvMzAxVwMjNTMTEzMB/oBwmHLxQf7qBwEgOv79AlP9VgABAB3/WQJPAckAMgAcQA4yLQ4OKQtyGSELEwcGcgArMj8zKzIRMy8wMVc0PgM1NTMRFB4CMzI2NjURMxEUFhYzMjY3NxcGBiMiJiYnDgIjIiYmJwYUBgYHHQUICAVHFSIrFyc4HkULFxARIwgIIBc0HxkqGgUNMDkeHTYqCwEBAQGnEUhaXEwW//7zKjcfDiRCLAEJ/q0YHg4WDQw0HBsUIxYaIhEPIBccOTk4HQACACX/9AIzApUAJAA4ABdADBQbAXIvCQZyJQALcgArMisyKzIwMUUGJiYnJj4CMzIWFhc2JicuAiMiBgcnNjYzMhYWFxYOAycyPgI3LgMjIg4CFx4DAQ1GXzQIBxc8ZUcnRzsVAgMDBy5TPiJMHAkkTCNYcz8KBwolRWlHM0syGwQOJCwvGTZOLhEGBBopMgsBLlM0MWNUMhQnHA4dDTZTLg4OPg0LO25MNnVvWjY5LktXKRomFwspQ08mHi4eEAAFACL/9gJCAnoAAwATACMAMwBEACVAEjQkJD0BASwFchwMDBQDAwQNcgArMi8yMi8zKzIvMjIvMzAxcwEzAQUiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWASImJjU0NjYzMhYWFRQGBicyNjY1NC4CIyIGBhUUFhY4AZ5C/l8BRiQ9JSU9JCU9IyQ9IxEfFBMfFBAfFRYh/vkkPSUlPSQlPCUjPSYPHxQNFBgLDx4VFSACb/2RCiI7JCU6IyM7JCQ7IjQQIhoXIxQPIRwcIw8BSyI8JSU6IyM7JSY7ITcOIhwVHhIHDiEdHCEPAAcAGP/1AkACeAADABMAIwAzAEMAUwBjADVAG1RERAMCAlxMBXI8LCw0JA1yAQAAHAwMFAQNcgArMjIvMzMRMysyMi8zKzIyETMyLzMwMXc1ARUBIiYmNTQ2NjMyFhYVFAYGJzI2NjU0JiYjIgYGFRQWFgUiJiY1NDY2MzIWFhUUBgYnMjY2NTQmJiMiBgYVFBYWASImJjU0NjYzMhYWFRQGBicyNjY1NCYmIyIGBhUUFhYYAij+XCI5IiI5IiM4IiE4JA4cEhIdDw8bEhIeATQiOSIiOSIjOCIhOCQPHBESHQ8OHBITHf7oIjkiIjkiIzgiITgkDhwSEh0PDxsSEh7hOAEEOP4QIDcjIjcgITciIzcfNg0fGBkeDQ0eGRgfDTYgNyMiNyAhNyIjNx82DR8YGR4NDR4ZGB8NAVogNyMiNyAhNyIjNx82DR8YGR4NDR4ZGB8NAAMAMQBfAiYCCQATACcAMwAaQA0zMiksLy0GChQAAB4KAC8zMy8yERc5MDFlIi4CNTQ+AjMyHgIVFA4CJzI+AjU0LgIjIg4CFRQeAjc1IzUzNTMVMxUjFQErNVtEJiZEWzU0XEQnJ0RcNCtKOCAgOEorKko4ICA4SheNjSyJiV8hOk0tLU06ISE6TS0tTTohKhovPiQkPi4aGi4+JCQ+LxodfCpycip8//8AVwHQAikCQQYHAngAAADI//8AegF1Ad0CjQQGAnoCHgABAEwABwIPAkUACQAdQAwJBgcHAwICBAgBAQQALzMRMxEzLzMzETMvMDFlEQcnNzMXBycRAQqPL9oazzSJBwHBkifo6CeS/j8AAAEAGABoAjwCLwAJABZADAAHBggBAgMFCAQJBAAvLxIXOTAxdwEHJyUXAyc3ARgBnNoHAVcSP0En/mGdAUoVOyIW/tkMtP62AAEAEwBpAjgB5wAJABtACwYHBwkDAgIEAAUJAC8zMzIyETMRMxEzMDFTISc3BRUFJzchEwGMqiABI/7bH6r+dQFJcC65Gqs0ZwAAAQAYACgCPAHvAAkAFkAMAAMEBwgJAgUIAQYBAC8vEhc5MDFTNwEnNxMHJTcXGCwBnydBPxL+qQfaAbo1/ra0DP7ZFiI7FQAAAQBMAB0CDwJbAAkAHUAMAgkJBQcICAQDAwUAAC8vMy8zMxEzETMRMzAxQTMRNxcHIyc3FwEKSIk0zxraL48CW/4/kifo6CeSAAABAA0AKAIyAe8ACQAWQAwABgcIAQIDBQgECQQALy8SFzkwMUEBNxcFJxMXBwECMv5j2wf+qBJAQScBngG6/rYVOyIWAScMtAFKAAEAHABpAkAB5wAJABtACwQDAwEHCAgGAAUBAC8zMzIyETMRMxEzMDFBFSEXByU1JRcHAkD+daof/twBIiCqAUlFZzSrGrkucAAAAQANAGkCMgIwAAkAFkAMAAQDAgkIBwUIAQYBAC8vEhc5MDFlBwEXBwM3BQcnAjIt/mInQUASAVgH2541AUq0DAEnFiI7FQAAAQAMAGoCTAHoAA8ALkAVAA8PCwwMCgENDQYDBAQIBwcJAgYSAD8zMzMRMzMRMxEzETMzMxEzMxEzMDFBFxUHJzchFwcnNTcXByEnAX3P0idz/sh3J9LPKnkBPHUB6LYWsjRnZzSyFrYtcXEAAQBHADgCEQIYAA8AEbcOBQYNBAEJAQAvLxIXOTAxZQcjJzcXEQcnNzMXBycRNwIR2hrWOIeHONYa2i+UlOCoqidlAQxpJ6qoKWr+8mYAAgApAAACMQJ8AAkAEgAhQA4IBgwDAhEMEQwRDwQKAAAvMi8zOTkvLxEzMxEzMzAxcxEjNTczFxUjESczETMVJwcnM6h/9CHzfuG3huLfFpoBbSzj4yz+kyoBbhjR0RgAAgAMAEMCTAH1AAkAEgAtQBUFDwQDCgsLCQ0ODgcHCQoQERECAgAALzIvMxEzMi8zLzMRMxEzERIXOTAxUzM1MwUVBSM1IzcVMxUnNyc3FQz7MQEU/uwx+yr8GP7+GAGLaswby2m1i3YCuroShwACACkAAAIxAnwACQASACdAEQcNDQkEDw8RAgILCQkOBgoAAC8yLzM5LzMzLzMzETMRMxEzMDFTIREzFQcjJzUzExEjNxc3FSMRqAELfvMh9H8qmhbf4oYCfP6TLOPjLAFD/pIY0dEYAW4AAgAMAEMCTAH1AAkAEgAvQBYFDgYDCxELCQ0MDAgICRECEA8PAwMCAC8zLzMRMxEzLzMvMxEzETMREhc5MDFBFSMVIyU1JTMVFyM1FwcXBzUzAkz7Mf7sARQx0fwY/v4Y/AGL32nLG8xqKocSuroCdgAAAQApAAACMgJ8AAkAF0AJAAcHAgUFBAgEAC8vEjkvMzMRMzAxQRUjESERIzU3MwIygv78g/UgAZks/pMBbSzjAAEADABDAkwB9QAJABlACgUGAQMDAQEICAAALzIvMhEzLxE5OTAxdzUzNTMFFQUjNQz7NQEQ/vA1rN9qzBvLaQABACkAAAIyAnwACQAXQAkACAgDBQUBBgEALy8SOS8zMxEzMDFlByMnNTMRIREzAjL0IPWDAQSC4+PjLAFt/pMAAQAMAEMCTAH1AAkAGUAKBQQJBwcJCQICAAAvMi8yETMvETk5MDFlIxUjJTUlMxUzAkz7Nf7wARA1+6xpyxvMagAAAQAA/nACWP8fAAMACLEBAAAvMjAxUTUhFQJY/nCvrwABAAD+cAJY/84AAwAIsQEAAC8vMDFRESERAlj+cAFe/qIAAQAA/nACWAB9AAMACLEBAAAvLzAxUREhEQJY/nACDf3zAAEAAP5wAlgBLAADAAixAQAALy8wMVERIRECWP5wArz9RAABAAD+cAJYAdsAAwAIsQEAAC8vMDFRESERAlj+cANr/JUAAQAA/nACWAKKAAMACLEBAAAvLzAxUREhEQJY/nAEGvvmAAEAAP5wAlgDOQADAAixAQAALy8wMVERIRECWP5wBMn7NwABAAD+cAJYA+gAAwAIsQEAAC8vMDFRESERAlj+cAV4+ogAAQAAASwCWAPoAAMACLEBAAAvLzAxUREhEQJYASwCvP1EAAEAAAM5AlgD6AADAAixAQAALy8wMVE1IRUCWAM5r68AAQAA/nAASwPoAAMACLEBAAAvLzAxUREzEUv+cAV4+ogAAAEAAP5wAJYD6AADAAixAQAALy8wMVERMxGW/nAFePqIAAABAAD+cADhA+gAAwAIsQEAAC8vMDFRETMR4f5wBXj6iAAAAQAA/nABLAPoAAMACLEBAAAvLzAxUREhEQEs/nAFePqIAAEAAP5wAXcD6AADAAixAQAALy8wMVERIREBd/5wBXj6iAABAAD+cAHCA+gAAwAIsQEAAC8vMDFRESERAcL+cAV4+ogAAQAA/nACDQPoAAMACLEBAAAvLzAxUREhEQIN/nAFePqIAAEBLP5wAlgD6AADAAixAQAALy8wMUERIREBLAEs/nAFePqIAAECDf5wAlgD6AADAAixAQAALy8wMUERMxECDUv+cAV4+ogAAAEAAP5wASwBLAADAAixAQAALy8wMVERIREBLP5wArz9RAABASz+cAJYASwAAwAIsQEAAC8vMDFBESERASwBLP5wArz9RAABAAABLAEsA+gAAwAIsQEAAC8vMDFRESERASwBLAK8/UQAAQAA/nACWAPoAAUACLEBAAAvLzAxUREhESERASwBLP5wBXj9RP1EAAEAAP5wAlgD6AAHAAixAwAALy8wMUERIREhESERASz+1AEsASz+cAK8Arz9RP1EAAEAAP5wAlgD6AAFAAixAQAALy8wMVERIREhEQJY/tT+cAV4/UT9RAABAAD+cAJYA+gABQAIsQMAAC8vMDFBESERIREBLP7UAlj+cAK8Arz6iAABASwBLAJYA+gAAwAIsQEAAC8vMDFBESERASwBLAEsArz9RAACAAD+cAJYA+gAAwAHAA60AQQEBQAALy85LzMwMVERIRkCIREBLAEs/nACvP1EArwCvP1EAAABAAD+cAJYA+gABQAIsQMAAC8vMDFRESERIREBLAEs/nACvAK8+ogAKgAU/okCRAPPAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwBHAEsATwBTAFcAWwBfAGMAZwBrAG8AcwB3AHsAfwCDAIcAiwCPAJMAlwCbAJ8AowCnAABTNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1MxUlNTMVMzUzFTM1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AlgAIAJYACACWAAgAlgAIAJYACACWAAgAlgAIAJYACACWAAgAlgAIAJYACACWAAgAlgAIAJYACACWAALAlgARwJYAEUCWAAiAlgAQwJYAEMCWABDAlgAQwJYAEMCWABDAlgAQwJYAEMCWAA+AlgAPgJYAD4CWAA+AlgAPgJYAD4CWAA+AlgAPgJYAD4CWAA+AlgAPgJYAEICWAAgAlgAJAJYACQCWAAkAlgAJAJYACQCWAAkAlgAJAJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYADYCWAA2AlgANgJYADYCWAA2AlgANgJYADwCWAA8AlgAPAJYADwCWAA8AlgAPAJYADwCWAA8AlgAHQJYABQCWAAUAlgAFAJYABQCWAAUAlgALwJYACACWAAgAlgAIAJYACACWAAgAlgAIAJYACACWAAgAlgAIAJYACACWAA8AlgAPAJYADwCWAA8AlgAPAJYADYCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgAOwJYADsCWAA7AlgADAJYAAwCWABGAlgAIAJYAEICWABCAlgAQgJYAEICWABCAlgAQgJYAEICWAA0AlgAMAJYACkCWAA0AlgANAJYADQCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgAOQJYADkCWAA5AlgANgJYADkCWAA/AlgAbQJYAD8CWAAqAlgAKgJYACoCWAAqAlgAKgJYACoCWAAqAlgAVAJY//UCWABUAlj/xwJYAFQCWAB5AlgAeQJYAHkCWAB5AlgAeAJYAGQCWAB5AlgAeQJYAHkCWAB5AlgAeQJYAHkCWAB5AlgAeQJYAHkCWAB5AlgAPAJYADwCWAA8AlgAUwJYAFMCWABTAlgAXwJYAF8CWABfAlgAXwJYAFMCWABfAlgAFwJYAF8CWABfAlgALQJYAC0CWABSAlgAUgJYAFICWABSAlgAUgJYAFICWABQAlgAUgJYAFICWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgALgJYAC4CWAAuAlgACQJYAEYCWABGAlgAMwJYAIoCWACKAlgAigJYAIoCWACKAlgAigJYAB0CWACKAlgAigJYACoCWABGAlgARgJYAEYCWABGAlgARgJYAEYCWABGAlgARgJYAEYCWABGAlgARgJYAEICWABSAlgASgJYAFICWABSAlgAUgJYAFICWABSAlgAUgJYAEoCWABKAlgASgJYAEoCWABKAlgASgJYAEoCWABKAlgASgJYAC0CWAAtAlgALQJYAC0CWAAtAlgALQJYAEoCWABKAlgASgJYAEoCWABKAlgASgJYAEoCWABKAlgAMAJYABQCWAAUAlgAFAJYABQCWAAUAlgANgJYAB4CWAAeAlgAHgJYAB4CWAAeAlgAHgJYAB4CWAAeAlgAHgJYAB4CWAA8AlgAPAJYADwCWAA8AlgAPAJYAC0CWABgAlgAYAJYAFICWAA8AlgARAJYAGoCWABGAlgAUwJYADoCWABNAlgAUAJYAF8CWABIAlgAUgJYAEQCWABEAlgAigJYAKUCWACLAlgAkwJYAIUCWACSAlgAkwJYAJ0CWACOAlgAkwJYAIoCWAClAlgAiwJYAJMCWACFAlgAkgJYAJMCWACdAlgAjgJYAJMCWACKAlgApQJYAIsCWACTAlgAhQJYAJICWACTAlgAnQJYAI4CWACTAlgAigJYAKUCWACLAlgAkwJYAIUCWACSAlgAkwJYAJ0CWACOAlgAkwJYAGQCWAAYAlgAGAJYAAkCWACKAlgAigJYAIoCWACKAlgAigJYAIoCWACKAlgAigJYAOQCWADPAlgA4wJYAM4CWAATAlgA5AJYAOQCWABNAlgATAJYAOECWADUAlgAMQJYAPACWAAeAlgAVQJYAFUCWADhAlgAMQJYAIsCWACFAlgARAJYAFACWAChAlgAigJYAIUCWACFAlgAVQJYAAwCWABVAlgADAJYAIUCWAAqAlgAywJYAE8CWABlAlgAbAJYAN0CWADLAlgAUAJYAFwCWACuAlgAsgJYAKsCWAEBAlgAjwJYAQEEsAA2BwgANgJYAAACWAAAAlgAAAJYAAACWAAA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AAAAAAAAAAAAAAX4AAAAAAAAAAACTAIeAkMCJgJVAoUDTgJEAisCLAIkAmwCGgIxAhkCJwIbAhwCcwJwAnICIANNAAEAHAAdACQAKgBCAEMASgBPAF4AYABjAG0AbwB4AJsAnQCeAKYAswC6ANEA0gDXANgA4gIvAigCMAJ6AjgDlQDoAQMBBQEMARIBLAEtATQBOQFJAUwBTwFYAVoBYwGGAYgBiQGTAZ8BpwG+Ab8BxAHFAc8CLQNXAi4CeAJNAh8CUgJkAlQCZgNYA1ADkwNRAdUCPwJ5AjIDUgOdA1QCdgIFAgYDlgKDA08CIgOeAgQB1gJAAg8CDgIQAiEAEgACAAkAGQAQABcAGgAgADkAKwAvADYAWABQAFIAVAAlAHcAhgB5AHsAlgCCAm4AlADBALsAvQC/ANkAnAGeAPkA6QDwAQAA9wD+AQEBCAEhARMBFwEeAUMBOwE9AT8BDQFiAXEBZAFmAYEBbQJvAX8BrgGoAaoBrAHGAYcByAAVAPwAAwDqABYA/QAeAQYAIgEKACMBCwAfAQcAJgEOACcBDwA8ASQALAEUADcBHwA/AScALQEVAEYBMABEAS4ASAEyAEcBMQBNATcASwE1AF0BSABbAUYAUQE8AFwBRwBWAToAXwFLAGEBTQFOAGUBUABnAVIAZgFRAGgBUwBsAVcAcAFbAHIBXQBxAVwAdQFgAJABewB6AWUAjgF5AJoBhQCfAYoAoQGMAKABiwCnAZQArAGZAKsBmACpAZYAtgGiALUBoQC0AaAAzwG8AMsBuAC8AakAzgG7AMkBtgDNAboA1AHBANoBxwDbAOMB0ADlAdIA5AHRAIgBcwDDAbAAQQErAGQAagFVAEUBLwCTAX4AGAD/ABsBAgCVAYAADwD2ABQA+wA1AR0AOwEjAFMBPgBaAUUAgQFsAI8BegCiAY0ApAGQAL4BqwDKAbcArQGaALcBowCDAW4AmQGEAIQBbwDgAc0DdANxA3ADbwN2A3UDmAOZA3kDcgN3A3MDeAOaA5QDmwOfA5wDlwN8A30DfwODA4QDgQN7A3oDhQOCA34DgAAhAQkAKAEQACkBEQA+ASYAPQElAC4BFgBJATMATgE4AEwBNgBVAUAAaQFUAGsBVgBuAVkAcwFeAHQBXwB2AWEAlwGCAJgBgwCSAX0AkQF8AKMBjgClAZEArgGbAK8BnACoAZUAqgGXALABnQC4AaUAuQGmANABvQDMAbkA1gHDANMBwADVAcIA3AHJAOYB0wARAPgAEwD6AAoA8QAMAPMADQD0AA4A9QALAPIABADrAAYA7QAHAO4ACADvAAUA7AA4ASAAOgEiAEABKQAwARgAMgEaADMBGwA0ARwAMQEZAFkBRABXAUIAhQFwAIcBcgB8AWcAfgFpAH8BagCAAWsAfQFoAIkBdACLAXYAjAF3AI0BeACKAXUAwAGtAMIBrwDEAbEAxgGzAMcBtADIAbUAxQGyAN4BywDdAcoA3wHMAOEBzgJJAksCTgJKAk8CNQIzAjQCNgI9Aj4COQI7AjwCOgNZA1sCIwJZAlwCVgJXAlsCYQJaAmMCXQJeAmICkAKKAowCjgKSApMCkQKLAo0CjwKXApQClQKWA2ECfAJ/AoECbQJoAoICdQJ0A2UDZANiAwoC5AMXAvEDEALqAxEC6wMNAucDDgLoAwkC2ALSAuMDCALWAtAC4gMWAzEDKwLwAxUDLwMpAu4DGgM9AyoC0wM6AtkDMAL0AxkDPAMoAtEDOQLXAy4C8wMHAvYDHALVAs8DHwL5AuEDFAL3Ax0DLQMnAyAC+gLtAxgC+AMeAzsDJgLUAzgC/AMiAvUDGwLaAywDIQL7AvIDAQLeAwIC3wLEAsgC3QLOAsMC3ALNAsIDNAMlAscDMwMkAsYDQAM3AssDPwM2AsoC2wLMAsEDMgMjAsUDPgM1AskC/gL9Av8DAAMFAwQDAwMLAxIDDwMGAuUC7ALpAuADDAMTAuYC7wKkApwCnQKeAp8CoAKhAqICowKsAqsCqgKpAqgCpwKmAq0CuQK6ArsCpQLAAr0CmwKYAppASpmYl5aHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1FQT05NTEtKSUhHRigfEAoJLAGxCwpDI0NlCi0sALEKC0MjQwstLAGwBkOwB0NlCi0ssE8rILBAUVghS1JYRUQbISFZGyMhsECwBCVFsAQlRWFkimNSWEVEGyEhWVktLACwB0OwBkMLLSxLUyNLUVpYIEWKYEQbISFZLSxLVFggRYpgRBshIVktLEtTI0tRWlg4GyEhWS0sS1RYOBshIVktLLACQ1RYsEYrGyEhISFZLSywAkNUWLBHKxshISFZLSywAkNU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ADwASAA7ADEAQAA7AEMAOgBHAD0APwBKAEMATAAtADgAPAAxADsAQwBFAEgANwA7AD0AQgAxADUANwA7AD0AQABEAEcASwBSADwAQgBGAEkATAA3ADsAPwArADEANwA5ADsAPgBAAEMARwBKADoARABIAEoAOwA9AD8AQgA6AEAASgA7AD8AQwBFAEcASgBMAC0AOAA9AEAAQwAvADIANwA6ADwAPwBCAEoBiwAAABMA6gADAAEECQAAALQAAAADAAEECQABACgAtAADAAEECQACAA4A3AADAAEECQADAEwA6gADAAEECQAEADgBNgADAAEECQAFABoBbgADAAEECQAGADYBiAADAAEECQAIADYBvgADAAEECQAJAEgB9AADAAEECQALAI4CPAADAAEECQAMAJICygADAAEECQANASADXAADAAEECQAOADQEfAADAAEECQAQACgAtAADAAEECQARAA4A3AADAAEECQEAAAwEsAADAAEECQEBAAoEvAADAAEECQFSABAExgADAAEECQFXAA4A3ABDAG8AcAB5AHIAaQBnAGgAdAAgADIAMAAwADYAIABUAGgAZQAgAEkAbgBjAG8AbgBzAG8AbABhAHQAYQAgAFAAcgBvAGoAZQBjAHQAIABBAHUAdABoAG8AcgBzACAAKABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAGMAeQByAGUAYQBsAHQAeQBwAGUALwBJAG4AYwBvAG4AcwBvAGwAYQB0AGEAKQBJAG4AYwBvAG4AcwBvAGwAYQB0AGEAIABFAHgAcABhAG4AZABlAGQAUgBlAGcAdQBsAGEAcgAzAC4AMAAwADEAOwBDAFkAUgBFADsASQBuAGMAbwBuAHMAbwBsAGEAdABhAEUAeABwAGEAbgBkAGUAZAAtAFIAZQBnAHUAbABhAHIASQBuAGMAbwBuAHMAbwBsAGEAdABhACAARQB4AHAAYQBuAGQAZQBkACAAUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMwAuADAAMAAxAEkAbgBjAG8AbgBzAG8AbABhAHQAYQBFAHgAcABhAG4AZABlAGQALQBSAGUAZwB1AGwAYQByAFIAYQBwAGgAIABMAGUAdgBpAGUAbgAsACAAQwB5AHIAZQBhAGwALAAgAEcAbwBvAGcAbABlAFIAYQBwAGgAIABMAGUAdgBpAGUAbgAsACAAQwB5AHIAZQBhAGwALAAgAEIAcgBlAG4AdABvAG4AIABTAGkAbQBwAHMAbwBuAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBsAGUAdgBpAGUAbgAuAGMAbwBtACAAfAAgAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBjAHkAcgBlAGEAbAAuAG8AcgBnACAAfAAgAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABzAC4AZwBvAG8AZwBsAGUALgBjAG8AbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbABlAHYAaQBlAG4ALgBjAG8AbQAgAHwAIABoAHQAdABwADoALwAvAHcAdwB3AC4AYwB5AHIAZQBhAGwALgBvAHIAZwAgAHwAIABoAHQAdABwADoALwAvAGEAcABwAHMAZgBvAHIAYQByAHQAaQBzAHQAcwAuAGMAbwBtAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATABXAGUAaQBnAGgAdABXAGkAZAB0AGgARQB4AHAAYQBuAGQAZQBkAAIAAAAAAAD/OAAyAAAAAQAAAAAAAAAAAAAAAAAAAAADwgAAACQAyQECAQMBBAEFAQYBBwDHAQgBCQEKAQsBDAENAGIBDgCtAQ8BEAERARIAYwETAK4AkAEUACUAJgD9AP8AZAEVARYBFwAnAOkBGAEZARoBGwAoAGUBHAEdAR4AyAEfASABIQEiASMBJADKASUBJgDLAScBKAEpASoBKwEsAS0BLgApACoA+AEvATABMQEyATMAKwE0ATUBNgE3ACwAzAE4AM0BOQDOAToA+gE7AM8BPAE9AT4BPwFAAC0BQQAuAUIBQwAvAUQBRQFGAUcBSAFJAUoBSwDiADABTAAxAU0BTgFPAVABUQFSAVMAZgAyANABVADRAVUBVgFXAVgBWQFaAGcBWwFcAV0A0wFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAJEBawCvAWwBbQFuALAAMwDtADQANQFvAXABcQFyAXMBdAF1ADYBdgF3AOQBeAD7AXkBegF7AXwBfQF+AX8ANwGAAYEBggGDAYQBhQA4ANQBhgDVAYcAaAGIANYBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcAOQA6AZgBmQGaAZsAOwA8AOsBnAC7AZ0BngGfAaABoQGiAD0BowDmAaQBpQGmAEQAaQGnAagBqQGqAasBrABrAa0BrgGvAbABsQGyAGwBswBqAbQBtQG2AbcAbgG4AG0AoAG5AEUBugBGAP4BAABvAbsBvAG9AEcA6gG+AQEBvwHAAEgAcAHBAcIBwwByAcQBxQHGAccByAHJAHMBygHLAHEBzAHNAc4BzwHQAdEB0gHTAdQB1QBJAEoA+QHWAdcB2AHZAdoASwHbAdwB3QHeAEwA1wB0Ad8AdgHgAHcB4QHiAeMAdQHkAeUB5gHnAegATQHpAeoATgHrAewATwHtAe4B7wHwAfEB8gHzAOMAUAH0AFEB9QH2AfcB+AH5AfoB+wB4AFIAeQH8AHsB/QH+Af8CAAIBAgIAfAIDAgQCBQB6AgYCBwIIAgkCCgILAgwCDQIOAg8CEAIRAhIAoQITAH0CFAIVAhYAsQBTAO4AVABVAhcCGAIZAhoCGwIcAh0CHgIfAFYCIAIhAOUCIgD8AiMCJAIlAiYCJwCJAFcCKAIpAioCKwIsAi0CLgBYAH4CLwCAAjAAgQIxAH8CMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkAAWQBaAkECQgJDAkQAWwBcAOwCRQC6AkYCRwJIAkkCSgJLAF0CTADnAk0CTgJPAJ0AngJQAlEAEwAUABUAFgAXABgAGQAaABsAHAJSAlMCVAJVAlYCVwJYAlkCWgJbAlwCXQJeAl8CYAJhAmICYwJkAmUCZgJnAmgCaQJqAmsCbAJtAm4CbwJwAnECcgJzAnQCdQJ2AncCeAJ5AnoCewC8APQA9QD2AnwCfQJ+An8CgAKBAoICgwARAA8AHQAeAKsABACjACIAogDDAIcADQKEAAYAEgA/AoUChgALAAwAXgBgAD4AQAAQAocAsgCzAogCiQKKAEIAxADFALQAtQC2ALcAqQCqAL4AvwAFAAoCiwKMAo0CjgKPApACkQADApICkwKUApUClgCEApcAvQAHApgCmQCmAPcCmgKbApwCnQKeAp8CoAKhAqICowCFAqQAlgKlAqYCpwKoAqkADgDvAPAAuAAgAI8AIQAfAJUAlACTAKcAYQCkAEEAkgKqAJwCqwKsAJoAmQClAq0AmAAIAMYCrgKvArACsQKyArMCtAK1ArYCtwK4ArkCugK7ArwCvQK+Ar8CwALBAsICwwLEAsUCxgLHAsgCyQLKAssCzALNAs4CzwLQAtEC0gLTAtQC1QLWAtcC2ALZAtoC2wLcAt0C3gLfAuAC4QLiAuMC5ALlAuYAuQLnAugC6QLqAusC7ALtAu4C7wLwAvEC8gLzAvQC9QL2AvcC+AL5AvoC+wL8Av0C/gL/AwADAQMCAwMDBAMFAwYDBwMIAwkDCgMLAwwDDQMOAw8DEAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHAMdAx4DHwMgAyEDIgMjAyQDJQMmAycDKAMpAyoDKwMsAy0DLgMvAzADMQMyAzMDNAM1AzYDNwM4AzkDOgM7AzwDPQM+Az8DQANBA0IDQwNEA0UDRgNHA0gDSQNKA0sDTANNA04DTwNQA1EDUgNTA1QDVQNWA1cDWANZA1oDWwNcA10DXgNfA2ADYQNiA2MDZANlA2YDZwNoA2kDagNrA2wDbQNuA28DcANxA3IAIwAJAIgAhgCLAIoAjACDA3MDdABfAOgAggN1AMIDdgN3A3gDeQN6A3sDfAN9A34DfwOAA4EDggODA4QDhQOGA4cDiAOJA4oDiwOMA40DjgOPA5ADkQOSA5MDlAOVA5YDlwOYA5kDmgObA5wDnQOeA58DoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrACOANwAQwCNAN8A2ADhANsA3QDZANoA3gDgA60DrgOvA7ADsQOyA7MDtAO1A7YDtwO4A7kDugO7A7wDvQO+A78DwAPBA8IDwwPEA8UDxgPHA8gDyQPKA8sDzAPNA84GQWJyZXZlB3VuaTFFQUUHdW5pMUVCNgd1bmkxRUIwB3VuaTFFQjIHdW5pMUVCNAd1bmkxRUE0B3VuaTFFQUMHdW5pMUVBNgd1bmkxRUE4B3VuaTFFQUEHdW5pMDIwMAd1bmkxRUEwB3VuaTFFQTIHdW5pMDIwMgdBbWFjcm9uB0FvZ29uZWsKQXJpbmdhY3V0ZQdBRWFjdXRlB3VuaTFFMDgLQ2NpcmN1bWZsZXgKQ2RvdGFjY2VudAZEY2Fyb24GRGNyb2F0B3VuaTFFMEMHdW5pMUUwRQZFYnJldmUGRWNhcm9uB3VuaTFFMUMHdW5pMUVCRQd1bmkxRUM2B3VuaTFFQzAHdW5pMUVDMgd1bmkxRUM0B3VuaTAyMDQKRWRvdGFjY2VudAd1bmkxRUI4B3VuaTFFQkEHdW5pMDIwNgdFbWFjcm9uB3VuaTFFMTYHdW5pMUUxNAdFb2dvbmVrB3VuaTFFQkMHdW5pMDFCOAZHY2Fyb24LR2NpcmN1bWZsZXgHdW5pMDEyMgpHZG90YWNjZW50B3VuaTFFMjAESGJhcgd1bmkxRTJBC0hjaXJjdW1mbGV4B3VuaTFFMjQGSWJyZXZlB3VuaTAyMDgHdW5pMUUyRQd1bmkxRUNBB3VuaTFFQzgHdW5pMDIwQQdJbWFjcm9uB0lvZ29uZWsGSXRpbGRlC0pjaXJjdW1mbGV4B3VuaTAxMzYHdW5pMDE5OAd1bmkwMUM3BkxhY3V0ZQZMY2Fyb24HdW5pMDEzQgRMZG90B3VuaTFFMzYHdW5pMDFDOAd1bmkxRTNBB3VuaTFFNDIGTmFjdXRlBk5jYXJvbgd1bmkwMTQ1B3VuaTFFNDQHdW5pMUU0NgNFbmcHdW5pMUU0OAZPYnJldmUHdW5pMUVEMAd1bmkxRUQ4B3VuaTFFRDIHdW5pMUVENAd1bmkxRUQ2B3VuaTAyMEMHdW5pMDIyQQd1bmkwMjMwB3VuaTFFQ0MHdW5pMUVDRQVPaG9ybgd1bmkxRURBB3VuaTFFRTIHdW5pMUVEQwd1bmkxRURFB3VuaTFFRTANT2h1bmdhcnVtbGF1dAd1bmkwMjBFB09tYWNyb24HdW5pMUU1Mgd1bmkxRTUwB3VuaTAxRUELT3NsYXNoYWN1dGUHdW5pMUU0Qwd1bmkxRTRFB3VuaTAyMkMGUmFjdXRlBlJjYXJvbgd1bmkwMTU2B3VuaTAyMTAHdW5pMUU1QQd1bmkwMjEyB3VuaTFFNUUGU2FjdXRlB3VuaTFFNjQHdW5pMUU2NgtTY2lyY3VtZmxleAd1bmkwMjE4B3VuaTFFNjAHdW5pMUU2Mgd1bmkxRTY4B3VuaTFFOUUHdW5pMDE4RgRUYmFyBlRjYXJvbgd1bmkwMTYyB3VuaTAyMUEHdW5pMUU2Qwd1bmkxRTZFBlVicmV2ZQd1bmkwMjE0B3VuaTFFRTQHdW5pMUVFNgVVaG9ybgd1bmkxRUU4B3VuaTFFRjAHdW5pMUVFQQd1bmkxRUVDB3VuaTFFRUUNVWh1bmdhcnVtbGF1dAd1bmkwMjE2B1VtYWNyb24HdW5pMUU3QQdVb2dvbmVrBVVyaW5nBlV0aWxkZQd1bmkxRTc4BldhY3V0ZQtXY2lyY3VtZmxleAlXZGllcmVzaXMGV2dyYXZlC1ljaXJjdW1mbGV4B3VuaTFFOEUHdW5pMUVGNAZZZ3JhdmUHdW5pMUVGNgd1bmkwMjMyB3VuaTFFRjgGWmFjdXRlClpkb3RhY2NlbnQHdW5pMUU5MgNVLmkGYWJyZXZlB3VuaTFFQUYHdW5pMUVCNwd1bmkxRUIxB3VuaTFFQjMHdW5pMUVCNQd1bmkxRUE1B3VuaTFFQUQHdW5pMUVBNwd1bmkxRUE5B3VuaTFFQUIHdW5pMDIwMQd1bmkxRUExB3VuaTFFQTMHdW5pMDIwMwdhbWFjcm9uB2FvZ29uZWsKYXJpbmdhY3V0ZQdhZWFjdXRlB3VuaTAyOTgHdW5pMUUwOQtjY2lyY3VtZmxleApjZG90YWNjZW50BmRjYXJvbgd1bmkxRTBEB3VuaTFFMEYGZWJyZXZlBmVjYXJvbgd1bmkxRTFEB3VuaTFFQkYHdW5pMUVDNwd1bmkxRUMxB3VuaTFFQzMHdW5pMUVDNQd1bmkwMjA1CmVkb3RhY2NlbnQHdW5pMUVCOQd1bmkxRUJCB3VuaTAyMDcHZW1hY3Jvbgd1bmkxRTE3B3VuaTFFMTUHZW9nb25lawd1bmkwMjlBB3VuaTFFQkQHdW5pMDI1OQd1bmkwMUI5BmdjYXJvbgtnY2lyY3VtZmxleAd1bmkwMTIzCmdkb3RhY2NlbnQHdW5pMUUyMQRoYmFyB3VuaTFFMkILaGNpcmN1bWZsZXgHdW5pMUUyNQZpYnJldmUHdW5pMDIwOQd1bmkxRTJGCWkubG9jbFRSSwd1bmkxRUNCB3VuaTFFQzkHdW5pMDIwQgdpbWFjcm9uB2lvZ29uZWsGaXRpbGRlB3VuaTAyMzcLamNpcmN1bWZsZXgHdW5pMDEzNwxrZ3JlZW5sYW5kaWMGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBGxkb3QHdW5pMUUzNwd1bmkwMUM5B3VuaTFFM0IHdW5pMUU0MwZuYWN1dGUGbmNhcm9uB3VuaTAxNDYHdW5pMUU0NQd1bmkxRTQ3A2VuZwd1bmkxRTQ5Bm9icmV2ZQd1bmkxRUQxB3VuaTFFRDkHdW5pMUVEMwd1bmkxRUQ1B3VuaTFFRDcHdW5pMDIwRAd1bmkwMjJCB3VuaTAyMzEHdW5pMUVDRAd1bmkxRUNGBW9ob3JuB3VuaTFFREIHdW5pMUVFMwd1bmkxRUREB3VuaTFFREYHdW5pMUVFMQ1vaHVuZ2FydW1sYXV0B3VuaTAyMEYHb21hY3Jvbgd1bmkxRTUzB3VuaTFFNTEHdW5pMDFFQgtvc2xhc2hhY3V0ZQd1bmkxRTREB3VuaTFFNEYHdW5pMDIyRAZyYWN1dGUGcmNhcm9uB3VuaTAxNTcHdW5pMDIxMQd1bmkxRTVCB3VuaTAyN0IHdW5pMDIxMwd1bmkxRTVGB3VuaTAyNEQGc2FjdXRlB3VuaTFFNjUHdW5pMUU2NwtzY2lyY3VtZmxleAd1bmkwMjE5B3VuaTFFNjEHdW5pMUU2Mwd1bmkxRTY5BHRiYXIGdGNhcm9uB3VuaTAxNjMHdW5pMDIxQgd1bmkxRTk3B3VuaTFFNkQHdW5pMUU2RgZ1YnJldmUHdW5pMDIxNQd1bmkxRUU1B3VuaTFFRTcFdWhvcm4HdW5pMUVFOQd1bmkxRUYxB3VuaTFFRUIHdW5pMUVFRAd1bmkxRUVGDXVodW5nYXJ1bWxhdXQHdW5pMDIxNwd1bWFjcm9uB3VuaTFFN0IHdW9nb25lawV1cmluZwZ1dGlsZGUHdW5pMUU3OQZ3YWN1dGULd2NpcmN1bWZsZXgJd2RpZXJlc2lzBndncmF2ZQt5Y2lyY3VtZmxleAd1bmkxRThGB3VuaTFFRjUGeWdyYXZlB3VuaTFFRjcHdW5pMDIzMwd1bmkxRUY5BnphY3V0ZQp6ZG90YWNjZW50B3VuaTFFOTMDdS5pB3VuaTIwN0YHdW5pMjEyNAl6ZXJvLnplcm8JemVyby5zczAyB3VuaTIwODAHdW5pMjA4MQd1bmkyMDgyB3VuaTIwODMHdW5pMjA4NAd1bmkyMDg1B3VuaTIwODYHdW5pMjA4Nwd1bmkyMDg4B3VuaTIwODkJemVyby5kbm9tCG9uZS5kbm9tCHR3by5kbm9tCnRocmVlLmRub20JZm91ci5kbm9tCWZpdmUuZG5vbQhzaXguZG5vbQpzZXZlbi5kbm9tCmVpZ2h0LmRub20JbmluZS5kbm9tCXplcm8ubnVtcghvbmUubnVtcgh0d28ubnVtcgp0aHJlZS5udW1yCWZvdXIubnVtcglmaXZlLm51bXIIc2l4Lm51bXIKc2V2ZW4ubnVtcgplaWdodC5udW1yCW5pbmUubnVtcgd1bmkyMDcwB3VuaTAwQjkHdW5pMDBCMgd1bmkwMEIzB3VuaTIwNzQHdW5pMjA3NQd1bmkyMDc2B3VuaTIwNzcHdW5pMjA3OAd1bmkyMDc5DHVuaTIwODAuc3MwMg56ZXJvLmRub20uc3MwMg56ZXJvLm51bXIuc3MwMgx1bmkyMDcwLnNzMDIMdW5pMjA4MC56ZXJvDnplcm8uZG5vbS56ZXJvDnplcm8ubnVtci56ZXJvDHVuaTIwNzAuemVybwd1bmkyRTEyFnBlcmlvZGNlbnRlcmVkLmxvY2xDQVQNYXN0ZXJpc2suc3MwMQd1bmkwMEFECmZpZ3VyZWRhc2gHdW5pMjAxNQd1bmkyMDEwDXF1b3RlZGJsLnNzMDMQcXVvdGVzaW5nbGUuc3MwMxNoeXBoZW5fZ3JlYXRlci5kbGlnF2V4Y2xhbV9lcXVhbF9lcXVhbC5kbGlnB3VuaTIwMDcHdW5pMjAwQQd1bmkyMDA4B3VuaTAwQTAHdW5pMjAwOQd1bmkyMDBCAkNSB3VuaTIwQjUNY29sb25tb25ldGFyeQRkb25nBEV1cm8HdW5pMjBCMgd1bmkyMEFEBGxpcmEHdW5pMjBCQQd1bmkyMEJDB3VuaTIwQTYGcGVzZXRhB3VuaTIwQjEHdW5pMjBCRAd1bmkyMEI5B3VuaTIwQTkMYXN0ZXJpc2ttYXRoB3VuaTIyMTkHdW5pMjIxNQdlbGVtZW50B3VuaTIwN0IIZW1wdHlzZXQHdW5pMjEyNgd1bmkyMjA2B3VuaTAwQjUKY2lyY2xlcGx1cw9hc2NpaXRpbGRlLnNzMDEQYXNjaWljaXJjdW0uc3MwMQdhcnJvd3VwB3VuaTIxOTcKYXJyb3dyaWdodAd1bmkyMTk4CWFycm93ZG93bgd1bmkyMTk5CWFycm93bGVmdAd1bmkyMTk2CWFycm93Ym90aAlhcnJvd3VwZG4HdW5pMjFFNwd1bmkyMUU4B3VuaTIxRTkHdW5pMjFFNgd1bmkyQjA2B3VuaTJCOTUHdW5pMkIwNwd1bmkyQjA1DWRuZWlnaHRoYmxvY2sOZG5xdWFydGVyYmxvY2sTZG50aHJlZWVpZ2h0aHNibG9jawtkbmhhbGZibG9jaxJkbmZpdmVlaWdodGhzYmxvY2sUZG50aHJlZXF1YXJ0ZXJzYmxvY2sTZG5zZXZlbmVpZ2h0aHNibG9jawlmdWxsYmxvY2sLdXBoYWxmYmxvY2sNdXBlaWdodGhibG9jaw9sZWZ0ZWlnaHRoYmxvY2sQbGVmdHF1YXJ0ZXJibG9jaxVsZWZ0dGhyZWVlaWdodGhzYmxvY2sNbGVmdGhhbGZibG9jaxRsZWZ0Zml2ZWVpZ2h0aHNibG9jaxZsZWZ0dGhyZWVxdWFydGVyc2Jsb2NrFWxlZnRzZXZlbmVpZ2h0aHNibG9jaw5yaWdodGhhbGZibG9jaxByaWdodGVpZ2h0aGJsb2NrDmRubGVmdHF1YWRyYW50D2RucmlnaHRxdWFkcmFudA51cGxlZnRxdWFkcmFudBt1cGxlZnRkbmxlZnRkbnJpZ2h0cXVhZHJhbnQVdXBsZWZ0ZG5yaWdodHF1YWRyYW50G3VwbGVmdHVwcmlnaHRkbmxlZnRxdWFkcmFudBx1cGxlZnR1cHJpZ2h0ZG5yaWdodHF1YWRyYW50D3VwcmlnaHRxdWFkcmFudBV1cHJpZ2h0ZG5sZWZ0cXVhZHJhbnQcdXByaWdodGRubGVmdGRucmlnaHRxdWFkcmFudApsaWdodHNoYWRlC21lZGl1bXNoYWRlCWRhcmtzaGFkZQd1bmkyNUNGBmNpcmNsZQd1bmkyNUM2B3VuaTI1QzcMZGJsZG5ob3J6YnhkDGRibGRubGVmdGJ4ZA1kYmxkbnJpZ2h0YnhkCmRibGhvcnpieGQMZGJsdXBob3J6YnhkDGRibHVwbGVmdGJ4ZA1kYmx1cHJpZ2h0YnhkCmRibHZlcnRieGQOZGJsdmVydGhvcnpieGQOZGJsdmVydGxlZnRieGQPZGJsdmVydHJpZ2h0YnhkD2RuZGJsaG9yenNuZ2J4ZA9kbmRibGxlZnRzbmdieGQQZG5kYmxyaWdodHNuZ2J4ZBNkbmhlYXZ5aG9yemxpZ2h0YnhkE2RuaGVhdnlsZWZ0bGlnaHRieGQVZG5oZWF2eWxlZnR1cGxpZ2h0YnhkFGRuaGVhdnlyaWdodGxpZ2h0YnhkFmRuaGVhdnlyaWdodHVwbGlnaHRieGQVZG5oZWF2eXVwaG9yemxpZ2h0YnhkE2RubGlnaHRob3J6aGVhdnlieGQTZG5saWdodGxlZnRoZWF2eWJ4ZBVkbmxpZ2h0bGVmdHVwaGVhdnlieGQUZG5saWdodHJpZ2h0aGVhdnlieGQWZG5saWdodHJpZ2h0dXBoZWF2eWJ4ZBVkbmxpZ2h0dXBob3J6aGVhdnlieGQPZG5zbmdob3J6ZGJsYnhkD2Ruc25nbGVmdGRibGJ4ZBBkbnNuZ3JpZ2h0ZGJsYnhkE2hlYXZ5ZGJsZGFzaGhvcnpieGQTaGVhdnlkYmxkYXNodmVydGJ4ZApoZWF2eWRuYnhkDmhlYXZ5ZG5ob3J6YnhkDmhlYXZ5ZG5sZWZ0YnhkD2hlYXZ5ZG5yaWdodGJ4ZAxoZWF2eWhvcnpieGQMaGVhdnlsZWZ0YnhkFmhlYXZ5bGVmdGxpZ2h0cmlnaHRieGQUaGVhdnlxdWFkZGFzaGhvcnpieGQUaGVhdnlxdWFkZGFzaHZlcnRieGQNaGVhdnlyaWdodGJ4ZBRoZWF2eXRycGxkYXNoaG9yemJ4ZBRoZWF2eXRycGxkYXNodmVydGJ4ZApoZWF2eXVwYnhkDmhlYXZ5dXBob3J6YnhkDmhlYXZ5dXBsZWZ0YnhkEWhlYXZ5dXBsaWdodGRuYnhkD2hlYXZ5dXByaWdodGJ4ZAxoZWF2eXZlcnRieGQQaGVhdnl2ZXJ0aG9yemJ4ZBBoZWF2eXZlcnRsZWZ0YnhkEWhlYXZ5dmVydHJpZ2h0YnhkGmxlZnRkbmhlYXZ5cmlnaHR1cGxpZ2h0YnhkGGxlZnRoZWF2eXJpZ2h0ZG5saWdodGJ4ZBhsZWZ0aGVhdnlyaWdodHVwbGlnaHRieGQabGVmdGhlYXZ5cmlnaHR2ZXJ0bGlnaHRieGQYbGVmdGxpZ2h0cmlnaHRkbmhlYXZ5YnhkGGxlZnRsaWdodHJpZ2h0dXBoZWF2eWJ4ZBpsZWZ0bGlnaHRyaWdodHZlcnRoZWF2eWJ4ZBpsZWZ0dXBoZWF2eXJpZ2h0ZG5saWdodGJ4ZBFsaWdodGFyY2RubGVmdGJ4ZBJsaWdodGFyY2RucmlnaHRieGQRbGlnaHRhcmN1cGxlZnRieGQSbGlnaHRhcmN1cHJpZ2h0YnhkE2xpZ2h0ZGJsZGFzaGhvcnpieGQTbGlnaHRkYmxkYXNodmVydGJ4ZBFsaWdodGRpYWdjcm9zc2J4ZBlsaWdodGRpYWd1cGxlZnRkbnJpZ2h0YnhkGWxpZ2h0ZGlhZ3VwcmlnaHRkbmxlZnRieGQKbGlnaHRkbmJ4ZA5saWdodGRuaG9yemJ4ZA5saWdodGRubGVmdGJ4ZA9saWdodGRucmlnaHRieGQMbGlnaHRob3J6YnhkDGxpZ2h0bGVmdGJ4ZBZsaWdodGxlZnRoZWF2eXJpZ2h0YnhkFGxpZ2h0cXVhZGRhc2hob3J6YnhkFGxpZ2h0cXVhZGRhc2h2ZXJ0YnhkDWxpZ2h0cmlnaHRieGQUbGlnaHR0cnBsZGFzaGhvcnpieGQUbGlnaHR0cnBsZGFzaHZlcnRieGQKbGlnaHR1cGJ4ZBFsaWdodHVwaGVhdnlkbmJ4ZA5saWdodHVwaG9yemJ4ZA5saWdodHVwbGVmdGJ4ZA9saWdodHVwcmlnaHRieGQMbGlnaHR2ZXJ0YnhkEGxpZ2h0dmVydGhvcnpieGQQbGlnaHR2ZXJ0bGVmdGJ4ZBFsaWdodHZlcnRyaWdodGJ4ZBpyaWdodGRuaGVhdnlsZWZ0dXBsaWdodGJ4ZBhyaWdodGhlYXZ5bGVmdGRubGlnaHRieGQYcmlnaHRoZWF2eWxlZnR1cGxpZ2h0YnhkGnJpZ2h0aGVhdnlsZWZ0dmVydGxpZ2h0YnhkGHJpZ2h0bGlnaHRsZWZ0ZG5oZWF2eWJ4ZBhyaWdodGxpZ2h0bGVmdHVwaGVhdnlieGQacmlnaHRsaWdodGxlZnR2ZXJ0aGVhdnlieGQacmlnaHR1cGhlYXZ5bGVmdGRubGlnaHRieGQPdXBkYmxob3J6c25nYnhkD3VwZGJsbGVmdHNuZ2J4ZBB1cGRibHJpZ2h0c25nYnhkFXVwaGVhdnlkbmhvcnpsaWdodGJ4ZBN1cGhlYXZ5aG9yemxpZ2h0YnhkFXVwaGVhdnlsZWZ0ZG5saWdodGJ4ZBN1cGhlYXZ5bGVmdGxpZ2h0YnhkFnVwaGVhdnlyaWdodGRubGlnaHRieGQUdXBoZWF2eXJpZ2h0bGlnaHRieGQVdXBsaWdodGRuaG9yemhlYXZ5YnhkE3VwbGlnaHRob3J6aGVhdnlieGQVdXBsaWdodGxlZnRkbmhlYXZ5YnhkE3VwbGlnaHRsZWZ0aGVhdnlieGQWdXBsaWdodHJpZ2h0ZG5oZWF2eWJ4ZBR1cGxpZ2h0cmlnaHRoZWF2eWJ4ZA91cHNuZ2hvcnpkYmxieGQPdXBzbmdsZWZ0ZGJsYnhkEHVwc25ncmlnaHRkYmxieGQRdmVydGRibGhvcnpzbmdieGQRdmVydGRibGxlZnRzbmdieGQSdmVydGRibHJpZ2h0c25nYnhkFXZlcnRoZWF2eWhvcnpsaWdodGJ4ZBV2ZXJ0aGVhdnlsZWZ0bGlnaHRieGQWdmVydGhlYXZ5cmlnaHRsaWdodGJ4ZBV2ZXJ0bGlnaHRob3J6aGVhdnlieGQVdmVydGxpZ2h0bGVmdGhlYXZ5YnhkFnZlcnRsaWdodHJpZ2h0aGVhdnlieGQRdmVydHNuZ2hvcnpkYmxieGQRdmVydHNuZ2xlZnRkYmxieGQSdmVydHNuZ3JpZ2h0ZGJsYnhkB3VuaTI2MzkJc21pbGVmYWNlDGludnNtaWxlZmFjZQVzcGFkZQRjbHViBWhlYXJ0B2RpYW1vbmQHdW5pMjcxMwd1bmkyNzE0B3VuaTI3MTUHdW5pMjcxNwd1bmkyNzE4Bm1pbnV0ZQZzZWNvbmQHdW5pMjExMwd1bmkyMTE2CWVzdGltYXRlZAd1bmkyNDIzB3VuaTIzOEIFaG91c2UHdW5pMjFFQQd1bmkyMzI3B3VuaTIzMkIHdW5pMjMyNgd1bmkyMzI1B3VuaTIzMTgHdW5pMjNDRQd1bmlGRkZEFmVxdWFsX2VxdWFsX2VxdWFsLmRsaWcSZXF1YWxfZ3JlYXRlci5kbGlnEmdyZWF0ZXJfZXF1YWwuZGxpZxBsZXNzX2h5cGhlbi5kbGlnD2xlc3NfZXF1YWwuZGxpZwd1bmkwMzc1B3VuaTAyQkMHdW5pMDJCQgd1bmkwMkJBB3VuaTAyQzkHdW5pMDJDQgd1bmkwMkI5B3VuaTAyQkYHdW5pMDJCRQd1bmkwMkNBB3VuaTAyQ0MHdW5pMDJDOAd1bmkwMzA4B3VuaTAzMDcJZ3JhdmVjb21iCWFjdXRlY29tYgd1bmkwMzBCB3VuaTAzMDIHdW5pMDMwQwd1bmkwMzA2B3VuaTAzMEEJdGlsZGVjb21iB3VuaTAzMDQNaG9va2Fib3ZlY29tYgd1bmkwMzBGB3VuaTAzMTEHdW5pMDMxMgd1bmkwMzFCDGRvdGJlbG93Y29tYgd1bmkwMzI0B3VuaTAzMjYHdW5pMDMyNwd1bmkwMzI4B3VuaTAzMkUHdW5pMDMzMQd1bmkwMzM1B3VuaTAzMzYMdW5pMDMwOC5jYXNlDHVuaTAzMDcuY2FzZQ5ncmF2ZWNvbWIuY2FzZQ5hY3V0ZWNvbWIuY2FzZQx1bmkwMzBCLmNhc2UMdW5pMDMwMi5jYXNlDHVuaTAzMEMuY2FzZQx1bmkwMzA2LmNhc2UMdW5pMDMwQS5jYXNlDnRpbGRlY29tYi5jYXNlDHVuaTAzMUIuY2FzZQ1kaWVyZXNpcy5jYXNlDmRvdGFjY2VudC5jYXNlCmdyYXZlLmNhc2UKYWN1dGUuY2FzZRFodW5nYXJ1bWxhdXQuY2FzZQpjYXJvbi5jYXNlCmJyZXZlLmNhc2UJcmluZy5jYXNlCnRpbGRlLmNhc2ULdGlsZGVjb21iLmkLdW5pMDMwNjAzMDELdW5pMDMwNjAzMDALdW5pMDMwNjAzMDkLdW5pMDMwNjAzMDMLdW5pMDMwMjAzMDELdW5pMDMwMjAzMDALdW5pMDMwMjAzMDkLdW5pMDMwMjAzMDMQdW5pMDMwMjAzMDEuY2FzZRB1bmkwMzAyMDMwMC5jYXNlEHVuaTAzMDIwMzA5LmNhc2UQdW5pMDMwMjAzMDMuY2FzZQROVUxMAAAAAQAB//8ADwABAAIADgAAAAAAAAD2AAIAJgABABkAAQAcACQAAQAmACYAAQAoAEAAAQBCAF8AAQBjAGMAAQBlAGkAAQBrAGsAAQBtAJkAAQCbAJsAAQCdALAAAQCyAOYAAQDoAQAAAQEDAQwAAQEPAScAAQEpASoAAQEtAVIAAQFUAVQAAQFWAVYAAQFYAV8AAQFhAYQAAQGGAYYAAQGJAY4AAQGQAZIAAQGfAdMAAQHXAdcAAQJRAlMAAQJWAlYAAQJZAlkAAQJfAl8AAQJhAmIAAQJlAmUAAQNwA3AAAQN6A5IAAwOVA5UAAQOgA6oAAwOwA7AAAQO1A8AAAwABAAMAAAAQAAAAIAAAADYAAQAGA4oDiwOMA40DjwOQAAIAAwN6A4gAAAOgA6kADwO1A8AAGQABAAIDiQOqAAEAAAAUACIACgAEACYAMgA8AEYAAkRGTFQAJGxhdG4AJAACbWFyawA4bWttawA+AAQAAAABAEQAMgAAAAYAEAABAEQAAAAGABAAAQBGAAEABgAQAAEASAACAAAAAQAAAAAAAwABAAIAAwAA//8AAgAAAAEAAQBmAlAABQGOAyYAAQBKAEoAAQCGADwAAQBkAGQAAQDgAJQAAQASABIAAQAaAAwAAhQUFBoAAQACA4kDqgACAAAUBgAAFAwABhQIFA4UFBQaFCAUJgABAAYDigOLA4wDjQOPA5AAAgADA3oDkgAAA6ADqgAZA7UDwAAkAAIAAwN6A4gAAAOgA6kADwO1A8AAGQAGAAAT4gAAE+gAABPuAAAT9AAAE/oAABP6ACUUuBPmE+wT8hP4FKwT/hQEFAoUphSyFBAUFhQcFCIUKBQuFDQUOhRAFKAUlBSaFEYUTBRSFFIUWBReFGQUahRwFHYUfBSIFIIUjgAlAAAU0gAAFHIAABR4AAAUfgAAFIQAABTeAAAU2AAAFLQAABTGAAAUzAAAFN4AABSKAAAUkAAAFLQAABSWAAAUugAAFLoAABScAAAUogAAFKgAABTkAAAU5AAAFOQAABS6AAAUugAAFLQAABS0AAAUtAAAFK4AABTYAAAU2AAAFNIAABS0AAAUugAAFOQAABTAAAAU5AAwAAAUPAAAE9wAABPiAAAT6AAAE+4AABRIAAAUQgAAFB4AABQwAAAUNgAAFEgAABP0AAAT+gAAFB4AABQAAAEStgACEuYAAhLsAAIS8gACEvgAAxRaAAIS/gACEv4ABBRUAAQUVAAAFCQAABQkAAAUBgAAFAwAABQSAAAUTgAAFE4AABROAAAUJAAAFCQAARK8AAAUHgAAFB4AABQeAAAUGAAAFEIAABRCAAAUPAAAFB4AABQkAAAUTgAAFCoAABROAAIAIwABABkAAAAcACQAGQAmACYAIgAoAEAAIwBCAF8APABjAGMAWgBlAGkAWwBrAGsAYABtAJkAYQCbAJsAjgCdALAAjwCyAOYAowDoAQAA2AEDAQwA8QEPAScA+wEpASoBFAEtAVIBFgFUAVQBPAFWAVYBPQFYAV8BPgFhAYQBRgGGAYYBagGJAY4BawGQAZIBcQGfAdMBdAHXAdcBqQJRAlMBqgJWAlYBrQJZAlkBrgJfAl8BrwJhAmIBsAJlAmUBsgNwA3ABswOVA5UBtAOwA7ABtQG2ErYAABLCEuYAABUgAAASwhLmAAASIAAAEsIS5gAAEsgAABLCEuYAABIgAAAZuBLmAAASzgAAEsIS5gAAEtQAABLCEuYAABLaAAASwhLmAAASJgAAEsIS5gAAFEgAABLCEuYAABImAAAZuBLmAAASDgAAEsIS5gAAFE4AABLCEuYAABIUAAASwhLmAAAUqAAAEsIS5gAAFSYAABLCEuYAABK2AAAZuBLmAAAVOAAAEsIS5gAAFT4AABLCEuYAABTkAAASwhLmAAAVRAAAEsIS5gAAErYAABLCEuYAABTwAAASwhLmAAAS4AAAEsIS5gAAFUoAABLCEuYAABK2AAASwgAAAAAZ1gAAGdwAAAAAEvIAABncAAAAABLsAAAZ3AAAAAAZ1gAAEvgAAAAAEvIAABL4AAAAABL+AAAZ3AAAAAATBAAAGdwAAAAAExAAABXyAAATHBMKAAAV8gAAExwTEAAAFbwAABMcExAAABMWAAATHBOIAAASwhTYAAATIgAAEsIU2AAAEy4AABLCFNgAABMoAAASwhTYAAATLgAAFJwU2AAAEzoAABLCFNgAABM0AAASwhTYAAATOgAAGbgU2AAAE0AAABLCFNgAABNGAAASwhTYAAATTAAAEsIU2AAAE1IAABLCFNgAABNYAAASwhTYAAATXgAAEsIU2AAAE4gAABm4FNgAABNkAAASwhTYAAATagAAEsIU2AAAE3AAABLCFNgAABN2AAASwhTYAAATfAAAEsIU2AAAE4IAABLCFNgAABOIAAASwhTYAAATjgAAEsIU2AAAErYAABLCAAAAABOmAAATvgAAAAATlAAAE74AAAAAE5oAABO+AAAAABOgAAATvgAAAAATpgAAE6wAAAAAE7IAABO+AAAAABO4AAATvgAAAAAStgAAEsIAABPKErYAABLCAAATyhK2AAATxAAAE8oSJgAAEsIAABPKErYAABm4AAATyhQSAAASwhQYAAAT0AAAEsIUGAAAE9YAABLCFBgAABPcAAASwhQYAAAT4gAAEsIUGAAAE+gAABLCFBgAABPuAAASwhQYAAAT9AAAEsIUGAAAFBIAABm4FBgAABP6AAASwhQYAAAUAAAAEsIUGAAAFAYAABLCFBgAABQMAAASwhQYAAAUEgAAEsIUGAAAFBIAABLCFBgAABQeAAAUKgAAAAAUJAAAFCoAAAAAFDYUPBLCAAAUQhQwFDwSwgAAFEIUNhQ8EsIAABRCFDYUPBd4AAAUQhQ2FDwSwgAAFEIUNhQ8GbgAABRCFDYUPBeKAAAUQhK2AAASwgAAAAAStgAAGbgAAAAAErYAABLCAAAAABUgAAASwgAAAAASGgAAEsIAAAAAErYAABd4AAAAABUsAAASwgAAAAAStgAAGbgAAAAAErYAABLCAAAAABK2AAAXigAAAAAVSgAAEsIAAAAAErYWChLCFhAWFhUgFgoSwhYQFhYSIBYKEsIWEBYWEiYWChLCFhAWFhRIFgoSwhYQFhYSJhYKGbgWEBYWEg4WChLCFhAWFhROFgoSwhYQFhYSFBYKEsIWEBYWFKgWChLCFhAWFhUmFgoSwhYQFhYU6hYKEsIWEBYWFFQWChLCFhAWFhK2FgoZuBYQFhYVOBYKEsIWEBYWFT4WChLCFhAWFhK2FgoSwhYQFhYVIBYKEsIWEBYWErYWChm4FhAWFhU4FgoSwhYQFhYVPhYKEsIWEBYWFUoWChLCFhAWFhTeFgoSwhYQFhYU5BYKEsIWEBYWFUQWChLCFhAWFhRaFgoSwhYQFhYUYBYKEsIWEBYWErYWChLCFhAWFhK2FgoSwhYQFhYVIBYKEsIWEBYWFUoWChLCFhAWFhT2FgoSwhYQFhYUZhYKEsIWEBYWFGwWChLCFhAWFhK2AAAaBgAAAAAStgAAEsIAAAAAErYAABLCAAAAABUgAAASwgAAAAASGgAAEsIAAAAAErYAABd4AAAAABSoAAASwgAAAAAStgAAGbgAAAAAFOQAABLCAAAAABK2AAAXigAAAAAUkAAAGJ4AAAAAFHIAABieAAAAABR4AAAYngAAAAAUfgAAGJ4AAAAAFIQAABieAAAAABSQAAAYjAAAAAAUigAAGJ4AAAAAFJAAABiSAAAAABSWAAAYngAAAAAUkAAAGKQAAAAAFJYAABikAAAAABK2FgoSwhYQFhYStgAAEsIAABSiErYAABLCAAAUohIaAAASwgAAFKIStgAAFJwAABSiErYAABd4AAAUohK2AAAZuAAAFKIStgAAF4oAABSiErYU/BLCFQIAABUgFPwSwhUCAAASIBT8EsIVAgAAEiYU/BLCFQIAABSoFPwSwhUCAAAVJhT8EsIVAgAAErYU/Bm4FQIAABU4FPwSwhUCAAAVPhT8EsIVAgAAFLQRJBTSFNgAABSuESQU0hTYAAAUtBEkFLoU2AAAFMARJBTSFNgAABTGESQU0hTYAAAUzBEkFNIU2AAAFN4U/BLCFQIAABTkFPwSwhUCAAAVRBT8EsIVAgAAFOoU/BLCFQIAABK2FPwSwhUCAAAU8BT8EsIVAgAAFUoU/BLCFQIAABT2FPwSwhUCAAAStgAAEsIAAAAAGgwAABUaAAAAABVWAAAVGgAAAAAVCAAAFRoAAAAAFQ4AABUaAAAAABUUAAAVGgAAAAAStgAAEsIAAAAAErYAABVQAAAAABUgAAAVUAAAAAASJgAAFVAAAAAAFSYAABVQAAAAABUsAAAVUAAAAAAStgAAFTIAAAAAFTgAABVQAAAAABU+AAAVUAAAAAAVRAAAFVAAAAAAFUoAABVQAAAAABoMAAAVaAAAAAAVVgAAFWgAAAAAFVwAABVoAAAAABViAAAVaAAAAAAaDAAAFW4AAAAAFdoAABXyFfgAABV0AAAV8hX4AAAVegAAFfIV+AAAFYAAABXyFfgAABV6AAAVvBX4AAAVgAAAFfIV+AAAFYYAABXyFfgAABWMAAAV8hX4AAAVmAAAFfIV+AAAFZIAABXyFfgAABWYAAAVvBX4AAAVngAAFfIV+AAAFaQAABXyFfgAABWqAAAV8hX4AAAVsAAAFfIV+AAAFbYAABXyFfgAABXaAAAVvBX4AAAVwgAAFfIV+AAAFcgAABXyFfgAABXOAAAV8hX4AAAV1AAAFfIV+AAAFdoAABXyFfgAABXgAAAV8hX4AAAV5gAAFfIV+AAAFewAABXyFfgAABKYAAAV/gAAAAAWBBYKEsIWEBYWFiIAABZAAAAAABYoAAAWQAAAAAAWHAAAFkAAAAAAFiIAABYuAAAAABYoAAAWLgAAAAAWNAAAFkAAAAAAFjoAABZAAAAAABKwFkYSwgAAFkwSsBZGEsIAABZMErAWRhm4AAAWTBKwFkYXigAAFkwSngAAFsQWygAAFlIAABbEFsoAABZeAAAWxBbKAAAWWAAAFsQWygAAFl4AABZkFsoAABZwAAAWxBbKAAAWagAAFsQWygAAFnAAABaaFsoAABZ2AAAWxBbKAAAWfAAAFsQWygAAFoIAABbEFsoAABaIAAAWxBbKAAAWjgAAFsQWygAAFpQAABbEFsoAABKeAAAWmhbKAAAWoAAAFsQWygAAFqYAABbEFsoAABasAAAWxBbKAAAWsgAAFsQWygAAFrgAABbEFsoAABa+AAAWxBbKAAASngAAFsQWygAAEiwAABbEFsoAABbQAAAW1hbcAAAY7AAAFvoAAAAAGOwAABb6AAAAABkEAAAW+gAAAAAW4gAAFvoAAAAAFugAABb6AAAAABbuAAAW+gAAAAAW9AAAFvoAAAAAFwwAABlkAAAXEhcMAAAZZAAAFxIXDAAAFwAAABcSFwYAABlkAAAXEhcMAAAXKgAAFxIYzgAAGWQZFgAAEqQAABlkGRYAABKkAAAZZBkWAAAXGAAAGWQZFgAAGVgAABlkGRYAABceAAAZZBkWAAASpAAAGWQZFgAAFyQAABlkGRYAABjOAAAZZBkWAAAYzgAAFyoZFgAAGV4AABlkGRYAABcwAAAZZBkWAAAXNgAAGWQZFgAAFzwAABlkGRYAABjOAAAZZBkWAAAXQgAAGWQZFgAAF0gAABdaAAAAABdOAAAXWgAAAAAXVAAAF1oAAAAAF2AAABoAAAAAABdgAAAXZgAAAAAXbAAAEsIAAAAAF34XhBLCAAAXkBdyF4QSwgAAF5AXfheEEsIAABeQF34XhBd4AAAXkBd+F4QZuAAAF5AXfheEF4oAABeQF5YAABLCAAAAABeWAAAZuAAAAAAZvgAAGcQAAAAAF5wAABnEAAAAABeiAAAZxAAAAAAZvgAAF6gAAAAAF64AABnEAAAAABm+AAAXtAAAAAAZvgAAF7oAAAAAF8AAABnEAAAAABlqGDgaABg+GEQYGhg4GgAYPhhEF8YYOBoAGD4YRBfSGDgaABg+GEQXzBg4GgAYPhhEF9IYOBf2GD4YRBfYGDgaABg+GEQX3hg4GgAYPhhEF+QYOBoAGD4YRBfqGDgaABg+GEQYzhg4GgAYPhhEGSgYOBoAGD4YRBfwGDgaABg+GEQZahg4F/YYPhhEGNoYOBoAGD4YRBjgGDgaABg+GEQZahg4GgAYPhhEGBoYOBoAGD4YRBlqGDgX9hg+GEQY2hg4GgAYPhhEGOAYOBoAGD4YRBggGDgaABg+GEQX/Bg4GgAYPhhEGAIYOBoAGD4YRBgIGDgaABg+GEQYDhg4GgAYPhhEGBQYOBoAGD4YRBlqGDgaABg+GEQZahg4GgAYPhhEGBoYOBoAGD4YRBggGDgaABg+GEQYJhg4GgAYPhhEGCwYOBoAGD4YRBgyGDgaABg+GEQYSgAAGFAAAAAAGIAAABiGAAAAABhWAAAYhgAAAAAYXAAAGIYAAAAAGIAAABhiAAAAABhoAAAYhgAAAAAYgAAAGG4AAAAAGHQAABiGAAAAABiAAAAYegAAAAAYgAAAGIYAAAAAGKoYsBieAAAYvBiqGLAYngAAGLwYqhiwGJ4AABi8GKoYsBiMAAAYvBiqGLAYkgAAGLwYmBiwGJ4AABi8GKoYsBikAAAYvBiqGLAYtgAAGLwSsBlAGUYZTAAAGawZQBlGGUwAABjCGUAZRhlMAAASMhlAGUYZTAAAGMgZQBlGGUwAABjOGUAZRhlMAAASsBlAGNQZTAAAGNoZQBlGGUwAABjgGUAZRhlMAAAY7BkKGRAZFgAAGOYZChkQGRYAABjsGQoY8hkWAAAY+BkKGRAZFgAAGP4ZChkQGRYAABkEGQoZEBkWAAAZHBlAGUYZTAAAGSIZQBlGGUwAABI4GUAZRhlMAAAZKBlAGUYZTAAAErAZQBlGGUwAABkuGUAZRhlMAAAZNBlAGUYZTAAAGToZQBlGGUwAABKkAAAZZAAAAAASpAAAGWQAAAAAGVIAABlkAAAAABlYAAAZZAAAAAASPgAAGWQAAAAAGV4AABlkAAAAABlqAAAaAAAAAAASqgAAGaYAAAAAGXAAABmmAAAAABl2AAAZpgAAAAAZfAAAGaYAAAAAGYIAABmmAAAAABKqAAAZiAAAAAAZjgAAGaYAAAAAGZQAABmmAAAAABmaAAAZpgAAAAAZoAAAGaYAAAAAErAAABLCAAAAABmsAAASwgAAAAAZsgAAEsIAAAAAErAAABLCAAAAABKwAAAZuAAAAAAZvgAAGcQAAAAAGdYAABncAAAAABnKAAAZ0AAAAAAZ1gAAGdwAAAAAGeIZ6BnuAAAZ9BK2AAASwgAAAAAZ+gAAGgAAAAAAErYAABoGAAAAABoM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AAQAAAABAcAAAQAAAAEBgAABAAAAAQHIAAEAAAABAXYAAQAAAAEBdAABAAAAAQQuAAEAAAABAWoAAQAAAAEBaAABAAAAAQFmAAEAAAABAWQAAQAAAAEBlgAEAAAAAQFgAAEAAAABBDYABAAAAAEBsAABAAAAAQG4AAEAAAABAVQAAQAAAAEBuAABAAAAAQEqAAYAAAACAugC+gAGAAAAAgNKA14ABgAAAAIC+AMKAAYAAAACAxIDJAAGAAAABANUA4oDZgN4AAAAAQAfAAAAAQAgAAAAAQAWAAAAAQASAAAAAQAJAAAAAQARAAAAAQAOAAAAAQANAAAAAQAMAAAAAQAPAAAAAQAQAAAAAQAVAAAAAQAiAAAAAQAjAAAAAQAkAAAAAQAlAAAAAQATAAAAAQAUAAAAAQAhAAAAAgAAAAEAAAACAAIABQAAAAIAHAAeAAAAAwACAAUACAAAAAMAFwAYABkAAP//AA8AAAABAAIABAAFAAYADwAQABEAEgATABQAFQAWABcAAQP4AAcAAQPiAAgAAQQEAAwAAQP+ABYAAQPW/+YAAQPyACAAAQPi//YAAQPUAAIAAQY2AAEDxAABBooAAwP2BAAD4gACA/4AAwIqAogCiQACBAgABACtALcBmgGjAAIEBgAEAdUB1gHVAdYAAP//AA8AAAABAAMABAAFAAYADwAQABEAEgATABQAFQAWABcAAQZWAAUDkgOWA7wDmgPCAAID8gAFAeMCFQIWAhcCGAACA+IABQHkAhECEgITAhQAAP//ABAAAAABAAIABAAFAAYABwAPABAAEQASABMAFAAVABYAFwAA//8AEAAAAAEAAgAEAAUABgAIAA8AEAARABIAEwAUABUAFgAXAAD//wAQAAAAAQACAAQABQAGAAkADwAQABEAEgATABQAFQAWABcAAP//ABAAAAABAAIABAAFAAYACgAPABAAEQASABMAFAAVABYAFwAA//8AEAAAAAEAAgAEAAUABgALAA8AEAARABIAEwAUABUAFgAXAAD//wAQAAAAAQACAAQABQAGAAwADwAQABEAEgATABQAFQAWABcAAP//ABAAAAABAAIABAAFAAYADQAPABAAEQASABMAFAAVABYAFwAA//8AEAAAAAEAAgAEAAUABgAOAA8AEAARABIAEwAUABUAFgAXAAMAAAABA5QAAQLMAAEAAAAGAAMAAQK6AAEDggAAAAEAAAAHAAMAAQJcAAEB8gAAAAEAAAAaAAMAAQJ6AAEB4AAAAAEAAAAbAAMAAQHYAAECPgAAAAEAAAAdAAMAAQHGAAECNAAAAAEAAAAdAAMAAQIqAAEBnAABAioAAQAAAAoAAwABAhwAAQGIAAECHAABAAAACwADAAAAAQImAAECLgABAAAAAwADAAEC7gABAu4AAAABAAAAAwADAAECJAABAtwAAAABAAAABAADAAAAAQHwAAICIgH4AAEAAAAEAAICNgALAgMCBAIFAgYCBwIIAgkCCgILAgwCawABArwADwICAowCMgI8AkYCUAJaAmQCbgJ4AoICCAIOAioCFAACAnYAGAOgA6EDogOjA6QDpQOmA6cDqAOpA6oDqwOsA60DrgOvA7ADsQOyA7MDvQO+A78DwAACAoQAGgE6AUoDoAOhA6IDowOkA6UDpgOnA6gDqQOqA6sDrAOtA64DrwOwA7EDsgOzA70DvgO/A8AAAgJ4ADIB1QHWAK0AtwHVAUoB1gGaAaMB8AHxAfIB8wH0AfUB9gH3AfgCKQIqAg0CRQJGAmsCiAKJA6ADoQOiA6MDpAOlA6YDpwOoA6kDqgOrA6wDrQOuA68DsAOxA7IDswO9A74DvwPAAAEAAQE5AAEAAQInAAECagABAAECIgABAAICQwJEAAIAAQH5AgIAAAACAAEB2QHiAAAAAwJSAlgCXgABAmgAAQJYAAECWgAEAmQCagJwAnYABAJyAngCfgKEAAEAAwIkAngCegACApICgAACAoAChgABAAQAqwC2AZgBogABAAQAAQB4AOgBYwABAAECDQABAAIAAQDoAAEAAgB4AWMAAQABAU8AAQABAGMAAQAFAdkB5QHvAfkCAwACAAEB7wH4AAAAAQACATkBSQACAAEDegOIAAAAAgACA6ADswAAA70DwAAUAAIAAgABAOYAAAHYAdgA5gACAAIDiQOLAAADjQOSAAMAAgE6AUEAAgIRAhUAAgISAhYAAgIUAhgAAgACAdkB4gAAAm0CbQAKAAMB7wITAhcABAHmAfAB+gIEAAQB5wHxAfsCBQAEAegB8gH8AgYABAHpAfMB/QIHAAQB6gH0Af4CCAAEAesB9QH/AgkABAHsAfYCAAIKAAQB7QH3AgECCwAEAe4B+AICAgwABgHjAeQB5QHvAfkCAwACAAUDegODAAADiQOJAAoDkwOXAAsDmQOcABADuQO8ABQAAQAPATkB2QHaAdsB3AHdAd4B3wHgAeEB4gHlAe8B+QIDAAIABwE5ATkAAAFJAUkAAQN6A4MAAgOJA4kADAOTA5cADQOZA5wAEgO5A7wAFgABADIAAQB4AKsAtgDoAUkBYwGYAaIB+gH7AfwB/QH+Af8CAAIBAgICIgIkAicCQwJEAm0CeAJ6A3oDewN8A30DfgN/A4ADgQOCA4MDiQOTA5QDlQOWA5cDmQOaA5sDnAO5A7oDuwO8A1wAAwFjAhkAAQABAG8DvQACA6MDvgACA6IDwAACA6kCRwACAnIDawACAnACSAADAnACcAO5AAIDfQO6AAIDfAO7AAIDhQO8AAIDgwO1AAIDfQO2AAIDfAO3AAIDhQO4AAIDgwABAAMDfwOBA6UDagACAnIDbQACAnADbAACAjEDaQADAnACcAABAAUCHgIxAnACcgJzAAEAAQAIAAIAAAAUAAIAAAAkAAJ3Z2h0AQAAAXdkdGgBAQAAAAQAEAABAAEAAAFSAH0AAAADAAAAAgFXAZAAAAK8AAA='; diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/fonts/Inconsolata-Regular.ttf b/lib/interactive/TMB_FLANKER_ATTENTION/fonts/Inconsolata-Regular.ttf new file mode 100644 index 0000000..3b7e851 Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/fonts/Inconsolata-Regular.ttf differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/fragment.html b/lib/interactive/TMB_FLANKER_ATTENTION/fragment.html new file mode 100644 index 0000000..6fb1a07 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/fragment.html @@ -0,0 +1,19 @@ + +
    >> >>
    + +
    << <<
    + +
    >>>>>
    + +
    >><>>
    + +
    <<<<<
    + +
    <<><<
    + +
    +
    + + +
    + +
    diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/index.ts b/lib/interactive/TMB_FLANKER_ATTENTION/index.ts new file mode 100644 index 0000000..93ee628 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/index.ts @@ -0,0 +1,157 @@ +import { defineInstrument } from '/runtime/v1/@opendatacapture/runtime-core'; +import { z } from '/runtime/v1/zod@3.x/v4'; + +import fingerLeft from './fingerLeft.png'; +import fingerRight from './fingerRight.png'; +import fingerUp from './fingerUp.png'; +import html from './fragment.html'; +import leftButton from './leftButton.png'; +import pressMIcon from './pressM_icon.png'; +import pressXIcon from './pressX_icon.png'; +import { render } from './render.js'; +import rightButton from './rightButton.png'; + +import './TestMyBrain.12.18.min.js?legacy'; +import './chooseInput.v1.Feb24.js?legacy'; +import './TestHelper.v1.Oct23.js?legacy'; +import './styles.css'; + +const staticAssets = { + '/fingerUp.png': fingerUp, + '/fingerLeft.png': fingerLeft, + '/fingerRight.png': fingerRight, + '/leftButton.png': leftButton, + '/rightButton.png': rightButton, + '/pressM_icon.png': pressMIcon, + '/pressX_icon.png': pressXIcon +}; + +export default defineInstrument({ + kind: 'INTERACTIVE', + language: ['en', 'fr'], + tags: { + en: ['TestMyBrain'], + fr: ['TestMyBrain'] + }, + internal: { + edition: 1, + name: 'TMB_FLANKER_ATTENTION' + }, + content: { + meta: { + charset: 'UTF-8', + description: 'TMB Flanker Attention', + copyright: '2024 The Many Brains Project, Inc. and McLean Hospital LGPLv3', + keywords: 'cognitive test, brain test, flanker, attention', + viewport: 'width=device-width, initial-scale=1, viewport-fit=contain', + 'apple-mobile-web-app-capable': 'yes', + 'mobile-web-app-capable': 'yes', + 'apple-mobile-web-app-title': 'TMB Flanker', + 'theme-color': 'white' + }, + html, + render, + staticAssets, + defaultFullscreen: true, + enableLanguageLock: true, + enableLanguageSelect: true + }, + clientDetails: { + estimatedDuration: 5, + instructions: { + en: ['Instructions will be presented on screen in the task.'], + fr: ["Les instructions seront présentées à l'écran pendant la tâche."] + } + }, + details: { + description: { + en: 'A cognitive test that measures selective attention and response inhibition by requiring the participant to indicate the direction of a central arrow while ignoring flanking arrows.', + fr: "Un test cognitif qui évalue l'attention sélective et l'inhibition de la réponse en demandant au participant d'indiquer la direction d'une flèche centrale tout en ignorant les flèches qui l'entourent." + }, + license: 'LGPL-3.0', + title: { + en: 'TMB Flanker Attention', + fr: 'TMB Attention Flanker' + } + }, + measures: { + score: { + kind: 'computed', + label: { en: 'Score', fr: 'Score' }, + value: (data) => data.outcomes.score + }, + accuracy: { + kind: 'computed', + label: { en: 'Accuracy', fr: 'Précision' }, + value: (data) => data.outcomes.accuracy + }, + medianRTc: { + kind: 'computed', + label: { en: 'Reaction Time (Median, Correct)', fr: 'Temps de réaction (médiane, correct)' }, + value: (data) => data.outcomes.medianRTc ?? undefined + }, + medianRT_interference: { + kind: 'computed', + label: { en: 'Interference (Median RT)', fr: 'Interférence (temps de réaction médian)' }, + value: (data) => data.outcomes.medianRT_interference + }, + accuracy_interference: { + kind: 'computed', + label: { en: 'Interference (Accuracy)', fr: 'Interférence (précision)' }, + value: (data) => data.outcomes.accuracy_interference + }, + rcs_interference: { + kind: 'computed', + label: { en: 'Interference (Rate Correct Score)', fr: 'Interférence (score de taux correct)' }, + value: (data) => data.outcomes.rcs_interference + }, + responseDevice: { + kind: 'computed', + label: { en: 'Response Device', fr: 'Dispositif de réponse' }, + value: (data) => data.outcomes.responseDevice + } + }, + validationSchema: z.object({ + results: z.array( + z.object({ + trialId: z.string().nullable(), + trialType: z.string(), + trialBlock: z.string(), + target: z.string(), + flankers: z.string(), + congruent: z.number(), + response: z.string().nullable(), + correct: z.number().nullable(), + rt: z.number().nullable(), + flagged: z.number().nullable(), + repeated: z.number(), + state: z.string(), + timestamp: z.number() + }) + ), + outcomes: z.object({ + accuracy: z.number(), + meanRTc: z.number().nullable(), + medianRTc: z.number().nullable(), + sdRTc: z.number().nullable(), + medianRT_congruent: z.number(), + medianRT_incongruent: z.number(), + accuracy_congruent: z.number(), + accuracy_incongruent: z.number(), + rcs_congruent: z.number(), + rcs_incongruent: z.number(), + accuracy_interference: z.number(), + medianRT_interference: z.number(), + rcs_interference: z.number(), + flag_medianRTc: z.number(), + flag_accuracy: z.number(), + flag_trialFlags: z.number(), + flag_any: z.number(), + didPracticeTrials: z.number(), + score: z.number(), + responseDevice: z.string(), + testVersion: z.string(), + type: z.string() + }) + }) +}); diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/leftButton.png b/lib/interactive/TMB_FLANKER_ATTENTION/leftButton.png new file mode 100644 index 0000000..1c9021f Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/leftButton.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/pressM_icon.png b/lib/interactive/TMB_FLANKER_ATTENTION/pressM_icon.png new file mode 100644 index 0000000..42a4daa Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/pressM_icon.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/pressX_icon.png b/lib/interactive/TMB_FLANKER_ATTENTION/pressX_icon.png new file mode 100644 index 0000000..ee7829a Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/pressX_icon.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/render.d.ts b/lib/interactive/TMB_FLANKER_ATTENTION/render.d.ts new file mode 100644 index 0000000..c883261 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/render.d.ts @@ -0,0 +1 @@ +export declare function render(done: (data: any) => void): void; diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/render.js b/lib/interactive/TMB_FLANKER_ATTENTION/render.js new file mode 100644 index 0000000..09c5e03 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/render.js @@ -0,0 +1,732 @@ +// @ts-nocheck +/* eslint-disable */ + +import { inconsolataFontUrl } from './font.ts'; +import { translator } from './translator.ts'; + +export function render(done) { + translator.init(); + + // inject the Inconsolata @font-face from the embedded base64 data URL so the + // monospace arrow stimuli render crisply (with a system monospace fallback) + var fontStyle = document.createElement('style'); + fontStyle.appendChild( + document.createTextNode( + "@font-face{font-family:'Inconsolata';src:url('" + inconsolataFontUrl + "') format('truetype');}" + ) + ); + document.head.appendChild(fontStyle); + + function tFormat(key, vars) { + var s = translator.t(key); + if (vars) { + for (var k in vars) s = s.replace(new RegExp('\\{' + k + '\\}', 'g'), vars[k]); + } + return s; + } + + // Globals + var testVersion; // version identifier for this test + var frameSequence = []; // object containing the sequence of frames and their properties + var frame; // single frame object + var chain; // chain of timeouts for stimulus presentation + var chainSeq = []; // array of stimulus events to schedule + var responseErrors = 0; // errors' counter + var score; // final score + var results = []; // array to store trials details and responses + var outcomes = {}; // object containing outcome variables + var deviceInfo; // variable for logging device info + var testStartTime; // timestamp of test start (since Unix epoch) + var flankerstime; // exposure of flankers in ms + var targettime; // exposure of target in ms + var fixationtime; // delay b/w target and fixation in ms + var leftKey; // keyboard key for left response + var rightKey; // keyboard key for right response + var chosenInput; // input type (taps or keys) + var repeated = 0; // whether the current trial has been repeated + var seed; // URL parameter: random number generator seed + var nopractice; // URL parameter: no practice trials + var debug; // URL parameter: output to console + var demo; // URL parameter: run in demo mode + var showresults; // URL parameter: if they want to show results in a popup window + var autosave; // URL parameter: if they want to save data in a file automatically + var filename; // URL parameter: filename for data + var usage = ''; // URL parameter: show usage + + tmbUI.onreadyUI = function () { + var right, left, correct, errorMessage; + + // if we are debugging and there was an error, log the message + if (debug === 'true' && tmbUI.message) console.log(tmbUI.message); + + // clear the stimulus chain, in case it's still running + clearChainTimeouts(chain); + + // is the response correct? + right = ~frame.stim.indexOf('Right'); + left = ~frame.stim.indexOf('Left'); + correct = + (tmbUI.response === (chosenInput === 'taps' ? 'rightButton' : rightKey) && right) || + (tmbUI.response === (chosenInput === 'taps' ? 'leftButton' : leftKey) && left) + ? 1 + : 0; + if (!correct) responseErrors++; + + // store the results + results.push({ + trialId: frame.trial_id, + trialType: frame.type.indexOf('test') > -1 ? 'test' : 'practice', // one of practice or test + trialBlock: frame.type, // trial block (e.g., practice1, test1) + target: frame.stim.indexOf('Right') > -1 ? 'right' : 'left', // one of right or left + flankers: frame.flankers.indexOf('Right') > -1 ? 'right' : 'left', // one of right or left + congruent: frame.stim.indexOf('incongruent') > -1 ? 0 : 1, // boolean for congruent + response: tmbUI.response === (chosenInput === 'taps' ? 'leftButton' : leftKey) ? 'left' : 'right', // one of left or right + correct: correct, // 1 for correct, 0 for error + rt: tmbUI.rt, // delay b/w onset of flankers and response + flagged: frame.type.indexOf('practice') > -1 || tmbUI.status === 'timeout' ? null : tmbUI.rt < 200 ? 1 : 0, // whether test trials are flagged for a qc violation + repeated: repeated, // whether this trial has a prior timeout + state: tmbUI.status, // state of the response handler + timestamp: Date.now() // unix ms timestamp of response + }); + + // deal with errors during practice by repeating instructions + // and repeating the trial + if (~frame.type.indexOf('practice') && !correct) { + // mark this incorrect response/timeout on retry + repeated = 1; + + // change certain results values to null when timeout + if (tmbUI.status === 'timeout') { + // change certain results values to null + results[results.length - 1].rt = null; + results[results.length - 1].correct = null; + results[results.length - 1].response = null; + } + + errorMessage = right + ? translator.t('feedback.middleRight') + + '
    ' + + ">
    " + + (chosenInput === 'taps' + ? translator.t('feedback.shouldClickRight') + '

    ' + : tFormat('feedback.shouldPress', { key: rightKey }) + '

    ') + : translator.t('feedback.middleLeft') + + '
    ' + + "<
    " + + (chosenInput === 'taps' + ? translator.t('feedback.shouldClickLeft') + '

    ' + : tFormat('feedback.shouldPress', { key: leftKey }) + '

    '); + + document.body.style.background = '#ffffff'; //white + + showAlert( + errorMessage, + chosenInput === 'taps' ? translator.t('buttons.clickRetry') : '', + function () { + hideCursor('document.body'); + document.body.style.background = '#e0e0e0'; // grey + frameSequence.unshift(frame); + showFrame('leftButton', 'rightButton'); + setTimeout(function () { + nextTrial(); + }, 1000); + }, + '20pt', + null, + chosenInput === 'taps' ? null : translator.t('buttons.spaceRetry') + ); + } + // if the input event returns a timeout, + // stop the sequence and advise the participant + else if (tmbUI.status === 'timeout') { + // mark this timeout on retry + repeated = 1; + + // change certain results values to null + results[results.length - 1].rt = null; + results[results.length - 1].correct = null; + results[results.length - 1].response = null; + + document.body.style.background = '#ffffff'; // white + + showAlert( + translator.t('timeout.tooLong') + + '

    ' + + translator.t('timeout.tryQuicker') + + '
    ' + + (chosenInput === 'taps' + ? translator.t('timeout.atClicking') + '

    ' + : tFormat('timeout.atPressing', { leftKey: leftKey, rightKey: rightKey }) + '

    '), + chosenInput === 'taps' ? translator.t('buttons.clickRetry') : '', + function () { + hideCursor('document.body'); + document.body.style.background = '#e0e0e0'; //grey + frameSequence.unshift(frame); + showFrame('leftButton', 'rightButton'); + setTimeout(function () { + nextTrial(); + }, 1000); + }, + '20pt', + null, + chosenInput === 'taps' ? null : translator.t('buttons.spaceRetry') + ); + } + // else all is good, advance to the next trial + else { + // if we are debugging, log the results + if (debug === 'true') logResults(results, 'inc'); + + // resetting repeated variable when no timeout + repeated = 0; + nextTrial(); + } + }; + + function nextTrial() { + var intervals = []; + + // read the frame sequence one frame at a time + frame = frameSequence.shift(); + if (frame) { + // check if it's the startup frame + if (frame.type === 'begin') { + showAlert( + frame.message, + chosenInput === 'taps' ? translator.t('buttons.clickInstructions') : '', + function () { + nextTrial(); + }, + '20pt', + null, + chosenInput === 'taps' ? null : translator.t('buttons.spaceInstructions') + ); + } + // check if it's a message frame + else if (frame.type === 'message') { + // change highlighting style, if needed + if ( + frameSequence.filter((x) => x.type === 'practice1').length === 0 && + tmbUI.highlight === 'responseIconHighlightPractice' + ) { + tmbUI.highlight = 'responseIconHighlight'; + } + + // before commencing a block of trials + // (except the first block), we warn the participant to emphasize + // speed or accuracy based on previous number of errors + if (frame.feedback === 'speedaccuracy') { + if (responseErrors <= 2) frame.message += translator.t('speedAccuracy.quickly'); + else if (responseErrors >= 4) frame.message += translator.t('speedAccuracy.accurately'); + else frame.message += translator.t('speedAccuracy.both'); + } + + // reset the errors' counter + responseErrors = 0; + + document.body.style.background = '#ffffff'; //white + + showAlert( + frame.message, + chosenInput === 'taps' ? translator.t('buttons.clickContinue') : '', + function () { + hideCursor('document.body'); + showFrame('null'); + setTimeout(function () { + nextTrial(); + }, 1000); + }, + '20pt', + null, + chosenInput === 'taps' ? null : translator.t('buttons.spaceContinue') + ); + } + // else show the stimulus + else { + // setup the stimulus' delays + if (frame.type === 'practice1') intervals = [1000, 600, 500, 0]; + else intervals = [1000, flankerstime, targettime, fixationtime]; + + // build the stimulus chain + chainSeq = [ + function () { + requestAnimationFrame(function () { + hideCursor('document.body'); + showFrame('leftButton', 'rightButton'); + document.body.offsetHeight; + }); + }, + intervals[0], // ITI + function () { + requestAnimationFrame(function () { + showFrame(frame.flankers, 'leftButton', 'rightButton'); + document.body.offsetHeight; + tmbUI.getInput(); + }); + }, + intervals[1], // flankers-target asynchrony + function () { + requestAnimationFrame(function () { + showFrame(frame.stim, 'leftButton', 'rightButton'); + document.body.offsetHeight; + }); + }, + intervals[2], // target duration + intervals[3] // target-fixation asynchrony + ? [ + function () { + requestAnimationFrame(function () { + showFrame('leftButton', 'rightButton'); + document.body.offsetHeight; + }); + }, + intervals[3], + function () { + requestAnimationFrame(function () { + showFrame('fixation', 'leftButton', 'rightButton'); + document.body.offsetHeight; + }); + } + ] + : function () { + requestAnimationFrame(function () { + showFrame('fixation', 'leftButton', 'rightButton'); + document.body.offsetHeight; + }); + } + ]; + chainSeq = chainSeq.flatten(); + + hideCursor('document.body'); + document.body.style.background = '#e0e0e0'; // grey + + // chain the stimulus presentation + chain = chainTimeouts(chainSeq); + } + } + // else the sequence is empty, we are done! + else { + var tmp1, tmp2, congTrials, incongTrials; + + showCursor('document.body'); + + // all test trials (excluding practice and timeouts) + tmp1 = results.filter(function (obj) { + return obj.trialType !== 'practice' && obj.state !== 'timeout'; + }); + + // correct trials only + tmp2 = tmp1 + .filter(function (obj) { + return obj.correct === 1; + }) + .pluck('rt'); + + outcomes.accuracy = tmp2.length / tmp1.length; + outcomes.meanRTc = tmp2.length ? tmp2.average().round(2) : null; + outcomes.medianRTc = tmp2.length ? tmp2.median().round(2) : null; + outcomes.sdRTc = tmp2.length > 1 ? tmp2.sd().round(2) : null; + + // congruent trials + congTrials = tmp1.filter(function (obj) { + return obj.congruent === 1; + }); + + // incongruent trials + incongTrials = tmp1.filter(function (obj) { + return obj.congruent === 0; + }); + + outcomes.medianRT_congruent = congTrials.pluck('rt').median(); + outcomes.medianRT_incongruent = incongTrials.pluck('rt').median(); + outcomes.accuracy_congruent = congTrials.pluck('correct').average(); + outcomes.accuracy_incongruent = incongTrials.pluck('correct').average(); + outcomes.rcs_congruent = ((1000 * outcomes.accuracy_congruent) / outcomes.medianRT_congruent).round(4); + outcomes.rcs_incongruent = ((1000 * outcomes.accuracy_incongruent) / outcomes.medianRT_incongruent).round(4); + outcomes.accuracy_interference = (outcomes.accuracy_congruent - outcomes.accuracy_incongruent).round(4); + outcomes.medianRT_interference = (outcomes.medianRT_incongruent - outcomes.medianRT_congruent).round(4); + outcomes.rcs_interference = (outcomes.rcs_congruent - outcomes.rcs_incongruent).round(4); + outcomes.flag_medianRTc = outcomes.medianRTc >= 400 ? 0 : 1; + outcomes.flag_accuracy = outcomes.accuracy < 0.65 ? 1 : 0; + outcomes.flag_trialFlags = tmp1.pluck('flagged').average() > 0.1 ? 1 : 0; + + //overall qc flag + outcomes.flag_any = outcomes.flag_medianRTc + outcomes.flag_accuracy + outcomes.flag_trialFlags > 0 ? 1 : 0; + outcomes.didPracticeTrials = nopractice === 'true' ? 0 : 1; + + // create a score with range 0 - 100 based on rate correct score + // (assume fastest plausible rcs of 2.5 = 100% accuracy + // with 400 ms medianRT) + score = outcomes.score = ((100 * ((1000 * outcomes.accuracy) / tmp1.pluck('rt').median())) / 2.5).round(2); + if (score > 100) score = outcomes.score = 100; + + // response device + tmp2 = tmp1.length ? tmp1[0].state : 'none'; + tmp2 = /key/i.test(tmp2) + ? 'keyboard' + : /touch/i.test(tmp2) + ? 'touch' + : /mouse/i.test(tmp2) + ? 'mouse' + : /pen/i.test(tmp2) + ? 'pen' + : 'unknown'; + + outcomes.responseDevice = tmp2; + outcomes.testVersion = testVersion; + outcomes.type = 'summaryScores'; + + // if debugging, output to console + if (debug === 'true') logResults([outcomes], 'cum'); + + done({ results: results, outcomes: outcomes }); + } + } + + function setFrameSequence() { + var TestMessage, + i, + j, + tempArray = []; + + // whether practice trials will be administered + var doPractice = !nopractice || nopractice === 'false'; + + // stimulus types + var targetType = ['congruentRight', 'congruentLeft', 'incongruentRight', 'incongruentLeft']; + var flankerType = ['flankersRight', 'flankersLeft']; + + // messages + TestMessage = { + begin: + '

    ' + + translator.t('instructions.title') + + '

    ' + + "<<><<

    ", + practice: [ + '

    ' + + translator.t('instructions.heading') + + '


    ' + + translator.t('instructions.youWillSee') + + '

    ' + + "<<><<
    " + + "finger up
    " + + translator.t('instructions.payAttention') + + '

    ', + '

    ' + + translator.t('instructions.heading') + + '

    ' + + "<<><<
    " + + (chosenInput === 'taps' + ? "
    left button      " +
    +              "finger right" +
    +              "right button
    " + : '') + + (chosenInput === 'taps' + ? translator.t('instructions.whenRightTaps') + '

    ' + : tFormat('instructions.whenRightKeys', { key: rightKey }) + + "
    m key
    "), + '

    ' + + translator.t('instructions.heading') + + '

    ' + + ">><>>
    " + + (chosenInput === 'taps' + ? "
    left button" +
    +              "finger left       " +
    +              "right button
    " + : '') + + (chosenInput === 'taps' + ? translator.t('instructions.whenLeftTaps') + '

    ' + : tFormat('instructions.whenLeftKeys', { key: leftKey }) + + "
    x key
    ") + + (doPractice ? translator.t('instructions.letsPractice') + '

    ' : ''), + translator.t('instructions.wellDone') + + '

    ' + + translator.t('instructions.noticedPlus') + + '

    ' + + translator.t('instructions.usePlus') + + '

    ', + translator.t('instructions.morePractice') + '

    ' + translator.t('instructions.fasterNow') + '

    ' + ], + test: [ + (doPractice + ? '
    ' + translator.t('test.excellent') + '

    ' + translator.t('test.nowReal') + '

    ' + : '') + + translator.t('test.threeParts') + + '

    ' + + translator.t('test.respondQuickly') + + '

    ', + '
    ' + + translator.t('test.greatJob') + + '

    ' + + translator.t('test.completedFirst') + + '

    ' + + translator.t('test.letsDoMore') + + '

    ', + '
    ' + translator.t('test.niceGoing') + '

    ' + translator.t('test.oneMore') + '

    ' + ] + }; + + // Practice sequence + + // type of frame to display + var frameType = ['begin', 'message', 'message', 'message']; + + // trial_id + var trial_id = [null, null, null, null]; + + // message to display + var frameMessage = [TestMessage.begin, TestMessage.practice[0], TestMessage.practice[1], TestMessage.practice[2]]; + + // requires feedback? + var frameFeedback = ['', '', '', '']; + + // flanker type (left or right) + var frameFlankers = ['', '', '', '']; + + // target type (incongruent or congruent, left or right) + var frameStim = ['', '', '', '']; + + // setup properties for practice trials + if (doPractice) { + frameType = frameType.concat([ + 'practice1', + 'practice1', + 'practice1', + 'practice1', + 'message', + 'message', + 'practice2', + 'practice2', + 'practice2', + 'practice2' + ]); + + trial_id = trial_id.concat([ + 'practice1', + 'practice2', + 'practice3', + 'practice4', + null, + null, + 'practice5', + 'practice6', + 'practice7', + 'practice8' + ]); + + frameMessage = frameMessage.concat([ + '', + '', + '', + '', + TestMessage.practice[3], + TestMessage.practice[4], + '', + '', + '', + '' + ]); + + frameFeedback = frameFeedback.concat(['', '', '', '', '', '', '', '', '', '']); + + frameFlankers = frameFlankers.concat([ + flankerType[0], + flankerType[1], + flankerType[1], + flankerType[0], + '', + '', + flankerType[0], + flankerType[1], + flankerType[1], + flankerType[0] + ]); + + frameStim = frameStim.concat([ + targetType[0], + targetType[1], + targetType[2], + targetType[3], + '', + '', + targetType[0], + targetType[1], + targetType[2], + targetType[3] + ]); + } + + // tests + + // run 3 blocks + var trialCount = 0; + for (i = 0; i < 3; i++) { + frameType.push('message'); + frameFeedback.push(i === 0 ? '' : 'speedaccuracy'); + frameMessage.push(TestMessage.test[i]); + frameStim.push(''); + frameFlankers.push(''); + trial_id.push(null); + + // each block has 32 trials + // same number of congruent/incongruent and left/right + tempArray = []; + for (j = 0; j < 8; j++) tempArray.push(targetType[0], targetType[1]); + for (j = 0; j < 8; j++) tempArray.push(targetType[2], targetType[3]); + tempArray = tempArray.flatten().shuffle(); + + for (j = 0; j < 32; j++) { + trialCount++; + trial_id.push('test' + trialCount); + frameType.push('test' + (i + 1)); + frameFeedback.push(''); + frameMessage.push(''); + frameStim.push(tempArray[j]); + frameFlankers.push( + tempArray[j] === 'congruentRight' || tempArray[j] === 'incongruentLeft' ? flankerType[0] : flankerType[1] + ); + } + } + + // push all components into the frames chain + for (i = 0; i < frameType.length; i++) { + frameSequence.push({ + trial_id: trial_id[i], + type: frameType[i], + feedback: frameFeedback[i], + message: frameMessage[i], + flankers: frameFlankers[i], + stim: frameStim[i] + }); + } + + //start the testing sequence + nextTrial(); + } + + (function () { + var copyright = 'Copyright ' + document.querySelector('meta[name="copyright"]').content; + var scriptName = window.location.pathname.split('/').pop(); + + // see if they are just asking for help + if ((usage = getUrlParameters('help', '', true))) { + showAlert( + "

    " + + '' + + document.title + + '
    ' + + '' + + copyright + + '

    ' + + 'Usage:' + + '
    ' + + scriptName + + '?urlParam1=1&urlParam2=0

    ' + + 'URL Parameters:
    ' + + 'nopractice=true -- omits practice trials
    ' + + 'debug=true -- outputs trial by trial info to the console
    ' + + 'showresults=true -- allows to save results locally in a file
    ' + + 'autosave=true -- will attempt to save results automatically to file
    ' + + 'filename=subject1.csv -- the filename to save results to
    ' + + 'help -- print this message' + ); + document.getElementById('helpSpan').style.textAlign = 'left'; + document.getElementById('helpSpan').style.margin = '50px'; + return; + } + + // check if this is a debug session + debug = getUrlParameters('debug', '', true); + + // check if they want to load results in a new page when the test is over, + // if data is to be saved automatically to a file and the filename + showresults = getUrlParameters('showresults', '', true); + autosave = getUrlParameters('autosave', '', true); + filename = getUrlParameters('filename', '', true); + + // check if they want to bypass practice + nopractice = getUrlParameters('nopractice', '', true); + + // timing parameters + flankerstime = 100; + targettime = 300; + fixationtime = 70; + + // set response timeout to 3 seconds + tmbUI.timeout = 3000; + + // set the random generator's seed + seed = getUrlParameters('seed', '', true); + if (!(seed = parseInt(seed))) seed = 'FlankerTask'; + Math.seedrandom(seed); + + // set the test version + testVersion = scriptName.replace(/\.[^/.]+$/, ''); + + // disable spurious user interactions + disableSelect(); + disableRightClick(); + disableDrag(); + disableElasticScrolling(); + disableDoubleTapZoom(); + + // set the scale for mobile devices + setBodyScale(700, 650); + + // get device info + deviceInfo = deviceScan(); + + // test start time + testStartTime = Date.now(); + + function setInput(input) { + // set keyboard response keys + leftKey = 'x'; + rightKey = 'm'; + + // determine events to listen to + if (input === 'taps') { + tmbUI.UIevents = ['taps']; + getID('leftButton').innerHTML = '<'; + getID('rightButton').innerHTML = '>'; + tmbUI.highlight = 'responseHighlight'; + } else { + tmbUI.UIevents = ['keys']; + tmbUI.UIkeys = [keyToCode(leftKey), keyToCode(rightKey)]; + getID('leftButton').classList.remove('responseButton'); + getID('rightButton').classList.remove('responseButton'); + getID('leftButton').classList.add('responseIcon'); + getID('rightButton').classList.add('responseIcon'); + getID('leftButton').innerHTML = "x key"; + getID('rightButton').innerHTML = "m key"; + getID('leftButton').style.marginLeft = '-262px'; + getID('rightButton').style.marginLeft = '110px'; + tmbUI.highlight = 'responseIconHighlightPractice'; + } + tmbUI.UIelements = ['leftButton', 'rightButton']; + + chosenInput = input; + + //hide cursor + hideCursor('document.body'); + + // preload images, then create the trials chain and start the sequence + imagePreLoad( + [ + 'fingerUp.png', + 'fingerLeft.png', + 'fingerRight.png', + 'leftButton.png', + 'rightButton.png', + 'pressM_icon.png', + 'pressX_icon.png' + ], + { pipeline: false, callBack: setFrameSequence } + ); + } + + if (!hasTouch) setInput('keys'); + else chooseInput({ keyboard: true, touch: true }, setInput); + })(); +} diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/rightButton.png b/lib/interactive/TMB_FLANKER_ATTENTION/rightButton.png new file mode 100644 index 0000000..f978bd9 Binary files /dev/null and b/lib/interactive/TMB_FLANKER_ATTENTION/rightButton.png differ diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/styles.css b/lib/interactive/TMB_FLANKER_ATTENTION/styles.css new file mode 100644 index 0000000..610f1d2 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/styles.css @@ -0,0 +1,160 @@ +/* + + Copyright 2023 The Many Brains Project, Inc. and McLean Hospital. + + This code is made available under a GNU Lesser General Public License 3.0 + (LGPLv3). + https://www.gnu.org/licenses/lgpl-3.0.html. + + Author: Paolo Martini + Version: Flanker_AoU.v1.Mar23 + + Note: the 'Inconsolata' @font-face declaration is injected at runtime from a + base64 data URL (see render.js / font.ts), so it is intentionally omitted here. + +*/ + +* { + border-radius: 0; + box-sizing: border-box; +} + +*::after, +*::before { + box-sizing: border-box; +} + +html { + width: 100vw; + height: 100vh; +} + +img.rounded-corners { + border-radius: 50%; +} + +img.small { + border-radius: 50%; + height: 100px; + width: 100px; + border: 1px solid black; +} + +body { + width: 100vw; + height: 100vh; + margin: auto; + background: #ffffff; + color: #000000; + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + font-size: 13pt; + text-align: center; +} + +.button { + border: 2px solid #f1c40f; + border-radius: 1em; + background: transparent; + color: #000000; + box-shadow: 0 5px 15px 5px grey; +} + +.button:active { + box-shadow: 0 5px 15px 1px lightgrey; +} + +.button:focus { + outline: none; +} + +.stimulus { + width: 400px; + height: 100px; + position: absolute; + left: 50%; + top: 50%; + margin-top: -150px; + margin-left: -200px; + text-align: center; + color: #424242; + font-size: 70pt; + line-height: 70%; + font-family: 'Inconsolata', monospace !important; + display: none; +} + +.responseButton { + -webkit-appearance: none; + background: #007bc7; + font-size: 40pt; + line-height: 2.5em; + width: 150px; + color: white; + border-radius: 2px; + box-shadow: 0px 1px 5px rgba(0, 0, 0, 0.14); + text-align: center; + font-family: + Palatino Linotype, + Bookman Antiqua, + Palatino, + serif; + -webkit-tap-highlight-color: transparent; + cursor: none; +} + +.responseIcon { + -webkit-appearance: none; + background: #e0e0e0; + border-radius: 50%; + width: 152px; + height: 152px; + border: 1px solid transparent; + -webkit-tap-highlight-color: transparent; + cursor: none; +} + +.responseHighlight { + box-shadow: inset 0px 0px 20px #c1c1c1; +} + +.responseIconHighlight { + border: 1px solid transparent; +} + +.responseIconHighlightPractice { + background: rgba(255, 255, 255, 0.3); + border: 1px solid #505050; + /*box-shadow: inset 0px 0px 20px #cdcdcd;*/ +} + +#leftButton { + position: absolute; + left: 50%; + top: 50%; + margin-left: -260px; + display: none; +} + +#rightButton { + position: absolute; + left: 50%; + top: 50%; + margin-left: 110px; + display: none; +} + +.blink { + animation: blink 1s steps(1, end) infinite; +} + +@keyframes blink { + 0% { + opacity: 1; + } + 75% { + opacity: 0; + } + 100% { + opacity: 1; + } +} diff --git a/lib/interactive/TMB_FLANKER_ATTENTION/translator.ts b/lib/interactive/TMB_FLANKER_ATTENTION/translator.ts new file mode 100644 index 0000000..d9c0803 --- /dev/null +++ b/lib/interactive/TMB_FLANKER_ATTENTION/translator.ts @@ -0,0 +1,182 @@ +import { Translator } from '/runtime/v1/@opendatacapture/runtime-core'; + +export const translator = new Translator({ + translations: { + buttons: { + clickContinue: { + en: 'Click here to continue', + fr: 'Cliquez ici pour continuer' + }, + clickInstructions: { + en: 'Click here for instructions', + fr: 'Cliquez ici pour les instructions' + }, + clickRetry: { + en: 'Click here to retry', + fr: 'Cliquez ici pour réessayer' + }, + spaceContinue: { + en: 'Press the SPACEBAR to continue', + fr: "Appuyez sur la BARRE D'ESPACE pour continuer" + }, + spaceInstructions: { + en: 'Press the SPACEBAR for instructions', + fr: "Appuyez sur la BARRE D'ESPACE pour les instructions" + }, + spaceRetry: { + en: 'Press the SPACEBAR to retry', + fr: "Appuyez sur la BARRE D'ESPACE pour réessayer" + } + }, + feedback: { + middleRight: { + en: 'The arrow in the middle was pointing right:', + fr: 'La flèche du milieu pointait vers la droite :' + }, + middleLeft: { + en: 'The arrow in the middle was pointing left:', + fr: 'La flèche du milieu pointait vers la gauche :' + }, + shouldClickRight: { + en: 'you should have clicked the right button.', + fr: 'vous auriez dû cliquer sur le bouton de droite.' + }, + shouldClickLeft: { + en: 'you should have clicked the left button.', + fr: 'vous auriez dû cliquer sur le bouton de gauche.' + }, + shouldPress: { + en: "you should have pressed the '{key}' keyboard key.", + fr: "vous auriez dû appuyer sur la touche '{key}' du clavier." + } + }, + timeout: { + tooLong: { + en: 'You took too long to respond.', + fr: 'Vous avez mis trop de temps à répondre.' + }, + tryQuicker: { + en: 'Try to be quicker', + fr: "Essayez d'être plus rapide" + }, + atClicking: { + en: 'at clicking the response buttons.', + fr: 'à cliquer sur les boutons de réponse.' + }, + atPressing: { + en: "at pressing the '{leftKey}' or '{rightKey}' keyboard key.", + fr: "à appuyer sur la touche '{leftKey}' ou '{rightKey}' du clavier." + } + }, + speedAccuracy: { + quickly: { + en: 'You should try to respond
    as QUICKLY as possible while still being accurate.

    ', + fr: 'Vous devriez essayer de répondre
    le plus RAPIDEMENT possible tout en restant précis.

    ' + }, + accurately: { + en: 'You should try to respond
    as ACCURATELY as possible while still being fast.

    ', + fr: 'Vous devriez essayer de répondre
    le plus PRÉCISÉMENT possible tout en restant rapide.

    ' + }, + both: { + en: 'You should try to respond
    as quickly and accurately as possible.

    ', + fr: 'Vous devriez essayer de répondre
    aussi rapidement et précisément que possible.

    ' + } + }, + instructions: { + title: { + en: 'TMB Flanker Attention', + fr: 'TMB Attention Flanker' + }, + heading: { + en: 'Instructions', + fr: 'Instructions' + }, + youWillSee: { + en: 'You will see 5 arrows:', + fr: 'Vous verrez 5 flèches :' + }, + payAttention: { + en: 'Pay attention to the arrow in the middle
    and ignore the arrows on the sides.', + fr: 'Concentrez-vous sur la flèche du milieu
    et ignorez les flèches sur les côtés.' + }, + whenRightTaps: { + en: 'When the arrow in the middle points
    to the right, tap the right button
    with your right hand.', + fr: 'Lorsque la flèche du milieu pointe
    vers la droite, touchez le bouton de droite
    avec votre main droite.' + }, + whenRightKeys: { + en: "When the arrow in the middle points
    to the right, press the '{key}' keyboard key
    with your right hand.", + fr: "Lorsque la flèche du milieu pointe
    vers la droite, appuyez sur la touche '{key}'
    avec votre main droite." + }, + whenLeftTaps: { + en: 'When the arrow in the middle points
    to the left, tap the left button
    with your left hand.', + fr: 'Lorsque la flèche du milieu pointe
    vers la gauche, touchez le bouton de gauche
    avec votre main gauche.' + }, + whenLeftKeys: { + en: "When the arrow in the middle points
    to the left, press the '{key}' keyboard key
    with your left hand.", + fr: "Lorsque la flèche du milieu pointe
    vers la gauche, appuyez sur la touche '{key}'
    avec votre main gauche." + }, + letsPractice: { + en: "Let's do some practice.", + fr: "Faisons quelques essais d'entraînement." + }, + wellDone: { + en: 'Well done!', + fr: 'Bien joué !' + }, + noticedPlus: { + en: 'You probably noticed the "+" sign.', + fr: 'Vous avez probablement remarqué le signe « + ».' + }, + usePlus: { + en: 'You can use the "+" sign to help
    you focus for the next arrow.', + fr: 'Vous pouvez utiliser le signe « + » pour
    vous aider à vous concentrer sur la prochaine flèche.' + }, + morePractice: { + en: "Let's do some more practice.", + fr: "Faisons encore quelques essais d'entraînement." + }, + fasterNow: { + en: 'Now the sequence will be faster.', + fr: 'La séquence sera maintenant plus rapide.' + } + }, + test: { + excellent: { + en: 'Excellent!', + fr: 'Excellent !' + }, + nowReal: { + en: 'Now comes the real test.', + fr: 'Voici maintenant le vrai test.' + }, + threeParts: { + en: 'This test has three parts.
    Each part has 32 sets of arrows.', + fr: 'Ce test comporte trois parties.
    Chaque partie comprend 32 séries de flèches.' + }, + respondQuickly: { + en: 'Respond as quickly and accurately as you can.', + fr: 'Répondez aussi rapidement et précisément que possible.' + }, + greatJob: { + en: 'Great job!', + fr: 'Excellent travail !' + }, + completedFirst: { + en: 'You just completed the first part of this test.
    There are two more parts.', + fr: 'Vous venez de terminer la première partie de ce test.
    Il reste deux parties.' + }, + letsDoMore: { + en: "Let's do more!", + fr: 'Continuons !' + }, + niceGoing: { + en: 'Nice going!', + fr: 'Bravo !' + }, + oneMore: { + en: 'One more part and you are done!', + fr: 'Encore une partie et vous aurez terminé !' + } + } + } +}); diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst0.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst0_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_Inst0.webp rename to lib/interactive/TMB_LN_SWITCHING/_Inst0_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst0_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst0_fr.webp new file mode 100644 index 0000000..d7e8616 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_Inst0_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst2.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst2_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_Inst2.webp rename to lib/interactive/TMB_LN_SWITCHING/_Inst2_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst2_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst2_fr.webp new file mode 100644 index 0000000..55b73c9 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_Inst2_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst3.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst3_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_Inst3.webp rename to lib/interactive/TMB_LN_SWITCHING/_Inst3_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst3_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst3_fr.webp new file mode 100644 index 0000000..eac965f Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_Inst3_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst4.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst4_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_Inst4.webp rename to lib/interactive/TMB_LN_SWITCHING/_Inst4_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_Inst4_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_Inst4_fr.webp new file mode 100644 index 0000000..ca665d5 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_Inst4_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_letterInst_click.webp b/lib/interactive/TMB_LN_SWITCHING/_letterInst_click_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_letterInst_click.webp rename to lib/interactive/TMB_LN_SWITCHING/_letterInst_click_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_letterInst_click_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_letterInst_click_fr.webp new file mode 100644 index 0000000..8d18f40 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_letterInst_click_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_letterInst.webp b/lib/interactive/TMB_LN_SWITCHING/_letterInst_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_letterInst.webp rename to lib/interactive/TMB_LN_SWITCHING/_letterInst_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_letterInst_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_letterInst_fr.webp new file mode 100644 index 0000000..6c616b0 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_letterInst_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_numberInst_click.webp b/lib/interactive/TMB_LN_SWITCHING/_numberInst_click_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_numberInst_click.webp rename to lib/interactive/TMB_LN_SWITCHING/_numberInst_click_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_numberInst_click_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_numberInst_click_fr.webp new file mode 100644 index 0000000..e940e7a Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_numberInst_click_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/_numberInst.webp b/lib/interactive/TMB_LN_SWITCHING/_numberInst_en.webp similarity index 100% rename from lib/interactive/TMB_LN_SWITCHING/_numberInst.webp rename to lib/interactive/TMB_LN_SWITCHING/_numberInst_en.webp diff --git a/lib/interactive/TMB_LN_SWITCHING/_numberInst_fr.webp b/lib/interactive/TMB_LN_SWITCHING/_numberInst_fr.webp new file mode 100644 index 0000000..d7e8616 Binary files /dev/null and b/lib/interactive/TMB_LN_SWITCHING/_numberInst_fr.webp differ diff --git a/lib/interactive/TMB_LN_SWITCHING/index.ts b/lib/interactive/TMB_LN_SWITCHING/index.ts index f6c4130..c9f7ced 100644 --- a/lib/interactive/TMB_LN_SWITCHING/index.ts +++ b/lib/interactive/TMB_LN_SWITCHING/index.ts @@ -2,15 +2,23 @@ import { defineInstrument } from '/runtime/v1/@opendatacapture/runtime-core'; import { z } from '/runtime/v1/zod@3.x/v4'; import fingerImg from './_finger.webp'; -import inst0Img from './_Inst0.webp'; +import inst0EnImg from './_Inst0_en.webp'; +import inst0FrImg from './_Inst0_fr.webp'; import inst1Img from './_Inst1.webp'; -import inst2Img from './_Inst2.webp'; -import inst3Img from './_Inst3.webp'; -import inst4Img from './_Inst4.webp'; -import letterInstImg from './_letterInst.webp'; -import letterInstClickImg from './_letterInst_click.webp'; -import numberInstImg from './_numberInst.webp'; -import numberInstClickImg from './_numberInst_click.webp'; +import inst2EnImg from './_Inst2_en.webp'; +import inst2FrImg from './_Inst2_fr.webp'; +import inst3EnImg from './_Inst3_en.webp'; +import inst3FrImg from './_Inst3_fr.webp'; +import inst4EnImg from './_Inst4_en.webp'; +import inst4FrImg from './_Inst4_fr.webp'; +import letterInstClickEnImg from './_letterInst_click_en.webp'; +import letterInstClickFrImg from './_letterInst_click_fr.webp'; +import letterInstEnImg from './_letterInst_en.webp'; +import letterInstFrImg from './_letterInst_fr.webp'; +import numberInstClickEnImg from './_numberInst_click_en.webp'; +import numberInstClickFrImg from './_numberInst_click_fr.webp'; +import numberInstEnImg from './_numberInst_en.webp'; +import numberInstFrImg from './_numberInst_fr.webp'; import html from './fragment.html'; import { render } from './render.js'; @@ -19,16 +27,24 @@ import './TestHelper.v1.May23.js?legacy'; import './styles.css'; const staticAssets = { - '/images/Inst0.jpg': inst0Img, '/images/Inst1.jpg': inst1Img, - '/images/Inst2.jpg': inst2Img, - '/images/Inst3.jpg': inst3Img, - '/images/Inst4.jpg': inst4Img, '/images/finger.png': fingerImg, - '/images/numberInst.jpg': numberInstImg, - '/images/numberInst_click.jpg': numberInstClickImg, - '/images/letterInst.jpg': letterInstImg, - '/images/letterInst_click.jpg': letterInstClickImg + '/images/Inst0_en.jpg': inst0EnImg, + '/images/Inst0_fr.jpg': inst0FrImg, + '/images/Inst2_en.jpg': inst2EnImg, + '/images/Inst2_fr.jpg': inst2FrImg, + '/images/Inst3_en.jpg': inst3EnImg, + '/images/Inst3_fr.jpg': inst3FrImg, + '/images/Inst4_en.jpg': inst4EnImg, + '/images/Inst4_fr.jpg': inst4FrImg, + '/images/numberInst_en.jpg': numberInstEnImg, + '/images/numberInst_fr.jpg': numberInstFrImg, + '/images/numberInst_click_en.jpg': numberInstClickEnImg, + '/images/numberInst_click_fr.jpg': numberInstClickFrImg, + '/images/letterInst_en.jpg': letterInstEnImg, + '/images/letterInst_fr.jpg': letterInstFrImg, + '/images/letterInst_click_en.jpg': letterInstClickEnImg, + '/images/letterInst_click_fr.jpg': letterInstClickFrImg }; export default defineInstrument({ @@ -57,6 +73,7 @@ export default defineInstrument({ html, render, staticAssets, + defaultFullscreen: true, enableLanguageLock: true, enableLanguageSelect: true }, diff --git a/lib/interactive/TMB_LN_SWITCHING/render.js b/lib/interactive/TMB_LN_SWITCHING/render.js index 582a4a4..e0a7adf 100644 --- a/lib/interactive/TMB_LN_SWITCHING/render.js +++ b/lib/interactive/TMB_LN_SWITCHING/render.js @@ -6,6 +6,9 @@ import { translator } from './translator.ts'; export function render(onComplete) { translator.init(); + // language suffix for instruction images ('_en' or '_fr') + var imgLang = translator.resolvedLanguage === 'fr' ? 'fr' : 'en'; + function tFormat(key, vars) { var s = translator.t(key); if (vars) { @@ -261,26 +264,40 @@ export function render(onComplete) { var TestMessage; var instructionsHeading = '

    ' + translator.t('instructions.heading') + '

    '; TestMessage = { - begin: '

    ' + translator.t('instructions.title') + '

    ' + "Title

    ", + begin: + '

    ' + + translator.t('instructions.title') + + '

    ' + + "Title

    ", instructions: [ instructionsHeading + "Instructions

    " + translator.t('instructions.step1') + '

    ', instructionsHeading + - "Instructions

    " + + "Instructions

    " + translator.t('instructions.step2') + '

    ', instructionsHeading + - "Instructions

    " + + "Instructions

    " + translator.t('instructions.step3') + '

    ', instructionsHeading + - "Instructions

    " + + "Instructions

    " + translator.t('instructions.step4') + '

    ', instructionsHeading + - "Instructions

    " + + "Instructions

    " + translator.t('instructions.letsPractice') + '

    ', translator.t('instructions.excellent') + '

    ' @@ -637,11 +654,11 @@ export function render(onComplete) { tmbUI.UIelements = ['leftResponse', 'rightResponse']; tmbUI.highlight = 'responseHighlight'; - images[0] = 'images/Inst0.jpg'; + images[0] = 'images/Inst0_' + imgLang + '.jpg'; images[1] = 'images/Inst1.jpg'; - images[2] = 'images/Inst2.jpg'; - images[3] = 'images/Inst3.jpg'; - images[4] = 'images/Inst4.jpg'; + images[2] = 'images/Inst2_' + imgLang + '.jpg'; + images[3] = 'images/Inst3_' + imgLang + '.jpg'; + images[4] = 'images/Inst4_' + imgLang + '.jpg'; imagePreLoad(images, { pipeline: false, callBack: setFrameSequence }); })(); } diff --git a/lib/interactive/TMB_MATRIX_REASONING/index.ts b/lib/interactive/TMB_MATRIX_REASONING/index.ts index 4ddaa8d..cff7afe 100644 --- a/lib/interactive/TMB_MATRIX_REASONING/index.ts +++ b/lib/interactive/TMB_MATRIX_REASONING/index.ts @@ -515,6 +515,7 @@ export default defineInstrument({ name: 'TMB_MATRIX_REASONING' }, content: { + defaultFullscreen: true, meta: { charset: 'UTF-8', copyright: '2023 The Many Brains Project, Inc. and McLean Hospital LGPLv3', diff --git a/lib/interactive/TMB_MOT/index.ts b/lib/interactive/TMB_MOT/index.ts index c76eec4..aa9953a 100644 --- a/lib/interactive/TMB_MOT/index.ts +++ b/lib/interactive/TMB_MOT/index.ts @@ -47,6 +47,7 @@ export default defineInstrument({ render, html, staticAssets, + defaultFullscreen: true, enableLanguageLock: true, enableLanguageSelect: true }, diff --git a/lib/interactive/TMB_SIMPLE_RT/index.ts b/lib/interactive/TMB_SIMPLE_RT/index.ts index c400659..d2253e5 100644 --- a/lib/interactive/TMB_SIMPLE_RT/index.ts +++ b/lib/interactive/TMB_SIMPLE_RT/index.ts @@ -42,6 +42,8 @@ export default defineInstrument({ html, render, staticAssets, + defaultFullscreen: true, + enableLanguageLock: true, enableLanguageSelect: true }, clientDetails: { diff --git a/lib/interactive/TMB_VERBAL_PA_STUDY/TestMyBrain.12.18.min.js b/lib/interactive/TMB_VERBAL_PA_STUDY/TestMyBrain.12.18.min.js index 759b561..65398d9 100644 --- a/lib/interactive/TMB_VERBAL_PA_STUDY/TestMyBrain.12.18.min.js +++ b/lib/interactive/TMB_VERBAL_PA_STUDY/TestMyBrain.12.18.min.js @@ -54,7 +54,6 @@ function showFrame() { for ( tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; t--; - ) ((e = n.indexOf(tmbObjs.frames[t].id) > -1 ? 'block' : 'none'), tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); @@ -68,7 +67,6 @@ function showFrameClass() { for ( tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; t--; - ) ((e = n.indexOf(tmbObjs.frames[t].className) > -1 ? 'block' : 'none'), tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); @@ -515,7 +513,6 @@ function imagePreLoad(e, t) { (t.addEventListener('load', c, !0), t.addEventListener('error', c, !0), (t.id = e), (t.src = e)); }; l > 0; - ) (l--, d(n.shift())); } @@ -3360,7 +3357,6 @@ var saveTextAs = s = void 0 === a ? n : a >> 0, u = 0 > s ? Math.max(n + s, 0) : Math.min(s, n); u > i; - ) ((t[i] = e), i++); return t; @@ -3470,7 +3466,6 @@ var zen = tmbObjs, r = n.length, o = (window.console = window.console || {}); r--; - ) ((e = n[r]), o[e] || (o[e] = t)); })(), diff --git a/lib/interactive/TMB_VERBAL_PA_STUDY/index.ts b/lib/interactive/TMB_VERBAL_PA_STUDY/index.ts index 3acb195..aa181fb 100644 --- a/lib/interactive/TMB_VERBAL_PA_STUDY/index.ts +++ b/lib/interactive/TMB_VERBAL_PA_STUDY/index.ts @@ -107,16 +107,112 @@ blonde ocean woman potato `.trim(); +const easyFr = ` +* Version française de easy (STUDY) +* PROBE TARGET +insecte cognac +enfants boisson +brûleur diamant +seau image +maison oreiller +camion citron +bétail jardin +herbe paille +matin jupe +affiche fleur +bibliothèque diapositive +cour rivage +souris argent +essai fusée +mixeur tombe +ballon sauce +érable fromage +ordures port +bataille capsule +pédale collège +garde triangle +hôpital craie +liquide policier +humain montagne +tennis tamia +`.trim(); + +const hardFr = ` +* Version française de hard (STUDY) +* PROBE TARGET +disposition liberté +perception malice +aptitude dévotion +gloire suppression +gratitude distinction +fierté méthode +esprit attribut +âme confiance +attitude bravoure +facilité espoir +discipline folie +théorie passion +opinion chagrin +vanité essence +loyauté incitation +animosité savoir +jalousie intellect +reconnaissance ingratitude +immunité amour +intérêt embarras +plaisir bien-être +violation destin +hasard impulsion +satire nécessité +pensée sécurité +`.trim(); + +const defaultInputFr = ` +* Version française de l'entrée par défaut (STUDY) +* PROBE TARGET +officier bouilloire +animal verre +étudiant canapé +cocktail ciment +fruit coude +cheval chorale +piano morse +ail bulle +miroir portefeuille +invité pain +boisson lessive +bougie parapluie +plage moutarde +infirmière radio +orgue laitue +flamme mère +lapin arme +requin plancher +cuillère maladie +touriste journal +football dentiste +torche fermeture +colonne tulipe +blonde océan +femme patate +`.trim(); + const staticAssets = { '/VerbalPAstudyInput_25pairs_easy1.txt': `data:text/plain,${encodeURIComponent(easy)}`, '/VerbalPAstudyInput_25pairs_hard1.txt': `data:text/plain,${encodeURIComponent(hard)}`, - '/VerbalPAstudyInput.txt': `data:text/plain,${encodeURIComponent(defaultInput)}` + '/VerbalPAstudyInput.txt': `data:text/plain,${encodeURIComponent(defaultInput)}`, + '/VerbalPAstudyInput_25pairs_easy1_fr.txt': `data:text/plain,${encodeURIComponent(easyFr)}`, + '/VerbalPAstudyInput_25pairs_hard1_fr.txt': `data:text/plain,${encodeURIComponent(hardFr)}`, + '/VerbalPAstudyInput_fr.txt': `data:text/plain,${encodeURIComponent(defaultInputFr)}` }; export default defineInstrument({ kind: 'INTERACTIVE', - language: 'en', - tags: ['TestMyBrain'], + language: ['en', 'fr'], + tags: { + en: ['TestMyBrain'], + fr: ['TestMyBrain'] + }, internal: { edition: 1, name: 'TMB_VERBAL_PA_STUDY' @@ -135,16 +231,28 @@ export default defineInstrument({ }, render, html, - staticAssets + staticAssets, + defaultFullscreen: true, + enableLanguageLock: true, + enableLanguageSelect: true }, clientDetails: { estimatedDuration: 1, - instructions: ['Instructions will be presented on screen in the task.'] + instructions: { + en: ['Instructions will be presented on screen in the task.'], + fr: ["Les instructions seront présentées à l'écran pendant la tâche."] + } }, details: { - description: 'The encoding phase of a verbal memory test where participants learn word pairs for later recall.', + description: { + en: 'The encoding phase of a verbal memory test where participants learn word pairs for later recall.', + fr: 'La phase d’encodage d’un test de mémoire verbale où les participants apprennent des paires de mots en vue d’un rappel ultérieur.' + }, license: 'LGPL-3.0', - title: 'Verbal Paired Associates - Study' + title: { + en: 'Verbal Paired Associates - Study', + fr: 'Paires associées verbales — Étude' + } }, measures: {}, validationSchema: z.array( diff --git a/lib/interactive/TMB_VERBAL_PA_STUDY/render.js b/lib/interactive/TMB_VERBAL_PA_STUDY/render.js index 4cfccfb..b2209ad 100644 --- a/lib/interactive/TMB_VERBAL_PA_STUDY/render.js +++ b/lib/interactive/TMB_VERBAL_PA_STUDY/render.js @@ -1,7 +1,19 @@ // @ts-nocheck /* eslint-disable */ +import { translator } from './translator.ts'; + export function render(done) { + translator.init(); + + function tFormat(key, vars) { + var s = translator.t(key); + if (vars) { + for (var k in vars) s = s.replace(new RegExp('\\{' + k + '\\}', 'g'), vars[k]); + } + return s; + } + var wordPairs = []; // array of probe-target words var pairsCount = 0; // count of already seen word pairs var studyTime = 3000; // probe-target study time @@ -25,7 +37,7 @@ export function render(done) { if (frame.type === 'begin') showAlert( frame.message, - 'Click here for instructions', + translator.t('buttons.clickInstructions'), function () { showFrame('null'); nextTrial(); @@ -36,7 +48,7 @@ export function render(done) { else if (frame.type === 'message') showAlert( frame.message, - 'Click here to continue', + translator.t('buttons.clickContinue'), function () { showFrame('null'); nextTrial(); @@ -55,7 +67,8 @@ export function render(done) { chainTimeouts( function () { pairsCount++; - getID('counter').innerHTML = '' + pairsCount + ' of ' + wordPairs.length + ''; + getID('counter').innerHTML = + '' + pairsCount + ' ' + translator.t('counter.of') + ' ' + wordPairs.length + ''; showFrame('counter'); }, ISI, @@ -86,16 +99,20 @@ export function render(done) { // messages testMessage = { - begin: '

    Remembering Words

    ' + 'SKY - GREEN

    ', + begin: '

    ' + translator.t('study.beginTitle') + '

    ' + translator.t('study.examplePair') + '

    ', instructions: - '

    Instructions:

    ' + - 'SKY - GREEN

    ' + - 'You will see ' + - wordPairs.length + - ' word pairs, like above.
    ' + - 'Learn which words go together.
    ' + - 'Later you will be tested on that!

    ', - end: 'You will be tested on these word pairs shortly.
    ' + "But first, let's do some other tests!

    " + '

    ' + + translator.t('study.instructionsHeading') + + '

    ' + + translator.t('study.examplePair') + + '

    ' + + tFormat('study.youWillSee', { count: wordPairs.length }) + + '
    ' + + translator.t('study.learnTogether') + + '
    ' + + translator.t('study.laterTested') + + '

    ', + end: translator.t('study.end') + '

    ' }; // type of frame to display @@ -239,6 +256,11 @@ export function render(done) { disableDrag(); disableDoubleTapZoom(); + // when French is selected, load the French word-pair list + if (translator.resolvedLanguage === 'fr') { + inputFile = inputFile.replace(/\.txt$/, '_fr.txt'); + } + // read the input file and call the parser ajaxRequest({ url: inputFile, async: true, callback: parseFile }); })(); diff --git a/lib/interactive/TMB_VERBAL_PA_STUDY/translator.ts b/lib/interactive/TMB_VERBAL_PA_STUDY/translator.ts new file mode 100644 index 0000000..7e6701e --- /dev/null +++ b/lib/interactive/TMB_VERBAL_PA_STUDY/translator.ts @@ -0,0 +1,52 @@ +import { Translator } from '/runtime/v1/@opendatacapture/runtime-core'; + +export const translator = new Translator({ + translations: { + buttons: { + clickContinue: { + en: 'Click here to continue', + fr: 'Cliquez ici pour continuer' + }, + clickInstructions: { + en: 'Click here for instructions', + fr: 'Cliquez ici pour les instructions' + } + }, + counter: { + of: { + en: 'of', + fr: 'sur' + } + }, + study: { + beginTitle: { + en: 'Remembering Words', + fr: 'Se souvenir des mots' + }, + examplePair: { + en: 'SKY - GREEN', + fr: 'CIEL - VERT' + }, + instructionsHeading: { + en: 'Instructions:', + fr: 'Instructions :' + }, + youWillSee: { + en: 'You will see {count} word pairs, like above.', + fr: 'Vous verrez {count} paires de mots, comme ci-dessus.' + }, + learnTogether: { + en: 'Learn which words go together.', + fr: 'Apprenez quels mots vont ensemble.' + }, + laterTested: { + en: 'Later you will be tested on that!', + fr: 'Vous serez testé(e) là-dessus plus tard !' + }, + end: { + en: "You will be tested on these word pairs shortly.
    But first, let's do some other tests!", + fr: 'Vous serez testé(e) sur ces paires de mots bientôt.
    Mais d’abord, faisons d’autres tests !' + } + } + } +}); diff --git a/lib/interactive/TMB_VERBAL_PA_TEST/TestMyBrain.12.18.min.js b/lib/interactive/TMB_VERBAL_PA_TEST/TestMyBrain.12.18.min.js index 759b561..65398d9 100644 --- a/lib/interactive/TMB_VERBAL_PA_TEST/TestMyBrain.12.18.min.js +++ b/lib/interactive/TMB_VERBAL_PA_TEST/TestMyBrain.12.18.min.js @@ -54,7 +54,6 @@ function showFrame() { for ( tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; t--; - ) ((e = n.indexOf(tmbObjs.frames[t].id) > -1 ? 'block' : 'none'), tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); @@ -68,7 +67,6 @@ function showFrameClass() { for ( tmbObjs.frames.length || (tmbObjs.frames = document.getElementsByTagName('div')), t = tmbObjs.frames.length; t--; - ) ((e = n.indexOf(tmbObjs.frames[t].className) > -1 ? 'block' : 'none'), tmbObjs.frames[t].style.display !== e && (tmbObjs.frames[t].style.display = e)); @@ -515,7 +513,6 @@ function imagePreLoad(e, t) { (t.addEventListener('load', c, !0), t.addEventListener('error', c, !0), (t.id = e), (t.src = e)); }; l > 0; - ) (l--, d(n.shift())); } @@ -3360,7 +3357,6 @@ var saveTextAs = s = void 0 === a ? n : a >> 0, u = 0 > s ? Math.max(n + s, 0) : Math.min(s, n); u > i; - ) ((t[i] = e), i++); return t; @@ -3470,7 +3466,6 @@ var zen = tmbObjs, r = n.length, o = (window.console = window.console || {}); r--; - ) ((e = n[r]), o[e] || (o[e] = t)); })(), diff --git a/lib/interactive/TMB_VERBAL_PA_TEST/index.ts b/lib/interactive/TMB_VERBAL_PA_TEST/index.ts index ee52018..7f61d05 100644 --- a/lib/interactive/TMB_VERBAL_PA_TEST/index.ts +++ b/lib/interactive/TMB_VERBAL_PA_TEST/index.ts @@ -107,16 +107,112 @@ mirror wallet cement wallet movie cousin fruit elbow mustard paint elbow material `.trim(); +const easyFr = ` +* Version française de easy (TEST) +* PROBE TARGET CHOICE-1 CHOICE-2 CHOICE-3 CHOICE-4 +érable fromage pomme quart citron fromage +bibliothèque diapositive graphique médicament fleur diapositive +seau image givre image aimant triangle +bataille capsule asperge concombre capsule collège +mixeur tombe tombe diapositive aimant arbitre +insecte cognac produit oreiller musicien cognac +humain montagne paille montagne auteur asperge +essai fusée fusée coton brosse image +garde triangle triangle cognac téléphone mari +matin jupe tamia coquille jupe soldat +herbe paille pelle reine sauce paille +hôpital craie mari médicament craie rivage +ordures port craie port plafond pomme +tennis tamia oignon tamia brosse fusée +brûleur diamant diamant produit arbitre fromage +liquide policier musicien policier oignon montagne +bétail jardin port jardin graphique public +pédale collège boisson reine coton collège +cour rivage téléphone soleil argent rivage +enfants boisson boisson capsule plafond nuage +ballon sauce jardin plafond sauce soldat +camion citron givre diamant citron pelle +souris argent policier soleil argent public +affiche fleur jupe fleur auteur coquille +maison oreiller oreiller concombre quart tombe +`.trim(); + +const hardFr = ` +* Version française de hard (TEST) +* PROBE TARGET CHOICE-1 CHOICE-2 CHOICE-3 CHOICE-4 +hasard impulsion essence intellect distinction impulsion +animosité savoir intellect malice savoir suppression +aptitude dévotion suppression sécurité espoir dévotion +attitude bravoure chagrin confiance bravoure malice +violation destin destin bravoure savoir bien-être +opinion chagrin liberté chagrin sécurité embarras +intérêt embarras embarras suppression folie nécessité +facilité espoir passion incitation espoir bien-être +gratitude distinction dévotion nécessité distinction savoir +satire nécessité nécessité essence sécurité méthode +esprit attribut amour attribut dévotion destin +loyauté incitation incitation destin embarras essence +disposition liberté attribut malice liberté passion +perception malice confiance malice ingratitude distinction +âme confiance savoir confiance impulsion amour +immunité amour ingratitude liberté destin amour +jalousie intellect amour incitation intellect folie +pensée sécurité sécurité nécessité attribut méthode +reconnaissance ingratitude passion espoir intellect ingratitude +vanité essence embarras attribut folie essence +discipline folie chagrin liberté ingratitude folie +fierté méthode bien-être incitation bravoure méthode +gloire suppression suppression impulsion distinction bravoure +plaisir bien-être méthode bien-être confiance chagrin +théorie passion impulsion passion distinction dévotion +`.trim(); + +const defaultInputFr = ` +* Version française de l'entrée par défaut (TEST) +* PROBE TARGET CHOICE-1 CHOICE-2 CHOICE-3 CHOICE-4 +femme patate patate pain araignée placard +étudiant canapé lac bouilloire forêt canapé +boisson lessive verre peinture détective lessive +invité pain coude limonade pain famille +blonde océan océan placard dentiste lac +football dentiste avocat arme fenêtre dentiste +cocktail ciment plancher ciment église famille +officier bouilloire laitue dollar docteur bouilloire +plage moutarde tunnel billet bulle moutarde +piano morse forêt radio morse billet +orgue laitue singe film canapé laitue +bougie parapluie mère enveloppe sauce parapluie +cuillère maladie sauce patate tunnel maladie +cheval chorale océan chorale église enveloppe +torche fermeture maladie robe fermeture tissu +ail bulle bulle journal docteur dollar +touriste journal fenêtre banane journal chorale +infirmière radio araignée radio limonade parapluie +colonne tulipe portefeuille robe tulipe casque +flamme mère mère cousin détective fermeture +animal verre verre singe morse banane +lapin arme caoutchouc lessive laitue arme +requin plancher plancher avocat tulipe casque +miroir portefeuille ciment portefeuille film cousin +fruit coude moutarde peinture coude tissu +`.trim(); + const staticAssets = { '/VerbalPAtestInput_25pairs_easy1.txt': `data:text/plain,${encodeURIComponent(easy)}`, '/VerbalPAtestInput_25pairs_hard1.txt': `data:text/plain,${encodeURIComponent(hard)}`, - '/VerbalPAtestInput.txt': `data:text/plain,${encodeURIComponent(defaultInput)}` + '/VerbalPAtestInput.txt': `data:text/plain,${encodeURIComponent(defaultInput)}`, + '/VerbalPAtestInput_25pairs_easy1_fr.txt': `data:text/plain,${encodeURIComponent(easyFr)}`, + '/VerbalPAtestInput_25pairs_hard1_fr.txt': `data:text/plain,${encodeURIComponent(hardFr)}`, + '/VerbalPAtestInput_fr.txt': `data:text/plain,${encodeURIComponent(defaultInputFr)}` }; export default defineInstrument({ kind: 'INTERACTIVE', - language: 'en', - tags: ['TestMyBrain'], + language: ['en', 'fr'], + tags: { + en: ['TestMyBrain'], + fr: ['TestMyBrain'] + }, internal: { edition: 1, name: 'TMB_VERBAL_PA_TEST' @@ -135,16 +231,28 @@ export default defineInstrument({ }, render, html, - staticAssets + staticAssets, + defaultFullscreen: true, + enableLanguageLock: true, + enableLanguageSelect: true }, clientDetails: { estimatedDuration: 1, - instructions: ['Instructions will be presented on screen in the task.'] + instructions: { + en: ['Instructions will be presented on screen in the task.'], + fr: ["Les instructions seront présentées à l'écran pendant la tâche."] + } }, details: { - description: 'The recall phase of a verbal memory test where participants retrieve previously learned word pairs.', + description: { + en: 'The recall phase of a verbal memory test where participants retrieve previously learned word pairs.', + fr: 'La phase de rappel d’un test de mémoire verbale où les participants récupèrent des paires de mots apprises précédemment.' + }, license: 'LGPL-3.0', - title: 'Verbal Paired Associates - Test' + title: { + en: 'Verbal Paired Associates - Test', + fr: 'Paires associées verbales — Test' + } }, measures: {}, validationSchema: z.object({ diff --git a/lib/interactive/TMB_VERBAL_PA_TEST/render.js b/lib/interactive/TMB_VERBAL_PA_TEST/render.js index 670fba2..b6e8663 100644 --- a/lib/interactive/TMB_VERBAL_PA_TEST/render.js +++ b/lib/interactive/TMB_VERBAL_PA_TEST/render.js @@ -1,7 +1,19 @@ // @ts-nocheck /* eslint-disable */ +import { translator } from './translator.ts'; + export function render(done) { + translator.init(); + + function tFormat(key, vars) { + var s = translator.t(key); + if (vars) { + for (var k in vars) s = s.replace(new RegExp('\\{' + k + '\\}', 'g'), vars[k]); + } + return s; + } + var testVersion; // version identifier for this test var wordPairs = []; // array of probe-target words var pairsCount = 0; // count of already seen word pairs @@ -71,16 +83,17 @@ export function render(done) { repeated = 1; showAlert( - 'The word pair you learned was:
    ' + + translator.t('feedback.pairYouLearned') + + '
    ' + "'" + frame.probe + ' - ' + frame.target + "'
    " + - "
    You should click '" + - frame.target + - "'.

    ", - 'Click here to retry', + '
    ' + + tFormat('feedback.clickTarget', { target: frame.target }) + + '

    ', + translator.t('buttons.clickRetry'), function () { showFrame('null'); nextTrial(); @@ -107,12 +120,11 @@ export function render(done) { repeated = 1; showAlert( - 'You are taking too long to respond.

    ' + - 'You should click the word
    ' + - "that goes with '" + - frame.probe + - "'.

    ", - 'Click here to retry', + translator.t('feedback.takingTooLong') + + '

    ' + + tFormat('feedback.clickGoesWith', { probe: frame.probe }) + + '

    ', + translator.t('buttons.clickRetry'), function () { showFrame('null'); nextTrial(); @@ -140,7 +152,7 @@ export function render(done) { if (frame.type === 'begin') showAlert( frame.message, - 'Click here for instructions', + translator.t('buttons.clickInstructions'), function () { showFrame('null'); nextTrial(); @@ -151,7 +163,7 @@ export function render(done) { else if (frame.type === 'message') showAlert( frame.message, - 'Click here to continue', + translator.t('buttons.clickContinue'), function () { showFrame('null'); nextTrial(); @@ -164,9 +176,10 @@ export function render(done) { function () { if (frame.type === 'test') { pairsCount++; - getID('counter').innerHTML = '' + pairsCount + ' of ' + wordPairs.length + ''; + getID('counter').innerHTML = + '' + pairsCount + ' ' + translator.t('counter.of') + ' ' + wordPairs.length + ''; } else { - getID('counter').innerHTML = 'Practice'; + getID('counter').innerHTML = '' + translator.t('counter.practice') + ''; } showFrame('counter'); }, @@ -258,22 +271,28 @@ export function render(done) { // messages testMessage = { - begin: '

    Remembering Words

    ' + 'SKY - GREEN

    ', + begin: '

    ' + translator.t('test.beginTitle') + '

    ' + translator.t('test.examplePair') + '

    ', instructions: [ - '

    Instructions:

    ' + - 'SKY - GREEN

    ' + - "Let's test your memory for the words
    " + - 'you learned a few minutes ago.

    ', - '

    Instructions:

    ' + - 'For practice, click the word
    ' + - 'that goes together with SKY.
    ' + - "(hint: it's GREEN!)

    ", - 'Excellent!

    ' + - 'You will be asked to recall all ' + - wordPairs.length + - ' pairs
    ' + - 'of words you saw previously.

    ' + - "Let's start!

    " + '

    ' + + translator.t('test.instructionsHeading') + + '

    ' + + translator.t('test.examplePair') + + '

    ' + + translator.t('test.testYourMemory') + + '

    ', + '

    ' + + translator.t('test.instructionsHeading') + + '

    ' + + translator.t('test.forPractice') + + '
    ' + + translator.t('test.hintGreen') + + '

    ', + translator.t('test.excellent') + + '

    ' + + tFormat('test.recallAll', { count: wordPairs.length }) + + '

    ' + + translator.t('test.letsStart') + + '

    ' ] }; @@ -289,13 +308,21 @@ export function render(done) { testMessage.instructions[2] ]; - // words to display - var frameProbe = ['', '', '', 'sky', '']; - var frameTarget = ['', '', '', 'green', '']; - var frameChoice1 = ['', '', '', 'pot', '']; - var frameChoice2 = ['', '', '', 'pan', '']; - var frameChoice3 = ['', '', '', 'green', '']; - var frameChoice4 = ['', '', '', 'dish', '']; + // words to display (practice pair is language-aware, matching the selected stimuli language) + var isFr = translator.resolvedLanguage === 'fr'; + var practiceProbe = isFr ? 'ciel' : 'sky'; + var practiceTarget = isFr ? 'vert' : 'green'; + var practiceChoice1 = isFr ? 'pot' : 'pot'; + var practiceChoice2 = isFr ? 'poêle' : 'pan'; + var practiceChoice3 = isFr ? 'vert' : 'green'; + var practiceChoice4 = isFr ? 'plat' : 'dish'; + + var frameProbe = ['', '', '', practiceProbe, '']; + var frameTarget = ['', '', '', practiceTarget, '']; + var frameChoice1 = ['', '', '', practiceChoice1, '']; + var frameChoice2 = ['', '', '', practiceChoice2, '']; + var frameChoice3 = ['', '', '', practiceChoice3, '']; + var frameChoice4 = ['', '', '', practiceChoice4, '']; // push all components into the frames chain for (i = 0; i < frameType.length; i++) { @@ -472,6 +499,11 @@ export function render(done) { disableDrag(); disableDoubleTapZoom(); + // when French is selected, load the French word-pair list + if (translator.resolvedLanguage === 'fr') { + inputFile = inputFile.replace(/\.txt$/, '_fr.txt'); + } + // read the input file and call the parser ajaxRequest({ url: inputFile, async: true, callback: parseFile }); })(); diff --git a/lib/interactive/TMB_VERBAL_PA_TEST/translator.ts b/lib/interactive/TMB_VERBAL_PA_TEST/translator.ts new file mode 100644 index 0000000..f2c166c --- /dev/null +++ b/lib/interactive/TMB_VERBAL_PA_TEST/translator.ts @@ -0,0 +1,86 @@ +import { Translator } from '/runtime/v1/@opendatacapture/runtime-core'; + +export const translator = new Translator({ + translations: { + buttons: { + clickContinue: { + en: 'Click here to continue', + fr: 'Cliquez ici pour continuer' + }, + clickInstructions: { + en: 'Click here for instructions', + fr: 'Cliquez ici pour les instructions' + }, + clickRetry: { + en: 'Click here to retry', + fr: 'Cliquez ici pour réessayer' + } + }, + counter: { + of: { + en: 'of', + fr: 'sur' + }, + practice: { + en: 'Practice', + fr: 'Entraînement' + } + }, + test: { + beginTitle: { + en: 'Remembering Words', + fr: 'Se souvenir des mots' + }, + examplePair: { + en: 'SKY - GREEN', + fr: 'CIEL - VERT' + }, + instructionsHeading: { + en: 'Instructions:', + fr: 'Instructions :' + }, + testYourMemory: { + en: "Let's test your memory for the words
    you learned a few minutes ago.", + fr: 'Testons votre mémoire des mots
    que vous avez appris il y a quelques minutes.' + }, + forPractice: { + en: 'For practice, click the word
    that goes together with SKY.', + fr: 'Pour vous entraîner, cliquez sur le mot
    qui va avec CIEL.' + }, + hintGreen: { + en: "(hint: it's GREEN!)", + fr: '(indice : c’est VERT !)' + }, + excellent: { + en: 'Excellent!', + fr: 'Excellent !' + }, + recallAll: { + en: 'You will be asked to recall all {count} pairs
    of words you saw previously.', + fr: 'On vous demandera de vous rappeler les {count} paires
    de mots vues précédemment.' + }, + letsStart: { + en: "Let's start!", + fr: 'Commençons !' + } + }, + feedback: { + pairYouLearned: { + en: 'The word pair you learned was:', + fr: 'La paire de mots que vous avez apprise était :' + }, + clickTarget: { + en: "You should click '{target}'.", + fr: 'Vous devez cliquer sur « {target} ».' + }, + takingTooLong: { + en: 'You are taking too long to respond.', + fr: 'Vous mettez trop de temps à répondre.' + }, + clickGoesWith: { + en: "You should click the word
    that goes with '{probe}'.", + fr: 'Vous devez cliquer sur le mot
    qui va avec « {probe} ».' + } + } + } +}); diff --git a/lib/interactive/TMB_VISUAL_PA_STUDY/index.ts b/lib/interactive/TMB_VISUAL_PA_STUDY/index.ts index 4a62aa2..5c1ff36 100644 --- a/lib/interactive/TMB_VISUAL_PA_STUDY/index.ts +++ b/lib/interactive/TMB_VISUAL_PA_STUDY/index.ts @@ -339,6 +339,8 @@ export default defineInstrument({ '/images/underwater8.jpg': underwater8Img, '/VisualPAstudyInput.txt': `data:text/plain,${encodeURIComponent(studyInput)}` }, + defaultFullscreen: true, + enableLanguageLock: true, enableLanguageSelect: true }, clientDetails: { diff --git a/lib/interactive/TMB_VISUAL_PA_TEST/index.ts b/lib/interactive/TMB_VISUAL_PA_TEST/index.ts index afcce24..d5b32e1 100644 --- a/lib/interactive/TMB_VISUAL_PA_TEST/index.ts +++ b/lib/interactive/TMB_VISUAL_PA_TEST/index.ts @@ -339,6 +339,8 @@ export default defineInstrument({ '/images/underwater8.jpg': underwater8Img, '/VisualPAtestInput.txt': `data:text/plain,${encodeURIComponent(studyInput)}` }, + defaultFullscreen: true, + enableLanguageLock: true, enableLanguageSelect: true }, clientDetails: { diff --git a/package.json b/package.json index 64a78ce..a2149ea 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,14 @@ "prepare": "husky" }, "dependencies": { - "@opendatacapture/runtime-v1": "^1.16.4" + "@opendatacapture/runtime-v1": "^2.0.0" }, "devDependencies": { "@douglasneuroinformatics/eslint-config": "^6.0.0", "@douglasneuroinformatics/prettier-config": "^0.3.0", "@douglasneuroinformatics/tsconfig": "^2.0.0", - "@opendatacapture/instrument-guidelines": "^1.16.4", - "@opendatacapture/serve-instrument": "^1.16.4", + "@opendatacapture/instrument-guidelines": "^2.0.0", + "@opendatacapture/serve-instrument": "^2.0.0", "@types/node": "^22.x", "eslint": "^9.22.0", "husky": "^9.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 944e4ad..57f2134 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,8 +8,8 @@ importers: .: dependencies: '@opendatacapture/runtime-v1': - specifier: ^1.16.4 - version: 1.16.4 + specifier: ^2.0.0 + version: 2.0.0 devDependencies: '@douglasneuroinformatics/eslint-config': specifier: ^6.0.0 @@ -21,11 +21,11 @@ importers: specifier: ^2.0.0 version: 2.0.0(typescript@6.0.3) '@opendatacapture/instrument-guidelines': - specifier: ^1.16.4 - version: 1.16.4 + specifier: ^2.0.0 + version: 2.0.0 '@opendatacapture/serve-instrument': - specifier: ^1.16.4 - version: 1.16.4(@opendatacapture/runtime-v1@1.16.4) + specifier: ^2.0.0 + version: 2.0.0(@opendatacapture/runtime-v1@2.0.0) '@types/node': specifier: ^22.x version: 22.19.0 @@ -349,21 +349,21 @@ packages: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } engines: { node: '>= 8' } - '@opendatacapture/instrument-guidelines@1.16.4': + '@opendatacapture/instrument-guidelines@2.0.0': resolution: - { integrity: sha512-si0hUC+PF86bw66jtTuw/VubvOlujTg4DSFJGd1aQRmPr2Pqn4UebU1pBTECRSQT6GD1liUvoXcwjUBdqBkUrQ== } + { integrity: sha512-YkqIISuNHW3WOoA1Fqax5GUTg4imjhLlZvZkMaVj7ER88FATVmaCf1kYZKPVF0mdY3ty8XkOfjZJSI3BCbShPw== } hasBin: true - '@opendatacapture/runtime-v1@1.16.4': + '@opendatacapture/runtime-v1@2.0.0': resolution: - { integrity: sha512-uvpeQ8LUDIXDq+zi0YXqkTWjLHJoOQaiXwJ4piBHD2JjRr0bV+ASEfwHxoyNKPT0aqNPsKvl6HWgifCXs1R+fA== } + { integrity: sha512-A1H+3dSgGgoPJhhry853qHfXKX6RGDhs6Ev8ZcH16kUZwZmzJFmKteoB11/6OJRaSkdHeQ/H5NfRfsP1Mc6O4w== } - '@opendatacapture/serve-instrument@1.16.4': + '@opendatacapture/serve-instrument@2.0.0': resolution: - { integrity: sha512-hB9bLLVJ1yf18KVott4CUoZhkZGHQ5+RGtdmjwB3oMbN5jXaGNiOC+/LM1fZ6b/VMpdAhhweR6qZRJVM0uwo0Q== } + { integrity: sha512-fuxZryinbHOZwaFowi38mx3cWhmhrceSru0n3rbOC1hlcWGrbUZE4JHa6b1KATO4MuKE/yX5AIdszMwgoni5kQ== } hasBin: true peerDependencies: - '@opendatacapture/runtime-v1': 1.16.4 + '@opendatacapture/runtime-v1': 2.0.0 '@pkgr/core@0.2.9': resolution: @@ -2131,13 +2131,13 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@opendatacapture/instrument-guidelines@1.16.4': {} + '@opendatacapture/instrument-guidelines@2.0.0': {} - '@opendatacapture/runtime-v1@1.16.4': {} + '@opendatacapture/runtime-v1@2.0.0': {} - '@opendatacapture/serve-instrument@1.16.4(@opendatacapture/runtime-v1@1.16.4)': + '@opendatacapture/serve-instrument@2.0.0(@opendatacapture/runtime-v1@2.0.0)': dependencies: - '@opendatacapture/runtime-v1': 1.16.4 + '@opendatacapture/runtime-v1': 2.0.0 chalk: 5.6.2 commander: 12.1.0 esbuild: 0.23.1