ketcher-standalone
Version:
Web-based molecule sketcher
583 lines (513 loc) • 13.6 MB
JavaScript
/****************************************************************************
* Copyright 2021 EPAM Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
import _createClass from '@babel/runtime/helpers/createClass';
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _regeneratorRuntime from '@babel/runtime/regenerator';
import { pickStandardServerOptions, provideEditorInstance, getLabelRenderModeForIndigo, ChemicalMimeType } from 'ketcher-core';
var Command;
(function (Command) {
Command[Command["Info"] = 0] = "Info";
Command[Command["Convert"] = 1] = "Convert";
Command[Command["Layout"] = 2] = "Layout";
Command[Command["Clean"] = 3] = "Clean";
Command[Command["Aromatize"] = 4] = "Aromatize";
Command[Command["Dearomatize"] = 5] = "Dearomatize";
Command[Command["CalculateCip"] = 6] = "CalculateCip";
Command[Command["Automap"] = 7] = "Automap";
Command[Command["Check"] = 8] = "Check";
Command[Command["Calculate"] = 9] = "Calculate";
Command[Command["GenerateImageAsBase64"] = 10] = "GenerateImageAsBase64";
Command[Command["GetInChIKey"] = 11] = "GetInChIKey";
Command[Command["ExplicitHydrogens"] = 12] = "ExplicitHydrogens";
Command[Command["CalculateMacromoleculeProperties"] = 13] = "CalculateMacromoleculeProperties";
})(Command || (Command = {}));
var WorkerEvent;
(function (WorkerEvent) {
WorkerEvent["Info"] = "info";
WorkerEvent["Convert"] = "convert";
WorkerEvent["Layout"] = "layout";
WorkerEvent["Clean"] = "clean";
WorkerEvent["Aromatize"] = "aromatize";
WorkerEvent["Dearomatize"] = "dearomatize";
WorkerEvent["CalculateCip"] = "calculateCip";
WorkerEvent["Automap"] = "automap";
WorkerEvent["Check"] = "check";
WorkerEvent["Calculate"] = "calculate";
WorkerEvent["GenerateImageAsBase64"] = "generateImageAsBase64";
WorkerEvent["GetInChIKey"] = "getInChIKey";
WorkerEvent["ExplicitHydrogens"] = "convert_explicit_hydrogens";
WorkerEvent["CalculateMacromoleculeProperties"] = "calculateMacroProperties";
})(WorkerEvent || (WorkerEvent = {}));
var SupportedFormat;
(function (SupportedFormat) {
SupportedFormat["Rxn"] = "rxnfile";
SupportedFormat["Mol"] = "molfile";
SupportedFormat["Smiles"] = "smiles";
SupportedFormat["Smarts"] = "smarts";
SupportedFormat["CML"] = "cml";
SupportedFormat["InChI"] = "inchi";
SupportedFormat["InChIAuxInfo"] = "inchi-aux";
SupportedFormat["InChIKey"] = "inchi-key";
SupportedFormat["Ket"] = "ket";
SupportedFormat["CDX"] = "cdx";
SupportedFormat["CDXML"] = "cdxml";
SupportedFormat["SDF"] = "sdf";
SupportedFormat["FASTA"] = "fasta";
SupportedFormat["SEQUENCE"] = "sequence";
SupportedFormat["SEQUENCE_3_LETTER"] = "peptide-sequence-3-letter";
SupportedFormat["IDT"] = "idt";
SupportedFormat["AXOLABS"] = "axo-labs";
SupportedFormat["HELM"] = "helm";
SupportedFormat["BILN"] = "biln";
SupportedFormat["RDF"] = "rdf";
SupportedFormat["MonomerLibrary"] = "monomer-library";
})(SupportedFormat || (SupportedFormat = {}));
var domain;
// This constructor is used to store event handlers. Instantiating this is
// faster than explicitly calling `Object.create(null)` to get a "clean" empty
// object (tested with v8 v4.9).
function EventHandlers() {}
EventHandlers.prototype = Object.create(null);
function EventEmitter() {
EventEmitter.init.call(this);
}
// nodejs oddity
// require('events') === require('events').EventEmitter
EventEmitter.EventEmitter = EventEmitter;
EventEmitter.usingDomains = false;
EventEmitter.prototype.domain = undefined;
EventEmitter.prototype._events = undefined;
EventEmitter.prototype._maxListeners = undefined;
// By default EventEmitters will print a warning if more than 10 listeners are
// added to it. This is a useful default which helps finding memory leaks.
EventEmitter.defaultMaxListeners = 10;
EventEmitter.init = function() {
this.domain = null;
if (EventEmitter.usingDomains) {
// if there is an active domain, then attach to it.
if (domain.active ) ;
}
if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
this._events = new EventHandlers();
this._eventsCount = 0;
}
this._maxListeners = this._maxListeners || undefined;
};
// Obviously not all Emitters should be limited to 10. This function allows
// that to be increased. Set to zero for unlimited.
EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {
if (typeof n !== 'number' || n < 0 || isNaN(n))
throw new TypeError('"n" argument must be a positive number');
this._maxListeners = n;
return this;
};
function $getMaxListeners(that) {
if (that._maxListeners === undefined)
return EventEmitter.defaultMaxListeners;
return that._maxListeners;
}
EventEmitter.prototype.getMaxListeners = function getMaxListeners() {
return $getMaxListeners(this);
};
// These standalone emit* functions are used to optimize calling of event
// handlers for fast cases because emit() itself often has a variable number of
// arguments and can be deoptimized because of that. These functions always have
// the same number of arguments and thus do not get deoptimized, so the code
// inside them can execute faster.
function emitNone(handler, isFn, self) {
if (isFn)
handler.call(self);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self);
}
}
function emitOne(handler, isFn, self, arg1) {
if (isFn)
handler.call(self, arg1);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1);
}
}
function emitTwo(handler, isFn, self, arg1, arg2) {
if (isFn)
handler.call(self, arg1, arg2);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1, arg2);
}
}
function emitThree(handler, isFn, self, arg1, arg2, arg3) {
if (isFn)
handler.call(self, arg1, arg2, arg3);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].call(self, arg1, arg2, arg3);
}
}
function emitMany(handler, isFn, self, args) {
if (isFn)
handler.apply(self, args);
else {
var len = handler.length;
var listeners = arrayClone(handler, len);
for (var i = 0; i < len; ++i)
listeners[i].apply(self, args);
}
}
EventEmitter.prototype.emit = function emit(type) {
var er, handler, len, args, i, events, domain;
var doError = (type === 'error');
events = this._events;
if (events)
doError = (doError && events.error == null);
else if (!doError)
return false;
domain = this.domain;
// If there is no 'error' event listener then throw.
if (doError) {
er = arguments[1];
if (domain) {
if (!er)
er = new Error('Uncaught, unspecified "error" event');
er.domainEmitter = this;
er.domain = domain;
er.domainThrown = false;
domain.emit('error', er);
} else if (er instanceof Error) {
throw er; // Unhandled 'error' event
} else {
// At least give some kind of context to the user
var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
err.context = er;
throw err;
}
return false;
}
handler = events[type];
if (!handler)
return false;
var isFn = typeof handler === 'function';
len = arguments.length;
switch (len) {
// fast cases
case 1:
emitNone(handler, isFn, this);
break;
case 2:
emitOne(handler, isFn, this, arguments[1]);
break;
case 3:
emitTwo(handler, isFn, this, arguments[1], arguments[2]);
break;
case 4:
emitThree(handler, isFn, this, arguments[1], arguments[2], arguments[3]);
break;
// slower
default:
args = new Array(len - 1);
for (i = 1; i < len; i++)
args[i - 1] = arguments[i];
emitMany(handler, isFn, this, args);
}
return true;
};
function _addListener(target, type, listener, prepend) {
var m;
var events;
var existing;
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
events = target._events;
if (!events) {
events = target._events = new EventHandlers();
target._eventsCount = 0;
} else {
// To avoid recursion in the case that type === "newListener"! Before
// adding it to the listeners, first emit "newListener".
if (events.newListener) {
target.emit('newListener', type,
listener.listener ? listener.listener : listener);
// Re-assign `events` because a newListener handler could have caused the
// this._events to be assigned to a new object
events = target._events;
}
existing = events[type];
}
if (!existing) {
// Optimize the case of one listener. Don't need the extra array object.
existing = events[type] = listener;
++target._eventsCount;
} else {
if (typeof existing === 'function') {
// Adding the second element, need to change to array.
existing = events[type] = prepend ? [listener, existing] :
[existing, listener];
} else {
// If we've already got an array, just append.
if (prepend) {
existing.unshift(listener);
} else {
existing.push(listener);
}
}
// Check for listener leak
if (!existing.warned) {
m = $getMaxListeners(target);
if (m && m > 0 && existing.length > m) {
existing.warned = true;
var w = new Error('Possible EventEmitter memory leak detected. ' +
existing.length + ' ' + type + ' listeners added. ' +
'Use emitter.setMaxListeners() to increase limit');
w.name = 'MaxListenersExceededWarning';
w.emitter = target;
w.type = type;
w.count = existing.length;
emitWarning(w);
}
}
}
return target;
}
function emitWarning(e) {
typeof console.warn === 'function' ? console.warn(e) : console.log(e);
}
EventEmitter.prototype.addListener = function addListener(type, listener) {
return _addListener(this, type, listener, false);
};
EventEmitter.prototype.on = EventEmitter.prototype.addListener;
EventEmitter.prototype.prependListener =
function prependListener(type, listener) {
return _addListener(this, type, listener, true);
};
function _onceWrap(target, type, listener) {
var fired = false;
function g() {
target.removeListener(type, g);
if (!fired) {
fired = true;
listener.apply(target, arguments);
}
}
g.listener = listener;
return g;
}
EventEmitter.prototype.once = function once(type, listener) {
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
this.on(type, _onceWrap(this, type, listener));
return this;
};
EventEmitter.prototype.prependOnceListener =
function prependOnceListener(type, listener) {
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
this.prependListener(type, _onceWrap(this, type, listener));
return this;
};
// emits a 'removeListener' event iff the listener was removed
EventEmitter.prototype.removeListener =
function removeListener(type, listener) {
var list, events, position, i, originalListener;
if (typeof listener !== 'function')
throw new TypeError('"listener" argument must be a function');
events = this._events;
if (!events)
return this;
list = events[type];
if (!list)
return this;
if (list === listener || (list.listener && list.listener === listener)) {
if (--this._eventsCount === 0)
this._events = new EventHandlers();
else {
delete events[type];
if (events.removeListener)
this.emit('removeListener', type, list.listener || listener);
}
} else if (typeof list !== 'function') {
position = -1;
for (i = list.length; i-- > 0;) {
if (list[i] === listener ||
(list[i].listener && list[i].listener === listener)) {
originalListener = list[i].listener;
position = i;
break;
}
}
if (position < 0)
return this;
if (list.length === 1) {
list[0] = undefined;
if (--this._eventsCount === 0) {
this._events = new EventHandlers();
return this;
} else {
delete events[type];
}
} else {
spliceOne(list, position);
}
if (events.removeListener)
this.emit('removeListener', type, originalListener || listener);
}
return this;
};
EventEmitter.prototype.removeAllListeners =
function removeAllListeners(type) {
var listeners, events;
events = this._events;
if (!events)
return this;
// not listening for removeListener, no need to emit
if (!events.removeListener) {
if (arguments.length === 0) {
this._events = new EventHandlers();
this._eventsCount = 0;
} else if (events[type]) {
if (--this._eventsCount === 0)
this._events = new EventHandlers();
else
delete events[type];
}
return this;
}
// emit removeListener for all listeners on all events
if (arguments.length === 0) {
var keys = Object.keys(events);
for (var i = 0, key; i < keys.length; ++i) {
key = keys[i];
if (key === 'removeListener') continue;
this.removeAllListeners(key);
}
this.removeAllListeners('removeListener');
this._events = new EventHandlers();
this._eventsCount = 0;
return this;
}
listeners = events[type];
if (typeof listeners === 'function') {
this.removeListener(type, listeners);
} else if (listeners) {
// LIFO order
do {
this.removeListener(type, listeners[listeners.length - 1]);
} while (listeners[0]);
}
return this;
};
EventEmitter.prototype.listeners = function listeners(type) {
var evlistener;
var ret;
var events = this._events;
if (!events)
ret = [];
else {
evlistener = events[type];
if (!evlistener)
ret = [];
else if (typeof evlistener === 'function')
ret = [evlistener.listener || evlistener];
else
ret = unwrapListeners(evlistener);
}
return ret;
};
EventEmitter.listenerCount = function(emitter, type) {
if (typeof emitter.listenerCount === 'function') {
return emitter.listenerCount(type);
} else {
return listenerCount.call(emitter, type);
}
};
EventEmitter.prototype.listenerCount = listenerCount;
function listenerCount(type) {
var events = this._events;
if (events) {
var evlistener = events[type];
if (typeof evlistener === 'function') {
return 1;
} else if (evlistener) {
return evlistener.length;
}
}
return 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
return this._eventsCount > 0 ? Reflect.ownKeys(this._events) : [];
};
// About 1.5x faster than the two-arg version of Array#splice().
function spliceOne(list, index) {
for (var i = index, k = i + 1, n = list.length; k < n; i += 1, k += 1)
list[i] = list[k];
list.pop();
}
function arrayClone(arr, i) {
var copy = new Array(i);
while (i--)
copy[i] = arr[i];
return copy;
}
function unwrapListeners(arr) {
var ret = new Array(arr.length);
for (var i = 0; i < ret.length; ++i) {
ret[i] = arr[i].listener || arr[i];
}
return ret;
}
var STRUCT_SERVICE_NO_RENDER_INITIALIZED_EVENT = 'struct-service-no-render-initialized';
var STRUCT_SERVICE_INITIALIZED_EVENT = 'struct-service-initialized';
function decodeBase64(base64, enableUnicode) {
var binaryString = atob(base64);
if (enableUnicode) {
var binaryView = new Uint8Array(binaryString.length);
for (var i = 0, n = binaryString.length; i < n; ++i) {
binaryView[i] = binaryString.charCodeAt(i);
}
return String.fromCharCode.apply(null, new Uint16Array(binaryView.buffer));
}
return binaryString;
}
function createURL(base64, sourcemapArg, enableUnicodeArg) {
var sourcemap = sourcemapArg === undefined ? null : sourcemapArg;
var enableUnicode = enableUnicodeArg === undefined ? false : enableUnicodeArg;
var source = decodeBase64(base64, enableUnicode);
var start = source.indexOf('\n', 10) + 1;
var body = source.substring(start) + (sourcemap ? '\/\/# sourceMappingURL=' + sourcemap : '');
var blob = new Blob([body], { type: 'application/javascript' });
return URL.createObjectURL(blob);
}
function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
var url;
return function WorkerFactory(options) {
url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
return new Worker(url, options);
};
}
var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewoJJ3VzZSBzdHJpY3QnOwoKCWZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7CgkJcmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCAnZGVmYXVsdCcpID8geFsnZGVmYXVsdCddIDogeDsKCX0KCglmdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgYmFzZWRpciwgbW9kdWxlKSB7CgkJcmV0dXJuIG1vZHVsZSA9IHsKCQkJcGF0aDogYmFzZWRpciwKCQkJZXhwb3J0czoge30sCgkJCXJlcXVpcmU6IGZ1bmN0aW9uIChwYXRoLCBiYXNlKSB7CgkJCQlyZXR1cm4gY29tbW9uanNSZXF1aXJlKHBhdGgsIChiYXNlID09PSB1bmRlZmluZWQgfHwgYmFzZSA9PT0gbnVsbCkgPyBtb2R1bGUucGF0aCA6IGJhc2UpOwoJCQl9CgkJfSwgZm4obW9kdWxlLCBtb2R1bGUuZXhwb3J0cyksIG1vZHVsZS5leHBvcnRzOwoJfQoKCWZ1bmN0aW9uIGNvbW1vbmpzUmVxdWlyZSAoKSB7CgkJdGhyb3cgbmV3IEVycm9yKCdEeW5hbWljIHJlcXVpcmVzIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBAcm9sbHVwL3BsdWdpbi1jb21tb25qcycpOwoJfQoKCXZhciBfdHlwZW9mXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfdHlwZW9mKG8pIHsKCSAgIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mIjsKCgkgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgInN5bWJvbCIgPT0gdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA/IGZ1bmN0aW9uIChvKSB7CgkgICAgcmV0dXJuIHR5cGVvZiBvOwoJICB9IDogZnVuY3Rpb24gKG8pIHsKCSAgICByZXR1cm4gbyAmJiAiZnVuY3Rpb24iID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IHR5cGVvZiBvOwoJICB9LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzLCBfdHlwZW9mKG8pOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfdHlwZW9mLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIHRvUHJpbWl0aXZlXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7Cgl2YXIgX3R5cGVvZiA9IF90eXBlb2ZfMVsiZGVmYXVsdCJdOwoJZnVuY3Rpb24gdG9QcmltaXRpdmUodCwgcikgewoJICBpZiAoIm9iamVjdCIgIT0gX3R5cGVvZih0KSB8fCAhdCkgcmV0dXJuIHQ7CgkgIHZhciBlID0gdFtTeW1ib2wudG9QcmltaXRpdmVdOwoJICBpZiAodm9pZCAwICE9PSBlKSB7CgkgICAgdmFyIGkgPSBlLmNhbGwodCwgciB8fCAiZGVmYXVsdCIpOwoJICAgIGlmICgib2JqZWN0IiAhPSBfdHlwZW9mKGkpKSByZXR1cm4gaTsKCSAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpOwoJICB9CgkgIHJldHVybiAoInN0cmluZyIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSB0b1ByaW1pdGl2ZSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciB0b1Byb3BlcnR5S2V5XzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7Cgl2YXIgX3R5cGVvZiA9IF90eXBlb2ZfMVsiZGVmYXVsdCJdOwoKCWZ1bmN0aW9uIHRvUHJvcGVydHlLZXkodCkgewoJICB2YXIgaSA9IHRvUHJpbWl0aXZlXzEodCwgInN0cmluZyIpOwoJICByZXR1cm4gInN5bWJvbCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgIiI7Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IHRvUHJvcGVydHlLZXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7Cgl9KTsKCgl2YXIgZGVmaW5lUHJvcGVydHkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkoZSwgciwgdCkgewoJICByZXR1cm4gKHIgPSB0b1Byb3BlcnR5S2V5XzEocikpIGluIGUgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgciwgewoJICAgIHZhbHVlOiB0LAoJICAgIGVudW1lcmFibGU6ICEwLAoJICAgIGNvbmZpZ3VyYWJsZTogITAsCgkgICAgd3JpdGFibGU6ICEwCgkgIH0pIDogZVtyXSA9IHQsIGU7Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IF9kZWZpbmVQcm9wZXJ0eSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciBfZGVmaW5lUHJvcGVydHkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoZGVmaW5lUHJvcGVydHkpOwoKCXZhciBhcnJheVdpdGhIb2xlcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKCWZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhyKSB7CgkgIGlmIChBcnJheS5pc0FycmF5KHIpKSByZXR1cm4gcjsKCX0KCW1vZHVsZS5leHBvcnRzID0gX2FycmF5V2l0aEhvbGVzLCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkgewoJZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KHIsIGwpIHsKCSAgdmFyIHQgPSBudWxsID09IHIgPyBudWxsIDogInVuZGVmaW5lZCIgIT0gdHlwZW9mIFN5bWJvbCAmJiByW1N5bWJvbC5pdGVyYXRvcl0gfHwgclsiQEBpdGVyYXRvciJdOwoJICBpZiAobnVsbCAhPSB0KSB7CgkgICAgdmFyIGUsCgkgICAgICBuLAoJICAgICAgaSwKCSAgICAgIHUsCgkgICAgICBhID0gW10sCgkgICAgICBmID0gITAsCgkgICAgICBvID0gITE7CgkgICAgdHJ5IHsKCSAgICAgIGlmIChpID0gKHQgPSB0LmNhbGwocikpLm5leHQsIDAgPT09IGwpIHsKCSAgICAgICAgaWYgKE9iamVjdCh0KSAhPT0gdCkgcmV0dXJuOwoJICAgICAgICBmID0gITE7CgkgICAgICB9IGVsc2UgZm9yICg7ICEoZiA9IChlID0gaS5jYWxsKHQpKS5kb25lKSAmJiAoYS5wdXNoKGUudmFsdWUpLCBhLmxlbmd0aCAhPT0gbCk7IGYgPSAhMCk7CgkgICAgfSBjYXRjaCAocikgewoJICAgICAgbyA9ICEwLCBuID0gcjsKCSAgICB9IGZpbmFsbHkgewoJICAgICAgdHJ5IHsKCSAgICAgICAgaWYgKCFmICYmIG51bGwgIT0gdFsicmV0dXJuIl0gJiYgKHUgPSB0WyJyZXR1cm4iXSgpLCBPYmplY3QodSkgIT09IHUpKSByZXR1cm47CgkgICAgICB9IGZpbmFsbHkgewoJICAgICAgICBpZiAobykgdGhyb3cgbjsKCSAgICAgIH0KCSAgICB9CgkgICAgcmV0dXJuIGE7CgkgIH0KCX0KCW1vZHVsZS5leHBvcnRzID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIGFycmF5TGlrZVRvQXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfYXJyYXlMaWtlVG9BcnJheShyLCBhKSB7CgkgIChudWxsID09IGEgfHwgYSA+IHIubGVuZ3RoKSAmJiAoYSA9IHIubGVuZ3RoKTsKCSAgZm9yICh2YXIgZSA9IDAsIG4gPSBBcnJheShhKTsgZSA8IGE7IGUrKykgbltlXSA9IHJbZV07CgkgIHJldHVybiBuOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfYXJyYXlMaWtlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHsKCWZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBhKSB7CgkgIGlmIChyKSB7CgkgICAgaWYgKCJzdHJpbmciID09IHR5cGVvZiByKSByZXR1cm4gYXJyYXlMaWtlVG9BcnJheShyLCBhKTsKCSAgICB2YXIgdCA9IHt9LnRvU3RyaW5nLmNhbGwocikuc2xpY2UoOCwgLTEpOwoJICAgIHJldHVybiAiT2JqZWN0IiA9PT0gdCAmJiByLmNvbnN0cnVjdG9yICYmICh0ID0gci5jb25zdHJ1Y3Rvci5uYW1lKSwgIk1hcCIgPT09IHQgfHwgIlNldCIgPT09IHQgPyBBcnJheS5mcm9tKHIpIDogIkFyZ3VtZW50cyIgPT09IHQgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodCkgPyBhcnJheUxpa2VUb0FycmF5KHIsIGEpIDogdm9pZCAwOwoJICB9Cgl9Cgltb2R1bGUuZXhwb3J0cyA9IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSwgbW9kdWxlLmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWUsIG1vZHVsZS5leHBvcnRzWyJkZWZhdWx0Il0gPSBtb2R1bGUuZXhwb3J0czsKCX0pOwoKCXZhciBub25JdGVyYWJsZVJlc3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkgewoJICB0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpOwoJfQoJbW9kdWxlLmV4cG9ydHMgPSBfbm9uSXRlcmFibGVSZXN0LCBtb2R1bGUuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZSwgbW9kdWxlLmV4cG9ydHNbImRlZmF1bHQiXSA9IG1vZHVsZS5leHBvcnRzOwoJfSk7CgoJdmFyIHNsaWNlZFRvQXJyYXkgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7CglmdW5jdGlvbiBfc2xpY2VkVG9BcnJheShyLCBlKSB7CgkgIHJldHVybiBhcnJheVdpdGhIb2xlcyhyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChyLCBlKSB8fCB1bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShyLCBlKSB8fCBub25JdGVyYWJsZVJlc3QoKTsKCX0KCW1vZHVsZS5leHBvcnRzID0gX3NsaWNlZFRvQXJyYXksIG1vZHVsZS5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlLCBtb2R1bGUuZXhwb3J0c1siZGVmYXVsdCJdID0gbW9kdWxlLmV4cG9ydHM7Cgl9KTsKCgl2YXIgX3NsaWNlZFRvQXJyYXkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoc2xpY2VkVG9BcnJheSk7CgoJdmFyIENvbW1hbmQ7CgkoZnVuY3Rpb24gKENvbW1hbmQpIHsKCSAgQ29tbWFuZFtDb21tYW5kWyJJbmZvIl0gPSAwXSA9ICJJbmZvIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDb252ZXJ0Il0gPSAxXSA9ICJDb252ZXJ0IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJMYXlvdXQiXSA9IDJdID0gIkxheW91dCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQ2xlYW4iXSA9IDNdID0gIkNsZWFuIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJBcm9tYXRpemUiXSA9IDRdID0gIkFyb21hdGl6ZSI7CgkgIENvbW1hbmRbQ29tbWFuZFsiRGVhcm9tYXRpemUiXSA9IDVdID0gIkRlYXJvbWF0aXplIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGVDaXAiXSA9IDZdID0gIkNhbGN1bGF0ZUNpcCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQXV0b21hcCJdID0gN10gPSAiQXV0b21hcCI7CgkgIENvbW1hbmRbQ29tbWFuZFsiQ2hlY2siXSA9IDhdID0gIkNoZWNrIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGUiXSA9IDldID0gIkNhbGN1bGF0ZSI7CgkgIENvbW1hbmRbQ29tbWFuZFsiR2VuZXJhdGVJbWFnZUFzQmFzZTY0Il0gPSAxMF0gPSAiR2VuZXJhdGVJbWFnZUFzQmFzZTY0IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJHZXRJbkNoSUtleSJdID0gMTFdID0gIkdldEluQ2hJS2V5IjsKCSAgQ29tbWFuZFtDb21tYW5kWyJFeHBsaWNpdEh5ZHJvZ2VucyJdID0gMTJdID0gIkV4cGxpY2l0SHlkcm9nZW5zIjsKCSAgQ29tbWFuZFtDb21tYW5kWyJDYWxjdWxhdGVNYWNyb21vbGVjdWxlUHJvcGVydGllcyJdID0gMTNdID0gIkNhbGN1bGF0ZU1hY3JvbW9sZWN1bGVQcm9wZXJ0aWVzIjsKCX0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpOwoJdmFyIFdvcmtlckV2ZW50OwoJKGZ1bmN0aW9uIChXb3JrZXJFdmVudCkgewoJICBXb3JrZXJFdmVudFsiSW5mbyJdID0gImluZm8iOwoJICBXb3JrZXJFdmVudFsiQ29udmVydCJdID0gImNvbnZlcnQiOwoJICBXb3JrZXJFdmVudFsiTGF5b3V0Il0gPSAibGF5b3V0IjsKCSAgV29ya2VyRXZlbnRbIkNsZWFuIl0gPSAiY2xlYW4iOwoJICBXb3JrZXJFdmVudFsiQXJvbWF0aXplIl0gPSAiYXJvbWF0aXplIjsKCSAgV29ya2VyRXZlbnRbIkRlYXJvbWF0aXplIl0gPSAiZGVhcm9tYXRpemUiOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlQ2lwIl0gPSAiY2FsY3VsYXRlQ2lwIjsKCSAgV29ya2VyRXZlbnRbIkF1dG9tYXAiXSA9ICJhdXRvbWFwIjsKCSAgV29ya2VyRXZlbnRbIkNoZWNrIl0gPSAiY2hlY2siOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlIl0gPSAiY2FsY3VsYXRlIjsKCSAgV29ya2VyRXZlbnRbIkdlbmVyYXRlSW1hZ2VBc0Jhc2U2NCJdID0gImdlbmVyYXRlSW1hZ2VBc0Jhc2U2NCI7CgkgIFdvcmtlckV2ZW50WyJHZXRJbkNoSUtleSJdID0gImdldEluQ2hJS2V5IjsKCSAgV29ya2VyRXZlbnRbIkV4cGxpY2l0SHlkcm9nZW5zIl0gPSAiY29udmVydF9leHBsaWNpdF9oeWRyb2dlbnMiOwoJICBXb3JrZXJFdmVudFsiQ2FsY3VsYXRlTWFjcm9tb2xlY3VsZVByb3BlcnRpZXMiXSA9ICJjYWxjdWxhdGVNYWNyb1Byb3BlcnRpZXMiOwoJfSkoV29ya2VyRXZlbnQgfHwgKFdvcmtlckV2ZW50ID0ge30pKTsKCXZhciBTdXBwb3J0ZWRGb3JtYXQ7CgkoZnVuY3Rpb24gKFN1cHBvcnRlZEZvcm1hdCkgewoJICBTdXBwb3J0ZWRGb3JtYXRbIlJ4biJdID0gInJ4bmZpbGUiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIk1vbCJdID0gIm1vbGZpbGUiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNtaWxlcyJdID0gInNtaWxlcyI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiU21hcnRzIl0gPSAic21hcnRzIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJDTUwiXSA9ICJjbWwiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkluQ2hJIl0gPSAiaW5jaGkiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkluQ2hJQXV4SW5mbyJdID0gImluY2hpLWF1eCI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiSW5DaElLZXkiXSA9ICJpbmNoaS1rZXkiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIktldCJdID0gImtldCI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiQ0RYIl0gPSAiY2R4IjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJDRFhNTCJdID0gImNkeG1sIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJTREYiXSA9ICJzZGYiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkZBU1RBIl0gPSAiZmFzdGEiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNFUVVFTkNFIl0gPSAic2VxdWVuY2UiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIlNFUVVFTkNFXzNfTEVUVEVSIl0gPSAicGVwdGlkZS1zZXF1ZW5jZS0zLWxldHRlciI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiSURUIl0gPSAiaWR0IjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJBWE9MQUJTIl0gPSAiYXhvLWxhYnMiOwoJICBTdXBwb3J0ZWRGb3JtYXRbIkhFTE0iXSA9ICJoZWxtIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJCSUxOIl0gPSAiYmlsbiI7CgkgIFN1cHBvcnRlZEZvcm1hdFsiUkRGIl0gPSAicmRmIjsKCSAgU3VwcG9ydGVkRm9ybWF0WyJNb25vbWVyTGlicmFyeSJdID0gIm1vbm9tZXItbGlicmFyeSI7Cgl9KShTdXBwb3J0ZWRGb3JtYXQgfHwgKFN1cHBvcnRlZEZvcm1hdCA9IHt9KSk7CgoJdmFyIGluZGlnb0tldGNoZXJOb3JlbmRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKCXZhciBNb2R1bGU9KCgpPT57dmFyIF9zY3JpcHROYW1lPWdsb2JhbFRoaXMuZG9jdW1lbnQ/LmN1cnJlbnRTY3JpcHQ/LnNyYztyZXR1cm4gYXN5bmMgZnVuY3Rpb24obW9kdWxlQXJnPXt9KXt2YXIgbW9kdWxlUnRuO3ZhciBNb2R1bGU9bW9kdWxlQXJnO3ZhciBFTlZJUk9OTUVOVF9JU19XRUI9ISFnbG9iYWxUaGlzLndpbmRvdzt2YXIgRU5WSVJPTk1FTlRfSVNfV09SS0VSPSEhZ2xvYmFsVGhpcy5Xb3JrZXJHbG9iYWxTY29wZTtnbG9iYWxUaGlzLnByb2Nlc3M/LnZlcnNpb25zPy5ub2RlJiZnbG9iYWxUaGlzLnByb2Nlc3M/LnR5cGUhPSJyZW5kZXJlciI7dmFyIHRoaXNQcm9ncmFtPSIuL3RoaXMucHJvZ3JhbSI7aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtfc2NyaXB0TmFtZT1zZWxmLmxvY2F0aW9uLmhyZWY7fXZhciBzY3JpcHREaXJlY3Rvcnk9IiI7dmFyIHJlYWRBc3luYyxyZWFkQmluYXJ5O2lmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXt0cnl7c2NyaXB0RGlyZWN0b3J5PW5ldyBVUkwoIi4iLF9zY3JpcHROYW1lKS5ocmVmO31jYXRjaHt9e2lmKEVOVklST05NRU5UX0lTX1dPUktFUil7cmVhZEJpbmFyeT11cmw9Pnt2YXIgeGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt4aHIub3BlbigiR0VUIix1cmwsZmFsc2UpO3hoci5yZXNwb25zZVR5cGU9ImFycmF5YnVmZmVyIjt4aHIuc2VuZChudWxsKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKX07fXJlYWRBc3luYz1hc3luYyB1cmw9Pnt2YXIgcmVzcG9uc2U9YXdhaXQgZmV0Y2godXJsLHtjcmVkZW50aWFsczoic2FtZS1vcmlnaW4ifSk7aWYocmVzcG9uc2Uub2spe3JldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpfXRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMrIiA6ICIrcmVzcG9uc2UudXJsKX07fX12YXIgb3V0PWNvbnNvbGUubG9nLmJpbmQoY29uc29sZSk7dmFyIGVycj1jb25zb2xlLmVycm9yLmJpbmQoY29uc29sZSk7dmFyIHdhc21CaW5hcnk7dmFyIEFCT1JUPWZhbHNlO2NsYXNzIEVtc2NyaXB0ZW5FSHt9Y2xhc3MgRW1zY3JpcHRlblNqTGogZXh0ZW5kcyBFbXNjcmlwdGVuRUh7fWNsYXNzIENwcEV4Y2VwdGlvbiBleHRlbmRzIEVtc2NyaXB0ZW5FSHtjb25zdHJ1Y3RvcihleGNQdHIpe3N1cGVyKCk7dGhpcy5leGNQdHI9ZXhjUHRyO319dmFyIHJlYWR5UHJvbWlzZVJlc29sdmUscmVhZHlQcm9taXNlUmVqZWN0O3ZhciBydW50aW1lSW5pdGlhbGl6ZWQ9ZmFsc2U7ZnVuY3Rpb24gdXBkYXRlTWVtb3J5Vmlld3MoKXt2YXIgYj13YXNtTWVtb3J5LmJ1ZmZlcjtIRUFQOD1uZXcgSW50OEFycmF5KGIpO0hFQVAxNj1uZXcgSW50MTZBcnJheShiKTtIRUFQVTg9bmV3IFVpbnQ4QXJyYXkoYik7SEVBUFUxNj1uZXcgVWludDE2QXJyYXkoYik7SEVBUDMyPW5ldyBJbnQzMkFycmF5KGIpO0hFQVBVMzI9bmV3IFVpbnQzMkFycmF5KGIpO0hFQVBGMzI9bmV3IEZsb2F0MzJBcnJheShiKTtIRUFQRjY0PW5ldyBGbG9hdDY0QXJyYXkoYik7SEVBUDY0PW5ldyBCaWdJbnQ2NEFycmF5KGIpO0hFQVBVNjQ9bmV3IEJpZ1VpbnQ2NEFycmF5KGIpO31mdW5jdGlvbiBwcmVSdW4oKXtpZihNb2R1bGVbInByZVJ1biJdKXtpZih0eXBlb2YgTW9kdWxlWyJwcmVSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInByZVJ1biJdPVtNb2R1bGVbInByZVJ1biJdXTt3aGlsZShNb2R1bGVbInByZVJ1biJdLmxlbmd0aCl7YWRkT25QcmVSdW4oTW9kdWxlWyJwcmVSdW4iXS5zaGlmdCgpKTt9fWNhbGxSdW50aW1lQ2FsbGJhY2tzKG9uUHJlUnVucyk7fWZ1bmN0aW9uIGluaXRSdW50aW1lKCl7cnVudGltZUluaXRpYWxpemVkPXRydWU7aWYoIU1vZHVsZVsibm9GU0luaXQiXSYmIUZTLmluaXRpYWxpemVkKUZTLmluaXQoKTt3YXNtRXhwb3J0c1siZmIiXSgpO0ZTLmlnbm9yZVBlcm1pc3Npb25zPWZhbHNlO31mdW5jdGlvbiBwb3N0UnVuKCl7aWYoTW9kdWxlWyJwb3N0UnVuIl0pe2lmKHR5cGVvZiBNb2R1bGVbInBvc3RSdW4iXT09ImZ1bmN0aW9uIilNb2R1bGVbInBvc3RSdW4iXT1bTW9kdWxlWyJwb3N0UnVuIl1dO3doaWxlKE1vZHVsZVsicG9zdFJ1biJdLmxlbmd0aCl7YWRkT25Qb3N0UnVuKE1vZHVsZVsicG9zdFJ1biJdLnNoaWZ0KCkpO319Y2FsbFJ1bnRpbWVDYWxsYmFja3Mob25Qb3N0UnVucyk7fWZ1bmN0aW9uIGFib3J0KHdoYXQpe01vZHVsZVsib25BYm9ydCJdPy4od2hhdCk7d2hhdD1gQWJvcnRlZCgke3doYXR9KWA7ZXJyKHdoYXQpO0FCT1JUPXRydWU7d2hhdCs9Ii4gQnVpbGQgd2l0aCAtc0FTU0VSVElPTlMgZm9yIG1vcmUgaW5mby4iO3ZhciBlPW5ldyBXZWJBc3NlbWJseS5SdW50aW1lRXJyb3Iod2hhdCk7cmVhZHlQcm9taXNlUmVqZWN0Py4oZSk7dGhyb3cgZX12YXIgd2FzbUJpbmFyeUZpbGU7ZnVuY3Rpb24gZmluZFdhc21CaW5hcnkoKXtyZXR1cm4gYmFzZTY0RGVjb2RlKCJBR0Z6YlFFQUFBQUJsd3FXQVdBQmZ3QmdBWDhCZjJBQ2YzOEJmMkFDZjM4QVlBTi9mMzhCZjJBRGYzOS9BR0FFZjM5L2Z3QmdCSDkvZjM4QmYyQUZmMzkvZjM4QVlBVi9mMzkvZndGL1lBWi9mMzkvZjM4QmYyQUFBR0FHZjM5L2YzOS9BR0FJZjM5L2YzOS9mMzhCZjJBQUFYOWdBbjk4QVg5Z0IzOS9mMzkvZjM4QmYyQUJmd0YrWUFkL2YzOS9mMzkvQUdBQ2YzOEJmV0FCZndGOVlBaC9mMzkvZjM5L2Z3QmdBMzkrZndCZ0FuOStBWDlnQ1g5L2YzOS9mMzkvZndGL1lBRi9BWHhnRUg5L2YzOS9mMzkvZjM5L2YzOS9mMzhCZjJBQmZRRjlZQXQvZjM5L2YzOS9mMzkvZndGL1lBSi9md0Y4WUFwL2YzOS9mMzkvZjM5L0FHQUVmMzkvZlFCZ0NuOS9mMzkvZjM5L2YzOEJmMkFOZjM5L2YzOS9mMzkvZjM5L2Z3Ri9ZQVYvZm41K2ZnQmdBWHdCZkdBQmZRQmdDWDkvZjM5L2YzOS9md0JnQkg5L2YzOEJmV0FEZjM1L0FYNWdFbjkvZjM5L2YzOS9mMzkvZjM5L2YzOS9md0YvWUFOL2YzOEJmV0FGZjM5L2YzMEFZQU4vZjM4QmZHQUdmMzkvZjM5OUFHQUdmMzk5ZjM5L0FHQU1mMzkvZjM5L2YzOS9mMzkvQVg5Z0EzOTlmUUYvWUFKL2ZRQmdCWDkvZjM5K0FYOWdBMzkvZlFCZ0FuOStBR0FEZjM5OUFYOWdCSDkrZm44QVlBSjhmQUY4WUFGK0FHQUJmZ0YvWUFKL2ZBQmdCSDkvZjM4QmZtQU9mMzkvZjM5L2YzOS9mMzkvZjM4QmYyQUZmMzkrZjM4QVlBSjlmd0YvWUFWL2YzOTlmd0JnQW45L0FYNWdCSDkvZlg4QVlBTi9mM3dBWUFkL2YzOTlmMzkvQUdBRmYzOS9mMzhCZkdBRWYzOTlmUUYvWUFWL2YzMTlmUUJnQTM5L2ZnQmdBbjE5QVgxZ0EzOTlmd0JnQUFGK1lBRjhBWDFnQkg5OWZYMEFZQUo4ZndGOFlBSitmd0YvWUFKL2ZRRi9ZQkYvZjM5L2YzOS9mMzkvZjM5L2YzOS9md0YvWUFOL2YzOEJmbUFHZjN4L2YzOS9BWDlnQkg5OWYzOEFZQTkvZjM5L2YzOS9mMzkvZjM5L2YzOEFZQWQvZjM5L2YzNStBWDlnQm45L2YzOStmZ0YvWUFWL2YzOS9mQUYvWUFSL2YzNS9BR0FEZjM5OEFYOWdCbjkvZjMxOWZRQmdDWDkvZjM5L2ZYOS9md0YvWUF0L2YzOS9mMzkvZjM5L2Z3QmdCSDkvZlgwQVlBWi9mMzkvZlg4QVlBVi9mMzk5ZndGL1lBTi9mMzRCZjJBUWYzOS9mMzkvZjM5L2YzOS9mMzkvZndCZ0NIOS9mMzk5ZjM5L0FHQUVmMzkvZndGOFlBZC9mMzkvZjMxL0FYOWdDSDkvZjM5L2ZYOS9BWDlnQkg5L2YzMEJmMkFIZjM5L2YzOS9mUUJnQjM5L2YzOTlmWDhBWUFOL2ZIOEFZQU4vZlg4QmYyQUZmMzk5ZjM4QmYyQUZmMzk5ZjM4QVlBWi9mWDkvZjM4QmZXQUZmMzkvZjM4QmZXQUZmMzkvZm40QVlBMS9mMzkvZjM5L2YzOS9mMzkvQUdBRmYzOS9mMzhCZm1BRWYzNS9md0YvWUFBQmZHQURmMzUvQVg5Z0JuOS9mWDE5ZlFCZ0NuOS9mWDkvZjM5L2YzOEFZQVYvZjM5OWZRRi9ZQVovZjM5L2Yzd0JmMkFDZm44QVlBTi9mWDBBWUFSK2ZuNStBWDlnRlg5L2YzOS9mMzkvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9ZQVYvZlg5L2Z3QmdCSDk5ZlgwQmZXQURmSHgvQVh4Z0JYOS9mWDEvQVg5Z0JYOS9mMzUvQUdBRWYzOS9mZ0YrWUJSL2YzOS9mMzkvZjM5L2YzOS9mMzkvZjM5L2Z3Ri9ZQUorZmdGOFlBWi9mbjkvZjM4QVlBSitmZ0Y5WUFOK2ZuNEJmMkFFZjM1K2ZnQmdBbngvQVg5Z0JIOS9mM3dBWUFSOGYzOS9BR0FDZkg4QVlBUi9mWDkvQVg5Z0JuOS9mMzE5ZndCZ0JuOS9mMzk5ZndGL1lBaC9mMzkvZlg5L2Z3Ri9ZQWQvZjM5L2ZYOS9BWDlnQlgxL2YzOS9BWDFnQkg5L2ZYOEJmMkFKZjMxL2YzOS9mMzkvQUdBRmYzMTlmWDBBWUFOOWZYMEFBdHNGY0FGaEFXRUFEZ0ZoQVdJQUFnRmhBV01BQ0FGaEFXUUFCd0ZoQVdVQUJBRmhBV1lBQlFGaEFXY0FCZ0ZoQVdnQUFBRmhBV2tBREFGaEFXb0FBQUZoQVdzQUF3RmhBV3dBQlFGaEFXMEFBUUZoQVc0QUFnRmhBVzhBQ1FGaEFYQUFBUUZoQVhFQUFRRmhBWElBQVFGaEFYTUFLUUZoQVhRQUVnRmhBWFVBQ2dGaEFYWUFDd0ZoQVhjQUV3RmhBWGdBTWdGaEFYa0FQd0ZoQVhvQVZ3RmhBVUVBRUFGaEFVSUFGUUZoQVVNQVdBRmhBVVFBS2dGaEFVVUFRQUZoQVVZQUZRRmhBVWNBQlFGaEFVZ0FGd0ZoQVVrQUFBRmhBVW9BTXdGaEFVc0FEUUZoQVV3QUt3RmhBVTBBSFFGaEFVNEFDQUZoQVU4QUhnRmhBVkFBV1FGaEFWRUFKUUZoQVZJQVdnRmhBVk1BTEFGaEFWUUFIZ0ZoQVZVQVd3RmhBVllBSmdGaEFWY0FYQUZoQVZnQVhRRmhBVmtBTFFGaEFWb0FHQUZoQVY4QVhnRmhBU1FBWHdGaEFtRmhBRFFCWVFKaVlRQmdBV0VDWTJFQUxnRmhBbVJoQUdFQllRSmxZUUJpQVdFQ1ptRUFZd0ZoQW1kaEFHUUJZUUpvWVFCbEFXRUNhV0VBWmdGaEFtcGhBQ0FCWVFKcllRQm5BV0VDYkdFQUh3RmhBbTFoQUFVQllRSnVZUUJCQVdFQ2IyRUFhQUZoQW5CaEFBY0JZUUp4WVFCcEFXRUNjbUVBYWdGaEFuTmhBR3NCWVFKMFlRQnNBV0VDZFdFQUN3RmhBblpoQUcwQllRSjNZUUJDQVdFQ2VHRUFCUUZoQW5saEFHNEJZUUo2WVFCREFXRUNRV0VBQkFGaEFrSmhBQXdCWVFKRFlRQnZBV0VDUkdFQUF3RmhBa1ZoQUVRQllRSkdZUUJ3QVdFQ1IyRUFjUUZoQWtoaEFBRUJZUUpKWVFBSEFXRUNTbUVBY2dGaEFrdGhBSE1CWVFKTVlRQUxBV0VDVFdFQWRBRmhBazVoQUVVQllRSlBZUUIxQVdFQ1VHRUFkZ0ZoQWxGaEFFWUJZUUpTWVFBQUFXRUNVMkVBQXdGaEFsUmhBQVlCWVFKVllRQURBV0VDVm1FQUFBRmhBbGRoQUFZQllRSllZUUFSQVdFQ1dXRUFkd0ZoQWxwaEFBNEJZUUpmWVFBTEFXRUNKR0VBQVFGaEFtRmlBQUlCWVFKaVlnQUNBV0VDWTJJQWVBRmhBbVJpQUFZRDJ6ekVQQUFEQVE0REFRQUVCQUFCQVFNQ0FRQUFBd0FCQUFZQ0RnTUVBZ0VCQXdJQ0N3RUdCUUFGQVFJRkJBUUJBZ2dFQ3drREFBVURBQVFEQkFzREFnTUFCQVVBQWdNRUFBSUFBUVVBQUVjQ0F4Z0VCQUVEQkFJREFnWUNBZ0FDQUFJQkFRUUFBd01DQUFNRUFRTUVBeUVCQXdFQ0JBTUZBUUlER3dBRENSc0pBUUVDQXdRRkF3TUFCd0FCQ1M4RUF3RUVBd0lDQVFVSkJnSWlBZ0lBQkFFQkF3QUFBQUVCQVFJQ0JBTUJBUUFBQlFJQkJBWUJCQU1FQWdRR0FnSUNBUUlCQUFJQUV3QUJBUVFIQVFjREFRRURCQVFDQWdFRkF3a0RBUUFFRXdRRUF3MEpBUU1CQUFJQUFRY0JBUUFFQUFJQkx3WUFCZ01DQWdFQkJRTUFFd1FBSWdVQUFoZ0JBd01ZQUFBQ0FRUUJBakExQ0FBQUF3SURFd01CQWdFRUFBRUNTQXNBQVFzT0F3TUJCUVlHQWpZQkJRQURBQUlEQWdBQUFRTUJOd1VJQWdZaUJ3RUNBUUVDQUFBQ0JRQURBZ0lEQmdJRkFBQUVBd1pKQUFBRUFRSURPQUlHQndJQ0RnSUJBUWNFQmdBQUJ3SURBQWNEQUFBQUJBTURBQUlFQkFFQ0FBTURCQUlBQVFNQUNBQUhBQUVTQndBQUFBSUFBUUFFQUFFRUFRRUJNd2RLU2tjS0JBWURFQWNIQXdFQUJnTUVBZ0FDQWdzRUNBSUNBUVlFQVFrSk9Sc0VBQTBBQndRSUNRSUNBZ01BQVFNQ0FnRUNBUVVQQVFBTkRRTWRBUVFBQlFVQ0JBb05Bd01FQXdBQkJ3RUNCd0lCQlFFT0JBQUFCUWNMQVJBRkJRQUNBZ0FGQlFJRUJBRURBd2NGQlFVQkd3QUNBQVVGQ2drREFBa2FCUU1CQVFFRkF3SUFBVXNBQWdBQUFBRUVBZ0VDQ1FBRUJRVUJDWGtCRkFBQUFnNENBQUFGQlFjREFnWURBUUkxQTNwTUJBSURBQUlBQ2dRQUJ3Z0NBUVFLQWdRREF3UUFBZ0lEQXdFQUFBRUdBQU1DQVFFQ0F3RUNBQUlFQUFFQUFnTUFEd2NCQUJrQUFCUURNQVFCQVFFSEJBVURBd1VEQVFNSEJBY0NBeFVDQXdFRkFRRURBUUVIQkUwQkJRRUxBQVFCQWdjREJBUUpBZ0VFQnhBTkNuc2hEUVFBQndJTUFBQUFBd1FBQUFBREF3QUdBQUFIQWdVVkFRSUxBUUVBQ1FBQkF3SUZCUU1JQUFRQ0JnY0FBQVFJQUFNRENBMEdBUVVGQWdVSUFRWUJBQU1CQUh3Q0NBRjlBZ0lBQndBQkF3QVVCUUVDQXdVRkFBRUtBZ1lCQ1FNQ0JRY0RBQU1BQ1FNTUF3b2dBU0FCQVFFQkJBSUJFWDQyRGhzQ0J3UUNBUW9IQWdVRUF3a0ZEUU1LQ0FjSEF3RUhCd1FHQUFBZkF3RUFBUU1FQlFVRUFRRUZBQUVEQVFNREF3TUNCQVlDQkFFQkF3SUZBUVFIQ0g4RkNBUUlBZ0VCQWdVQUJRVUFBd0VCQWdBREFRSUJDQVFDQVFVQkFRRU1EQUFNQUF3TURBTUNLUUVBQVFNRkFnUUFBQWdCQVFNQ0JBZ0RBZ2dHREFnRURRSUJDQVFBQ3dBQ0FRTUJBUVNBQVFnRUxnRVFCQzRCRUFGT0FnTUNTUVVGQlFVREFnU0JBUUVUQWdJQ0RnQURFZ01CQmdFQUF3TUFBekFBQndrR0NRTUNBd2NhRUFnREJBY0hCQVZQQWdjRUJRUW9FQmdLQ2dvSkNnUUVCQWNCQ1FrQUJJSUJHQWNOQkFjS0Fnb0NCd2dDQWdBREF3UUJBUVFBQVFFQkF3RURBd0FCQUFnSUF3TUJBd01EQndNREFnSUJBZzRCQVFBQUNna0ZCZ01IQlFBREFRa0NBZ1lJQ0FrQkF3WUFBQUFEQXdJRkNRTUlDd3NMQ2dzRUJBTUNBZ0FLQXdRRkFBRURBd01EQXdBQkFRTURBd0FGQUFJQkF3TURBd01EQVFFSEFRRUJBd01EQXdJREJRSUVSUVlDQVFFREFRQUdBZ3NBQXdBQ1RRRVVBQU1EQVFJR0FBSUFCQUlFQVFNQUJBQUdBd01PQUFNQkFBRUZFZ1lDQ0FJSkFnVXJIUVlJT2hJSEVCQUNBUXdHQlJNRkFnTUNBZ0lHQVFjRENBVUNBUWdGQVZBSEFBRUNBZ0VEQXdRQUF3QUJBQXNCQVFBQUFRRUFnd0VpQVFrR0FnSUNBU01qQ0FFRUFRTUNBU01qQXdvQkJ3RUdCZ0lEQWdFQ0FnQUFCUWNCRFFBRUJBSUNBaWdlQUFvS0FRY0tDUUlEQkFRREJBVUJBaGdFQ1FFQkFnSUFDUWNLQndnUUJDZ1NBQWM1QkNBU0RRQURBQlVJQ0FnQUFnQURCZ1lBQmdZREFBTUJBUklEQ1FFQUJBTUFBd2tEQXdFREFRTUJBQUFDQUFFRkFBSUFCQVlBQUFVQUJBWUFBd0VHQXdJSENRUUJBZ0lCQWdJRUFnNEZBZ1lGQWdBQUFRTUJBQVFEQUFFRUFnSUNBZ1VDQnd3TUFpWUJBQUVEQUFBQ0FBQUZBQTRCQUFNQUFBSUZBQUFKQkFRSEF3VUhBQW9LQ0FZRENBUUtCQUFEQWdjRUFRSUVCUUVGQUFNRUFBSUJBZ0VIQVFjQkJRVUFBd01BQUFBQUFRWUVBd0VGQVFFQkJDc0RBUUFFQVFVQkFRSUlCUVVCQXdnSEJRTUlBUUVKREFNRkFBRUFBUlVHQXhVQUFRUUNCQUVTRlJVVkZRQURBUVFEQXdNRkFBUUFCQWNDQWdJQkFRd0RBQklUQXhNVEJBUUJBUUlBQXdRREFBSURDd0FCQVFJQkFoY1hBZ0lGQ2dVRUJBd0RDQVFFQndjSEJ3Z0NCQUlJQ0FnTUJRMDdCQVFFQXdNRENRa0hoQUVJQ0FjQ0JRa1NBeElHQXdVSUF3SURCZ1FHQkF3R0NRVUhCQVFFRUJBWUFnSUFBQUVDQWdZQUN3TUVBd0FBQUFVRkZRVUpCd1FBQXdNRkFnQUJBUWtORFFrTkRRa05BUUlCQUFBQUFBRUVBUUVJQkFNQkFRUUZBd01NQ0F3TUNBd01BUWNIQndWUUJBNEpDUUVKQWdFQ0FBRURBZ0FDQXdFQkFBRURBZ0VCQWc4QUFRRUNBZ0FCQVFZOEJBRUVCQUFGQlFZRkJnVUdBZ2dHQmdJSUJnWUNDQVlHaFFFRElvWUJCRVlFQmdFUUJEOEdJaldIQVFFRkFRc2JBZ0lCQVVFMkFrd0RCUnNFQVFFQkFEMklBUWtDR3lNakJRVUFBZ0lDQWdJQkF3d0ZCUVVFQmdJREJnRUZCd1FEQWdFREFnTURBd2NDQlJBQkFnZ0ZBZzBDQndJSEJRWUZCZ3dRSlFZS0FBRUpBUUFBQUNBTkJTRWFBZ0VCRFJ3U0FSQlBCd29CRUVNdUJ4QUVBd1lDSEJ3Y0VCQUpHZzBFQkEwREJ3Y2dCUUVDQWdRUUNRY0tDZ2tLR2dFRkNBZ0pBZ0lDT3dVUUJBY0JHQUlIQWdjS0J3RVNBUWtIQ1FBRENpZ29EUkFLQmdrQ0RTRUtCQTBOQWhVaERRVUhCeGdjQlJ3RUJ4QVFPd0FHRWdBQUFnUUJBZ0lBQWdnSUFBQURCZ1lBQkFVR0Jna0VBQUFCQ0FFQUVnTUFDQWtDQmdZQkFBUUFCQUlBQUFJRkFBTUFBUUlCQWdFREF3TUJBUUFBQVFnSEJ3Y0hCd1lBQXdBREFCUUdBd01FQkFVRUF3QUNBZ1FEQkFRTUNBSUVEQVFJQUFnSUNBQUdBQUFBQUFJQ0FnZ0NBQUlJQWdRRUJRUUJBZ0lCQXdRQ0JBZ0NBUUVCQWdBSUFRRUJDd3NCQWdNQkFRSURBQUFBQlFJQUFBQUFBQUFFQXdBQUF3RUJBQUFFQWdRQkF3WURBZ1lDQWdJR0JoTUJCUU1GQmdZQkFRY0VBaEFBQUFRQkFnSUFBQUVCQVFFQkFRUUVCd0FBQXdNRkF3QUJBQVlGQlFNREF3UUJBd01GQXdJQ0JBRURCUVlHQmdZSlRnY0FCQVlBQlFVQkFRVUJBZ2dFQmdJQkFRTUdDQU1HQmhVQUFBZ0RDQVFIQ3dFSEFBc0xEQUVFQkFNTENnUUVCQVFDQXdFQ0F3TUNEQUFIQmdVREF3WUZBZ1VCQWdVREFRUUVBUVFEQlFJTUF3UUNBZ1FHQWdjRkJRSUZBd0FCQ3dBRUF3TUVCQUFJQVFFQkF3QUdBUXNEQWdNQUFBZ01CZ0VCQmdjQkFRZ0RBUVVGQlFRRkFnUUFBZ0VDQVFNQkF3VUhBd1VBQVFBQkJBQUpCZ2NIQUFJQ0FnY0JCd1lHQXdNSEFRRUJBd0lBQVFFQkFRRUJBUUFBQVFRQkF3WUJCUUlCQUFFQkFnVURBZ0FCQVlrQkFRRUJBZ0VGQVFFRkJRVUZBZ0lDQWdJQUFBWURBbEl0QlFBRkFBTUZDQUFDQVFBR0FnRUJBUUVGQlFFQUFBRUdCUVlNQmdZRUFnQUFBQUVCQVFFQkh3SUNDQUFBRXdFQUFBc0FRQVlJQUFNQUFBRUFCUUlCQmdZSUNBTUlDQUlBQUFNRkFBRUZBd0FFQXdFREFnQUJBd0FBQUI4QUJnVUFBQUFBQVFjSEV4K0tBUU1EQVFFR0FRSUNCUUFGQXdFQ0FBQUNCZ0lEQmdVRUJRVUVBUUlEQUFFRkJnRUJBUUlIQlFBTEFnRVJCVGdMQ3c0QUFBTURKUVlBQUFBQUFnRUJBd01EQXdVQ0F3RURCZ01EQWdJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQXNBQ3dBQUFBQUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWdFQkFRRUJBUUVFQVFRRUFRRUJBUUVCQkFBR0FRRUJBUUFCQVFjREJRRUJBUUVCQXdFQkFRVUJBd0VCQVFBRkFBQUFBQUFBSkFBQUFDUUFBQUFBQUNRQUFBQWtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFMQlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEZ0FBQVFFQkFBUU1EQXdJQ0FnQUJBUUdCZ1lBQkFRQkN3QUFBQUFBQWdVRkFBRUNBQVU1QUFRRUJ3QURCQVVBQndRSEJBQUNBZ0lBQUFBQUFRTUNBd0lCQUFZQUFBQUFBUUFCQUFFQUFRQUFBUUFCQUFFQUFRQUJBQUFCQUFFQUFRQUJBQUVBQXdNREF3TURBUUVBQUFBQUFRa0JCd0VKRFFBTkFBa0pCQWNFQWdBRUFnQUpCQWNFQWdBRkJBSUhCd2NFQUFNQURnQURBQU1EQXdNQ0F3SURBQU1EQXdNREF3TURBd01BQXdNREF3TURBd01EQXdBQ0F3TURBd01DREF3QUNsTWVWQXBUSGxRQUJCQWVIQkFBQkJBRkhod0FFQkFBQlJBTkNnb0tDZ0FLRFFvS0NnQUtDZ2xWRWxZQU1Ra3hFZ2tKQ1ZVQUVnZFdNUWt4QUJJSkNRb0tDZ0FLQ2dvS0Nnb0FDZ29IQ2dBR0Npc0tLUW82Q2dBS0NnY0tPZ29IQUFVS0FBb0VCZ2tFQmdrRUFBQUNCQU1DQVFBQkF3SUVBd0FDQVFFREFBc2tBQUFHQXdRRkFRUUVBQUFCQUFFQUFRWUFBRHdDQWdFREFBVURBZ1FBQVFRQUFBQUJBUUFCQWc4Q0FnRUFBUUlDQVFBQUJBRUVBQUFDQVFBQUJRQUZCUUFNQUFBQUJBQUVBMUVBQUFBQUp3QUNBQUFTRGdFQUFBRUVBQVFuQUFBQUF3UUFBQWNDQWdBQUVnWURCd0FBQlFVbEJnQUdCQUFCQWdNRUFRQUJBQUVCQUFFQUFRQUJBQUFCQWdBQUFnSUFBZ0lDQkFJREF3TUZBQVVCQUFFQkFRQUJBZ0lDQndFQUFBTUFBZ0lDQndJQUFnSUhBZ0lDQndBQ0FnSUhBQUlFQUFBQUFBQUNBQUlBQXdBQUFBb0FCQUlBQWdBYUFCb2FCQUFBQkFRRUJBUUFBZ1FFQkFRQUFBQUFBQUlFQmdBQUFDRUFpd0VIQndBQUJBSUNBQVFDQUFRQUFBQUFBQUFGQUFBQUFBWUFBQUFDQVFBQ0FBQUFCd01EQXdNQUFBQUFCZ1VBQUFBQUFBWUFBQUFBQlFJRUFBQUFBQUVEQXdBQUFBWURBd0lFQUFBQUJnQUZBd1FHQndZQUJnTURBQU1CQXdZSUJRQUVCd0FBQVFFQkJBUUFBQUFEQUFROVBRQUlCZ2dBQUFZSUFBSUNBd2dBQUFJR0Fna0RFQUlDQVFJQUFRUUFBQUFEQWdRQUFBRUFBd1FFQUFBQUFBSUFBQUFEQWdRQUFBQURBZ1FBQUFBQ0JRRVNBd2dGREFnREJBQUJBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQVFBQUN3QUxBQUFBQUFBQkNBQUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQU1BQUFBQUFBQUFBUUlEQVFNQkFRSURBd0VCQWdNQkF3RUJBZ01EQVFNREJBUUFBQUFBQUFNQUFBQUFBQUFBQUFBQUF3QUFBQUFBQUFBQUN3QUdDd0FBQUFBQUFBQUFBQU1BQUFBQUFBQUFBQUFBQVFBQUFBQUFBQUFBQUFBQkFBQUFBQUFDQndRQ0F3VUVBQWNKQWdRSEFBTUpBd1lLQ1FBS0JRTUFBQUFGQUFFRkJ3TUNCQUFBQUFrS0FBQUFBQUFBQUFrRkFRQUNCQVFDQlFRQUFBUUZCZ01CQUFBQUFBQUFCUUFFQUFVQUJnSUJBd0VBQUFVREJBNE9EZ1FEQVFVREFnSUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTEFBc0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQUFBQUFBQUFBQVFBQUFBRUNBZ0FBQVFFSUFRQUFBQUlCQ0FJQ0FnQUdBQUFCQUFBQUF3SUFBQUFHQXdRQUJBRUNBZ0lDQlFJQkFBQUFBQUlDQVFFQ0FnQUJBd0FCQUFBQUFRTUVBUUFBQUFNQUFBQURBUUFDQUFBQUFnRUJBUUFHQWdFQ0FRSUJBUUVJQUFRQUFRQUFCQVFFQVFRRUFBQUFCQVNNQVFBRUJnTUdBd0VDQkFNQkFRSUVBd0VCQWdRREFRRUNCQU1CQVFJRUF3RUJBZ1FEQVFFQkFnUURBUUVDQkFNQkFRRUdBZ1FEQVFZQkNBWUdEQUVDQmdjTUJnRURBQUFEQ3dVR0RBRUFCZ1lHQmdZR0JnRUdCZ1lHQmdZR0JnWUdBZ1lHQ3dBQUFBTUJBUUVGQUFBQUFBQUFBQWdFQXdBRUFBQUFBUUFBQUFNREJBSUZBUVlDQXdjRkVnVUJBZ1lCQkFBQUFBRURBd01DQkFBQUJ3QUVCUVlGQXdNSUF3WUlBd1VBQlFBR0FBSU1BQU1HQmdVR0JRQUFBQUFFQkFBQUFBQUFDd1VBQUFBQUFBQUFBQUFBQUFBRkJRZ0ZEQVVEQXdZQUFBUURCeElHQUFBRUJBVUhDQUFBQUFBQUN3QUFBQUFBQUFBQUFBQUFDUWdHQmdVQ0JnQURCd1FFQmdNQUN3RURBZ2tGQmdRQUJRSUNEQVVLQkFnR0FnTURDQUFBQUFBQkFBQUxBQUFBQUFBQUFBRUFBQUFBQlFVTUFRY0hCQVFBQUFBQkFBQUxBQUFBQUFBQUFBSUFBQUFBQVFBQ0JBRUFBUUlFQkFFRUFnY0hBZ1FBQUFBQUFnSUJBQUlDQndFQkNRUUNCd1FBQ1FRSEJBSURCUUlNQXd3Q0FnWUFCd0lFQWdFQUJBUUhCQUVDQkFFQUFBQUFBQVVFQWdjQ0RBVUFBd0FCQkFVRkFnSUNBZ0lFQWdJQ0FnSUVCUVFGQmdNRkJBUUVCd1FIQkFjQ0FnSUNBZ1VDQWdJQ0FnQUJCQUVBQUFBQkFRTUVBUUlKQUFNQkFBRUFBUWdHQlFnSUJRa0hBZ0VFQkFJQ0JBa0JCQVFGQWdFQ0FnVUVBUUlFQkFjRUFBRUFBQUFBQUFBTEFBQUFBQUFBQUFBQUFBQUFCZ0lDQ0FnSUFBWUFCQVFHQVFBQ0JBUUdBQUlCQUFBQUFBQUFDd0FBQUFBQUFBQUFBQUFBQ2dNREJnQUNBUVlBQUFJQkJnTURBd0lCQlFBQUJRQUFBZ0VBQUFBQUFBQUJCUUVEQUFBQUFBQUxBQUFBQVFBQUFBQUFBZ0FBQUFNQUF3WUdCZ1FDQWdZREF3VUZCZ0FHQXdNREF3UUFBQUFBQUFBTEFBQUFBQUFBQUFBQUFBQUFBd0lEQWdZSUFBQUFBQUFMQUFBQUFBQUFBQUFBQUFBQUJRVUFBd0FBQXdBREFBQUFBQUFMQUFFQUFBQUFBQUFBQUFBQUx3UUJBUUFBQUFBQUFBc0FBQUFBQUFBQUFBQUJBQUFJQWdjR0FBQUJBQUFBQ3dBQUFBQUFBQUlBQUFBQUFBSUNBd01EQXdNREJBQUFBQUFBQ3dBQUFBQUFBQUFBQUFBQUFBSURBUUVCQVFBQUFBQUJBd0VZQWdRQ0FRRUZBUWtLQ1FVSUJnTUNCQVFBQUFFQUx3Y0VBUUVFQlFBSEJBQUFBQU1GQVFBREF3RUJCUUlFQUFFQUFBRUFBd0FBQUFJRUFBQUJBQUFCQndRREFBQUVBUU1BQkFBQ0FRQUJBQUVBQVFBRkFRSUVBUUlFQUFBQUFBQUFBQVVJQkFBRUJRQURCUVFERFFFRUFBQUFBQWNBQUFBQUFBRUFCUVlCQWdRQUFnTUdBUVFBQVFFQkFBWUJCUUFCQVFZQUFBQUFBd1lEQWdBQUFBWUFCUVFEQXdBQUFBWURBd0FCQUFBR0F3VURBZ0lHQWdBQkJnQUJBUUFDQWdNRUJnSUNBQWNGQUFBRkFBRUVCQVFFQUFBQUJnWUZCQjBFSFIwQkJBQUFCZ0FGQkFRRkFnWUlBQU1GQUFnRkJRVVNCZ1lHQlFVRkJRUUdCZ1VFQWdRQUFBQUdBQUFMQUFBQUFBQUFBQVlBQUFBQUFRSUpBd0VCQmdJRkF3RUJBZ29EQVFNR0FBVUZCUUlFQXdNREJnVUZCZ1lGQlJRR0VBRUdBZ0lDQXdRQUFBQUdBQUFMQUFBQUFBQUFBQUFBQUFBQ0F3UUxBQVlFQUFBQUFBQUFBUUFBQVFBQkJBTUhBd1lBQkFNRUF3QURCQUFEQUFFRUFBQUFCQWNIQUFNQUFBQUFBQUVFQXdJQUFBQUJBZ1FFQUFBQUFBQUFBUUVKQ2drRUJBQUFBQVFGQlFJQ0JBa0VBUVFDQWdZRkF3QUFBZ1FIQkFJQUFBQUJBQVFBQlFVRkF3QUFBUU1DQlFNQUFBUUhCd0FFQUFZRUFBQUFBQU1HRWdNREF3a0FCd2dsQWdBQUFBVUZCUUFIQXdBQ0JRTUFCUVVBQlFRRkJRTU1DQUFEUWdnTURBVURBQUVKQUFZR0FBTURCQU1CQkFBRERBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBTEFBQUxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVCZ1lBQUFBSUNRTUJCUU1CQXdBRkF3TURBd1VGQndrQUNBc0pCd01BQUFNREFBRURBQUVEQXdBQUFRTUFBUW9BQmdzQ0N3VUNBd0FCQXdBQkF3TUFCZ1lDQXdzREF3TUJBUU1CQVFJQkFRQUFBUUFCQXdNQkFRTUdBQU1CQVFFQkF3TUJBd01MQXdFQkFnRUJBUUVDQUFNREFRRUNBQU1EQVFFQUFnTURBUUVDQXdNQkFRQUNBd01CQVFJREF3RUJBQUlEQXdFQkFnTURBUUVBQWdNREFRRUNBd01CQVFBQ0F3TUJBUUlEQXdFQkFBSURBUUVDQXdNQkFRSUFBd01CQVFJREF3RUJBZ0FNQXdFQkFnTURBUUVDQXdBREFRRUNBd01CQVFJQUF3TUJBUUlEQXdFQkFBSURBd0VCQWdNREFRQUJBZ01EQVFFQ0F3TUJBQVlCQWdBREF3RUJBZ01BQXdFQkFnTURBUUVDQXdBREFRRUNCZ01EQVFFQ0FBTURBUUVDQXdNQkFRSUFBd01CQVFJREF3RUJBZ0FEQXdFQkFnTURBUUVDQUFNQkJnSUJBZ01EQVFFQUFnTURBUUVDQXdNQkFRQUNBd01CQVFJREF3RUJBQUlEQXdFQkFnTURBUUVBQWdNREFRRUNCQU1EQVFBQkFnTUJBUUlEQXdFQkFBSURBUUVDQXdNQkF3QURBUUFCQVFNREFRRUJBQUVHQWdnRkRBVUNBQVlEQlFJTEJBa0FCQVVEQWdZRkJnSUZBQUlGQlFZQ0JnQUFCUU1HQlFNREF3WUZBUU1EQlFjQ0FRVUZCUVFFQkFRRUFRUUFBQUFBQUFBQUFBQUJBQUFBQUFBQUFBQUFBQUlBQUFBQUN3QUxBQUFBQWdBQUFnQUFBQUFBQUFBQ0FBQUFBQUFBQUFBQUFBQUNBQUFBQUFBQUFBQUFBQUlDQXdVRUF3SUNBZ0lEQXdvR0J3UUVCd01DQkFRQUFBQUZBZ0lCQlFJQ0FBUURBQUlBQUFBQUN3QUFBQUFBQVFBQUFBQUFBQUFBQUFBQkFBQUFBQUFBQUFBQUFBSUFBQUFBQUFBTEFBc0FBUUFBQUFBQUFBQUFBQUFBQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCRUJGZ0VSQXdNRkFRQUNCQUFBQkFRRkJBSUZCQVFDQWdjRUFRUUFBQUFBQlJJQUNRRUVBQUFBQUFFQ0JRSUJCUVVDQWdJQUFnSUJBZ0lDQWdjSEFBUUNCQVVGQkFRSEJ3UUFCd0lDQWdJQ0FnSUNBUU1DQWdJRUJRSUJBZ0lGQlFVQ0FnQUJEQVlBQUFBQUFBc0FBQUFBQUFFQUFBQUFBQUFNREFBQUNBd0lBd0lNQXdNQUFBQUFCQUFBQUFBSUJRRUNCUU1CQ1FFQ0JRTUJCZ2dCQWdVREFRRUNCUU1CQmdFQ0F3TUJBUUlEQXdFRUFRSURBd0VEQVFZQkFnVURBUUVDQlFNQUFRWUJBZ1VEQVFFQ0JRTUJBUUlGQXdFREF3TURBQUVEQXdFQUF3TUJBZ0VCQXdBRENRTUJCZ0lCQWdBR0NBUUFEZ1lBQWc0R0FBSU9CZ0FDQWdJREF3QUNBd0FDQVFBQ0FnQUFBQUFBQUFzQUFBQUFBQUFBQUFBQUFBQUlCUUFGQUFnQUFBQUVBUVlBQkFBRUJBTUpBQUVEQWdnRkRBVUFCbzBCQkFBQUFBQUFHUXNBQUFBQUFBQUFBQUFCQUFBRUFnQUNBZ0FaQUFFQUFBQUFHUUVBQVFBQkFBRUJCd1FCQUFFQUFRQUJBUVlFR1FBQkFnTUNCZ0VDQXhrQkJBTUVBQUVBQVJrRUFBRUJBUUFCQUFBQkFBRUFBUUFBQUFBREF3VUFCQUFBQkFBRUFRb0VBQVFEQXdNREF3WUJCUU1EQXdNRUF3QUFBQUFBQ3dBQUFBQUFBQUFBQUFBQUFBQURBd0lIQVFJQ0J3QUJBUUlDQndjUEZ4Y0NBQUlDQVFFREFBRUFBd01IQWdFQ0FnRUNBQThYRndJQ0FnRUFBUUVEQXdjQ0FRSUNBUUVDRHhjWEFnSUNBUUFCRGdFQUF3TUpBUUlKQXdFQUFRSUhBd0VCQWdjREFRQUZBZ0lKQlFvQ0JRQURCZ1lHQXdNR0JRTUJCUVFBQUFBRUJBQUFCZ29FQUFrRUFBUUpDUUFIQUFVQ0F3QUNBZ0FBQWdBQ0FBUUlCUUlGQUFNREFnSUFBQUlWQVFBRUJnZ0hDQWtBQkFjSUJ3SU1Cd0FKQ2dJSkNBY0pCQUFBQUFBQUN3QUFBQUFBQUFBQUFBQUFBd0FEQUFRQkF3TUZCZ01NQlFNRkJRUUFBQUFBQUFRQkFBQUFBd1FBQUFBREF3TURCQVVIQWdRQUFBQUJFUkVXQVFFREJRSUVCQVFkQlFFWkFnSUNBUUFBQUFBRUJnY0FBZ1FHQXdNWkFCa01EQUFMQUFJWkFBQUFBd1lHQXdRQUFBQUdBd01DQkFZQkNBVURBd2NEQWdJRUFBQUFBd01BQWdRQUFBQUtCUVVGQlFVRUFnb0hCd1lFQkFRQUFBQUFBQXNBQUFBQUFBQUFBQUFBQUFVQ0FnSUJCQVlFQUFNQUJBWUFCd0FBQUFBQUN3QUFBQUFBQUFBQUFBQUFBZ1VDQWdBRUJRVUFCUUVHQkFFREJRQURBQUFBQVFBQUN3QUFBQUFBQUFBQUFBQUFBQUlDQWc0R0F3TUZCUU1DQVFNRkF3TUlCQU1CQkFVRkJUSUFGQU1GQlFJREFRVUJBZ2dMQXdFREF3TURBZ01EQXdNREFBQUFBZ0FBQUFzQUFBQUFBQUFEQUFBQUFBQUJBQUVBQUFBQUFBa0VBQUVBQUFFQUFBY0VCZ01DQWdVSE53d0NBd01DTnd3SUF3TUpDQUlEQXdJSUJnVUJBUklHQUFFQkFBZ0VBQUFBQUFBQUN3QUZDUVFBQUFVRUFBTUVBQUFBQUFBQUFCUUJId1VNS2dnREFBQURBQU1BQlFRQUFBQUJBd0lFQXdFREF3RURBQVlGQWdJQ0FBQURBUWNBQUFBREF3TUJBQUVEQXdrQkFRSURBUUVDQXdFQ0FRSUZBd0VJQXdNK0FoOEVCQWtFQVFBR2pnRUFBQVVGQWdNQUFBQUFBQUVFQndFRkJRVUFBRDRGQUFNVEF3TUZEaE1EQUFJQUFBQUFDd0VERkJRVUZCUURBd1VVQlFBQkFBRUFBQUErVWdZRENBQU1Bd1VBQ0FZTUFBQUFDUW9CQUFBQUFBQUFBQVlDQmdjRUFBQUFBQUFIQ1JNbUpnSUhqd0dRQVFBQUFBTUFBd1VGQkFBQUFBTUVBZ2NTQXdjQUJBSUFBQUNSQVFNR0ZRZ0ZDQUEwTkFjREJKSUJCZ01OQUFZQUFBQUFBd2NBQUFZRlNBTXFBQWFUQVFZQUFBQXlSQUFEQVFVSkNRQU1BUUFKTEFjR0FEQUFBQUFBQUFFQkJBQURBZ1FFQUFRQUFBQUZDZ0FBQUFBQUJ3VUFMUVVCQUFBQUFRUUZCUWtGQlFRQUFBQUVBQVFBQmdNRkFnQUFMQ3dHQXdBQUFBQURGQUFIQmdBcUFBQUFBQU1BQUFBVUJBQUFBQ1lIS1FVR0FBUUFBUU1EQXdBREFBSUpCQWtDQVFjREFnSUNCZ01BQlFnTUJnSUhBd0lCQXdNQUFnSURBQVFHQXdBSEFnVUZCZ1VIQWdFQUJBVUZCQUlEQXdRQUJRa0JBd01EQkFBRURnUVRCUUFDQkV1VUFRTUZBUU1BQUFjSEJ3a1JEZ0lCQWdRQkJBSUJCQUlDQWdJQ0JRRVdBd1VCRVJFQkJRRUFCUVVCQXdNRUFRVURBZ0FGQVFZQkV3VUZBaFFCQVFVQkFRUUNBZ0VGQWdJRkF3TURCZ1FPQVFBUkVSRUZBQVVBQkFRRUJBRUVBQUVPQVFFQ0FBUUFDd0FBRGdFQkJ3RXpPQWdCRndBSkFBQUFCUVFBQ1FZRkF3SUhDQUVMQkFjQmNBSGZPZDg1QlFjQkFZQUVnSUFDQmcwQ2Z3RkI4TTh4QzM4QlFRQUxCMUlPQW1WaUFnQUNabUlBc3owQ1oySUFzajBDYUdJQkFBSnBZZ0J3QW1waUFJc0JBbXRpQUlzRUFteGlBS3dQQW0xaUFPa2FBbTVpQU9RWEFtOWlBT01YQW5CaUFQOFhBbkZpQUlBWUFuSm