{"version":3,"file":"static/chunks/13c605fd-c823fe6d3bd16aae.js","mappings":"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","sources":["webpack://_N_E/./node_modules/supplemental-page-content/dist/index.js","webpack://_N_E/<anon>"],"sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.util = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n},{}],2:[function(require,module,exports){\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],3:[function(require,module,exports){\n(function (process){(function (){\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n var has = require('./lib/has');\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (process.env.NODE_ENV !== 'production') {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"./lib/ReactPropTypesSecret\":7,\"./lib/has\":8,\"_process\":2}],4:[function(require,module,exports){\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n\n},{\"./lib/ReactPropTypesSecret\":7}],5:[function(require,module,exports){\n(function (process){(function (){\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactIs = require('react-is');\nvar assign = require('object-assign');\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\nvar has = require('./lib/has');\nvar checkPropTypes = require('./checkPropTypes');\n\nvar printWarning = function() {};\n\nif (process.env.NODE_ENV !== 'production') {\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nmodule.exports = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<<anonymous>>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bigint: createPrimitiveTypeChecker('bigint'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message, data) {\n this.message = message;\n this.data = data && typeof data === 'object' ? data: {};\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n if (process.env.NODE_ENV !== 'production') {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use `PropTypes.checkPropTypes()` to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'),\n {expectedType: expectedType}\n );\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!ReactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n if (process.env.NODE_ENV !== 'production') {\n if (arguments.length > 1) {\n printWarning(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n process.env.NODE_ENV !== 'production' ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : void 0;\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var expectedTypes = [];\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret);\n if (checkerResult == null) {\n return null;\n }\n if (checkerResult.data && has(checkerResult.data, 'expectedType')) {\n expectedTypes.push(checkerResult.data.expectedType);\n }\n }\n var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': '';\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function invalidValidatorError(componentName, location, propFullName, key, type) {\n return new PropTypeError(\n (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.'\n );\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from props.\n var allKeys = assign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (has(shapeTypes, key) && typeof checker !== 'function') {\n return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker));\n }\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes;\n ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"./checkPropTypes\":3,\"./lib/ReactPropTypesSecret\":7,\"./lib/has\":8,\"_process\":2,\"object-assign\":1,\"react-is\":11}],6:[function(require,module,exports){\n(function (process){(function (){\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"./factoryWithThrowingShims\":4,\"./factoryWithTypeCheckers\":5,\"_process\":2,\"react-is\":11}],7:[function(require,module,exports){\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n},{}],8:[function(require,module,exports){\nmodule.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n\n},{}],9:[function(require,module,exports){\n(function (process){(function (){\n/** @license React v16.13.1\n * react-is.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\n// (unstable) APIs that have been removed. Can we remove the symbols?\n\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n\n default:\n return $$typeof;\n }\n\n }\n\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n} // AsyncMode is deprecated along with isAsyncMode\n\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\nvar hasWarnedAboutDeprecatedIsAsyncMode = false; // AsyncMode should be deprecated\n\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true; // Using console['warn'] to evade Babel and ESLint\n\n console['warn']('The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\nexports.isValidElementType = isValidElementType;\nexports.typeOf = typeOf;\n })();\n}\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"_process\":2}],10:[function(require,module,exports){\n/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n\n},{}],11:[function(require,module,exports){\n(function (process){(function (){\n'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"./cjs/react-is.development.js\":9,\"./cjs/react-is.production.min.js\":10,\"_process\":2}],12:[function(require,module,exports){\n(function (process){(function (){\n/** @license React v16.14.0\n * react.development.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar _assign = require('object-assign');\nvar checkPropTypes = require('prop-types/checkPropTypes');\n\nvar ReactVersion = '16.14.0';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace; // TODO: We don't use AsyncMode or ConcurrentMode anymore. They were temporary\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = hasSymbol ? Symbol.for('react.suspense_list') : 0xead8;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\nvar REACT_BLOCK_TYPE = hasSymbol ? Symbol.for('react.block') : 0xead9;\nvar REACT_FUNDAMENTAL_TYPE = hasSymbol ? Symbol.for('react.fundamental') : 0xead5;\nvar REACT_RESPONDER_TYPE = hasSymbol ? Symbol.for('react.responder') : 0xead6;\nvar REACT_SCOPE_TYPE = hasSymbol ? Symbol.for('react.scope') : 0xead7;\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\n/**\n * Keeps track of the current dispatcher.\n */\nvar ReactCurrentDispatcher = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\n/**\n * Keeps track of the current batch's configuration such as how long an update\n * should suspend for if it needs to.\n */\nvar ReactCurrentBatchConfig = {\n suspense: null\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\nvar BEFORE_SLASH_RE = /^(.*)[\\\\\\/]/;\nfunction describeComponentFrame (name, source, ownerName) {\n var sourceInfo = '';\n\n if (source) {\n var path = source.fileName;\n var fileName = path.replace(BEFORE_SLASH_RE, '');\n\n {\n // In DEV, include code for a common special case:\n // prefer \"folder/index.js\" instead of just \"index.js\".\n if (/^index\\./.test(fileName)) {\n var match = path.match(BEFORE_SLASH_RE);\n\n if (match) {\n var pathBeforeSlash = match[1];\n\n if (pathBeforeSlash) {\n var folderName = pathBeforeSlash.replace(BEFORE_SLASH_RE, '');\n fileName = folderName + '/' + fileName;\n }\n }\n }\n }\n\n sourceInfo = ' (at ' + fileName + ':' + source.lineNumber + ')';\n } else if (ownerName) {\n sourceInfo = ' (created by ' + ownerName + ')';\n }\n\n return '\\n in ' + (name || 'Unknown') + sourceInfo;\n}\n\nvar Resolved = 1;\nfunction refineResolvedLazyComponent(lazyComponent) {\n return lazyComponent._status === Resolved ? lazyComponent._result : null;\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var functionName = innerType.displayName || innerType.name || '';\n return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getComponentName(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n return 'Context.Consumer';\n\n case REACT_PROVIDER_TYPE:\n return 'Context.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n return getComponentName(type.type);\n\n case REACT_BLOCK_TYPE:\n return getComponentName(type.render);\n\n case REACT_LAZY_TYPE:\n {\n var thenable = type;\n var resolvedThenable = refineResolvedLazyComponent(thenable);\n\n if (resolvedThenable) {\n return getComponentName(resolvedThenable);\n }\n\n break;\n }\n }\n }\n\n return null;\n}\n\nvar ReactDebugCurrentFrame = {};\nvar currentlyValidatingElement = null;\nfunction setCurrentlyValidatingElement(element) {\n {\n currentlyValidatingElement = element;\n }\n}\n\n{\n // Stack implementation injected by the current renderer.\n ReactDebugCurrentFrame.getCurrentStack = null;\n\n ReactDebugCurrentFrame.getStackAddendum = function () {\n var stack = ''; // Add an extra top frame while an element is being validated\n\n if (currentlyValidatingElement) {\n var name = getComponentName(currentlyValidatingElement.type);\n var owner = currentlyValidatingElement._owner;\n stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner.type));\n } // Delegate to the injected renderer-specific implementation\n\n\n var impl = ReactDebugCurrentFrame.getCurrentStack;\n\n if (impl) {\n stack += impl() || '';\n }\n\n return stack;\n };\n}\n\n/**\n * Used by act() to track whether you're inside an act() scope.\n */\nvar IsSomeRendererActing = {\n current: false\n};\n\nvar ReactSharedInternals = {\n ReactCurrentDispatcher: ReactCurrentDispatcher,\n ReactCurrentBatchConfig: ReactCurrentBatchConfig,\n ReactCurrentOwner: ReactCurrentOwner,\n IsSomeRendererActing: IsSomeRendererActing,\n // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n assign: _assign\n};\n\n{\n _assign(ReactSharedInternals, {\n // These should not be included in production.\n ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n // TODO: remove in React 17.0.\n ReactComponentTreeHook: {}\n });\n}\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n}\nfunction error(format) {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var hasExistingStack = args.length > 0 && typeof args[args.length - 1] === 'string' && args[args.length - 1].indexOf('\\n in') === 0;\n\n if (!hasExistingStack) {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n }\n }\n\n var argsWithFormat = args.map(function (item) {\n return '' + item;\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n throw new Error(message);\n } catch (x) {}\n }\n}\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n {\n var _constructor = publicInstance.constructor;\n var componentName = _constructor && (_constructor.displayName || _constructor.name) || 'ReactClass';\n var warningKey = componentName + \".\" + callerName;\n\n if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n return;\n }\n\n error(\"Can't call %s on a component that is not yet mounted. \" + 'This is a no-op, but it might indicate a bug in your application. ' + 'Instead, assign to `this.state` directly or define a `state = {};` ' + 'class property with the desired state in the %s component.', callerName, componentName);\n\n didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n }\n}\n/**\n * This is the abstract API for an update queue.\n */\n\n\nvar ReactNoopUpdateQueue = {\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance, callback, callerName) {\n warnNoop(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n warnNoop(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} Name of the calling function in the public API.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n warnNoop(publicInstance, 'setState');\n }\n};\n\nvar emptyObject = {};\n\n{\n Object.freeze(emptyObject);\n}\n/**\n * Base class helpers for the updating state of a component.\n */\n\n\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context; // If a component has string refs, we will assign a different object later.\n\n this.refs = emptyObject; // We initialize the default updater but the real one gets injected by the\n // renderer.\n\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\n\nComponent.prototype.setState = function (partialState, callback) {\n if (!(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)) {\n {\n throw Error( \"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\" );\n }\n }\n\n this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\n\n\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n\n\n{\n var deprecatedAPIs = {\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n };\n\n var defineDeprecationWarning = function (methodName, info) {\n Object.defineProperty(Component.prototype, methodName, {\n get: function () {\n warn('%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n\n return undefined;\n }\n });\n };\n\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\nfunction ComponentDummy() {}\n\nComponentDummy.prototype = Component.prototype;\n/**\n * Convenience component with default shallow equality check for sCU.\n */\n\nfunction PureComponent(props, context, updater) {\n this.props = props;\n this.context = context; // If a component has string refs, we will assign a different object later.\n\n this.refs = emptyObject;\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent; // Avoid an extra prototype jump for these methods.\n\n_assign(pureComponentPrototype, Component.prototype);\n\npureComponentPrototype.isPureReactComponent = true;\n\n// an immutable object with a single mutable value\nfunction createRef() {\n var refObject = {\n current: null\n };\n\n {\n Object.seal(refObject);\n }\n\n return refObject;\n}\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\nvar specialPropKeyWarningShown, specialPropRefWarningShown, didWarnAboutStringRefs;\n\n{\n didWarnAboutStringRefs = {};\n}\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n\n return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n var warnAboutAccessingKey = function () {\n {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n\n error('%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n }\n }\n };\n\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n var warnAboutAccessingRef = function () {\n {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n\n error('%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n }\n }\n };\n\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n}\n\nfunction warnIfStringRefCannotBeAutoConverted(config) {\n {\n if (typeof config.ref === 'string' && ReactCurrentOwner.current && config.__self && ReactCurrentOwner.current.stateNode !== config.__self) {\n var componentName = getComponentName(ReactCurrentOwner.current.type);\n\n if (!didWarnAboutStringRefs[componentName]) {\n error('Component \"%s\" contains the string ref \"%s\". ' + 'Support for string refs will be removed in a future major release. ' + 'This case cannot be automatically converted to an arrow function. ' + 'We ask you to manually fix this case by using useRef() or createRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://fb.me/react-strict-mode-string-ref', getComponentName(ReactCurrentOwner.current.type), config.ref);\n\n didWarnAboutStringRefs[componentName] = true;\n }\n }\n }\n}\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, instanceof check\n * will not work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} props\n * @param {*} key\n * @param {string|object} ref\n * @param {*} owner\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @internal\n */\n\n\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allows us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {}; // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n }); // self and source are DEV only properties.\n\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n }); // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\n\nfunction createElement(type, config, children) {\n var propName; // Reserved names are extracted\n\n var props = {};\n var key = null;\n var ref = null;\n var self = null;\n var source = null;\n\n if (config != null) {\n if (hasValidRef(config)) {\n ref = config.ref;\n\n {\n warnIfStringRefCannotBeAutoConverted(config);\n }\n }\n\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n self = config.__self === undefined ? null : config.__self;\n source = config.__source === undefined ? null : config.__source; // Remaining properties are added to a new props object\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n } // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n\n\n var childrenLength = arguments.length - 2;\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n\n {\n if (Object.freeze) {\n Object.freeze(childArray);\n }\n }\n\n props.children = childArray;\n } // Resolve default props\n\n\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n\n {\n if (key || ref) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n }\n\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\nfunction cloneAndReplaceKey(oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n return newElement;\n}\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\n\nfunction cloneElement(element, config, children) {\n if (!!(element === null || element === undefined)) {\n {\n throw Error( \"React.cloneElement(...): The argument must be a React element, but you passed \" + element + \".\" );\n }\n }\n\n var propName; // Original props are copied\n\n var props = _assign({}, element.props); // Reserved names are extracted\n\n\n var key = element.key;\n var ref = element.ref; // Self is preserved since the owner is preserved.\n\n var self = element._self; // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n\n var source = element._source; // Owner will be preserved, unless ref is overridden\n\n var owner = element._owner;\n\n if (config != null) {\n if (hasValidRef(config)) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n\n if (hasValidKey(config)) {\n key = '' + config.key;\n } // Remaining properties override existing props\n\n\n var defaultProps;\n\n if (element.type && element.type.defaultProps) {\n defaultProps = element.type.defaultProps;\n }\n\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n if (config[propName] === undefined && defaultProps !== undefined) {\n // Resolve default props\n props[propName] = defaultProps[propName];\n } else {\n props[propName] = config[propName];\n }\n }\n }\n } // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n\n\n var childrenLength = arguments.length - 2;\n\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a ReactElement.\n * @final\n */\n\nfunction isValidElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\n\nfunction escape(key) {\n var escapeRegex = /[=:]/g;\n var escaperLookup = {\n '=': '=0',\n ':': '=2'\n };\n var escapedString = ('' + key).replace(escapeRegex, function (match) {\n return escaperLookup[match];\n });\n return '$' + escapedString;\n}\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\n\nvar didWarnAboutMaps = false;\nvar userProvidedKeyEscapeRegex = /\\/+/g;\n\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\nvar POOL_SIZE = 10;\nvar traverseContextPool = [];\n\nfunction getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n if (traverseContextPool.length) {\n var traverseContext = traverseContextPool.pop();\n traverseContext.result = mapResult;\n traverseContext.keyPrefix = keyPrefix;\n traverseContext.func = mapFunction;\n traverseContext.context = mapContext;\n traverseContext.count = 0;\n return traverseContext;\n } else {\n return {\n result: mapResult,\n keyPrefix: keyPrefix,\n func: mapFunction,\n context: mapContext,\n count: 0\n };\n }\n}\n\nfunction releaseTraverseContext(traverseContext) {\n traverseContext.result = null;\n traverseContext.keyPrefix = null;\n traverseContext.func = null;\n traverseContext.context = null;\n traverseContext.count = 0;\n\n if (traverseContextPool.length < POOL_SIZE) {\n traverseContextPool.push(traverseContext);\n }\n}\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n var invokeCallback = false;\n\n if (children === null) {\n invokeCallback = true;\n } else {\n switch (type) {\n case 'string':\n case 'number':\n invokeCallback = true;\n break;\n\n case 'object':\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = true;\n }\n\n }\n }\n\n if (invokeCallback) {\n callback(traverseContext, children, // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows.\n nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getComponentKey(child, i);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n\n if (typeof iteratorFn === 'function') {\n\n {\n // Warn about using Maps as children\n if (iteratorFn === children.entries) {\n if (!didWarnAboutMaps) {\n warn('Using Maps as children is deprecated and will be removed in ' + 'a future major release. Consider converting children to ' + 'an array of keyed ReactElements instead.');\n }\n\n didWarnAboutMaps = true;\n }\n }\n\n var iterator = iteratorFn.call(children);\n var step;\n var ii = 0;\n\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getComponentKey(child, ii++);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else if (type === 'object') {\n var addendum = '';\n\n {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n }\n\n var childrenString = '' + children;\n\n {\n {\n throw Error( \"Objects are not valid as a React child (found: \" + (childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString) + \").\" + addendum );\n }\n }\n }\n }\n\n return subtreeCount;\n}\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\n\n\nfunction traverseAllChildren(children, callback, traverseContext) {\n if (children == null) {\n return 0;\n }\n\n return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\n\n\nfunction getComponentKey(component, index) {\n // Do some typechecking here since we call this blindly. We want to ensure\n // that we don't block potential future ES APIs.\n if (typeof component === 'object' && component !== null && component.key != null) {\n // Explicit key\n return escape(component.key);\n } // Implicit key determined by the index in the set\n\n\n return index.toString(36);\n}\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n var func = bookKeeping.func,\n context = bookKeeping.context;\n func.call(context, child, bookKeeping.count++);\n}\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenforeach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\n\n\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n if (children == null) {\n return children;\n }\n\n var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n traverseAllChildren(children, forEachSingleChild, traverseContext);\n releaseTraverseContext(traverseContext);\n}\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n var result = bookKeeping.result,\n keyPrefix = bookKeeping.keyPrefix,\n func = bookKeeping.func,\n context = bookKeeping.context;\n var mappedChild = func.call(context, child, bookKeeping.count++);\n\n if (Array.isArray(mappedChild)) {\n mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, function (c) {\n return c;\n });\n } else if (mappedChild != null) {\n if (isValidElement(mappedChild)) {\n mappedChild = cloneAndReplaceKey(mappedChild, // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n }\n\n result.push(mappedChild);\n }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n var escapedPrefix = '';\n\n if (prefix != null) {\n escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n }\n\n var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n releaseTraverseContext(traverseContext);\n}\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenmap\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\n\n\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n return result;\n}\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrencount\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\n\n\nfunction countChildren(children) {\n return traverseAllChildren(children, function () {\n return null;\n }, null);\n}\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrentoarray\n */\n\n\nfunction toArray(children) {\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, function (child) {\n return child;\n });\n return result;\n}\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#reactchildrenonly\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\n\n\nfunction onlyChild(children) {\n if (!isValidElement(children)) {\n {\n throw Error( \"React.Children.only expected to receive a single React element child.\" );\n }\n }\n\n return children;\n}\n\nfunction createContext(defaultValue, calculateChangedBits) {\n if (calculateChangedBits === undefined) {\n calculateChangedBits = null;\n } else {\n {\n if (calculateChangedBits !== null && typeof calculateChangedBits !== 'function') {\n error('createContext: Expected the optional second argument to be a ' + 'function. Instead received: %s', calculateChangedBits);\n }\n }\n }\n\n var context = {\n $$typeof: REACT_CONTEXT_TYPE,\n _calculateChangedBits: calculateChangedBits,\n // As a workaround to support multiple concurrent renderers, we categorize\n // some renderers as primary and others as secondary. We only expect\n // there to be two concurrent renderers at most: React Native (primary) and\n // Fabric (secondary); React DOM (primary) and React ART (secondary).\n // Secondary renderers store their context values on separate fields.\n _currentValue: defaultValue,\n _currentValue2: defaultValue,\n // Used to track how many concurrent renderers this context currently\n // supports within in a single renderer. Such as parallel server rendering.\n _threadCount: 0,\n // These are circular\n Provider: null,\n Consumer: null\n };\n context.Provider = {\n $$typeof: REACT_PROVIDER_TYPE,\n _context: context\n };\n var hasWarnedAboutUsingNestedContextConsumers = false;\n var hasWarnedAboutUsingConsumerProvider = false;\n\n {\n // A separate object, but proxies back to the original context object for\n // backwards compatibility. It has a different $$typeof, so we can properly\n // warn for the incorrect usage of Context as a Consumer.\n var Consumer = {\n $$typeof: REACT_CONTEXT_TYPE,\n _context: context,\n _calculateChangedBits: context._calculateChangedBits\n }; // $FlowFixMe: Flow complains about not setting a value, which is intentional here\n\n Object.defineProperties(Consumer, {\n Provider: {\n get: function () {\n if (!hasWarnedAboutUsingConsumerProvider) {\n hasWarnedAboutUsingConsumerProvider = true;\n\n error('Rendering <Context.Consumer.Provider> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Provider> instead?');\n }\n\n return context.Provider;\n },\n set: function (_Provider) {\n context.Provider = _Provider;\n }\n },\n _currentValue: {\n get: function () {\n return context._currentValue;\n },\n set: function (_currentValue) {\n context._currentValue = _currentValue;\n }\n },\n _currentValue2: {\n get: function () {\n return context._currentValue2;\n },\n set: function (_currentValue2) {\n context._currentValue2 = _currentValue2;\n }\n },\n _threadCount: {\n get: function () {\n return context._threadCount;\n },\n set: function (_threadCount) {\n context._threadCount = _threadCount;\n }\n },\n Consumer: {\n get: function () {\n if (!hasWarnedAboutUsingNestedContextConsumers) {\n hasWarnedAboutUsingNestedContextConsumers = true;\n\n error('Rendering <Context.Consumer.Consumer> is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');\n }\n\n return context.Consumer;\n }\n }\n }); // $FlowFixMe: Flow complains about missing properties because it doesn't understand defineProperty\n\n context.Consumer = Consumer;\n }\n\n {\n context._currentRenderer = null;\n context._currentRenderer2 = null;\n }\n\n return context;\n}\n\nfunction lazy(ctor) {\n var lazyType = {\n $$typeof: REACT_LAZY_TYPE,\n _ctor: ctor,\n // React uses these fields to store the result.\n _status: -1,\n _result: null\n };\n\n {\n // In production, this would just set it on the object.\n var defaultProps;\n var propTypes;\n Object.defineProperties(lazyType, {\n defaultProps: {\n configurable: true,\n get: function () {\n return defaultProps;\n },\n set: function (newDefaultProps) {\n error('React.lazy(...): It is not supported to assign `defaultProps` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n defaultProps = newDefaultProps; // Match production behavior more closely:\n\n Object.defineProperty(lazyType, 'defaultProps', {\n enumerable: true\n });\n }\n },\n propTypes: {\n configurable: true,\n get: function () {\n return propTypes;\n },\n set: function (newPropTypes) {\n error('React.lazy(...): It is not supported to assign `propTypes` to ' + 'a lazy component import. Either specify them where the component ' + 'is defined, or create a wrapping component around it.');\n\n propTypes = newPropTypes; // Match production behavior more closely:\n\n Object.defineProperty(lazyType, 'propTypes', {\n enumerable: true\n });\n }\n }\n });\n }\n\n return lazyType;\n}\n\nfunction forwardRef(render) {\n {\n if (render != null && render.$$typeof === REACT_MEMO_TYPE) {\n error('forwardRef requires a render function but received a `memo` ' + 'component. Instead of forwardRef(memo(...)), use ' + 'memo(forwardRef(...)).');\n } else if (typeof render !== 'function') {\n error('forwardRef requires a render function but was given %s.', render === null ? 'null' : typeof render);\n } else {\n if (render.length !== 0 && render.length !== 2) {\n error('forwardRef render functions accept exactly two parameters: props and ref. %s', render.length === 1 ? 'Did you forget to use the ref parameter?' : 'Any additional parameter will be undefined.');\n }\n }\n\n if (render != null) {\n if (render.defaultProps != null || render.propTypes != null) {\n error('forwardRef render functions do not support propTypes or defaultProps. ' + 'Did you accidentally pass a React component?');\n }\n }\n }\n\n return {\n $$typeof: REACT_FORWARD_REF_TYPE,\n render: render\n };\n}\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' || // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_FUNDAMENTAL_TYPE || type.$$typeof === REACT_RESPONDER_TYPE || type.$$typeof === REACT_SCOPE_TYPE || type.$$typeof === REACT_BLOCK_TYPE);\n}\n\nfunction memo(type, compare) {\n {\n if (!isValidElementType(type)) {\n error('memo: The first argument must be a component. Instead ' + 'received: %s', type === null ? 'null' : typeof type);\n }\n }\n\n return {\n $$typeof: REACT_MEMO_TYPE,\n type: type,\n compare: compare === undefined ? null : compare\n };\n}\n\nfunction resolveDispatcher() {\n var dispatcher = ReactCurrentDispatcher.current;\n\n if (!(dispatcher !== null)) {\n {\n throw Error( \"Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\\n1. You might have mismatching versions of React and the renderer (such as React DOM)\\n2. You might be breaking the Rules of Hooks\\n3. You might have more than one copy of React in the same app\\nSee https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.\" );\n }\n }\n\n return dispatcher;\n}\n\nfunction useContext(Context, unstable_observedBits) {\n var dispatcher = resolveDispatcher();\n\n {\n if (unstable_observedBits !== undefined) {\n error('useContext() second argument is reserved for future ' + 'use in React. Passing it is not supported. ' + 'You passed: %s.%s', unstable_observedBits, typeof unstable_observedBits === 'number' && Array.isArray(arguments[2]) ? '\\n\\nDid you call array.map(useContext)? ' + 'Calling Hooks inside a loop is not supported. ' + 'Learn more at https://fb.me/rules-of-hooks' : '');\n } // TODO: add a more generic warning for invalid values.\n\n\n if (Context._context !== undefined) {\n var realContext = Context._context; // Don't deduplicate because this legitimately causes bugs\n // and nobody should be using this in existing code.\n\n if (realContext.Consumer === Context) {\n error('Calling useContext(Context.Consumer) is not supported, may cause bugs, and will be ' + 'removed in a future major release. Did you mean to call useContext(Context) instead?');\n } else if (realContext.Provider === Context) {\n error('Calling useContext(Context.Provider) is not supported. ' + 'Did you mean to call useContext(Context) instead?');\n }\n }\n }\n\n return dispatcher.useContext(Context, unstable_observedBits);\n}\nfunction useState(initialState) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useState(initialState);\n}\nfunction useReducer(reducer, initialArg, init) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useReducer(reducer, initialArg, init);\n}\nfunction useRef(initialValue) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useRef(initialValue);\n}\nfunction useEffect(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useEffect(create, deps);\n}\nfunction useLayoutEffect(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useLayoutEffect(create, deps);\n}\nfunction useCallback(callback, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useCallback(callback, deps);\n}\nfunction useMemo(create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useMemo(create, deps);\n}\nfunction useImperativeHandle(ref, create, deps) {\n var dispatcher = resolveDispatcher();\n return dispatcher.useImperativeHandle(ref, create, deps);\n}\nfunction useDebugValue(value, formatterFn) {\n {\n var dispatcher = resolveDispatcher();\n return dispatcher.useDebugValue(value, formatterFn);\n }\n}\n\nvar propTypesMisspellWarningShown;\n\n{\n propTypesMisspellWarningShown = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n if (ReactCurrentOwner.current) {\n var name = getComponentName(ReactCurrentOwner.current.type);\n\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n\n return '';\n}\n\nfunction getSourceInfoErrorAddendum(source) {\n if (source !== undefined) {\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n\n return '';\n}\n\nfunction getSourceInfoErrorAddendumForProps(elementProps) {\n if (elementProps !== null && elementProps !== undefined) {\n return getSourceInfoErrorAddendum(elementProps.__source);\n }\n\n return '';\n}\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n\n\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n\n if (parentName) {\n info = \"\\n\\nCheck the top-level render call using <\" + parentName + \">.\";\n }\n }\n\n return info;\n}\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\n\n\nfunction validateExplicitKey(element, parentType) {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n\n element._store.validated = true;\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true; // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n\n var childOwner = '';\n\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n childOwner = \" It was passed a child from \" + getComponentName(element._owner.type) + \".\";\n }\n\n setCurrentlyValidatingElement(element);\n\n {\n error('Each child in a list should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.', currentComponentErrorInfo, childOwner);\n }\n\n setCurrentlyValidatingElement(null);\n}\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\n\n\nfunction validateChildKeys(node, parentType) {\n if (typeof node !== 'object') {\n return;\n }\n\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n}\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\n\n\nfunction validatePropTypes(element) {\n {\n var type = element.type;\n\n if (type === null || type === undefined || typeof type === 'string') {\n return;\n }\n\n var name = getComponentName(type);\n var propTypes;\n\n if (typeof type === 'function') {\n propTypes = type.propTypes;\n } else if (typeof type === 'object' && (type.$$typeof === REACT_FORWARD_REF_TYPE || // Note: Memo only checks outer props here.\n // Inner props are checked in the reconciler.\n type.$$typeof === REACT_MEMO_TYPE)) {\n propTypes = type.propTypes;\n } else {\n return;\n }\n\n if (propTypes) {\n setCurrentlyValidatingElement(element);\n checkPropTypes(propTypes, element.props, 'prop', name, ReactDebugCurrentFrame.getStackAddendum);\n setCurrentlyValidatingElement(null);\n } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true;\n\n error('Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n }\n\n if (typeof type.getDefaultProps === 'function' && !type.getDefaultProps.isReactClassApproved) {\n error('getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n }\n}\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\n\n\nfunction validateFragmentProps(fragment) {\n {\n setCurrentlyValidatingElement(fragment);\n var keys = Object.keys(fragment.props);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n\n if (key !== 'children' && key !== 'key') {\n error('Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.', key);\n\n break;\n }\n }\n\n if (fragment.ref !== null) {\n error('Invalid attribute `ref` supplied to `React.Fragment`.');\n }\n\n setCurrentlyValidatingElement(null);\n }\n}\nfunction createElementWithValidation(type, props, children) {\n var validType = isValidElementType(type); // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n\n if (!validType) {\n var info = '';\n\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendumForProps(props);\n\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n var typeString;\n\n if (type === null) {\n typeString = 'null';\n } else if (Array.isArray(type)) {\n typeString = 'array';\n } else if (type !== undefined && type.$$typeof === REACT_ELEMENT_TYPE) {\n typeString = \"<\" + (getComponentName(type.type) || 'Unknown') + \" />\";\n info = ' Did you accidentally export a JSX literal instead of a component?';\n } else {\n typeString = typeof type;\n }\n\n {\n error('React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', typeString, info);\n }\n }\n\n var element = createElement.apply(this, arguments); // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n\n if (element == null) {\n return element;\n } // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n\n\n if (validType) {\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], type);\n }\n }\n\n if (type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n}\nvar didWarnAboutDeprecatedCreateFactory = false;\nfunction createFactoryWithValidation(type) {\n var validatedFactory = createElementWithValidation.bind(null, type);\n validatedFactory.type = type;\n\n {\n if (!didWarnAboutDeprecatedCreateFactory) {\n didWarnAboutDeprecatedCreateFactory = true;\n\n warn('React.createFactory() is deprecated and will be removed in ' + 'a future major release. Consider using JSX ' + 'or use React.createElement() directly instead.');\n } // Legacy hook: remove it\n\n\n Object.defineProperty(validatedFactory, 'type', {\n enumerable: false,\n get: function () {\n warn('Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n\n Object.defineProperty(this, 'type', {\n value: type\n });\n return type;\n }\n });\n }\n\n return validatedFactory;\n}\nfunction cloneElementWithValidation(element, props, children) {\n var newElement = cloneElement.apply(this, arguments);\n\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], newElement.type);\n }\n\n validatePropTypes(newElement);\n return newElement;\n}\n\n{\n\n try {\n var frozenObject = Object.freeze({});\n var testMap = new Map([[frozenObject, null]]);\n var testSet = new Set([frozenObject]); // This is necessary for Rollup to not consider these unused.\n // https://github.com/rollup/rollup/issues/1771\n // TODO: we can remove these if Rollup fixes the bug.\n\n testMap.set(0, 0);\n testSet.add(0);\n } catch (e) {\n }\n}\n\nvar createElement$1 = createElementWithValidation ;\nvar cloneElement$1 = cloneElementWithValidation ;\nvar createFactory = createFactoryWithValidation ;\nvar Children = {\n map: mapChildren,\n forEach: forEachChildren,\n count: countChildren,\n toArray: toArray,\n only: onlyChild\n};\n\nexports.Children = Children;\nexports.Component = Component;\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.Profiler = REACT_PROFILER_TYPE;\nexports.PureComponent = PureComponent;\nexports.StrictMode = REACT_STRICT_MODE_TYPE;\nexports.Suspense = REACT_SUSPENSE_TYPE;\nexports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactSharedInternals;\nexports.cloneElement = cloneElement$1;\nexports.createContext = createContext;\nexports.createElement = createElement$1;\nexports.createFactory = createFactory;\nexports.createRef = createRef;\nexports.forwardRef = forwardRef;\nexports.isValidElement = isValidElement;\nexports.lazy = lazy;\nexports.memo = memo;\nexports.useCallback = useCallback;\nexports.useContext = useContext;\nexports.useDebugValue = useDebugValue;\nexports.useEffect = useEffect;\nexports.useImperativeHandle = useImperativeHandle;\nexports.useLayoutEffect = useLayoutEffect;\nexports.useMemo = useMemo;\nexports.useReducer = useReducer;\nexports.useRef = useRef;\nexports.useState = useState;\nexports.version = ReactVersion;\n })();\n}\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"_process\":2,\"object-assign\":1,\"prop-types/checkPropTypes\":3}],13:[function(require,module,exports){\n/** @license React v16.14.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var l=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.forward_ref\"):60112,y=n?Symbol.for(\"react.suspense\"):60113,z=n?Symbol.for(\"react.memo\"):60115,A=n?Symbol.for(\"react.lazy\"):\n60116,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function F(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}F.prototype.isReactComponent={};F.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(C(85));this.updater.enqueueSetState(this,a,b,\"setState\")};F.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction G(){}G.prototype=F.prototype;function H(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}var I=H.prototype=new G;I.constructor=H;l(I,F.prototype);I.isPureReactComponent=!0;var J={current:null},K=Object.prototype.hasOwnProperty,L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,c){var e,d={},g=null,k=null;if(null!=b)for(e in void 0!==b.ref&&(k=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)K.call(b,e)&&!L.hasOwnProperty(e)&&(d[e]=b[e]);var f=arguments.length-2;if(1===f)d.children=c;else if(1<f){for(var h=Array(f),m=0;m<f;m++)h[m]=arguments[m+2];d.children=h}if(a&&a.defaultProps)for(e in f=a.defaultProps,f)void 0===d[e]&&(d[e]=f[e]);return{$$typeof:p,type:a,key:g,ref:k,props:d,_owner:J.current}}\nfunction N(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,c,e){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=c;d.context=e;d.count=0;return d}return{result:a,keyPrefix:b,func:c,context:e,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,c,e){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return c(e,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var k=0;k<a.length;k++){d=a[k];var f=b+U(d,k);g+=T(d,f,c,e)}else if(null===a||\"object\"!==typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),k=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,k++),g+=T(d,f,c,e);else if(\"object\"===d)throw c=\"\"+a,Error(C(31,\"[object Object]\"===c?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":c,\"\"));return g}function V(a,b,c){return null==a?0:T(a,\"\",b,c)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function W(a,b){a.func.call(a.context,b,a.count++)}\nfunction aa(a,b,c){var e=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?X(a,e,c,function(a){return a}):null!=a&&(O(a)&&(a=N(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+c)),e.push(a))}function X(a,b,c,e,d){var g=\"\";null!=c&&(g=(\"\"+c).replace(P,\"$&/\")+\"/\");b=R(b,g,e,d);V(a,aa,b);S(b)}var Y={current:null};function Z(){var a=Y.current;if(null===a)throw Error(C(321));return a}\nvar ba={ReactCurrentDispatcher:Y,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:J,IsSomeRendererActing:{current:!1},assign:l};exports.Children={map:function(a,b,c){if(null==a)return a;var e=[];X(a,e,null,b,c);return e},forEach:function(a,b,c){if(null==a)return a;b=R(null,null,b,c);V(a,W,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];X(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(C(143));return a}};\nexports.Component=F;exports.Fragment=r;exports.Profiler=u;exports.PureComponent=H;exports.StrictMode=t;exports.Suspense=y;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ba;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(C(267,a));var e=l({},a.props),d=a.key,g=a.ref,k=a._owner;if(null!=b){void 0!==b.ref&&(g=b.ref,k=J.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var f=a.type.defaultProps;for(h in b)K.call(b,h)&&!L.hasOwnProperty(h)&&(e[h]=void 0===b[h]&&void 0!==f?f[h]:b[h])}var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){f=Array(h);for(var m=0;m<h;m++)f[m]=arguments[m+2];e.children=f}return{$$typeof:p,type:a.type,\nkey:d,ref:g,props:e,_owner:k}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:x,render:a}};exports.isValidElement=O;\nexports.lazy=function(a){return{$$typeof:A,_ctor:a,_status:-1,_result:null}};exports.memo=function(a,b){return{$$typeof:z,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return Z().useCallback(a,b)};exports.useContext=function(a,b){return Z().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return Z().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return Z().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return Z().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return Z().useMemo(a,b)};exports.useReducer=function(a,b,c){return Z().useReducer(a,b,c)};exports.useRef=function(a){return Z().useRef(a)};exports.useState=function(a){return Z().useState(a)};exports.version=\"16.14.0\";\n\n},{\"object-assign\":1}],14:[function(require,module,exports){\n(function (process){(function (){\n'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n\n}).call(this)}).call(this,require('_process'))\n\n},{\"./cjs/react.development.js\":12,\"./cjs/react.production.min.js\":13,\"_process\":2}],15:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar Privacy = function Privacy(props) {\n var domain = props.domain,\n isTrademarked = props.isTrademarked;\n\n var renderDomain = function renderDomain() {\n return /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, domain.replace('.com', ''), isTrademarked && /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"\\u2122\"));\n };\n\n return /*#__PURE__*/_react[\"default\"].createElement(_react[\"default\"].Fragment, null, /*#__PURE__*/_react[\"default\"].createElement(\"h2\", null, \"Privacy Policy\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, domain, /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), renderDomain(), \" Website\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Privacy Policy Last Updated: January 1 , 2020\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Summary\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Thank you for visiting the eLocal\\u2122 \", renderDomain(), \" website located at www.\", domain, \" (individually referred to as the \\\"Site\\\"). The Site is an Internet property of eLocal USA LLC (\\\"\", renderDomain(), \",\\\" \\\"we\\\" or \\\"us\\\"). The following \", renderDomain(), \"Website Privacy Policy (\\\"Privacy Policy\\\") sets forth our policy with respect to the collection, storage and use of your personal information and other information that we collect from you. \", /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Please note, if you are a resident of a European Union Member State (\\\"EU Resident\\\"), you are not permitted to use the Site and/or \", renderDomain(), \" Offerings (as defined below).\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", {\n className: \"disclaimer\"\n }, \"Users with disabilities who wish to access this Privacy Policy in an alternative format can contact us via contact form\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \" here\"), \"; by calling us at: (877) 913-5622; or by sending us mail to: eLocal.com | 1010 Spring Mill Ave | Suite 200 | Conshohocken, PA | 19428.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Background\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You agree to this Privacy Policy, in its entirety, when you: access the Site; utilize the \", renderDomain(), \" search directory (\\\"Directory Service\\\") in order to obtain Listings regarding a variety of businesses, professionals, venues, products and/or services (collectively, \\\"Third Party Offerings\\\") as offered and provided by the third party business entities and professionals featured on the Site (collectively, \\\"Third Party Service Providers\\\"); access articles, discussions and feedback on the \", renderDomain(), \" Home Expert Network (\\\"Home Expert Network\\\") and/or access other content on the Site (collectively, \\\"Content\\\"); utilize the Site's many interactive features designed to facilitate interaction between you, \", renderDomain(), \", the Ongoing Contributors and Expert Panelists participating in the Home Expert Network and other Site users including, but not limited to, blogs, comment sections, reviews and question and answer options located in designated areas of the Site (collectively, \\\"Interactive Services\\\"); register to submit a free Listing of your Third Party Offerings; register for Paid Advertiser Services in connection with promoting your Third Party Offerings as an Advertiser; and/or access links to our social media pages on third party social media websites, such as Facebook\\xAE and Twitter\\xAE (\\\"Social Media Pages,\\\" and together with the Site, Directory Services, Listings, Home Expert Network, Content, Interactive Services, Paid Advertiser Services and Social Media Pages, the \\\"\", renderDomain(), \" Offerings\\\").\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Capitalized terms not defined herein shall have the meaning set forth in the \", renderDomain(), \" Website Terms and Conditions (\\\"Terms and Conditions\\\").\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", {\n style: {\n textTransform: 'uppercase'\n }\n }, \"IF YOU DO NOT AGREE TO THIS PRIVACY POLICY IN ITS ENTIRETY, YOU MAY NOT ACCESS OR OTHERWISE USE THE \", renderDomain(), \" OFFERINGS.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Any use of the Directory Service by Site Users is not intended to, and will not create, an attorney-client relationship between any such Site Users and \", renderDomain(), \". Without limiting the foregoing, any information submitted to \", renderDomain(), \" and/or any electronic or other communication sent to \", renderDomain(), \" will not create, or be covered by, an attorney-client relationship between Site Users and \", renderDomain(), \".\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Your California Privacy Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Shine the Light.\"), \" If you are a resident of the State of California and would like to know how your \\\"personal information\\\" (as defined in the Shine the Light Law, Cal. Civ. Code \\xA7 1798.83) is shared with third parties, what categories of personal information that we have shared with third parties in the preceding year, as well as the names and addresses of those third parties, please contact us at: via contact form \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \"here\"), \" or eLocal.com | 1010 Spring Mill Ave | Suite 200 | Conshohocken, PA | 19428, Phone: 877-913-5622.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Further, if you are a resident of the State of California and would like to opt-out from the disclosure of your personal information to any third party for marketing purposes, please contact via contact form \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \"here\"), \" or eLocal.com | 1010 Spring Mill Ave | Suite 200 | Conshohocken, PA | 19428, Phone: 877-913-5622. Please be advised that where California State residents opt-out from permitting their personal information to be shared, such individuals may still receive selected offers directly from us, in accordance with applicable law.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"California Consumer Privacy Act of 2018 (\\\"CCPA\\\").\"), \" In addition to the foregoing, if you are a resident of the State of California certain other privacy-related rights may apply to you in accordance with the CCPA, including the right to opt-out of our sale of your personal information, as well as the right to know what personal information about you we have collected, whether your personal information was shared with third-parties in the preceding year and, if so, what categories of personal information were shared, as well as the categories of third parties with whom we shared that personal information. Please see our \\\"Provisions for California Residents\\\" \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#california\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \" for a more complete description of your rights under the CCPA as a California resident.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"quicklinks\"\n }, \"Privacy Policy Quick Links\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Below are links to key sections of our Privacy Policy:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", {\n className: \"undecorated\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#quicklinks\",\n \"data-delegate\": \"Privacy\"\n }, \"Privacy Policy Quick Links\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#nevada\",\n \"data-delegate\": \"Privacy\"\n }, \"Your Nevada Privacy Rights\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#personallyidentifiable\",\n \"data-delegate\": \"Privacy\"\n }, \"Personally Identifiable Information We Collect\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#sharinginfo\",\n \"data-delegate\": \"Privacy\"\n }, \"Use and Sharing of Personally Identifiable Information\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#nonpersonal\",\n \"data-delegate\": \"Privacy\"\n }, \"Non-Personal Information Collection and Use\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#behavioral\",\n \"data-delegate\": \"Privacy\"\n }, \"Behavioral Tracking/Do Not Track\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#security\",\n \"data-delegate\": \"Privacy\"\n }, \"Security of Your Personal Information\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#children\",\n \"data-delegate\": \"Privacy\"\n }, \"Children's Privacy\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#optout\",\n \"data-delegate\": \"Privacy\"\n }, \"Opt-Out/Unsubscribe\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#deleting\",\n \"data-delegate\": \"Privacy\"\n }, \"Deleting, Modifying and Updating Your Information\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#changes\",\n \"data-delegate\": \"Privacy\"\n }, \"Changes to this Privacy Policy\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#contactus\",\n \"data-delegate\": \"Privacy\"\n }, \"Contact Us\"))), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"nevada\"\n }, \"Your Nevada Privacy Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"If you are a resident of the State of Nevada and would like to opt-out from the disclosure of your personal information to any third party data broker, please contact us via contact form \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \"here\"), \" or eLocal.com | 1010 Spring Mill Ave | Suite 200 | Conshohocken, PA | 19428, Phone: 877-913-5622.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"personallyidentifiable\"\n }, \"Personally Identifiable Information We Collect\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We collect your personally identifiable information when you register on the Site in order to utilize the various \", renderDomain(), \" Offerings. \\xA0\", /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"We may also collect your personally identifiable information when you otherwise agree to the terms of this Privacy Policy, but do not complete the applicable registration process in full.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"The personally identifiable information that you must provide on the applicable Site Forms and/or in connection with your request for \", renderDomain(), \" Offerings may include, depending on the applicable \", renderDomain(), \" Offerings requested, all or some of the following: your first and last name; your e-mail address; your primary telephone number; your credit card information; the category applicable to your inquiry (where searching for a Listing); your company name; your company's address; your business telephone number; categories that apply to your company's business practice, if applicable; at your option, your mobile telephone number; at your option, your business profile and link to your company's website; any other information requested on the applicable Site Form. For purposes of this Privacy Policy, item (d) in the preceding sentence shall be considered \\\"Sensitive Information\\\".\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Consent to Call Recording\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"From time to time, when you call us, when we call you, or when we forward calls between users and thirty party businesses, we may record those calls for quality assurance and customer satisfaction purposes. We will notify you at the beginning of any and all calls that we record.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"sharinginfo\"\n }, \"Use and Sharing of Personally Identifiable Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Please see our Provisions for California Residents \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#california\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \" for additional details regarding how we use the personal information collected.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Other than as expressly provided for hereunder, \", renderDomain(), \" will never sell, rent, exchange or barter your personal information to or with any third party for financial gain or marketing purposes. By submitting your personal information on the Site, you agree that we may share such personal information (other than your Sensitive Information) with Third Party Service Providers that you request to be contacted by in order to complete your request for Third Party Offerings, and that the Third Party Service Providers may use such personal information for any lawful purposes, subject to any restrictions contained herein. Any information that you supply to any Third Party Service Provider shall be governed by the applicable Third Party Service Provider's privacy policy. \", /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Please be advised that \", renderDomain(), \" does not itself provide Third Party Offerings, or any other related products and/or services. The ultimate terms and conditions of any Third Party Offerings provided by any Third Party Service Providers will be determined by those Third Party Service Providers.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Where you register to access any of the \", renderDomain(), \" Offerings, we use the personal information that you make available to personalize your experience with the Site, facilitate the provision of the applicable \", renderDomain(), \" Offerings to you and for verification purposes. You also agree that we may contact you at any time, via e-mail or other means: with updates and/or any other information that we may deem appropriate for you to receive in connection with your continued use of the \", renderDomain(), \" Offerings; with information regarding third party products, services, offers and/or promotions that we think might be of interest to you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"If you wish to stop receiving future communications from us, please see the Opt-Out/Unsubscribe section \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#optout\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \".\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"By submitting your personal information in connection with the \", renderDomain(), \" Offerings, you agree that such act constitutes an inquiry and/or application for purposes of the Amended Telemarketing Sales Rule (16 CFR \\xA7310 et seq.), as amended from time to time (the \\\"Rule\\\") and applicable state do-not-call regulations. As such, notwithstanding that your telephone number may be listed on the Federal Trade Commission's Do-Not-Call List, and/or on applicable state do-not-call lists, we retain the right to contact you via telemarketing in accordance with the Rule and applicable state do-not-call regulations.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In addition, where you provide \\\"express written consent\\\" within the meaning of the Telephone Consumer Protection Act (47 USC \\xA7 227), and its implementing regulations adopted by the Federal Communications Commission (47 CFR \\xA7 64.1200), as amended from time-to-time (\\\"TCPA\\\"), you consent to receive telephone calls from \", renderDomain(), \" and any designated Third Party Service Provider(s), including artificial voice and pre-recorded messages and/or calls (including SMS text messages) delivered via automated technology, to the telephone number(s) that you provided. Please note that you are not required to provide this consent in order to obtain access to the \", renderDomain(), \" Offerings, and your consent simply allows \", renderDomain(), \", as well as the designated Third-Party Service Provider(s), to contact you via these means. \", /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Please be advised that by agreeing to this Privacy Policy, you are obligated to immediately inform us if and when the telephone number that you have previously provided to us changes. Without limiting the foregoing, if you: have your telephone number reassigned to another person or entity; give up your telephone number so that it is no longer used by you; port your telephone number to a landline or vice versa; or otherwise stop using that telephone number for any reason (collectively \\\"Phone Number Change\\\"),you agree that you shall promptly notify \", renderDomain(), \" of the Phone Number Change via e-mail at: correspondence@eLocal.com.\"), \" We may also employ other companies and individuals to perform certain functions on our behalf. Examples include sending direct and electronic mail, removing duplicate information from user lists, analyzing data and providing marketing analysis. The agents performing these limited functions on our behalf shall have access to our users' personal information as needed to perform their functions for us, but we do not permit them to use your personal information for other purposes.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We will also use your personal information for customer service, to provide you with information that you may request, to customize your experience on the Site and/or to contact you when necessary in connection with transactions entered into by you on the Site. We may also use your personal information for internal business purposes, such as analyzing and managing our business. We may also combine the information we have gathered about you with information from other sources.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We also reserve the right to release current or past user information: in the event that we believe that the user is using, or has used, the \", renderDomain(), \" Offerings to commit unlawful acts and/or in violation of the Terms and Conditions, this Privacy Policy or any other of our operating rules, policies, price schedules and other supplemental terms and conditions or documents that may be published by us from time to time; if the information is subpoenaed; provided, however, that, where permitted by applicable law, we shall provide you with e-mail notice, and opportunity to challenge the subpoena, prior to disclosure of any personal information pursuant to a subpoena; or if we are sold, merge with a third party or are acquired; provided, however, that if \", renderDomain(), \" is involved in a merger, acquisition or sale of all or a portion of its assets, you will be notified via email and/or a prominent notice on the Site of any change in ownership or uses of your personal information, as well as any choices that you may have regarding your personal information. Moreover, you hereby consent to disclosure of any record or communication to any third-party when \", renderDomain(), \", in its sole discretion, determines the disclosure to be appropriate including, without limitation, sharing your e-mail address with other third-parties for suppression purposes in compliance with the CAN-SPAM Act of 2003, as amended from time to time.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"nonpersonal\"\n }, \"Non-Personal Information Collection and Use\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", {\n className: \"disclaimer\"\n }, \"Please see our Provisions for California Residents \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#california\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \" for additional details regarding how we collect and share your non-personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"IP Addresses/Browser Type\"), \" We may collect certain non-personally identifiable information about you when you visit many of the pages of the Site. This non-personally identifiable information includes, without limitation, the type of browser that you use (e.g., Internet Explorer, Chrome, Safari), your IP address, the type of operating system that you use (e.g., Windows or Mac OS) and the domain name of your Internet service provider (e.g., Verizon, AT&T). We use the non-personally identifiable information that we collect to improve the design and content of the \", renderDomain(), \" Offerings and to enable us to personalize your Internet experience. We also may use this information in the aggregate to analyze \", renderDomain(), \" Offerings usage, as well as to offer you products and services.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Cookies\"), \" When an end-user visits the Site, we send one (1) or more cookies and/or gif files (collectively, \\\"Cookies\\\") to assign an anonymous, unique identifier to the applicable end-user's computer or other device. A Cookie is a piece of data stored on your hard drive containing non-personally identifiable information about you. Cookies have many benefits to enhance your experience at the Site. To find out more about Cookies, please visit www.cookiecentral.com. We use Cookies to improve the quality of the Site, including for storing user preferences, and tracking Site-user trends (such as pages opened and length of stay at the Site).\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Most Internet browsers are initially set up to accept Cookies, but you can reset your browser to refuse all Cookies or to indicate when a cookie is being sent. To disable and reject certain Cookies, follow the instructions associated with your Internet browser. Even in the case where a user rejects a Cookie, he or she may still use the \", renderDomain(), \" Offerings. We reserve the right to retain Cookie data indefinitely.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"behavioral\"\n }, \"Behavioral Tracking/Do Not Track\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"As a general rule, other than as set forth below, neither \", renderDomain(), \", nor any third parties, track the activity of Site Users in connection with the Site. However, when an Advertiser is logged into its account, we track changes in such Advertiser's status and updates to its profile. We may use this activity data to target those Advertisers with more specific marketing messages. In addition, when an Advertiser opens or clicks on links in email marketing messages from us, we record that information and may use it to refine subsequent marketing messages. This tracking will usually occur even where the applicable Advertiser has selected the \\\"do-not-track\\\" option on its Internet browser.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We use Google Analytics on the Site, as well as a conversion rate optimization platform called Visual Website Optimizer. These platforms do not record personal information of Site Users, but aggregate information and activity only.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Cross Device Tracking\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, renderDomain(), \" does not track Site Users' use of the \", renderDomain(), \" Offerings across multiple devices, including personal computers and mobile devices.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Other Websites\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"The Site may contain links to third-party owned and/or operated websites including, without limitation, websites owned and/or operated by our Third Party Service Providers. \", renderDomain(), \" is not responsible for the privacy practices or the content of such websites. In some cases, you may be able to make a purchase through one of their third-party websites. In these instances, you may be required to provide certain information, such as a credit card number, to register or complete a transaction at such website. These third-party websites have separate privacy and data collection practices and \", renderDomain(), \" has no responsibility or liability relating to them.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"security\"\n }, \"Security of Your Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We endeavor to safeguard and protect our users' personal information. When users make personal information available to us, their personal information is protected both online and offline (to the extent that we maintain any personal information offline). The privacy of your personal information is very important to us. When our registration process asks users to submit Sensitive Information (such as credit card information), and when we transmit such Sensitive Information, that Sensitive Information is encrypted and is protected with Transport Layer Security (\\u201CTLS\\u201D) encryption software.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Access to your personal information is strictly limited, and we take reasonable measures to ensure that your personal information is not accessible to the public. The servers that we store personal information on are kept in a secure physical environment. We also have security measures in place to protect against the loss, misuse and alteration of personal information under our control. Please be advised, however, that while we take every reasonable precaution available to protect your data, no storage facility, technology, software, security protocols or data transmission over the Internet can be guaranteed to be 100% secure.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Computer hackers that circumvent our security measures may gain access to certain portions of your personal information, and technological bugs, errors and glitches may cause inadvertent disclosures of your personal information; provided, however, that any attempt to breach the security of the network, our servers, databases or other hardware or software may constitute a crime punishable by law. For the reasons mentioned above, we cannot warrant that your personal information will be absolutely secure. Any transmission of data at or through the Site is at your own risk.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"All of our users' personal information is restricted in our offices. Only employees or third party agents who need personal information to perform a specific job are granted access to personal information. Our employees are dedicated to ensuring the security and privacy of all user personal information. Employees not adhering to our firm policies are subject to disciplinary action. In compliance with applicable federal and state laws, we shall notify you and any applicable regulatory agencies in the event that we learn of an information security breach with respect to your personal information. You will be notified via e-mail in the event of such a breach. Please be advised that notice may be delayed in order to address the needs of law enforcement, determine the scope of network damage, and to engage in remedial measures.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"children\"\n }, \"Children's Privacy\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Visitors under eighteen (18) years of age are not permitted to use and/or submit their personal information at the Site. \", renderDomain(), \" does not knowingly solicit or collect information from visitors under eighteen (18) years of age. \", renderDomain(), \" encourages parents and guardians to spend time online with their children and to participate and monitor the interactive activities of their children.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"optout\"\n }, \"Opt-Out/Unsubscribe\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Please see our Provisions for California Residents \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#california\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \" for additional details regarding how California State residents can opt-out from the sale of their personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"To opt-out of receiving e-mail advertising, SMS text-based marketing (where and to the extent permitted by applicable law), telemarketing and direct mail marketing from us, you can follow the instructions at the end of the applicable marketing message or email us by submitting a contact form here \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \"here\"), \".\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Notwithstanding the foregoing, we may continue to contact you for the purpose of communicating information relating to your use of the \", renderDomain(), \" Offerings and to respond to any inquiry or request made by you. To opt-out of receiving \", renderDomain(), \" Offerings-related and inquiry response-related messages from \", renderDomain(), \", you must cease utilizing the \", renderDomain(), \" Offerings and submitting inquiries to \", renderDomain(), \", as applicable.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"deleting\"\n }, \"Deleting and Updating Your Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Please see our Provisions for California Residents \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"#california\",\n \"data-delegate\": \"Privacy\"\n }, \"below\"), \" for additional details regarding how California State residents can delete and/or access their personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"At your request, we will inform you of what personal information we have on file for you. In addition, at your request, we will remove and/or modify the personal information that you have provided to us, or that we have collected. You may do so by contacting us via contact form \", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/information#contact\",\n \"data-delegate\": \"Privacy\"\n }, \"here\"), \"; provided, however, that we ask individuals to identify themselves and the information requested to be accessed, corrected or removed before processing such requests, and we may decline to process requests that are unreasonably repetitive or systematic, require disproportionate technical effort, jeopardize the privacy of others or would be extremely impractical (for instance, requests concerning information residing on backup tapes).\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Please be advised that deleting your personal information will terminate your access to some or all of the \", renderDomain(), \" Offerings. If you wish to continue using the \", renderDomain(), \" Offerings, you may not delete the personal information that we have on file for you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Please be further advised that, after you delete your personal information, residual copies may take a period of time before they are deleted from our active servers and may remain in our backup systems.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Transfer of Personal Information Internationally\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"If you are visiting the Site from a country other than the country in which our servers are located, your communications with us may result in the transfer of personal information across international boundaries. By visiting the Site and/or otherwise communicating electronically with us, you consent to such transfers. Even if your jurisdiction does not have the same privacy laws as the jurisdiction where our servers are located, we will treat your information as subject to the protections described in this Privacy Policy.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"changes\"\n }, \"Changes to this Privacy Policy\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, renderDomain(), \" reserves the right to change or update this Privacy Policy at any time by posting a notice on the Site that we are changing this Privacy Policy. If the manner in which we use personally identifiable information changes, \", renderDomain(), \" will notify users by: (a) sending the modified policy to our users via email; and/or (b) any other reasonable means acceptable under applicable state and federal law. You will have a choice as to whether or not we use your information in this different manner, and we will only use your information in this different manner where you opt-in to such use.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"contactus\"\n }, \"Contacting the Site\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"If you have any questions about this Privacy Policy or the privacy practices of \", renderDomain(), \", please feel free to e-mail us at:\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"mailto: correspondence@elocal.com\",\n \"data-delegate\": \"Privacy\"\n }, \"correspondence@elocal.com\"), \".\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Filing a Complaint with the Federal Trade Commission\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"To file a complaint regarding our privacy practices, please\\xA0\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.ftccomplaintassistant.gov/Information?OrgCode=#crnt&panel1-1\",\n \"data-delegate\": \"Privacy\"\n }, \"click here\"), \".\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n id: \"california\"\n }, \"Privacy Provisions for California Residents\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"These Privacy Provisions for California Residents (\\u201CPrivacy Provisions\\u201D) supplement the information contained in the Privacy Policy set forth above These Privacy Provisions apply solely to residents of the State of California (\\u201CCA Users\\u201D). We adopt these Privacy Provisions in compliance with the California Consumer Privacy Act of 2018 (\\u201CCCPA\\u201D). Any terms defined in the CCPA have the same meaning when used in these Privacy Provisions.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Categories of Information We Collect\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We collect information that identifies, relates to, describes, references, is capable of being associated with, or could reasonably be linked, directly or indirectly, with a particular CA User or device (\\\"\", /*#__PURE__*/_react[\"default\"].createElement(\"u\", null, \"personal information\"), \"\\\"). In particular, we have collected the following categories of personal information from CA Users within the last twelve (12) months:\"), /*#__PURE__*/_react[\"default\"].createElement(\"table\", {\n className: \"california-information-container\",\n border: \"1px\",\n cellSpacing: \"0\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"tbody\", null, /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Category\"), /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Examples\"), /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Collected\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A real name, alias, postal address, unique personal identifier, online identifier, Internet Protocol address, email address, account name, telephone number, or other similar identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"B. Personal information categories listed in the California Customer Records statute (Cal. Civ. Code \\xA7 1798.80(e)).\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A name, signature, Social Security number, physical characteristics or description, postal address, telephone number, passport number, driver's license or State identification card number, insurance policy number, education, employment, employment history, bank account number, credit card number, debit card number, or any other financial information, medical information, or health insurance information. Some personal information included in this category may overlap with other categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"D. Commercial information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Records of personal property, products or services purchased, obtained, or considered, or other purchasing or consuming histories or tendencies.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"F. Internet or other similar network activity.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Browsing history, search history, information on a CA User's interaction with a website, application or advertisement.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"I. Professional or employment-related information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Current or past job history or performance evaluations.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")))), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Personal information does not include:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Publicly available information from government records.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"De-identified or aggregated CA User information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Information excluded from the CCPA's scope, such as:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"health or medical information covered by the Health Insurance Portability and Accountability Act of 1996 (HIPAA) and the California Confidentiality of Medical Information Act (CMIA) or clinical trial data; and\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"personal information covered by certain sector-specific privacy laws, including the Fair Credit Reporting Act (FRCA), the Gramm-Leach-Bliley Act (GLBA) or California Financial Information Privacy Act (FIPA), and the Driver's Privacy Protection Act of 1994.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We obtain the categories of personal information listed above from the following categories of sources (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Directly from our CA Users. For example, from online registration forms that our CA Users submit to us related to the products and/or services that we (and our third party service providers) offer by and through the Site. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Indirectly from our CA Users. For example, through information we collect from our CA Users in the course of providing our products and/or services to them. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Directly and indirectly from activity on the Site. This includes the type of browser that you use (e.g., Safari, Chrome, Internet Explorer), your IP address, the type of operating system that you use (e.g., Windows or iOS) and the domain name of your Internet Service Provider. In addition, we obtain certain Site usage details and analytics as same are collected automatically by us and our third party partners. (Category F)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"From third-parties that interact with us in connection with the products and/or services that we offer to our CA Users. For example, third party entities that assist us in sending direct and electronic mail, removing duplicate information from CA User lists, analyzing data and providing marketing analysis. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"From third-party data brokers or aggregators. (Category A, B, D and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Use of Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We may use or disclose the personal information that we collect for one or more of the following business purposes (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To fulfill or meet the reason for which the information is provided. For example, if you provide us with personal information in connection with your request for products and/or services from the third party service providers featured on the Site, as well as information regarding the other products and/or services featured on the Site, we will use that personal information to better provide you with the requested information. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To enable the third-party service providers featured on the Site to contact you regarding the featured products and/or services. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To provide you with information, products or services that you request from us. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To create, maintain, customize and secure your account with us. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To provide you with e-mail, direct mail and telemarketing messages concerning certain Company products and/or services, as well as third-party products and/or services, that we believe may be of interest to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To deliver relevant Site content and advertisements to you and measure or understand the effectiveness of the advertising we serve to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including the Site's Terms and Conditions. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To improve the Site and better present its contents to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"For customer service purposes and to respond to inquiries from you. (Category A and B)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"For testing, research, analysis and product development. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"As necessary or appropriate to protect our rights, property or safety, and that of our clients or others. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To respond to law enforcement requests and as required by applicable law, court order, or governmental regulations. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"As described to you when collecting your personal information or as otherwise set forth in the CCPA. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution or other sale or transfer of some or all of our assets, whether as a going concern or as part of bankruptcy, liquidation or similar proceeding, in which personal information held by us is among the assets transferred. (Category A, B, D, F and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We will not collect additional categories of personal information or use the personal information we collected for materially different, unrelated or incompatible purposes without providing you with notice.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Sharing Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Subject to your right to opt-out of such sharing/sale, we may share, rent and/or sell your personal information (Category A, B, D, F and I): (a) with/to the third party service providers that offer the products and services featured on the Site; and (b) for the other business purposes set forth above.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"When we disclose personal information to a third party service provider or other entity, we enter into a contractual relationship that describes the purpose for which such third party may use the personal information and requires that third party to both keep the personal information confidential and not use it for any purpose other than the performance of its services under the applicable contract. Please note, we do not collect information from CA Users that we actually know are less than eighteen (18) years of age and we do not share or sell the personal information of CA Users that we actually know are less than eighteen (18) years of age. Without limiting the foregoing, we have not shared or sold the personal information of CA Users that we actually know are less than sixteen (16) years of age in the preceding twelve (12) months.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have disclosed the following categories of personal information for a business purpose:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category B. California Customer Records personal information categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category D. Commercial information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"\\u2028Category F. Internet or other similar network activity.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"\\u2028Category I. Professional or employment-related information.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We disclose your personal information for a business purpose to the following categories of third parties (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Our affiliates. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Service providers. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The third party service providers that offer the products and services featured on the Site. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Third parties to whom you authorize us to disclose your personal information in connection with the products and/or services that we provide to you. (Category A, B, D, F and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have sold the following categories of personal information to third parties:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category B. California Customer Records personal information categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category D. Commercial information.\\u2028\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category F. Internet or other similar network activity.\\u2028\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category I. Professional or employment-related information.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have sold the above referenced categories of personal information to the third party service providers that offer the products and services featured on the Site.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Your Rights and Choices\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"The CCPA provides CA Users (California residents) with specific rights regarding their personal information. This section describes your CCPA rights and explains how to exercise those rights.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Opt-Out from the Sale of Your Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to opt-out of our sale of your personal information to third parties. To exercise your right to opt-out of our sale of your personal information to third parties, please submit a verifiable CA User request to us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/opt_outs/new\",\n \"data-delegate\": \"Privacy\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622; \"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or \"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We endeavor to act on all opt-out requests as soon as practicable, but in all cases within fifteen (15) days of the receipt of your request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Access to Specific Information and Data Portability Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to request that we disclose certain information to you about our collection and use of your personal information over the past twelve (12) months. Once we receive and confirm your verifiable CA User request, we will disclose to you:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of personal information we collected about you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of sources for the personal information we collected about you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Our business or commercial purpose for collecting or selling that personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of third parties with whom we have shared that personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The specific pieces of personal information we collected about you (also called a data portability request).\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"If we sold or disclosed your personal information for a business purpose, two separate lists disclosing:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"sales, identifying the personal information categories that each category of recipient purchased; and\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"disclosures for a business purpose, identifying the personal information categories that each category of recipient obtained.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Deletion Request Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to request that we delete any of your personal information that we collected from you and retained, subject to certain exceptions. Once we receive and confirm your verifiable CA User request, we will delete (and direct our service providers to delete) your personal information from our (their) records, unless an exception applies.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We may deny your deletion request if retaining the information is necessary for us or our service providers to:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ol\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Complete the transaction for which we collected the personal information, provide a good or service that you requested, take actions reasonably anticipated within the context of our ongoing business relationship with you, or otherwise perform our obligations in connection with our contract with you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Detect security incidents, protect against malicious, deceptive, fraudulent or illegal activity, or prosecute those responsible for such activities.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Debug products to identify and repair errors that impair existing intended functionality.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Exercise free speech rights, ensure the right of another CA User to exercise their free speech rights or exercise another right provided for by law.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Comply with the California Electronic Communications Privacy Act (Cal. Penal Code \\xA7 1546\\xA0seq.).\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Engage in public or peer-reviewed scientific, historical, or statistical research in the public interest that adheres to all other applicable ethics and privacy laws, when the information's deletion may likely render impossible or seriously impair the research's achievement, if you previously provided informed consent.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Enable solely internal uses that are reasonably aligned with CA User expectations based on your relationship with us.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Comply with a legal obligation.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Make other internal and lawful uses of that information that are compatible with the context in which you provided it.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Exercising Access, Data Portability and Deletion Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"To exercise your access, data portability and/or deletion rights described above, please submit a verifiable CA User request to us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/privacy_rights_requests/new\",\n \"data-delegate\": \"Privacy\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Only you or a person registered with the California Secretary of State that you authorize to act on your behalf, may make a verifiable CA User request related to your personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You may only make a verifiable CA User request for access or data portability twice within a 12-month period. The verifiable CA User request must:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Provide sufficient information that allows us to reasonably verify that you are: (1) the person about whom we collected personal information; or (2) an authorized representative of the applicable CA User.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Describe your request with sufficient detail that allows us to properly understand, evaluate, and respond to it.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We cannot respond to your request or provide you with personal information if we cannot verify your identity or authority to make the request and confirm that the personal information relates to you. Making a verifiable CA User request does not require you to create an account with us. We will only use personal information provided in a verifiable CA User request to verify the requestor's identity or authority to make the request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Response Timing and Format\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We endeavor to respond to all verifiable CA User requests within forty-five (45) days of the receipt thereof. If we require more time (up to ninety (90) days), we will inform you of the reason and extension period in writing. We will deliver our written response by mail or electronically, at your option. Any disclosures we provide will only cover the twelve (12) month period preceding the receipt of your verifiable request. The response we provide will also explain the reasons we cannot comply with a request, if applicable. For data portability requests, we will select a format to provide your personal information that is readily useable and should allow you to transmit the information from one entity to another entity without hindrance.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We do not charge a fee to process or respond to your verifiable CA User request unless it is excessive, repetitive, or manifestly unfounded. If we determine that the request warrants a fee, we will tell you why we made that decision and provide you with a cost estimate before completing your request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Non-Discrimination\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We will not discriminate against you for exercising any of your CCPA rights. Unless permitted by the CCPA, we will not:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Deny you goods or services;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Charge you different prices or rates for goods or services, including through granting discounts or other benefits, or imposing penalties;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Provide you a different level or quality of goods or services; and/or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Suggest that you may receive a different price or rate for goods or services or a different level or quality of goods or services.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Changes to these Provisions\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We reserve the right to amend these Provisions in our discretion and at any time. When we make changes to these Provisions, we will notify you by email or through a notice on the Site's homepage.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Contact Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"If you have any questions or comments about these Provisions, our Privacy Policy, the ways in which we collect and use your personal information, your choices and rights regarding such use, or wish to exercise your rights under California law, please do not hesitate to contact us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/privacy_rights_requests/new\",\n \"data-delegate\": \"Privacy\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")));\n};\n\nPrivacy.propTypes = {\n domain: _propTypes[\"default\"].string.isRequired,\n isTrademarked: _propTypes[\"default\"].bool\n};\nPrivacy.defaultProps = {\n isTrademarked: false\n};\nvar _default = Privacy;\nexports[\"default\"] = _default;\n\n},{\"prop-types\":6,\"react\":14}],16:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar PrivacyCalifornia = function PrivacyCalifornia(props) {\n var domain = props.domain,\n isTrademarked = props.isTrademarked;\n\n var renderDomain = function renderDomain() {\n return /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, domain.replace('.com', ''), isTrademarked && /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"\\u2122\"));\n };\n\n return /*#__PURE__*/_react[\"default\"].createElement(_react[\"default\"].Fragment, null, /*#__PURE__*/_react[\"default\"].createElement(\"h2\", null, \"California Privacy Policy\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, domain, /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), renderDomain(), \" Website\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"California Privacy Notice Last Updated: January 1, 2020\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", null, \"Privacy Notice for California Residents\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"This Privacy Notice for California Residents (\\\"Privacy Notice\\\") supplements the information contained in the \", renderDomain(), \" Privacy Policy (the \\\"Privacy Policy\\\") made available on the website located at \", domain, \" (the \\\"Site\\\"). The Site is owned and operated by eLocal USA LLC (\\\"Company,\\\" \\\"we,\\\" \\\"us\\\" or \\\"our\\\"). This Privacy Notice applies solely to residents of the State of California (\\\"Users\\\"). We adopt this Privacy Notice in compliance with the California Consumer Privacy Act of 2018 (\\\"CCPA\\\"). Any terms defined in the CCPA have the same meaning when used in this Privacy Notice. Users with disabilities who wish to access this Privacy Notice in an alternative format can contact us by calling us at: (877) 913-5622; emailing us at: correspondence@eLocal.com; or sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Categories of Information We Collect\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We collect information that identifies, relates to, describes, references, is capable of being associated with, or could reasonably be linked, directly or indirectly, with a particular CA User or device (\\\"\", /*#__PURE__*/_react[\"default\"].createElement(\"u\", null, \"personal information\"), \"\\\"). In particular, we have collected the following categories of personal information from CA Users within the last twelve (12) months:\"), /*#__PURE__*/_react[\"default\"].createElement(\"table\", {\n className: \"california-information-container\",\n border: \"1px\",\n cellSpacing: \"0\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"tbody\", null, /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Category\"), /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Examples\"), /*#__PURE__*/_react[\"default\"].createElement(\"th\", null, \"Collected\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A real name, alias, postal address, unique personal identifier, online identifier, Internet Protocol address, email address, account name, telephone number, or other similar identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"B. Personal information categories listed in the California Customer Records statute (Cal. Civ. Code \\xA7 1798.80(e)).\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"A name, signature, Social Security number, physical characteristics or description, postal address, telephone number, passport number, driver's license or State identification card number, insurance policy number, education, employment, employment history, bank account number, credit card number, debit card number, or any other financial information, medical information, or health insurance information. Some personal information included in this category may overlap with other categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"D. Commercial information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Records of personal property, products or services purchased, obtained, or considered, or other purchasing or consuming histories or tendencies.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"F. Internet or other similar network activity.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Browsing history, search history, information on a CA User's interaction with a website, application or advertisement.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")), /*#__PURE__*/_react[\"default\"].createElement(\"tr\", null, /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"I. Professional or employment-related information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"Current or past job history or performance evaluations.\"), /*#__PURE__*/_react[\"default\"].createElement(\"td\", null, \"YES\")))), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Personal information does not include:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Publicly available information from government records.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"De-identified or aggregated CA User information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Information excluded from the CCPA's scope, such as:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"health or medical information covered by the Health Insurance Portability and Accountability Act of 1996 (HIPAA) and the California Confidentiality of Medical Information Act (CMIA) or clinical trial data; and\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"personal information covered by certain sector-specific privacy laws, including the Fair Credit Reporting Act (FRCA), the Gramm-Leach-Bliley Act (GLBA) or California Financial Information Privacy Act (FIPA), and the Driver's Privacy Protection Act of 1994.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We obtain the categories of personal information listed above from the following categories of sources (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Directly from our CA Users. For example, from online registration forms that our CA Users submit to us related to the products and/or services that we (and our third party service providers) offer by and through the Site. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Indirectly from our CA Users. For example, through information we collect from our CA Users in the course of providing our products and/or services to them. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Directly and indirectly from activity on the Site. This includes the type of browser that you use (e.g., Safari, Chrome, Internet Explorer), your IP address, the type of operating system that you use (e.g., Windows or iOS) and the domain name of your Internet Service Provider. In addition, we obtain certain Site usage details and analytics as same are collected automatically by us and our third party partners. (Category F)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"From third-parties that interact with us in connection with the products and/or services that we offer to our CA Users. For example, third party entities that assist us in sending direct and electronic mail, removing duplicate information from CA User lists, analyzing data and providing marketing analysis. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"From third-party data brokers or aggregators. (Category A, B, D and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Use of Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We may use or disclose the personal information that we collect for one or more of the following business purposes (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To fulfill or meet the reason for which the information is provided. For example, if you provide us with personal information in connection with your request for products and/or services from the third party service providers featured on the Site, as well as information regarding the other products and/or services featured on the Site, we will use that personal information to better provide you with the requested information. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To enable the third-party service providers featured on the Site to contact you regarding the featured products and/or services. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To provide you with information, products or services that you request from us. (Category A, B, D and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To create, maintain, customize and secure your account with us. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To provide you with e-mail, direct mail and telemarketing messages concerning certain Company products and/or services, as well as third-party products and/or services, that we believe may be of interest to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To deliver relevant Site content and advertisements to you and measure or understand the effectiveness of the advertising we serve to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To carry out our obligations and enforce our rights arising from any contracts entered into between you and us, including the Site's Terms and Conditions. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To improve the Site and better present its contents to you. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"For customer service purposes and to respond to inquiries from you. (Category A and B)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"For testing, research, analysis and product development. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"As necessary or appropriate to protect our rights, property or safety, and that of our clients or others. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To respond to law enforcement requests and as required by applicable law, court order, or governmental regulations. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"As described to you when collecting your personal information or as otherwise set forth in the CCPA. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"To evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution or other sale or transfer of some or all of our assets, whether as a going concern or as part of bankruptcy, liquidation or similar proceeding, in which personal information held by us is among the assets transferred. (Category A, B, D, F and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We will not collect additional categories of personal information or use the personal information we collected for materially different, unrelated or incompatible purposes without providing you with notice.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Sharing Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Subject to your right to opt-out of such sharing/sale, we may share, rent and/or sell your personal information (Category A, B, D, F and I): (a) with/to the third party service providers that offer the products and services featured on the Site; and (b) for the other business purposes set forth above.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"When we disclose personal information to a third party service provider or other entity, we enter into a contractual relationship that describes the purpose for which such third party may use the personal information and requires that third party to both keep the personal information confidential and not use it for any purpose other than the performance of its services under the applicable contract. Please note, we do not collect information from CA Users that we actually know are less than eighteen (18) years of age and we do not share or sell the personal information of CA Users that we actually know are less than eighteen (18) years of age. Without limiting the foregoing, we have not shared or sold the personal information of CA Users that we actually know are less than sixteen (16) years of age in the preceding twelve (12) months.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have disclosed the following categories of personal information for a business purpose:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category B. California Customer Records personal information categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category D. Commercial information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"\\u2028Category F. Internet or other similar network activity.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"\\u2028Category I. Professional or employment-related information.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We disclose your personal information for a business purpose to the following categories of third parties (with the specific categories of personal information indicated in parenthesis):\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Our affiliates. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Service providers. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The third party service providers that offer the products and services featured on the Site. (Category A, B, D, F and I)\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Third parties to whom you authorize us to disclose your personal information in connection with the products and/or services that we provide to you. (Category A, B, D, F and I)\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have sold the following categories of personal information to third parties:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category A. Identifiers.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category B. California Customer Records personal information categories.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category D. Commercial information.\\u2028\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category F. Internet or other similar network activity.\\u2028\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Category I. Professional or employment-related information.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"In the preceding twelve (12) months, we have sold the above referen ced categories of personal information to the third party service providers that offer the products and services featured on the Site.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Your Rights and Choices\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"The CCPA provides CA Users (California residents) with specific rights regarding their personal information. This section describes your CCPA rights and explains how to exercise those rights.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\",\n id: \"do-not-sell\"\n }, \"Opt-Out from the Sale of Your Personal Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to opt-out of our sale of your personal information to third parties. To exercise your right to opt-out of our sale of your personal information to third parties, please submit a verifiable CA User request to us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/opt_outs/new\",\n \"data-delegate\": \"PrivacyCalifornia\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622; \"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or \"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We endeavor to act on all opt-out requests as soon as practicable, but in all cases within fifteen (15) days of the receipt of your request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Access to Specific Information and Data Portability Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to request that we disclose certain information to you about our collection and use of your personal information over the past twelve (12) months. Once we receive and confirm your verifiable CA User request, we will disclose to you:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of personal information we collected about you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of sources for the personal information we collected about you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Our business or commercial purpose for collecting or selling that personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The categories of third parties with whom we have shared that personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"The specific pieces of personal information we collected about you (also called a data portability request).\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"If we sold or disclosed your personal information for a business purpose, two separate lists disclosing:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"sales, identifying the personal information categories that each category of recipient purchased; and\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"disclosures for a business purpose, identifying the personal information categories that each category of recipient obtained.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Deletion Request Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You have the right to request that we delete any of your personal information that we collected from you and retained, subject to certain exceptions. Once we receive and confirm your verifiable CA User request, we will delete (and direct our service providers to delete) your personal information from our (their) records, unless an exception applies.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We may deny your deletion request if retaining the information is necessary for us or our service providers to:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ol\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Complete the transaction for which we collected the personal information, provide a good or service that you requested, take actions reasonably anticipated within the context of our ongoing business relationship with you, or otherwise perform our obligations in connection with our contract with you.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Detect security incidents, protect against malicious, deceptive, fraudulent or illegal activity, or prosecute those responsible for such activities.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Debug products to identify and repair errors that impair existing intended functionality.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Exercise free speech rights, ensure the right of another CA User to exercise their free speech rights or exercise another right provided for by law.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Comply with the California Electronic Communications Privacy Act (Cal. Penal Code \\xA7 1546\\xA0seq.).\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Engage in public or peer-reviewed scientific, historical, or statistical research in the public interest that adheres to all other applicable ethics and privacy laws, when the information's deletion may likely render impossible or seriously impair the research's achievement, if you previously provided informed consent.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Enable solely internal uses that are reasonably aligned with CA User expectations based on your relationship with us.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Comply with a legal obligation.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Make other internal and lawful uses of that information that are compatible with the context in which you provided it.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Exercising Access, Data Portability and Deletion Rights\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"To exercise your access, data portability and/or deletion rights described above, please submit a verifiable CA User request to us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/privacy_rights_requests/new\",\n \"data-delegate\": \"PrivacyCalifornia\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Only you or a person registered with the California Secretary of State that you authorize to act on your behalf, may make a verifiable CA User request related to your personal information.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You may only make a verifiable CA User request for access or data portability twice within a 12-month period. The verifiable CA User request must:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Provide sufficient information that allows us to reasonably verify that you are: (1) the person about whom we collected personal information; or (2) an authorized representative of the applicable CA User.\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Describe your request with sufficient detail that allows us to properly understand, evaluate, and respond to it.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We cannot respond to your request or provide you with personal information if we cannot verify your identity or authority to make the request and confirm that the personal information relates to you. Making a verifiable CA User request does not require you to create an account with us. We will only use personal information provided in a verifiable CA User request to verify the requestor's identity or authority to make the request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Response Timing and Format\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We endeavor to respond to all verifiable CA User requests within forty-five (45) days of the receipt thereof. If we require more time (up to ninety (90) days), we will inform you of the reason and extension period in writing. We will deliver our written response by mail or electronically, at your option. Any disclosures we provide will only cover the twelve (12) month period preceding the receipt of your verifiable request. The response we provide will also explain the reasons we cannot comply with a request, if applicable. For data portability requests, we will select a format to provide your personal information that is readily useable and should allow you to transmit the information from one entity to another entity without hindrance.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We do not charge a fee to process or respond to your verifiable CA User request unless it is excessive, repetitive, or manifestly unfounded. If we determine that the request warrants a fee, we will tell you why we made that decision and provide you with a cost estimate before completing your request.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Non-Discrimination\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We will not discriminate against you for exercising any of your CCPA rights. Unless permitted by the CCPA, we will not:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Deny you goods or services;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Charge you different prices or rates for goods or services, including through granting discounts or other benefits, or imposing penalties;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Provide you a different level or quality of goods or services; and/or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Suggest that you may receive a different price or rate for goods or services or a different level or quality of goods or services.\")), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Changes to these Provisions\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"We reserve the right to amend these Provisions in our discretion and at any time. When we make changes to these Provisions, we will notify you by email or through a notice on the Site's homepage.\"), /*#__PURE__*/_react[\"default\"].createElement(\"h3\", {\n className: \"california\"\n }, \"Contact Information\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"If you have any questions or comments about these Provisions, our Privacy Policy, the ways in which we collect and use your personal information, your choices and rights regarding such use, or wish to exercise your rights under California law, please do not hesitate to contact us by either:\"), /*#__PURE__*/_react[\"default\"].createElement(\"ul\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Clicking\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n href: \"https://www.elocal.com/ccpa/privacy_rights_requests/new\",\n \"data-delegate\": \"PrivacyCalifornia\"\n }, \" here\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Calling us at: (877) 913-5622;\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Emailing us at: correspondence@elocal.com; or\"), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, \"Sending us U.S. mail to: eLocal.com, 1010 Spring Mill Ave, Suite 200, Conshohocken, PA, 19428.\")));\n};\n\nPrivacyCalifornia.propTypes = {\n domain: _propTypes[\"default\"].string.isRequired,\n isTrademarked: _propTypes[\"default\"].bool\n};\nPrivacyCalifornia.defaultProps = {\n isTrademarked: false\n};\nvar _default = PrivacyCalifornia;\nexports[\"default\"] = _default;\n\n},{\"prop-types\":6,\"react\":14}],17:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nvar Terms = function Terms(props) {\n var domain = props.domain,\n icon = props.icon,\n isTrademarked = props.isTrademarked,\n privacyUrl = props.privacyUrl;\n\n var renderDomain = function renderDomain() {\n return /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, domain.replace('.com', ''), isTrademarked && /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"\\u2122\"));\n };\n\n return /*#__PURE__*/_react[\"default\"].createElement(_react[\"default\"].Fragment, null, /*#__PURE__*/_react[\"default\"].createElement(\"h2\", null, \"Terms & Conditions\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, domain, /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), renderDomain(), \" Website\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Terms and Conditions Last Updated: January 01, 2020\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Thank you for visiting the \", renderDomain(), \" website located at www.\", domain, \".com (the \\\"Site\\\"). The Site is an Internet property of eLocal USA LLC (\\\"\", renderDomain(), \",\\\" \\\"we,\\\" \\u201Cour\\u201D or \\\"us\\\"). The following \", renderDomain(), \" Website Terms and Conditions (\\\"Terms and Conditions\\\") shall incorporate and govern the \", renderDomain(), \" Website Privacy Policy (\\\"Privacy Policy\\\"), the \", renderDomain(), \" Advertiser Terms (\\\"Advertiser Terms\\\") and any and all other applicable \", renderDomain(), \" operating rules, policies, price schedules and other supplemental terms and conditions or documents that may be published from time to time (collectively, the \\\"Agreement\\\").\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You agree, without limitation or qualification, to be bound by the terms of the Agreement in its entirety when you: (a) access the Site; (b) utilize the \", renderDomain(), \" search directory (\\\"Directory Service\\\") in order to obtain search listings and related information (collectively, \\\"Listings\\\") regarding a variety of businesses, professionals, venues, products and/or services (collectively, \\\"Third Party Offerings\\\") as offered and provided by the third party business entities and professionals featured on the Site (collectively, \\\"Third Party Service Providers\\\"); (c) access articles, discussions and feedback on the \", renderDomain(), \" Home Expert Network and/or \", renderDomain(), \" Legal Resource Network (collectively, \\\"Resource Network\\\") and/or access other content on the Site (collectively, \\\"Content\\\"); (d) utilize the Site's many interactive features designed to facilitate interaction between you, \", renderDomain(), \", the \\\"Contributors,\\\" \\\"Expert Panelists,\\\" \\\"Members\\\" and \\\"Ongoing Contributors\\\" (collectively, \\\"Network Participants\\\") participating in the Resource Network and other Site users including, but not limited to, blogs, comment sections, reviews and question and answer options located in designated areas of the Site (\\\"Interactive Services\\\"); (e) register to submit a free Listing of your Third Party Offerings; (f) register for enhanced services (\\\"Paid Advertiser Services\\\") in connection with promoting your Third Party Offerings as an \\\"Advertiser\\\"; (g) participate in the \", renderDomain(), \" Rewards Program (\\\"Rewards Program\\\"); and/or (h) access links to our social media pages on third party social media websites, such as Facebook\\xAE, Instagram\\xAE, LinkedIn\\xAE and Twitter\\xAE (\\\"Social Media Pages,\\\" and together with the Site, Directory Services, Listings, Resource Network, Content, Interactive Services, Paid Advertiser Services, Rewards Program and Social Media Pages, the \\\"\", renderDomain(), \" Offerings\\\").\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"PLEASE REVIEW THE AGREEMENT CAREFULLY. IF YOU DO NOT AGREE TO THE TERMS OF THE AGREEMENT IN THEIR ENTIRETY, YOU ARE NOT AUTHORIZED TO USE THE \", renderDomain(), \" OFFERINGS IN ANY MANNER OR FORM.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"NOTICE: THE AGREEMENT CONTAINS DISCLAIMERS OF WARRANTIES, LIMITATIONS OF LIABILITY, RELEASES, A CLASS-ACTION WAIVER, AND THE REQUIREMENT TO ARBITRATE ANY AND ALL CLAIMS THAT MAY ARISE HEREUNDER AGAINST \", renderDomain(), \", AS WELL AS ITS PARENT, SUBSIDIARIES, AFFILIATED COMPANIES, RELATED PARTIES, NETWORK PARTICIPANTS AND THIRD PARTY SERVICE PROVIDERS (COLLECTIVELY, \\u201CCOVERED PARTIES\\u201D), WHO ARE EXPRESS THIRD-PARTY BENEFICIARIES OF THE MANDATORY ARBITRATION PROVISION CONTAINED HEREIN. THE AFOREMENTIONED PROVISIONS ARE AN ESSENTIAL BASIS OF THE AGREEMENT.\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"NEW JERSEY STATE RESIDENTS ARE ENCOURAGED TO REVIEW THEIR RIGHTS UNDER THE AGREEMENT, AS PROVIDED UNDER THE NEW JERSEY TRUTH-IN-CONSUMER CONTRACT WARRANTY AND NOTICE ACT (\\u201CTCCWNA\\u201D).\")), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"You understand and agree that \", renderDomain(), \" shall not be liable to you, any other Site User (as defined below) or any third party for any claim in connection with your use of, or inability to use, the \", renderDomain(), \" Offerings. \", renderDomain(), \" disclaims any and all liability for any loss, damage, or injury based on Site Content, Third Party Offerings or other products, services and information directly or indirectly obtained through the \", renderDomain(), \" Offerings. You understand and agree that \", renderDomain(), \" is not responsible or liable in any manner whatsoever for any dispute between you and any Site User.\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, \"Instagram\\xAE and Facebook\\xAE are registered trademarks of Facebook, Inc. (\\\"Facebook\\\"). LinkedIn\\xAE is a registered trademark of LinkedIn Corporation (\\u201CLinkedIn\\u201D). Twitter\\xAE is a registered trademark of Twitter, Inc. (\\\"Twitter\\\"). Please be advised that \", renderDomain(), \" is not in any way affiliated with Facebook, LinkedIn or Twitter, and the \", renderDomain(), \" Offerings are not endorsed, administered or sponsored by any of the aforementioned entities.\"), /*#__PURE__*/_react[\"default\"].createElement(\"ol\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Scope/Modification of Agreement.\"), \"The Agreement constitutes the entire and only agreement between you and \", renderDomain(), \" with respect to your use of the \", renderDomain(), \" Offerings, and supersedes all prior or contemporaneous agreements, representations, warranties and/or understandings with respect to the Site. We may amend the Agreement from time to time in our sole discretion, without specific notice to you; provided, however, that: (a) any amendment or modification to the arbitration provisions, prohibition on class action provisions or any other provisions applicable to dispute resolution (collectively, \\\"Dispute Resolution Provisions\\\") shall not apply to any disputes incurred prior to the applicable amendment or modification; and (b) any amendment or modification to pricing and/or billing provisions (\\\"Billing Provisions\\\") shall not apply to any charges incurred prior to the applicable amendment or modification. The latest Agreement will be posted on the Site, and you should review the Agreement prior to using the \", renderDomain(), \" Offerings. By your continued use of the \", renderDomain(), \" Offerings, you hereby agree to comply with, and be bound by, all of the terms and conditions contained within the Agreement effective at that time (other than with respect to disputes arising prior to the amendment or modification of the Dispute Resolution Provisions, or charges incurred prior to the amendment or modification of the Billing Provisions, which shall be governed by the Dispute Resolution Provisions and/or Billing Provisions then in effect at the time of the subject dispute or incurred charges, as applicable). Unless explicitly stated otherwise, any future offer(s) made available to you on the Site that augment(s) or otherwise enhance(s) the current features of the \", renderDomain(), \" Offerings shall be subject to the Agreement. If \", renderDomain(), \" terminates the Agreement for any reason, \", renderDomain(), \" shall have no liability or responsibility to you. You understand and agree that refusal to use the \", renderDomain(), \" Offerings is your sole right and remedy with respect to any dispute with \", renderDomain(), \". The Agreement only governs your use of the \", renderDomain(), \" Offerings.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Non-Endorsement: Site Content and Site Users.\"), /*#__PURE__*/_react[\"default\"].createElement(\"ol\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, renderDomain(), \" does not sponsor, recommend or endorse: (i) any Third Party Service Providers (including Advertisers) that are accessible by and through the Directory Service and/or Interactive Services; and/or (ii) any Network Participants that are accessible by and through the Resource Network and/or Interactive Services; and/or (iii) any Site visitors (\\\"Visitors\\\") that are accessible by and through the Resource Network and/or Interactive Services. The Site facilitates communication between Third Party Service Providers, Network Participants, Visitors and potential users of associated Third Party Offerings. Some of the Third Party Service Providers that are accessible by and through the Directory Service pay a fee for inclusion in the Directory Service.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"The \", renderDomain(), \" Offerings contain comments, opinions, statements, feedback and other content (collectively, \\\"Feedback\\\"), Listings, Content, Network Articles (as defined below), advertisements, responses, statements, promises and other information (collectively, \\\"Site Content\\\") that is provided directly by Third Party Service Providers, Network Participants, Visitors and any other parties that use the Site (collectively, \\\"Site Users\\\"). You agree that \", renderDomain(), \" shall have no obligation and incur no liability to you in connection with any Feedback appearing in or through the Interactive Services. \", renderDomain(), \" does not represent or warrant that the Feedback posted through the Interactive Services is accurate, complete or appropriate. Please use caution and common sense when using the Site and Directory Service. \", renderDomain(), \" in no way endorses the Site Content made available by Site Users through the Interactive Services, Directory Service, Resource Network and/or any other \", renderDomain(), \" Offerings. The Site Content and other information submitted or made available by Site Users is not verified or reviewed in any way before it appears on the Site or otherwise through the \", renderDomain(), \" Offerings. \", renderDomain(), \" does not warrant the validity or accuracy of any such Site Content. Each Site User shall be solely responsible for the Site Content posted by and through the \", renderDomain(), \" Offerings. \", renderDomain(), \" reserves the right to prohibit any conduct by Site Users or remove any Site Content from the \", renderDomain(), \" Offerings at any time and for any reason, in \", renderDomain(), \"'s sole discretion. The reasons for removal may include where \", renderDomain(), \" believes that the Site Content posted by a Site User is unsuitable for the \", renderDomain(), \" Offerings for any reason including, without limitation, where: (i) the Site Content contains or links to material that could be considered unlawful, harmful, threatening, defamatory, obscene, harassing or otherwise objectionable; (ii) the Site Content contains or links to material that infringes upon the trademark, trade name, service mark, copyright, license, or other intellectual property or proprietary right of any third party; (iii) \", renderDomain(), \" believes that a Site User is, at any time, conducting any commercial activity by and through the Site; and/or (iv) \", renderDomain(), \" believes that a Site User is in violation of the Agreement including, without limitation, Section 12 below.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, renderDomain(), \" does not involve itself in the agreements arrived at by and between Visitors and Third Party Service Providers, or in the actual provision of Third Party Offerings in connection with the relationships created thereby. Therefore, \", renderDomain(), \" does not make any representations regarding the competency, trustworthiness, honesty, integrity and/or behavior of either its Visitors or Third Party Service Providers. Visitors, and not \", renderDomain(), \", are solely responsible for assessing the competency, trustworthiness, honesty and integrity of all Third Party Service Providers that such Visitors contact via the Directory Service.\"))))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Terms Applicable to Attorney Listings.\"), /*#__PURE__*/_react[\"default\"].createElement(\"ol\", null, /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, renderDomain(), \" is not a law firm or a lawyer referral service. As such, \", renderDomain(), \" offers no legal advice, recommendations, mediation or counseling in connection with any legal matter, under any circumstances, and nothing we do and no element of the Site, Directory Service or other \", renderDomain(), \" Offerings should be construed as such. You should always check with your attorney, accountant and/or other advisors to be sure that any legal advice, law-related Third Party Offerings, law-related Site Content or other legal products and/or services available by and through the \", renderDomain(), \" Offerings (collectively, \\\"Legal Services\\\") is/are appropriate for you.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"The Site provides paid attorney advertising to those attorneys that are registered as Third Party Service Providers (\\\"Third Party Legal Professionals\\\"). Some of the Third Party Legal Professionals that are accessible by and through the Directory Service pay a fee for inclusion in the Directory Service. \", renderDomain(), \" does not receive any portion of any Third Party Legal Professional's fees.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"Any use of the Directory Service by Site Users is not intended to, and will not create, an attorney-client relationship between any such Site Users and \", renderDomain(), \". Without limiting the foregoing, any information submitted to \", renderDomain(), \" and/or any electronic or other communication sent to \", renderDomain(), \" will not create, or be covered by, an attorney-client relationship between Site Users and \", renderDomain(), \" or any Third Party Legal Professionals.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"The Site facilitates communication between Third Party Legal Professionals and potential users of associated Legal Services. \", renderDomain(), \" does not guarantee that Site Users will successfully find legal representation through the Directory Service. The determination of the need for legal services and the choice of legal representation are extremely important decisions and should not be based solely on advertisements, claims of expertise or cost offered by any Third Party Legal Professional.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, renderDomain(), \" does not review the standing of any Third Party Legal Professionals with any regulatory authority or bar association. Therefore, \", renderDomain(), \" makes no representation regarding the status, standing or ability of any Third Party Legal Professional. When considering retaining a Third Party Legal Professional, Site Users should ask for free background information from that Third Party Legal Professional and check that Third Party Legal Professional's standing with the applicable state bar association. \", renderDomain(), \" is not responsible for, and in no way endorses, any description or indication of specialization or limitation of practice by any Third Party Legal Professionals that are accessible through the Directory Service. Please be aware that no agency or board may have certified such Third Party Legal Professional as a specialist or expert in any indicated field of law practice. In addition, a Third Party Legal Professional claiming specialization is not necessarily any more expert or competent than other legal professionals. Site Users should make an independent investigation, confirm and verify all claims made by Third Party Legal Professionals. Site Users are encouraged to use caution when reviewing any information submitted by Third Party Legal Professionals. Except where otherwise indicated, the Third Party Legal Professionals are not certified by the Florida State Bar Board of Legal Specialization and Education, the Texas State Board of Legal Specialization (\\\"Not Certified by the Texas Board of Legal Specialization\\\"), or any other entity or body.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"Laws vary across legal jurisdictions and may be subject to interpretation by different courts. Laws are also very specific to individual facts and circumstances, and the law-related Site Content may not fit your particular circumstance. The law-related Site Content is provided for informational purposes only, and may not reflect current legal developments or variances in the law of different jurisdictions. The law-related Site Content does not necessarily reflect the opinions of any Third Party Legal Professionals, their partners, clients or affiliates.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, \"Certain Listings and other law-related Site Content may include descriptions of successful lawsuits brought by Third Party Legal Professionals. These descriptions are not meant to create any unjustified expectations that similar results can be obtained for others, because each case is determined on its own specific factual and legal circumstances. No Third Party Legal Professional can guarantee the success of a case, and past successes, even in very similar lawsuits, do not mean that success in a subsequent case is guaranteed or even likely. Results depend upon a variety of factors unique to each case.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"ADDITIONAL STATE SPECIFIC DISCLOSURES:\"), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Alabama\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"No representation is made that the quality of the Legal Services to be performed by the Third Party Legal Professionals is greater than the quality of legal services performed by other attorneys.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Alaska\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"The Alaska Bar Association does not accredit or endorse certifying organizations.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Florida\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), renderDomain(), \" operates as a \\\"Lawyer Directory\\\" as defined under Florida Rule 4-7.23.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Hawaii\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"There is no procedure for review or approval of specialist certification organizations in Hawaii.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Illinois\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"The Supreme Court of Illinois does not recognize certifications of specialties in the practice of law and such a certificate, award or recognition is not a requirement to practice law in Illinois.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Iowa\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Memberships and offices in legal fraternities and legal societies, technical and professional licenses, and memberships in scientific, technical and professional associations and societies of law or field of practice do not mean that a Third Party Legal Professional is a specialist or expert in a field of law, nor do they mean that such Third Party Legal Professional is necessarily any more expert or competent than any other lawyer. A description or indication of limitation of practice does not mean that any agency or board has certified such Third Party Legal Professional as a specialist or expert in an indicated field of law practice, nor does it mean that such Third Party Legal Professional is necessarily any more expert or competent than any other lawyer.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Kentucky\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"THIS IS AN ADVERTISEMENT.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Massachusetts\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"If a Massachusetts Third Party Legal Professional holds himself or herself out as \\\"certified\\\" in a particular service, field or area of law by a non-governmental body, the certifying organization is a private organization, whose standards for certification are not regulated by the Commonwealth of Massachusetts.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Mississippi\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Free background information is available upon request for any Mississippi Third Party Legal Professional. The listing of any area of practice by a Mississippi Third Party Legal Professional does not indicate any certification of expertise therein.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Missouri\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Neither the Supreme Court of Missouri, nor the Missouri Bar, reviews or approves certifying organizations or specialist designations.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Nevada\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Neither the State Bar of Nevada, nor any agency of the State Bar, has certified any Third Party Legal Professional identified here as a specialist or as an expert.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"New Jersey\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Any certification as a specialist, or any certification in a field of practice, that does not state that such certification has been granted by the Supreme Court of the State of New Jersey or by an organization that has been approved by the American Bar Association, indicates that the certifying organization has not been approved, or has been denied approval, by the Supreme Court of the State of New Jersey and the American Bar Association.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"New Mexico\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Any certification by an organization other than the New Mexico Board of Legal Specialization does not constitute recognition by the New Mexico Board of Legal Specialization, unless the Third Party Legal Professional is also recognized by the Board as a specialist in that area of law.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"New York\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Prior results obtained by Third Party Legal Professionals do not guarantee a similar outcome.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Rhode Island\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"The Rhode Island Supreme Court does not license or certify any Third Party Legal Professional as an expert or specialist in any field of practice.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Tennessee\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Unless otherwise indicated, Tennessee Third Party Legal Professionals are not certified as specialists by the Tennessee Commission on Continuing Legal Education and Specialization in the areas of practice listed on their Listings.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Texas\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"Unless otherwise indicated, Texas Third Party Legal Professionals are Not Certified by the Texas Board of Legal Specialization in the areas of practice listed on their Listings.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Washington\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"The Supreme Court of Washington does not recognize certification of specialties in the practice of law. Any certificate, award or recognition by a group, organization or association used by a Washington Third Party Legal Professional to describe his or her qualifications as a lawyer or qualifications in any subspecialty of law is not a requirement to practice law in the State of Washington.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null)), /*#__PURE__*/_react[\"default\"].createElement(\"p\", null, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"i\", null, \"Wyoming\")), /*#__PURE__*/_react[\"default\"].createElement(\"br\", null), \"The Wyoming State Bar does not certify any Third Party Legal Professional as a specialist or expert.\", /*#__PURE__*/_react[\"default\"].createElement(\"br\", null))))))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Requirements.\"), \"The \", renderDomain(), \" Offerings are available only to individuals who can enter into legally binding contracts under applicable law. The \", renderDomain(), \" Offerings are not intended for use by individuals under eighteen (18) years of age (or the applicable age of majority, if greater than eighteen (18) years of age in their respective jurisdictions). If you are under eighteen (18) years of age (or the applicable age of majority, if greater than eighteen (18) years of age in your jurisdiction), you do not have permission to use and/or access the \", renderDomain(), \" Offerings.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Directory Service.\"), \"Please be advised that \", renderDomain(), \" does not itself provide any underlying products and/or services, and the ultimate terms and conditions of any Third Party Offerings will be determined by the applicable Third Party Service Providers.\", /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"Please be advised that \", renderDomain(), \" does not itself provide any underlying products and/or services, and the ultimate terms and conditions of any Third Party Offerings will be determined by the applicable Third Party Service Providers.\"), \"To receive information regarding Third Party Service Providers, you must first fully complete the registration forms located on the Site (collectively, the \\\"Site Form\\\"). The information that you must supply on the Site Form includes, but is not limited to: (i) your zip code; (ii) the category applicable to your inquiry, if any; and/or (iii) any other information requested on the Site Form (collectively, the \\\"Directory Registration Data\\\"). You agree to provide true, accurate, current and complete Directory Registration Data and to update your Directory Registration Data as necessary in order to maintain it in a current and accurate fashion. \", renderDomain(), \"'s use of the Directory Registration Data shall be governed by the Privacy Policy.\", /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"Please be advised that the Directory Registration Data submitted by you, and any and all other information provided by you to \", renderDomain(), \" is not protected by the attorney-client privilege, and submitting this information does not create an attorney-client relationship.\")), /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, \"Upon entering your Directory Registration Data and clicking on the applicable submission button on the Site, you may be provided additional information regarding participating Third Party Service Providers that are located in your designated geographic area that you can choose to contact or be contacted by. Upon your request to contact, or be contacted by, any of the applicable Third Party Service Providers, \", renderDomain(), \" may transfer all or some of your Directory Registration Data to the applicable Third Party Service Provider(s) in connection with facilitating your request for Third Party Offerings from same.\", /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"Please be advised that selecting a Third Party Legal Professional to contact, or be contacted by, does not create an attorney-client relationship.\")), /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, \"You understand and agree that \", renderDomain(), \" shall not be liable to you or any third party for any modification, suspension or discontinuation of any service offered by any Third Party Service Provider.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Listings/Free Listings.\"), \"Subject to the terms and conditions of the Agreement, as well as the\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"/information#advertiser_terms\",\n target: \"_blank\"\n }, \"Advertiser Terms\"), \"that you agree to in their entirety when you submit Listings for display to Site Users, by registering on the Site, agreeing to the Agreement and receiving approval from \", renderDomain(), \", you (acting as a Third Party Service Provider) can submit, or attempt to submit, Listings for display to Site Users that conduct searches by and through the Directory Services. To submit a Listing, you must first fully complete the applicable Site Form. The information that you must supply on the Site Form includes, but is not limited to: (a) your company name; (b) your company's address; (c) your business telephone number; (d) categories that apply to your company's business practice, if applicable; (e) at your option, your business profile and link to your company's website; and/or (f) any other information requested on the Site Form (collectively, the \\\"Listing Registration Data\\\"). You agree to provide true, accurate, current and complete Listing Registration Data and to update your Listing Registration Data as necessary in order to maintain it in a current and accurate fashion. \", renderDomain(), \"'s use of the Listing Registration Data shall be governed by the Privacy Policy.\", /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, \"The Listings contain descriptions that are provided directly by the applicable Third Party Service Providers, or the manufacturers or distributors of the Third Party Offerings featured in the Listings, as applicable. \", renderDomain(), \" does not represent or warrant that the descriptions of such items are accurate or complete. As a result, \", renderDomain(), \" has no control over: (i) the quality, safety or legality of the Third Party Offerings; (ii) the truth or accuracy of the Listings; and/or (iii) the ability of the applicable Third Party Service Providers to sell the Third Party Offerings. Do not assume that the offer, sale, purchase, export or import of any Third Party Offerings is valid and legal simply because it is listed on the Site. We are not responsible for ensuring that the applicable Third Party Service Provider actually completes a transaction. Where you submit a Listing by and through the Site, you represent and warrant that: (A) all content in the Listing is accurate, complete and current; (B) you have all necessary rights, power and authority to publish the Listing; (C) the Listing, and any website listed in, or linked to from, the Listing: (I) complies with all applicable laws and regulations; (II) does not infringe upon, misappropriate or otherwise violate any copyright, patent, trademark, service mark, trade secret or other intellectual property right of any third party; (III) does not violate the rights of any person or entity, including rights of publicity or privacy, and is not defamatory; and (IV) does not result in consumer fraud (including being false or misleading), product liability, tort, breach of contract, injury, damage or harm of any kind to any person or entity; and (D) you possess documents that substantiate all claims, express and implied, contained within the Listing.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Paid Advertiser Services.\"), \"Subject to the terms and conditions of the Agreement, as well as the\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"/information#advertiser_terms\",\n target: \"_blank\"\n }, \"Advertiser Terms\"), \"that you agree to in their entirety when you register to become an Advertiser, by registering on the Site and receiving approval from \", renderDomain(), \", you can obtain, or attempt to obtain, for a fee, access to the Paid Advertiser Services as an Advertiser. All payment terms associated with the Paid Advertiser Services shall be set forth in the Advertiser Terms. Please review the terms and conditions of the\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"/information#advertiser_terms\",\n target: \"_blank\"\n }, \"Advertiser Terms\"), \"carefully before proceeding with registration. Advertisers are subject to the same obligations, terms and conditions as apply to Third Party Service Providers under the Agreement including, without limitation, those applicable to Listings set forth in Section 6 above. To submit a Listing, you must first fully complete the applicable Site Form on the Site, or via telephone with an \", renderDomain(), \" representative. The information that you must supply on the Site Form includes, but is not limited to: (a) your company name; (b) your company's address; (c) your business telephone number; (d) categories that apply to your company's business practice, if applicable; (e) at your option, your mobile telephone number; (f) at your option, your business profile and link to your company's website; (g) your credit card information; and/or (h) any other information requested on the Site Form (collectively, the \\\"Advertiser Registration Data\\\"). You agree to provide true, accurate, current and complete Advertiser Registration Data and to update your Advertiser Registration Data as necessary in order to maintain it in a current and accurate fashion. \", renderDomain(), \"'s use of the Advertiser Registration Data shall be governed by the Privacy Policy.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Resource Network.\"), \"The Resource Network features ongoing, interactive conversations, discussions and forums surrounding articles (\\\"Network Articles\\\") on a broad range of topics as submitted by registered Network Participants and/or permitted guests. Visitors may be permitted to post Feedback at the end of Network Articles. Subject to the terms and conditions of the Agreement, by sending \", renderDomain(), \" a request to: (a)\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n mailto: \"HomeExpertNetwork@eLocal.com\"\n }, \"HomeExpertNetwork@eLocal.com,\"), \"agreeing to the Agreement and receiving approval from \", renderDomain(), \", you may be granted access to the Home Expert Network as an Ongoing Contributor or Expert Panelist; and/or (b)\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n mailto: \"LegalResourceNetwork@eLocal.com\"\n }, \"LegalResourceNetwork@eLocal.com,\"), \"you may be granted access to the Legal Resource Network as an Contributor or Member. To become a Network Participant, you must provide certain information to the applicable \", renderDomain(), \" representative (collectively, the \\\"Network Registration Data\\\" and together with the Directory Registration Data, Listing Registration Data and Advertiser Registration Data, the \\\"Registration Data\\\"). You agree to provide true, accurate, current and complete Network Registration Data and to update your Network Registration Data as necessary in order to maintain it in a current and accurate fashion. \", renderDomain(), \"'s use of Network Registration Data shall be governed by the Privacy Policy.\", /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, \"The Network Articles are provided directly by the applicable Network Participants. \", renderDomain(), \" does not represent or warrant that the Network Articles are accurate or complete. As a result, \", renderDomain(), \" has no control over: (a) the quality, safety or legality of the Network Articles; and/or (b) the truth or accuracy of the Network Articles. Where you submit a Network Article by and through the Site, you represent and warrant that: (i) all content in the Network Article is accurate, complete and current; (ii) you have all necessary rights, power and authority to publish the Network Article (and grant \", renderDomain(), \" the rights to publish and use same as contemplated hereunder); (iii) the Network Article, and any website listed in, or linked to from, the Network Article: (A) complies with all applicable laws, rules and regulations including, without limitation, the Federal Trade Commission Guidelines Concerning the Use of Endorsements and Testimonials; (B) does not infringe upon, misappropriate or otherwise violate any copyright, patent, trademark, service mark, trade secret or other intellectual property right of any third party; (C) does not violate the rights of any person or entity, including rights of publicity or privacy, and is not defamatory; and (D) does not result in consumer fraud (including being false or misleading), product liability, tort, breach of contract, injury, damage or harm of any kind to any person or entity; and (iv) you possess documents that substantiate all claims, express and implied, contained within the Network Article.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Content.\"), \"Subject to the terms and conditions of the Agreement, end-users that possess the requisite technology shall have the opportunity to view, download and/or interact with all or some of the Content made available by and through the Site and/or other \", renderDomain(), \" Offerings. The Content is compiled, distributed and displayed by \", renderDomain(), \", as well as various third-party content providers including, without limitation, Third Party Service Providers, Visitors and Network Participants (\\\"Third-Party Providers\\\"). \", renderDomain(), \" does not control the Content provided by Third-Party Providers that is made available by and through the \", renderDomain(), \" Offerings. Such Third-Party Providers are solely responsible for the accuracy, completeness, appropriateness and/or usefulness of such Content. The Content should not necessarily be relied upon. \", renderDomain(), \" does not represent or warrant that the Content and other information posted by and through the \", renderDomain(), \" Offerings is accurate, complete, up-to-date or appropriate. You understand and agree that \", renderDomain(), \" shall not be responsible for, and \", renderDomain(), \" undertakes no responsibility to monitor or otherwise police, Content provided by Third-Party Providers.\", /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }), \"You agree that \", renderDomain(), \" shall have no obligation and incur no liability to you in connection with any Content. You may find certain Content to be outdated, harmful, inaccurate and/or deceptive. Please use caution, common sense and safety when using the Content.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Social Media Pages.\"), \"The Site contains links to various \", renderDomain(), \" Social Media Pages. The Social Media Pages are hosted and made available on third party websites (\\\"Social Media Websites\\\") by third party entities. Your use of Social Media Pages and Social Media Websites shall be governed by the applicable terms and conditions of those Social Media Websites.\", /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"You understand and agree that \", renderDomain(), \" shall not be liable to you, any other end-user or any third party for any claim in connection with your use of, or inability to use, the Social Media Pages and/or Social Media Websites.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Interactive Services.\"), \"Subject to the restrictions set forth herein, the Interactive Services will allow you to participate in, and provide Feedback in connection with, Network Articles comment sections, blogs, message boards, question and answer areas and other interactive areas of the Site.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Site Content Submission Guidelines.\"), \"All Site Content that you submit through or in association with the \", renderDomain(), \" Offerings including, without limitation, the Registration Data, Feedback, Listings, Content, Network Articles, advertisements, responses, statements, promises or other information, shall be subject to the Privacy Policy. For a copy of the Privacy Policy, please\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"/information#privacy\",\n target: \"_blank\"\n }, \"click here.\"), \"By submitting such Site Content to us, you: (a) represent and warrant that \", renderDomain(), \"'s use of your submission does not and will not breach any agreement, violate any law or infringe upon any third party's rights; (b) agree that \", renderDomain(), \" is free to use in any manner all or part of the content of any such Site Content or other materials in perpetuity, on an unrestricted basis without the obligation to notify, identify or compensate you or anyone else; and (c) grant \", renderDomain(), \" all necessary rights, including a waiver of all copyright, trademark, privacy and moral rights, to use all Site Content and/or materials, in whole or in part, or as a derivative work, without any duty by \", renderDomain(), \" to anyone whatsoever. \", renderDomain(), \" does not accept unsolicited ideas, works or other materials and you acknowledge that you are responsible for, and bear all risk as to the use or distribution of, any such ideas, works and/or materials.\", /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, \"You agree that you are solely responsible for the Site Content that you publish, transmit and/or post by and through the \", renderDomain(), \" Offerings. You agree to use the \", renderDomain(), \" Offerings in full compliance with all applicable laws, rules and regulations. In connection with your use of the \", renderDomain(), \" Offerings, and submission of Site Content, you agree not to: (i) display any telephone numbers, street addresses, last names, URLs, e-mail addresses or any confidential information of any third party; (ii) display any audio files, text, photographs, videos or other images containing confidential information; (iii) display any audio files, text, photographs, videos or other images that may be deemed indecent or obscene in your community, as defined under applicable law; (iv) impersonate any person or entity; (v) \\\"stalk\\\" or otherwise harass any person; (vi) engage in unauthorized advertising to, or commercial solicitation of, Site Users; (vii) transmit any chain letters, spam or junk e-mail to Site Users or other parties; (viii) express or imply that any statements you make are endorsed by \", renderDomain(), \"; (ix) harvest or collect personal information of Site Users whether or not for commercial purposes, without their express consent; (x) use any robot, spider, site search/retrieval application, or other manual or automatic device or process to retrieve, index, \\\"data mine,\\\" or in any way reproduce or circumvent the navigational structure or presentation of the Site or its contents; (xi) post, distribute or reproduce in any way any copyrighted material, trademarks or other proprietary information without obtaining the prior consent of the owner of such proprietary rights; (xii) remove any copyright, trademark or other proprietary rights notices contained in the \", renderDomain(), \" Offerings; (xiii) interfere with or disrupt any of the \", renderDomain(), \" Offerings and/or the servers or networks connected to same; (xiv) post, offer for download, e-mail or otherwise transmit any material that contains software viruses or any other computer code, files or programs designed to interrupt, destroy or limit the functionality of any computer software or hardware or telecommunications equipment; (xv) post, offer for download, transmit, promote or otherwise make available any software, product or service that is illegal or that violates the rights of a third party including, but not limited to, spyware, adware, programs designed to send unsolicited advertisements (i.e. \\\"spamware\\\"), services that send unsolicited advertisements, programs designed to initiate \\\"denial of service\\\" attacks, mail bomb programs and programs designed to gain unauthorized access to networks on the Internet; (xvi) \\\"frame\\\" or \\\"mirror\\\" any part of the \", renderDomain(), \" Offerings; (xvii) use metatags or code or other devices containing any reference to the \", renderDomain(), \" Offerings in order to direct any person to any other website for any purpose; and/or (xviii) modify, adapt, sublicense, translate, sell, reverse engineer, decipher, decompile or otherwise disassemble any portion of the \", renderDomain(), \" Offerings or any software used on or in connection with same. Engaging in any of the aforementioned prohibited practices shall be deemed a breach of the Agreement and may result in the immediate termination of your access to some or all of the \", renderDomain(), \" Offerings without notice, in the sole discretion of \", renderDomain(), \". \", renderDomain(), \" reserves the right to pursue any and all legal remedies against Site Users that engage in the aforementioned prohibited conduct.\"))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"License Grant.\"), \"As a user of the Site, you are granted a non-exclusive, non-transferable, revocable and limited license to access and use the \", renderDomain(), \" Offerings and associated content in accordance with the Agreement. \", renderDomain(), \" may terminate this license at any time for any reason. Other than where expressly permitted by \", renderDomain(), \", you may only use the \", renderDomain(), \" Offerings on one computer for your own personal, non-commercial use. No part of the \", renderDomain(), \" Offerings may be reproduced in any form or incorporated into any information retrieval system, electronic or mechanical. You may not use, copy, emulate, clone, rent, lease, sell, modify, decompile, disassemble, reverse engineer or transfer the \", renderDomain(), \" Offerings or any portion thereof. \", renderDomain(), \" reserves all rights not explicitly granted in the Agreement. You may not use any device, software or routine to interfere or attempt to interfere with the proper working of the \", renderDomain(), \" Offerings. You may not take any action that imposes an unreasonable or disproportionately large load on \", renderDomain(), \" infrastructure. Your right to use the \", renderDomain(), \" Offerings is not transferable.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Proprietary Rights.\"), \"The content, organization, graphics, design, compilation, magnetic translation, digital conversion, software, services and other matters related to the \", renderDomain(), \" Offerings are protected under applicable copyright, trademark and other proprietary (including, but not limited to, intellectual property) rights. The copying, redistribution, publication or sale by you of any part of the \", renderDomain(), \" Offerings is strictly prohibited. Systematic retrieval of material from the Site by automated means or any other form of scraping or data extraction in order to create or compile, directly or indirectly, a collection, compilation, database or directory without written permission from \", renderDomain(), \" is prohibited. You do not acquire ownership rights in or to any content, document, software, services or other materials viewed at the Site or through the \", renderDomain(), \" Offerings. The posting of information or material on the Site by \", renderDomain(), \" does not constitute a waiver of any right in or to such information and/or materials. The \\\"eLocal\\\" name and logo, and all associated graphics, icons and service names, are trademarks of \", renderDomain(), \" USA LLC. All other trademarks are the property of their respective owners. The use of any trademark without the applicable trademark owner's express written consent is strictly prohibited.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Editing, Deleting and Modification.\"), \"We reserve the right in our sole discretion to edit and/or delete any documents, information or other content appearing on the Site.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Legal Warning.\"), \"Any attempt by any individual, whether or not a \", renderDomain(), \" customer, to damage, destroy, tamper with, vandalize and/or otherwise interfere with the operation of the \", renderDomain(), \" Offerings, is a violation of criminal and civil law and \", renderDomain(), \" will diligently pursue any and all remedies in this regard against any offending individual or entity to the fullest extent permissible by law and in equity.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Indemnification.\"), \"You agree to indemnify and hold \", renderDomain(), \", its parents, subsidiaries and affiliates, and each of their respective members, officers, directors, employees, agents, co-navbar-branders and/or other partners, harmless from and against any and all claims, expenses (including reasonable attorneys' fees), damages, suits, costs, demands and/or judgments whatsoever, made by any third party due to or arising out of: (a) your use of the \", renderDomain(), \" Offerings; (b) your breach of the Agreement; (c) any dispute between you and any Site User or third party; and/or (d) your violation of any rights of another individual and/or entity. The provisions of this Section 17 are for the benefit of \", renderDomain(), \", its parents, subsidiaries and/or affiliates, and each of their respective officers, directors, members, employees, agents, shareholders, licensors, suppliers and/or attorneys. Each of these individuals and entities shall have the right to assert and enforce these provisions directly against you on its own behalf.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Disclaimer of Warranties.\"), \"THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME ARE PROVIDED TO YOU ON AN \\\"AS IS\\\" AND \\\"AS AVAILABLE\\\" BASIS AND ALL WARRANTIES, EXPRESS AND IMPLIED, ARE DISCLAIMED TO THE FULLEST EXTENT PERMISSIBLE PURSUANT TO APPLICABLE LAW (INCLUDING, BUT NOT LIMITED TO, THE DISCLAIMER OF ANY WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT OF INTELLECTUAL PROPERTY AND/OR FITNESS FOR A PARTICULAR PURPOSE). IN PARTICULAR, BUT NOT AS A LIMITATION THEREOF, ELOCAL MAKES NO WARRANTY THAT: (A) THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME WILL MEET YOUR REQUIREMENTS; (B) THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME WILL BE UNINTERRUPTED, TIMELY, SECURE OR ERROR-FREE; (C) YOU WILL QUALIFY FOR THIRD PARTY OFFERINGS FROM ANY THIRD PARTY SERVICE PROVIDER; OR (D) THE RESULTS THAT MAY BE OBTAINED FROM THE USE OF THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME WILL BE ACCURATE OR RELIABLE. THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME MAY CONTAIN BUGS, ERRORS, PROBLEMS OR OTHER LIMITATIONS. WE WILL NOT BE LIABLE FOR THE AVAILABILITY OF THE UNDERLYING INTERNET CONNECTION ASSOCIATED WITH THE SITE. NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU FROM ELOCAL&trade, ANY SITE USER OR OTHERWISE THROUGH OR FROM THE ELOCAL OFFERINGS, SHALL CREATE ANY WARRANTY NOT EXPRESSLY STATED IN THE AGREEMENT.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Limitation of Liability.\"), \"YOU EXPRESSLY UNDERSTAND AND AGREE THAT ELOCAL SHALL NOT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL AND/OR EXEMPLARY DAMAGES INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER INTANGIBLE LOSSES (EVEN IF ELOCAL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), TO THE FULLEST EXTENT PERMISSIBLE BY LAW FOR: (A) THE USE OR THE INABILITY TO USE THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME; (B) THE COST OF PROCUREMENT OF SUBSTITUTE GOODS AND SERVICES RESULTING FROM ANY GOODS, DATA, INFORMATION AND/OR SERVICES PURCHASED OR OBTAINED FROM, OR TRANSACTIONS ENTERED INTO THROUGH, THE ELOCAL OFFERINGS; (C) THE FAILURE TO QUALIFY FOR THIRD PARTY OFFERINGS FROM ANY THIRD PARTY SERVICE PROVIDER; (D) THE UNAUTHORIZED ACCESS TO, OR ALTERATION OF, YOUR REGISTRATION DATA; AND (E) ANY OTHER MATTER RELATING TO THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME. THIS LIMITATION APPLIES TO ALL CAUSES OF ACTION, IN THE AGGREGATE INCLUDING, BUT NOT LIMITED TO, BREACH OF CONTRACT, BREACH OF WARRANTY, NEGLIGENCE, STRICT LIABILITY, MISREPRESENTATIONS AND ANY AND ALL OTHER TORTS. YOU HEREBY RELEASE ELOCAL FROM ANY AND ALL OBLIGATIONS, LIABILITIES AND CLAIMS IN EXCESS OF THE LIMITATIONS STATED HEREIN. IF APPLICABLE LAW DOES NOT PERMIT SUCH LIMITATIONS, THE MAXIMUM LIABILITY OF ELOCAL TO YOU UNDER ANY AND ALL CIRCUMSTANCES WILL BE FIVE HUNDRED DOLLARS ($500.00). THE NEGATION OF DAMAGES SET FORTH ABOVE IS A FUNDAMENTAL ELEMENT OF THE BASIS OF THE BARGAIN BETWEEN YOU AND ELOCAL&trade. THE ELOCAL OFFERINGS AND/OR ANY OTHER PRODUCTS AND/OR SERVICES THAT YOU MAY APPLY FOR THROUGH SAME WOULD NOT BE PROVIDED TO YOU WITHOUT SUCH LIMITATIONS. SOME JURISDICTIONS, SUCH AS NEW JERSEY, MAY NOT ALLOW CERTAIN LIMITATIONS ON LIABILITY AND IN SUCH JURISDICTIONS THE LIABILITY OF ELOCAL SHALL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY LAW.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Third Party Websites.\"), \"The Site may provide links to and/or refer you to other Internet websites and/or resources including, but not limited to, certain Site User websites and/or Social Media Websites. Because \", renderDomain(), \" has no control over such third party websites and/or resources, you hereby acknowledge and agree that \", renderDomain(), \" is not responsible for the availability of such third party websites and/or resources. Furthermore, \", renderDomain(), \" does not endorse, and is not responsible or liable for, any terms and conditions, privacy policies, content, advertising, services, products and/or other materials at or available from such third party websites or resources, or for any damages and/or losses arising therefrom.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Dispute Resolution Provisions.\"), \"The Agreement shall be treated as though it were executed and performed in Delaware and shall be governed by and construed in accordance with the laws of the State of Delaware (without regard to conflict of law principles).\", /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"You hereby agree to arbitrate all claims that may arise under the Agreement that you may have against \", renderDomain(), \" or any of the Covered Parties, who are express third-party beneficiaries of the mandatory arbitration provision. Without limiting the foregoing, should a dispute arise between you and \", renderDomain(), \" and/or any Covered Party including, without limitation, any matter concerning the \", renderDomain(), \" Offerings, terms and conditions of the Agreement or the breach of same by any party hereto: (a) the parties agree to submit their dispute for resolution by arbitration before the American Arbitration Association (the \\u201CAAA\\u201D) in Delaware or the county of your residence, in accordance with the then current Commercial Arbitration rules of the AAA; and (b) you agree to first commence a formal dispute proceeding by completing and submitting an Initial Dispute Notice which can be found\\xA0\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"http://assets.elocal.com.s3.amazonaws.com/DisputeResolutionProvision.pdf\",\n target: \"_blank\"\n }, \"here.\"), \"We may choose to provide you with a final written settlement offer after receiving your Initial Dispute Notice (\\\"Final Settlement Offer\\\"). If we provide you with a Final Settlement Offer and you do not accept it, or we cannot otherwise satisfactorily resolve your dispute, but you still wish to proceed with your dispute, you must submit your dispute for resolution by arbitration before the AAA as set forth above, by filing a separate Demand for Arbitration, which is available\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"http://www.adr.org/aaa/ShowPDF?doc=ADRSTG_004177\",\n target: \"_blank\"\n }, \"here.\"), \"For claims of Ten Thousand Dollars ($10,000.00) or less, you can choose whether the arbitration proceeds in person, by telephone or based only on submissions. If the arbitrator awards you relief that is greater than our Final Settlement Offer, then we will pay all filing, administration and arbitrator fees associated with the arbitration and, if you retained an attorney to represent you in connection with the arbitration, we will reimburse any reasonable attorneys' fees that your attorney accrued for investigating, preparing and pursuing the claim in arbitration. Any award rendered shall be final and conclusive to the parties and a judgment thereon may be entered in any court of competent jurisdiction. Although we may have a right to an award of attorneys' fees and expenses if we prevail in arbitration, we will not seek such an award from you unless the arbitrator determines that your claim was frivolous.\"), /*#__PURE__*/_react[\"default\"].createElement(\"span\", {\n className: \"break\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"b\", {\n className: \"darken\"\n }, \"To the extent permitted by law, you agree that you will not bring, join or participate in any class action lawsuit as to any claim, dispute or controversy that you may have against \", renderDomain(), \" and/or any Covered Party. You agree to the entry of injunctive relief to stop such a lawsuit or to remove you as a participant in the suit. You agree to pay the attorney's fees and court costs that \", renderDomain(), \" and/or any Covered Party incurs in seeking such relief. This provision preventing you from bringing, joining or participating in class action lawsuits: (i) does not constitute a waiver of any of your rights or remedies to pursue a claim individually and not as a class action in binding arbitration as provided above; and (ii) is an independent agreement. You may opt-out of these dispute resolution provisions by providing written notice of your decision within thirty (30) days of the date that you first access the Site.\")))), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Miscellaneous.\"), \"Should any part of the Agreement be held invalid or unenforceable, that portion shall be construed consistent with applicable law and the remaining portions shall remain in full force and effect. To the extent that anything in or associated with any \", renderDomain(), \" Offerings is in conflict or inconsistent with the Agreement, the Agreement shall take precedence. Our failure to enforce any provision of the Agreement shall not be deemed a waiver of such provision nor of the right to enforce such provision. The parties do not intend that any agency or partnership relationship be created through operation of the Agreement. \", renderDomain(), \" may assign its rights and obligations under the Agreement, in whole or in part, to any party at any time without any notice to you. The Agreement may not, however, be assigned by you, and you may not delegate your duties under it. Headings are for reference purposes only and in no way define, limit, construe or describe the scope or extent of such section.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", null, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"California End-User Consumer Rights.\"), \"In accordance with Cal. Civ. Code Sec. 1789.3, California State resident Users may file grievances and complaints with the California Department of Consumer Affairs, 400 R Street, Ste. 1080, Sacramento, CA 95814; or by phone at 916-445-1254 or 800-952-5210; or by email to dca@dca.ca.gov.\")), /*#__PURE__*/_react[\"default\"].createElement(\"li\", {\n className: \"spacer-large bottom\"\n }, /*#__PURE__*/_react[\"default\"].createElement(\"span\", null, /*#__PURE__*/_react[\"default\"].createElement(\"strong\", null, \"Contact Us.\"), \"If you have any questions regarding the Agreement, or would like more information from \", renderDomain(), \", please contact us at using our\", /*#__PURE__*/_react[\"default\"].createElement(\"a\", {\n className: \"underline-link\",\n href: \"/information#contact\",\n target: \"_blank\"\n }, \"contact form;\"), \"or call us at: 1-877-91-ELOCAL.\"))));\n};\n\nTerms.propTypes = {\n domain: _propTypes[\"default\"].string.isRequired,\n icon: _propTypes[\"default\"].func.isRequired,\n isTrademarked: _propTypes[\"default\"].bool,\n privacyUrl: _propTypes[\"default\"].string.isRequired\n};\nTerms.defaultProps = {\n isTrademarked: false\n};\nvar _default = Terms;\nexports[\"default\"] = _default;\n\n},{\"prop-types\":6,\"react\":14}],18:[function(require,module,exports){\n\"use strict\";\n\nvar _Privacy = _interopRequireDefault(require(\"./Privacy\"));\n\nvar _PrivacyCalifornia = _interopRequireDefault(require(\"./PrivacyCalifornia\"));\n\nvar _Terms = _interopRequireDefault(require(\"./Terms\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { \"default\": obj }; }\n\nmodule.exports = {\n Privacy: _Privacy[\"default\"],\n PrivacyCalifornia: _PrivacyCalifornia[\"default\"],\n Terms: _Terms[\"default\"]\n};\n\n},{\"./Privacy\":15,\"./PrivacyCalifornia\":16,\"./Terms\":17}]},{},[18])(18)\n});\n\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvb2JqZWN0LWFzc2lnbi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9jaGVja1Byb3BUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvaGFzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWlzL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pcy9janMvcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtaXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QvY2pzL3JlYWN0LmRldmVsb3BtZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9pbmRleC5qcyIsInNyYy9Qcml2YWN5L2luZGV4LmpzIiwic3JjL1ByaXZhY3lDYWxpZm9ybmlhL2luZGV4LmpzIiwic3JjL1Rlcm1zL2luZGV4LmpzIiwic3JjL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbG1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3gzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDUEE7O0FBQ0E7Ozs7QUFFQSxJQUFN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RGxNLDZNQUM2WSxZQUFZLEVBRHpaLGloQkFEQSxDQVZBLENBREYsQ0E3VUYsZUErVkUseURBQ0UsMkRBQ0EsaUVBREEsZ1FBRTJQLFlBQVksRUFGdlEsK1dBRW9uQixZQUFZLEVBRmhvQiw2V0FERixDQS9WRixlQXFXRSx5REFDRSwyREFDQSx1RkFEQSxxU0FERixDQXJXRixlQTJXRTtBQUFJLElBQUEsU0FBUyxFQUFDO0FBQWQsa0JBQ0UsMkRBQ0EsOERBREEsNkZBRXdGLFlBQVksRUFGcEcsbURBR0E7QUFBRyxJQUFBLFNBQVMsRUFBQyxnQkFBYjtBQUE4QixJQUFBLElBQUksRUFBQyxzQkFBbkM7QUFBMEQsSUFBQSxNQUFNLEVBQUM7QUFBakUscUJBSEEsb0NBREYsQ0EzV0YsQ0E5QkYsQ0FERjtBQXFaRCxDQWphRDs7QUFtYUEsS0FBSyxDQUFDLFNBQU4sR0FBa0I7QUFDaEIsRUFBQSxNQUFNLEVBQUUsc0JBQVUsTUFBVixDQUFpQixVQURUO0FBRWhCLEVBQUEsSUFBSSxFQUFFLHNCQUFVLElBQVYsQ0FBZSxVQUZMO0FBR2hCLEVBQUEsYUFBYSxFQUFFLHNCQUFVLElBSFQ7QUFJaEIsRUFBQSxVQUFVLEVBQUUsc0JBQVUsTUFBVixDQUFpQjtBQUpiLENBQWxCO0FBT0EsS0FBSyxDQUFDLFlBQU4sR0FBcUI7QUFDbkIsRUFBQSxhQUFhLEVBQUU7QUFESSxDQUFyQjtlQUllLEs7Ozs7OztBQ2piZjs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCO0FBQ2YsRUFBQSxPQUFPLEVBQVAsbUJBRGU7QUFFZixFQUFBLGlCQUFpQixFQUFqQiw2QkFGZTtBQUdmLEVBQUEsS0FBSyxFQUFMO0FBSGUsQ0FBakIiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24oKSB7fTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG5cbiAgcHJpbnRXYXJuaW5nID0gZnVuY3Rpb24odGV4dCkge1xuICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyB0ZXh0O1xuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHsgLyoqLyB9XG4gIH07XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgICAgaWYgKGhhcyh0eXBlU3BlY3MsIHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaWYgKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdmFyIGVyciA9IEVycm9yKFxuICAgICAgICAgICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHR5cGVTcGVjTmFtZSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgICAgICAgICAnaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLCBidXQgcmVjZWl2ZWQgYCcgKyB0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gKyAnYC4nICtcbiAgICAgICAgICAgICAgJ1RoaXMgb2Z0ZW4gaGFwcGVucyBiZWNhdXNlIG9mIHR5cG9zIHN1Y2ggYXMgYFByb3BUeXBlcy5mdW5jdGlvbmAgaW5zdGVhZCBvZiBgUHJvcFR5cGVzLmZ1bmNgLidcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlcnIubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlcnJvciAmJiAhKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJykgKyAnOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJyArXG4gICAgICAgICAgICBsb2NhdGlvbiArICcgYCcgKyB0eXBlU3BlY05hbWUgKyAnYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgK1xuICAgICAgICAgICAgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICcgKyB0eXBlb2YgZXJyb3IgKyAnLiAnICtcbiAgICAgICAgICAgICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICtcbiAgICAgICAgICAgICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgK1xuICAgICAgICAgICAgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICAgJ0ZhaWxlZCAnICsgbG9jYXRpb24gKyAnIHR5cGU6ICcgKyBlcnJvci5tZXNzYWdlICsgKHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNldHMgd2FybmluZyBjYWNoZSB3aGVuIHRlc3RpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuY2hlY2tQcm9wVHlwZXMucmVzZXRXYXJuaW5nQ2FjaGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbmZ1bmN0aW9uIGVtcHR5RnVuY3Rpb24oKSB7fVxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvbldpdGhSZXNldCgpIHt9XG5lbXB0eUZ1bmN0aW9uV2l0aFJlc2V0LnJlc2V0V2FybmluZ0NhY2hlID0gZW1wdHlGdW5jdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAnVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICApO1xuICAgIGVyci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIHRocm93IGVycjtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJpZ2ludDogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBlbGVtZW50VHlwZTogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltLFxuICAgIGV4YWN0OiBnZXRTaGltLFxuXG4gICAgY2hlY2tQcm9wVHlwZXM6IGVtcHR5RnVuY3Rpb25XaXRoUmVzZXQsXG4gICAgcmVzZXRXYXJuaW5nQ2FjaGU6IGVtcHR5RnVuY3Rpb25cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdElzID0gcmVxdWlyZSgncmVhY3QtaXMnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9saWIvaGFzJyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbnZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBwcmludFdhcm5pbmcgPSBmdW5jdGlvbih0ZXh0KSB7XG4gICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArIHRleHQ7XG4gICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfSBjYXRjaCAoeCkge31cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbCgpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBiaWdpbnQ6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdiaWdpbnQnKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBlbGVtZW50VHlwZTogY3JlYXRlRWxlbWVudFR5cGVUeXBlQ2hlY2tlcigpLFxuICAgIGluc3RhbmNlT2Y6IGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIsXG4gICAgbm9kZTogY3JlYXRlTm9kZUNoZWNrZXIoKSxcbiAgICBvYmplY3RPZjogY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcixcbiAgICBvbmVPZjogY3JlYXRlRW51bVR5cGVDaGVja2VyLFxuICAgIG9uZU9mVHlwZTogY3JlYXRlVW5pb25UeXBlQ2hlY2tlcixcbiAgICBzaGFwZTogY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcixcbiAgICBleGFjdDogY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcixcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSwgZGF0YSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5kYXRhID0gZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhOiB7fTtcbiAgICB0aGlzLnN0YWNrID0gJyc7XG4gIH1cbiAgLy8gTWFrZSBgaW5zdGFuY2VvZiBFcnJvcmAgc3RpbGwgd29yayBmb3IgcmV0dXJuZWQgZXJyb3JzLlxuICBQcm9wVHlwZUVycm9yLnByb3RvdHlwZSA9IEVycm9yLnByb3RvdHlwZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgZXJyLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9IGVsc2UgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBwcm9wIG9uIGAnICsgY29tcG9uZW50TmFtZSArICdgLiBUaGlzIGlzIGRlcHJlY2F0ZWQgJyArXG4gICAgICAgICAgICAgICdhbmQgd2lsbCB0aHJvdyBpbiB0aGUgc3RhbmRhbG9uZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAgICdZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIGEgdGhpcmQtcGFydHkgUHJvcFR5cGVzICcgK1xuICAgICAgICAgICAgICAnbGlicmFyeS4gU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1kb250LWNhbGwtcHJvcHR5cGVzICcgKyAnZm9yIGRldGFpbHMuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSxcbiAgICAgICAgICB7ZXhwZWN0ZWRUeXBlOiBleHBlY3RlZFR5cGV9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLicpO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGFycmF5LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHR5cGVDaGVja2VyKHByb3BWYWx1ZSwgaSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICdbJyArIGkgKyAnXScsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZVR5cGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGlmICghUmVhY3RJcy5pc1ZhbGlkRWxlbWVudFR5cGUocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQgdHlwZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHByaW50V2FybmluZyhcbiAgICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50cyBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gYXJyYXksIGdvdCAnICsgYXJndW1lbnRzLmxlbmd0aCArICcgYXJndW1lbnRzLiAnICtcbiAgICAgICAgICAgICdBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHdyaXRlIG9uZU9mKHgsIHksIHopIGluc3RlYWQgb2Ygb25lT2YoW3gsIHksIHpdKS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGFycmF5LicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvblRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkVmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpcyhwcm9wVmFsdWUsIGV4cGVjdGVkVmFsdWVzW2ldKSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciB2YWx1ZXNTdHJpbmcgPSBKU09OLnN0cmluZ2lmeShleHBlY3RlZFZhbHVlcywgZnVuY3Rpb24gcmVwbGFjZXIoa2V5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdHlwZSA9IGdldFByZWNpc2VUeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHZhbHVlIGAnICsgU3RyaW5nKHByb3BWYWx1ZSkgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKGhhcyhwcm9wVmFsdWUsIGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IHByaW50V2FybmluZygnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb25UaGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheU9mVHlwZUNoZWNrZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICBpZiAodHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcHJpbnRXYXJuaW5nKFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWVkIHRvIG9uZU9mVHlwZS4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgY2hlY2sgZnVuY3Rpb25zLCBidXQgJyArXG4gICAgICAgICAgJ3JlY2VpdmVkICcgKyBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlcikgKyAnIGF0IGluZGV4ICcgKyBpICsgJy4nXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uVGhhdFJldHVybnNOdWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIGV4cGVjdGVkVHlwZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIHZhciBjaGVja2VyUmVzdWx0ID0gY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgaWYgKGNoZWNrZXJSZXN1bHQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja2VyUmVzdWx0LmRhdGEgJiYgaGFzKGNoZWNrZXJSZXN1bHQuZGF0YSwgJ2V4cGVjdGVkVHlwZScpKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUeXBlcy5wdXNoKGNoZWNrZXJSZXN1bHQuZGF0YS5leHBlY3RlZFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgPSAoZXhwZWN0ZWRUeXBlcy5sZW5ndGggPiAwKSA/ICcsIGV4cGVjdGVkIG9uZSBvZiB0eXBlIFsnICsgZXhwZWN0ZWRUeXBlcy5qb2luKCcsICcpICsgJ10nOiAnJztcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agc3VwcGxpZWQgdG8gJyArICgnYCcgKyBjb21wb25lbnROYW1lICsgJ2AnICsgZXhwZWN0ZWRUeXBlc01lc3NhZ2UgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFsaWRWYWxpZGF0b3JFcnJvcihjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBrZXksIHR5cGUpIHtcbiAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoXG4gICAgICAoY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnKSArICc6ICcgKyBsb2NhdGlvbiArICcgdHlwZSBgJyArIHByb3BGdWxsTmFtZSArICcuJyArIGtleSArICdgIGlzIGludmFsaWQ7ICcgK1xuICAgICAgJ2l0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZSwgYnV0IHJlY2VpdmVkIGAnICsgdHlwZSArICdgLidcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHNoYXBlVHlwZXMpIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBzaGFwZVR5cGVzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBpbnZhbGlkVmFsaWRhdG9yRXJyb3IoY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwga2V5LCBnZXRQcmVjaXNlVHlwZShjaGVja2VyKSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlU3RyaWN0U2hhcGVUeXBlQ2hlY2tlcihzaGFwZVR5cGVzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIGAnICsgcHJvcFR5cGUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYG9iamVjdGAuJykpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBhbGwga2V5cyBpbiBjYXNlIHNvbWUgYXJlIHJlcXVpcmVkIGJ1dCBtaXNzaW5nIGZyb20gcHJvcHMuXG4gICAgICB2YXIgYWxsS2V5cyA9IGFzc2lnbih7fSwgcHJvcHNbcHJvcE5hbWVdLCBzaGFwZVR5cGVzKTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBhbGxLZXlzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoaGFzKHNoYXBlVHlwZXMsIGtleSkgJiYgdHlwZW9mIGNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gaW52YWxpZFZhbGlkYXRvckVycm9yKGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIGtleSwgZ2V0UHJlY2lzZVR5cGUoY2hlY2tlcikpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hlY2tlcikge1xuICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcihcbiAgICAgICAgICAgICdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBrZXkgYCcgKyBrZXkgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nICtcbiAgICAgICAgICAgICdcXG5CYWQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkocHJvcHNbcHJvcE5hbWVdLCBudWxsLCAnICAnKSArXG4gICAgICAgICAgICAnXFxuVmFsaWQga2V5czogJyArIEpTT04uc3RyaW5naWZ5KE9iamVjdC5rZXlzKHNoYXBlVHlwZXMpLCBudWxsLCAnICAnKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGZhbHN5IHZhbHVlIGNhbid0IGJlIGEgU3ltYm9sXG4gICAgaWYgKCFwcm9wVmFsdWUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5yZXNldFdhcm5pbmdDYWNoZSA9IGNoZWNrUHJvcFR5cGVzLnJlc2V0V2FybmluZ0NhY2hlO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgUmVhY3RJcyA9IHJlcXVpcmUoJ3JlYWN0LWlzJyk7XG5cbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgZGV2ZWxvcG1lbnQgYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgdmFyIHRocm93T25EaXJlY3RBY2Nlc3MgPSB0cnVlO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKShSZWFjdElzLmlzRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59IGVsc2Uge1xuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBwcm9kdWN0aW9uIGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFRocm93aW5nU2hpbXMnKSgpO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiIsIi8qKiBAbGljZW5zZSBSZWFjdCB2MTYuMTMuMVxuICogcmVhY3QtaXMuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cblxuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIChmdW5jdGlvbigpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3Jhcnlcbi8vICh1bnN0YWJsZSkgQVBJcyB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLiBDYW4gd2UgcmVtb3ZlIHRoZSBzeW1ib2xzP1xuXG52YXIgUkVBQ1RfQVNZTkNfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuYXN5bmNfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29uY3VycmVudF9tb2RlJykgOiAweGVhY2Y7XG52YXIgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZvcndhcmRfcmVmJykgOiAweGVhZDA7XG52YXIgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlJykgOiAweGVhZDE7XG52YXIgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc3VzcGVuc2VfbGlzdCcpIDogMHhlYWQ4O1xudmFyIFJFQUNUX01FTU9fVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0Lm1lbW8nKSA6IDB4ZWFkMztcbnZhciBSRUFDVF9MQVpZX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5sYXp5JykgOiAweGVhZDQ7XG52YXIgUkVBQ1RfQkxPQ0tfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmJsb2NrJykgOiAweGVhZDk7XG52YXIgUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZ1bmRhbWVudGFsJykgOiAweGVhZDU7XG52YXIgUkVBQ1RfUkVTUE9OREVSX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5yZXNwb25kZXInKSA6IDB4ZWFkNjtcbnZhciBSRUFDVF9TQ09QRV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3Quc2NvcGUnKSA6IDB4ZWFkNztcblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyB8fCAvLyBOb3RlOiBpdHMgdHlwZW9mIG1pZ2h0IGJlIG90aGVyIHRoYW4gJ3N5bWJvbCcgb3IgJ251bWJlcicgaWYgaXQncyBhIHBvbHlmaWxsLlxuICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9QUk9WSURFUl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVTUE9OREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfU0NPUEVfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9CTE9DS19UWVBFKTtcbn1cblxuZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsKSB7XG4gICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXG4gICAgc3dpdGNoICgkJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgIHZhciB0eXBlID0gb2JqZWN0LnR5cGU7XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcblxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB2YXIgJCR0eXBlb2ZUeXBlID0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKCQkdHlwZW9mVHlwZSkge1xuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJCR0eXBlb2ZUeXBlO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59IC8vIEFzeW5jTW9kZSBpcyBkZXByZWNhdGVkIGFsb25nIHdpdGggaXNBc3luY01vZGVcblxudmFyIEFzeW5jTW9kZSA9IFJFQUNUX0FTWU5DX01PREVfVFlQRTtcbnZhciBDb25jdXJyZW50TW9kZSA9IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xudmFyIENvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlRFWFRfVFlQRTtcbnZhciBDb250ZXh0UHJvdmlkZXIgPSBSRUFDVF9QUk9WSURFUl9UWVBFO1xudmFyIEVsZW1lbnQgPSBSRUFDVF9FTEVNRU5UX1RZUEU7XG52YXIgRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG52YXIgRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xudmFyIExhenkgPSBSRUFDVF9MQVpZX1RZUEU7XG52YXIgTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcbnZhciBQb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcbnZhciBQcm9maWxlciA9IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG52YXIgU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG52YXIgU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xudmFyIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gZmFsc2U7IC8vIEFzeW5jTW9kZSBzaG91bGQgYmUgZGVwcmVjYXRlZFxuXG5mdW5jdGlvbiBpc0FzeW5jTW9kZShvYmplY3QpIHtcbiAge1xuICAgIGlmICghaGFzV2FybmVkQWJvdXREZXByZWNhdGVkSXNBc3luY01vZGUpIHtcbiAgICAgIGhhc1dhcm5lZEFib3V0RGVwcmVjYXRlZElzQXN5bmNNb2RlID0gdHJ1ZTsgLy8gVXNpbmcgY29uc29sZVsnd2FybiddIHRvIGV2YWRlIEJhYmVsIGFuZCBFU0xpbnRcblxuICAgICAgY29uc29sZVsnd2FybiddKCdUaGUgUmVhY3RJcy5pc0FzeW5jTW9kZSgpIGFsaWFzIGhhcyBiZWVuIGRlcHJlY2F0ZWQsICcgKyAnYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBSZWFjdCAxNysuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlICcgKyAnUmVhY3RJcy5pc0NvbmN1cnJlbnRNb2RlKCkgaW5zdGVhZC4gSXQgaGFzIHRoZSBleGFjdCBzYW1lIEFQSS4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNDb25jdXJyZW50TW9kZShvYmplY3QpIHx8IHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9BU1lOQ19NT0RFX1RZUEU7XG59XG5mdW5jdGlvbiBpc0NvbmN1cnJlbnRNb2RlKG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTkNVUlJFTlRfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0Q29uc3VtZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNDb250ZXh0UHJvdmlkZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPVklERVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRWxlbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzRm9yd2FyZFJlZihvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xufVxuZnVuY3Rpb24gaXNGcmFnbWVudChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xufVxuZnVuY3Rpb24gaXNMYXp5KG9iamVjdCkge1xuICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0xBWllfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzTWVtbyhvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG59XG5mdW5jdGlvbiBpc1BvcnRhbChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzUHJvZmlsZXIob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbn1cbmZ1bmN0aW9uIGlzU3RyaWN0TW9kZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xufVxuZnVuY3Rpb24gaXNTdXNwZW5zZShvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xufVxuXG5leHBvcnRzLkFzeW5jTW9kZSA9IEFzeW5jTW9kZTtcbmV4cG9ydHMuQ29uY3VycmVudE1vZGUgPSBDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuQ29udGV4dENvbnN1bWVyID0gQ29udGV4dENvbnN1bWVyO1xuZXhwb3J0cy5Db250ZXh0UHJvdmlkZXIgPSBDb250ZXh0UHJvdmlkZXI7XG5leHBvcnRzLkVsZW1lbnQgPSBFbGVtZW50O1xuZXhwb3J0cy5Gb3J3YXJkUmVmID0gRm9yd2FyZFJlZjtcbmV4cG9ydHMuRnJhZ21lbnQgPSBGcmFnbWVudDtcbmV4cG9ydHMuTGF6eSA9IExhenk7XG5leHBvcnRzLk1lbW8gPSBNZW1vO1xuZXhwb3J0cy5Qb3J0YWwgPSBQb3J0YWw7XG5leHBvcnRzLlByb2ZpbGVyID0gUHJvZmlsZXI7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBTdHJpY3RNb2RlO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFN1c3BlbnNlO1xuZXhwb3J0cy5pc0FzeW5jTW9kZSA9IGlzQXN5bmNNb2RlO1xuZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlID0gaXNDb25jdXJyZW50TW9kZTtcbmV4cG9ydHMuaXNDb250ZXh0Q29uc3VtZXIgPSBpc0NvbnRleHRDb25zdW1lcjtcbmV4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXIgPSBpc0NvbnRleHRQcm92aWRlcjtcbmV4cG9ydHMuaXNFbGVtZW50ID0gaXNFbGVtZW50O1xuZXhwb3J0cy5pc0ZvcndhcmRSZWYgPSBpc0ZvcndhcmRSZWY7XG5leHBvcnRzLmlzRnJhZ21lbnQgPSBpc0ZyYWdtZW50O1xuZXhwb3J0cy5pc0xhenkgPSBpc0xhenk7XG5leHBvcnRzLmlzTWVtbyA9IGlzTWVtbztcbmV4cG9ydHMuaXNQb3J0YWwgPSBpc1BvcnRhbDtcbmV4cG9ydHMuaXNQcm9maWxlciA9IGlzUHJvZmlsZXI7XG5leHBvcnRzLmlzU3RyaWN0TW9kZSA9IGlzU3RyaWN0TW9kZTtcbmV4cG9ydHMuaXNTdXNwZW5zZSA9IGlzU3VzcGVuc2U7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50VHlwZSA9IGlzVmFsaWRFbGVtZW50VHlwZTtcbmV4cG9ydHMudHlwZU9mID0gdHlwZU9mO1xuICB9KSgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xMy4xXG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgYj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLGM9Yj9TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKTo2MDEwMyxkPWI/U3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKTo2MDEwNixlPWI/U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpOjYwMTA3LGY9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIik6NjAxMDgsZz1iP1N5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTo2MDExNCxoPWI/U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpOjYwMTA5LGs9Yj9TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKTo2MDExMCxsPWI/U3ltYm9sLmZvcihcInJlYWN0LmFzeW5jX21vZGVcIik6NjAxMTEsbT1iP1N5bWJvbC5mb3IoXCJyZWFjdC5jb25jdXJyZW50X21vZGVcIik6NjAxMTEsbj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKTo2MDExMixwPWI/U3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpOjYwMTEzLHE9Yj9cblN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpOjYwMTIwLHI9Yj9TeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKTo2MDExNSx0PWI/U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik6NjAxMTYsdj1iP1N5bWJvbC5mb3IoXCJyZWFjdC5ibG9ja1wiKTo2MDEyMSx3PWI/U3ltYm9sLmZvcihcInJlYWN0LmZ1bmRhbWVudGFsXCIpOjYwMTE3LHg9Yj9TeW1ib2wuZm9yKFwicmVhY3QucmVzcG9uZGVyXCIpOjYwMTE4LHk9Yj9TeW1ib2wuZm9yKFwicmVhY3Quc2NvcGVcIik6NjAxMTk7XG5mdW5jdGlvbiB6KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciB1PWEuJCR0eXBlb2Y7c3dpdGNoKHUpe2Nhc2UgYzpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBsOmNhc2UgbTpjYXNlIGU6Y2FzZSBnOmNhc2UgZjpjYXNlIHA6cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIG46Y2FzZSB0OmNhc2UgcjpjYXNlIGg6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gdX19Y2FzZSBkOnJldHVybiB1fX19ZnVuY3Rpb24gQShhKXtyZXR1cm4geihhKT09PW19ZXhwb3J0cy5Bc3luY01vZGU9bDtleHBvcnRzLkNvbmN1cnJlbnRNb2RlPW07ZXhwb3J0cy5Db250ZXh0Q29uc3VtZXI9aztleHBvcnRzLkNvbnRleHRQcm92aWRlcj1oO2V4cG9ydHMuRWxlbWVudD1jO2V4cG9ydHMuRm9yd2FyZFJlZj1uO2V4cG9ydHMuRnJhZ21lbnQ9ZTtleHBvcnRzLkxhenk9dDtleHBvcnRzLk1lbW89cjtleHBvcnRzLlBvcnRhbD1kO1xuZXhwb3J0cy5Qcm9maWxlcj1nO2V4cG9ydHMuU3RyaWN0TW9kZT1mO2V4cG9ydHMuU3VzcGVuc2U9cDtleHBvcnRzLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiBBKGEpfHx6KGEpPT09bH07ZXhwb3J0cy5pc0NvbmN1cnJlbnRNb2RlPUE7ZXhwb3J0cy5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PWt9O2V4cG9ydHMuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ofTtleHBvcnRzLmlzRWxlbWVudD1mdW5jdGlvbihhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Y307ZXhwb3J0cy5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1ufTtleHBvcnRzLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1lfTtleHBvcnRzLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4geihhKT09PXR9O1xuZXhwb3J0cy5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1yfTtleHBvcnRzLmlzUG9ydGFsPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09ZH07ZXhwb3J0cy5pc1Byb2ZpbGVyPWZ1bmN0aW9uKGEpe3JldHVybiB6KGEpPT09Z307ZXhwb3J0cy5pc1N0cmljdE1vZGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1mfTtleHBvcnRzLmlzU3VzcGVuc2U9ZnVuY3Rpb24oYSl7cmV0dXJuIHooYSk9PT1wfTtcbmV4cG9ydHMuaXNWYWxpZEVsZW1lbnRUeXBlPWZ1bmN0aW9uKGEpe3JldHVyblwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1lfHxhPT09bXx8YT09PWd8fGE9PT1mfHxhPT09cHx8YT09PXF8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09dHx8YS4kJHR5cGVvZj09PXJ8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09a3x8YS4kJHR5cGVvZj09PW58fGEuJCR0eXBlb2Y9PT13fHxhLiQkdHlwZW9mPT09eHx8YS4kJHR5cGVvZj09PXl8fGEuJCR0eXBlb2Y9PT12KX07ZXhwb3J0cy50eXBlT2Y9ejtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1pcy5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xNC4wXG4gKiByZWFjdC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuXG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgKGZ1bmN0aW9uKCkge1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcbnZhciBjaGVja1Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvY2hlY2tQcm9wVHlwZXMnKTtcblxudmFyIFJlYWN0VmVyc2lvbiA9ICcxNi4xNC4wJztcblxuLy8gVGhlIFN5bWJvbCB1c2VkIHRvIHRhZyB0aGUgUmVhY3RFbGVtZW50LWxpa2UgdHlwZXMuIElmIHRoZXJlIGlzIG5vIG5hdGl2ZSBTeW1ib2xcbi8vIG5vciBwb2x5ZmlsbCwgdGhlbiBhIHBsYWluIG51bWJlciBpcyB1c2VkIGZvciBwZXJmb3JtYW5jZS5cbnZhciBoYXNTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5mb3I7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIDogMHhlYWM3O1xudmFyIFJFQUNUX1BPUlRBTF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucG9ydGFsJykgOiAweGVhY2E7XG52YXIgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmZyYWdtZW50JykgOiAweGVhY2I7XG52YXIgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN0cmljdF9tb2RlJykgOiAweGVhY2M7XG52YXIgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb2ZpbGVyJykgOiAweGVhZDI7XG52YXIgUkVBQ1RfUFJPVklERVJfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnByb3ZpZGVyJykgOiAweGVhY2Q7XG52YXIgUkVBQ1RfQ09OVEVYVF9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QuY29udGV4dCcpIDogMHhlYWNlOyAvLyBUT0RPOiBXZSBkb24ndCB1c2UgQXN5bmNNb2RlIG9yIENvbmN1cnJlbnRNb2RlIGFueW1vcmUuIFRoZXkgd2VyZSB0ZW1wb3JhcnlcbnZhciBSRUFDVF9DT05DVVJSRU5UX01PREVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LmNvbmN1cnJlbnRfbW9kZScpIDogMHhlYWNmO1xudmFyIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mb3J3YXJkX3JlZicpIDogMHhlYWQwO1xudmFyIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5zdXNwZW5zZScpIDogMHhlYWQxO1xudmFyIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnN1c3BlbnNlX2xpc3QnKSA6IDB4ZWFkODtcbnZhciBSRUFDVF9NRU1PX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5tZW1vJykgOiAweGVhZDM7XG52YXIgUkVBQ1RfTEFaWV9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QubGF6eScpIDogMHhlYWQ0O1xudmFyIFJFQUNUX0JMT0NLX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5ibG9jaycpIDogMHhlYWQ5O1xudmFyIFJFQUNUX0ZVTkRBTUVOVEFMX1RZUEUgPSBoYXNTeW1ib2wgPyBTeW1ib2wuZm9yKCdyZWFjdC5mdW5kYW1lbnRhbCcpIDogMHhlYWQ1O1xudmFyIFJFQUNUX1JFU1BPTkRFUl9UWVBFID0gaGFzU3ltYm9sID8gU3ltYm9sLmZvcigncmVhY3QucmVzcG9uZGVyJykgOiAweGVhZDY7XG52YXIgUkVBQ1RfU0NPUEVfVFlQRSA9IGhhc1N5bWJvbCA/IFN5bWJvbC5mb3IoJ3JlYWN0LnNjb3BlJykgOiAweGVhZDc7XG52YXIgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG52YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5mdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgaWYgKG1heWJlSXRlcmFibGUgPT09IG51bGwgfHwgdHlwZW9mIG1heWJlSXRlcmFibGUgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgbWF5YmVJdGVyYXRvciA9IE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF07XG5cbiAgaWYgKHR5cGVvZiBtYXliZUl0ZXJhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3I7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBkaXNwYXRjaGVyLlxuICovXG52YXIgUmVhY3RDdXJyZW50RGlzcGF0Y2hlciA9IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAdHlwZSB7UmVhY3RDb21wb25lbnR9XG4gICAqL1xuICBjdXJyZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGJhdGNoJ3MgY29uZmlndXJhdGlvbiBzdWNoIGFzIGhvdyBsb25nIGFuIHVwZGF0ZVxuICogc2hvdWxkIHN1c3BlbmQgZm9yIGlmIGl0IG5lZWRzIHRvLlxuICovXG52YXIgUmVhY3RDdXJyZW50QmF0Y2hDb25maWcgPSB7XG4gIHN1c3BlbnNlOiBudWxsXG59O1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcbn07XG5cbnZhciBCRUZPUkVfU0xBU0hfUkUgPSAvXiguKilbXFxcXFxcL10vO1xuZnVuY3Rpb24gZGVzY3JpYmVDb21wb25lbnRGcmFtZSAobmFtZSwgc291cmNlLCBvd25lck5hbWUpIHtcbiAgdmFyIHNvdXJjZUluZm8gPSAnJztcblxuICBpZiAoc291cmNlKSB7XG4gICAgdmFyIHBhdGggPSBzb3VyY2UuZmlsZU5hbWU7XG4gICAgdmFyIGZpbGVOYW1lID0gcGF0aC5yZXBsYWNlKEJFRk9SRV9TTEFTSF9SRSwgJycpO1xuXG4gICAge1xuICAgICAgLy8gSW4gREVWLCBpbmNsdWRlIGNvZGUgZm9yIGEgY29tbW9uIHNwZWNpYWwgY2FzZTpcbiAgICAgIC8vIHByZWZlciBcImZvbGRlci9pbmRleC5qc1wiIGluc3RlYWQgb2YganVzdCBcImluZGV4LmpzXCIuXG4gICAgICBpZiAoL15pbmRleFxcLi8udGVzdChmaWxlTmFtZSkpIHtcbiAgICAgICAgdmFyIG1hdGNoID0gcGF0aC5tYXRjaChCRUZPUkVfU0xBU0hfUkUpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHZhciBwYXRoQmVmb3JlU2xhc2ggPSBtYXRjaFsxXTtcblxuICAgICAgICAgIGlmIChwYXRoQmVmb3JlU2xhc2gpIHtcbiAgICAgICAgICAgIHZhciBmb2xkZXJOYW1lID0gcGF0aEJlZm9yZVNsYXNoLnJlcGxhY2UoQkVGT1JFX1NMQVNIX1JFLCAnJyk7XG4gICAgICAgICAgICBmaWxlTmFtZSA9IGZvbGRlck5hbWUgKyAnLycgKyBmaWxlTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBzb3VyY2VJbmZvID0gJyAoYXQgJyArIGZpbGVOYW1lICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKSc7XG4gIH0gZWxzZSBpZiAob3duZXJOYW1lKSB7XG4gICAgc291cmNlSW5mbyA9ICcgKGNyZWF0ZWQgYnkgJyArIG93bmVyTmFtZSArICcpJztcbiAgfVxuXG4gIHJldHVybiAnXFxuICAgIGluICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgc291cmNlSW5mbztcbn1cblxudmFyIFJlc29sdmVkID0gMTtcbmZ1bmN0aW9uIHJlZmluZVJlc29sdmVkTGF6eUNvbXBvbmVudChsYXp5Q29tcG9uZW50KSB7XG4gIHJldHVybiBsYXp5Q29tcG9uZW50Ll9zdGF0dXMgPT09IFJlc29sdmVkID8gbGF6eUNvbXBvbmVudC5fcmVzdWx0IDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0V3JhcHBlZE5hbWUob3V0ZXJUeXBlLCBpbm5lclR5cGUsIHdyYXBwZXJOYW1lKSB7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgJyc7XG4gIHJldHVybiBvdXRlclR5cGUuZGlzcGxheU5hbWUgfHwgKGZ1bmN0aW9uTmFtZSAhPT0gJycgPyB3cmFwcGVyTmFtZSArIFwiKFwiICsgZnVuY3Rpb25OYW1lICsgXCIpXCIgOiB3cmFwcGVyTmFtZSk7XG59XG5cbmZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWUodHlwZSkge1xuICBpZiAodHlwZSA9PSBudWxsKSB7XG4gICAgLy8gSG9zdCByb290LCB0ZXh0IG5vZGUgb3IganVzdCBpbnZhbGlkIHR5cGUuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB7XG4gICAgaWYgKHR5cGVvZiB0eXBlLnRhZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGVycm9yKCdSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lKCkuICcgKyAnVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgcmV0dXJuICdGcmFnbWVudCc7XG5cbiAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgcmV0dXJuICdQb3J0YWwnO1xuXG4gICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgcmV0dXJuIFwiUHJvZmlsZXJcIjtcblxuICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgIHJldHVybiAnU3RyaWN0TW9kZSc7XG5cbiAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICByZXR1cm4gJ1N1c3BlbnNlJztcblxuICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgcmV0dXJuICdTdXNwZW5zZUxpc3QnO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB0eXBlID09PSAnb2JqZWN0Jykge1xuICAgIHN3aXRjaCAodHlwZS4kJHR5cGVvZikge1xuICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgIHJldHVybiAnQ29udGV4dC5Db25zdW1lcic7XG5cbiAgICAgIGNhc2UgUkVBQ1RfUFJPVklERVJfVFlQRTpcbiAgICAgICAgcmV0dXJuICdDb250ZXh0LlByb3ZpZGVyJztcblxuICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZE5hbWUodHlwZSwgdHlwZS5yZW5kZXIsICdGb3J3YXJkUmVmJyk7XG5cbiAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZSh0eXBlLnR5cGUpO1xuXG4gICAgICBjYXNlIFJFQUNUX0JMT0NLX1RZUEU6XG4gICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lKHR5cGUucmVuZGVyKTtcblxuICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgIHtcbiAgICAgICAgICB2YXIgdGhlbmFibGUgPSB0eXBlO1xuICAgICAgICAgIHZhciByZXNvbHZlZFRoZW5hYmxlID0gcmVmaW5lUmVzb2x2ZWRMYXp5Q29tcG9uZW50KHRoZW5hYmxlKTtcblxuICAgICAgICAgIGlmIChyZXNvbHZlZFRoZW5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZShyZXNvbHZlZFRoZW5hYmxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG52YXIgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZSA9IHt9O1xudmFyIGN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50ID0gbnVsbDtcbmZ1bmN0aW9uIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KGVsZW1lbnQpIHtcbiAge1xuICAgIGN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgfVxufVxuXG57XG4gIC8vIFN0YWNrIGltcGxlbWVudGF0aW9uIGluamVjdGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyLlxuICBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjayA9IG51bGw7XG5cbiAgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzdGFjayA9ICcnOyAvLyBBZGQgYW4gZXh0cmEgdG9wIGZyYW1lIHdoaWxlIGFuIGVsZW1lbnQgaXMgYmVpbmcgdmFsaWRhdGVkXG5cbiAgICBpZiAoY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZShjdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudC50eXBlKTtcbiAgICAgIHZhciBvd25lciA9IGN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50Ll9vd25lcjtcbiAgICAgIHN0YWNrICs9IGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgY3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQuX3NvdXJjZSwgb3duZXIgJiYgZ2V0Q29tcG9uZW50TmFtZShvd25lci50eXBlKSk7XG4gICAgfSAvLyBEZWxlZ2F0ZSB0byB0aGUgaW5qZWN0ZWQgcmVuZGVyZXItc3BlY2lmaWMgaW1wbGVtZW50YXRpb25cblxuXG4gICAgdmFyIGltcGwgPSBSZWFjdERlYnVnQ3VycmVudEZyYW1lLmdldEN1cnJlbnRTdGFjaztcblxuICAgIGlmIChpbXBsKSB7XG4gICAgICBzdGFjayArPSBpbXBsKCkgfHwgJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xufVxuXG4vKipcbiAqIFVzZWQgYnkgYWN0KCkgdG8gdHJhY2sgd2hldGhlciB5b3UncmUgaW5zaWRlIGFuIGFjdCgpIHNjb3BlLlxuICovXG52YXIgSXNTb21lUmVuZGVyZXJBY3RpbmcgPSB7XG4gIGN1cnJlbnQ6IGZhbHNlXG59O1xuXG52YXIgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gIFJlYWN0Q3VycmVudERpc3BhdGNoZXI6IFJlYWN0Q3VycmVudERpc3BhdGNoZXIsXG4gIFJlYWN0Q3VycmVudEJhdGNoQ29uZmlnOiBSZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxcbiAgUmVhY3RDdXJyZW50T3duZXI6IFJlYWN0Q3VycmVudE93bmVyLFxuICBJc1NvbWVSZW5kZXJlckFjdGluZzogSXNTb21lUmVuZGVyZXJBY3RpbmcsXG4gIC8vIFVzZWQgYnkgcmVuZGVyZXJzIHRvIGF2b2lkIGJ1bmRsaW5nIG9iamVjdC1hc3NpZ24gdHdpY2UgaW4gVU1EIGJ1bmRsZXM6XG4gIGFzc2lnbjogX2Fzc2lnblxufTtcblxue1xuICBfYXNzaWduKFJlYWN0U2hhcmVkSW50ZXJuYWxzLCB7XG4gICAgLy8gVGhlc2Ugc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBwcm9kdWN0aW9uLlxuICAgIFJlYWN0RGVidWdDdXJyZW50RnJhbWU6IFJlYWN0RGVidWdDdXJyZW50RnJhbWUsXG4gICAgLy8gU2hpbSBmb3IgUmVhY3QgRE9NIDE2LjAuMCB3aGljaCBzdGlsbCBkZXN0cnVjdHVyZWQgKGJ1dCBub3QgdXNlZCkgdGhpcy5cbiAgICAvLyBUT0RPOiByZW1vdmUgaW4gUmVhY3QgMTcuMC5cbiAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rOiB7fVxuICB9KTtcbn1cblxuLy8gYnkgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBieSBhIEJhYmVsIHBsdWdpbi5cbi8vXG4vLyBJbiBQUk9EIChvciBpbiBwYWNrYWdlcyB3aXRob3V0IGFjY2VzcyB0byBSZWFjdCBpbnRlcm5hbHMpLFxuLy8gdGhleSBhcmUgbGVmdCBhcyB0aGV5IGFyZSBpbnN0ZWFkLlxuXG5mdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcHJpbnRXYXJuaW5nKCd3YXJuJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuZnVuY3Rpb24gZXJyb3IoZm9ybWF0KSB7XG4gIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICB9XG5cbiAgICBwcmludFdhcm5pbmcoJ2Vycm9yJywgZm9ybWF0LCBhcmdzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcmludFdhcm5pbmcobGV2ZWwsIGZvcm1hdCwgYXJncykge1xuICAvLyBXaGVuIGNoYW5naW5nIHRoaXMgbG9naWMsIHlvdSBtaWdodCB3YW50IHRvIGFsc29cbiAgLy8gdXBkYXRlIGNvbnNvbGVXaXRoU3RhY2tEZXYud3d3LmpzIGFzIHdlbGwuXG4gIHtcbiAgICB2YXIgaGFzRXhpc3RpbmdTdGFjayA9IGFyZ3MubGVuZ3RoID4gMCAmJiB0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnc3RyaW5nJyAmJiBhcmdzW2FyZ3MubGVuZ3RoIC0gMV0uaW5kZXhPZignXFxuICAgIGluJykgPT09IDA7XG5cbiAgICBpZiAoIWhhc0V4aXN0aW5nU3RhY2spIHtcbiAgICAgIHZhciBSZWFjdERlYnVnQ3VycmVudEZyYW1lID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZTtcbiAgICAgIHZhciBzdGFjayA9IFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgICBpZiAoc3RhY2sgIT09ICcnKSB7XG4gICAgICAgIGZvcm1hdCArPSAnJXMnO1xuICAgICAgICBhcmdzID0gYXJncy5jb25jYXQoW3N0YWNrXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFyZ3NXaXRoRm9ybWF0ID0gYXJncy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiAnJyArIGl0ZW07XG4gICAgfSk7IC8vIENhcmVmdWw6IFJOIGN1cnJlbnRseSBkZXBlbmRzIG9uIHRoaXMgcHJlZml4XG5cbiAgICBhcmdzV2l0aEZvcm1hdC51bnNoaWZ0KCdXYXJuaW5nOiAnICsgZm9ybWF0KTsgLy8gV2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2Ugc3ByZWFkIChvciAuYXBwbHkpIGRpcmVjdGx5IGJlY2F1c2UgaXRcbiAgICAvLyBicmVha3MgSUU5OiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzEzNjEwXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWludGVybmFsL25vLXByb2R1Y3Rpb24tbG9nZ2luZ1xuXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZVtsZXZlbF0sIGNvbnNvbGUsIGFyZ3NXaXRoRm9ybWF0KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyAtLS0gV2VsY29tZSB0byBkZWJ1Z2dpbmcgUmVhY3QgLS0tXG4gICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cbn1cblxudmFyIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudCA9IHt9O1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICB7XG4gICAgdmFyIF9jb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHZhciBjb21wb25lbnROYW1lID0gX2NvbnN0cnVjdG9yICYmIChfY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgX2NvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJztcbiAgICB2YXIgd2FybmluZ0tleSA9IGNvbXBvbmVudE5hbWUgKyBcIi5cIiArIGNhbGxlck5hbWU7XG5cbiAgICBpZiAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZXJyb3IoXCJDYW4ndCBjYWxsICVzIG9uIGEgY29tcG9uZW50IHRoYXQgaXMgbm90IHlldCBtb3VudGVkLiBcIiArICdUaGlzIGlzIGEgbm8tb3AsIGJ1dCBpdCBtaWdodCBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiAnICsgJ0luc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCAnICsgJ2NsYXNzIHByb3BlcnR5IHdpdGggdGhlIGRlc2lyZWQgc3RhdGUgaW4gdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjb21wb25lbnROYW1lKTtcblxuICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvclVubW91bnRlZENvbXBvbmVudFt3YXJuaW5nS2V5XSA9IHRydWU7XG4gIH1cbn1cbi8qKlxuICogVGhpcyBpcyB0aGUgYWJzdHJhY3QgQVBJIGZvciBhbiB1cGRhdGUgcXVldWUuXG4gKi9cblxuXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBjb21wb25lbnQgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHs/c3RyaW5nfSBjYWxsZXJOYW1lIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24gaW4gdGhlIHB1YmxpYyBBUEkuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gY2FsbGVyTmFtZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgY29tcG9uZW50IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbntcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5cblxuZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7IC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuXG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbkNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuQ29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gIGlmICghKHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBwYXJ0aWFsU3RhdGUgPT09ICdmdW5jdGlvbicgfHwgcGFydGlhbFN0YXRlID09IG51bGwpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwic2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuXCIgKTtcbiAgICB9XG4gIH1cblxuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsIHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2ssICdzZXRTdGF0ZScpO1xufTtcbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5cblxuQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbn07XG4vKipcbiAqIERlcHJlY2F0ZWQgQVBJcy4gVGhlc2UgQVBJcyB1c2VkIHRvIGV4aXN0IG9uIGNsYXNzaWMgUmVhY3QgY2xhc3NlcyBidXQgc2luY2VcbiAqIHdlIHdvdWxkIGxpa2UgdG8gZGVwcmVjYXRlIHRoZW0sIHdlJ3JlIG5vdCBnb2luZyB0byBtb3ZlIHRoZW0gb3ZlciB0byB0aGlzXG4gKiBtb2Rlcm4gYmFzZSBjbGFzcy4gSW5zdGVhZCwgd2UgZGVmaW5lIGEgZ2V0dGVyIHRoYXQgd2FybnMgaWYgaXQncyBhY2Nlc3NlZC5cbiAqL1xuXG5cbntcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuXG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKTtcblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuXG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBDb21wb25lbnQucHJvdG90eXBlO1xuLyoqXG4gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgd2l0aCBkZWZhdWx0IHNoYWxsb3cgZXF1YWxpdHkgY2hlY2sgZm9yIHNDVS5cbiAqL1xuXG5mdW5jdGlvbiBQdXJlQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsgLy8gSWYgYSBjb21wb25lbnQgaGFzIHN0cmluZyByZWZzLCB3ZSB3aWxsIGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgbGF0ZXIuXG5cbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIHRoaXMudXBkYXRlciA9IHVwZGF0ZXIgfHwgUmVhY3ROb29wVXBkYXRlUXVldWU7XG59XG5cbnZhciBwdXJlQ29tcG9uZW50UHJvdG90eXBlID0gUHVyZUNvbXBvbmVudC5wcm90b3R5cGUgPSBuZXcgQ29tcG9uZW50RHVtbXkoKTtcbnB1cmVDb21wb25lbnRQcm90b3R5cGUuY29uc3RydWN0b3IgPSBQdXJlQ29tcG9uZW50OyAvLyBBdm9pZCBhbiBleHRyYSBwcm90b3R5cGUganVtcCBmb3IgdGhlc2UgbWV0aG9kcy5cblxuX2Fzc2lnbihwdXJlQ29tcG9uZW50UHJvdG90eXBlLCBDb21wb25lbnQucHJvdG90eXBlKTtcblxucHVyZUNvbXBvbmVudFByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbi8vIGFuIGltbXV0YWJsZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBtdXRhYmxlIHZhbHVlXG5mdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG4gIHZhciByZWZPYmplY3QgPSB7XG4gICAgY3VycmVudDogbnVsbFxuICB9O1xuXG4gIHtcbiAgICBPYmplY3Quc2VhbChyZWZPYmplY3QpO1xuICB9XG5cbiAgcmV0dXJuIHJlZk9iamVjdDtcbn1cblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duLCBkaWRXYXJuQWJvdXRTdHJpbmdSZWZzO1xuXG57XG4gIGRpZFdhcm5BYm91dFN0cmluZ1JlZnMgPSB7fTtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRSZWYoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdrZXknKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAna2V5JykuZ2V0O1xuXG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAge1xuICAgICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgICBzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93biA9IHRydWU7XG5cbiAgICAgICAgZXJyb3IoJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gd2FybklmU3RyaW5nUmVmQ2Fubm90QmVBdXRvQ29udmVydGVkKGNvbmZpZykge1xuICB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmID09PSAnc3RyaW5nJyAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIGNvbmZpZy5fX3NlbGYgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5zdGF0ZU5vZGUgIT09IGNvbmZpZy5fX3NlbGYpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gZ2V0Q29tcG9uZW50TmFtZShSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LnR5cGUpO1xuXG4gICAgICBpZiAoIWRpZFdhcm5BYm91dFN0cmluZ1JlZnNbY29tcG9uZW50TmFtZV0pIHtcbiAgICAgICAgZXJyb3IoJ0NvbXBvbmVudCBcIiVzXCIgY29udGFpbnMgdGhlIHN0cmluZyByZWYgXCIlc1wiLiAnICsgJ1N1cHBvcnQgZm9yIHN0cmluZyByZWZzIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSBtYWpvciByZWxlYXNlLiAnICsgJ1RoaXMgY2FzZSBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gYW4gYXJyb3cgZnVuY3Rpb24uICcgKyAnV2UgYXNrIHlvdSB0byBtYW51YWxseSBmaXggdGhpcyBjYXNlIGJ5IHVzaW5nIHVzZVJlZigpIG9yIGNyZWF0ZVJlZigpIGluc3RlYWQuICcgKyAnTGVhcm4gbW9yZSBhYm91dCB1c2luZyByZWZzIHNhZmVseSBoZXJlOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3Qtc3RyaWN0LW1vZGUtc3RyaW5nLXJlZicsIGdldENvbXBvbmVudE5hbWUoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC50eXBlKSwgY29uZmlnLnJlZik7XG5cbiAgICAgICAgZGlkV2FybkFib3V0U3RyaW5nUmVmc1tjb21wb25lbnROYW1lXSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4vKipcbiAqIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIG5ldyBSZWFjdCBlbGVtZW50LiBUaGlzIG5vIGxvbmdlciBhZGhlcmVzIHRvXG4gKiB0aGUgY2xhc3MgcGF0dGVybiwgc28gZG8gbm90IHVzZSBuZXcgdG8gY2FsbCBpdC4gQWxzbywgaW5zdGFuY2VvZiBjaGVja1xuICogd2lsbCBub3Qgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG5cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93cyB1cyB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIGFzIGEgUmVhY3QgRWxlbWVudFxuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIHtcbiAgICAvLyBUaGUgdmFsaWRhdGlvbiBmbGFnIGlzIGN1cnJlbnRseSBtdXRhdGl2ZS4gV2UgcHV0IGl0IG9uXG4gICAgLy8gYW4gZXh0ZXJuYWwgYmFja2luZyBzdG9yZSBzbyB0aGF0IHdlIGNhbiBmcmVlemUgdGhlIHdob2xlIG9iamVjdC5cbiAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgV2Vha01hcCBvbmNlIHRoZXkgYXJlIGltcGxlbWVudGVkIGluXG4gICAgLy8gY29tbW9ubHkgdXNlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMuXG4gICAgZWxlbWVudC5fc3RvcmUgPSB7fTsgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICB2YWx1ZTogZmFsc2VcbiAgICB9KTsgLy8gc2VsZiBhbmQgc291cmNlIGFyZSBERVYgb25seSBwcm9wZXJ0aWVzLlxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQsICdfc2VsZicsIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBzZWxmXG4gICAgfSk7IC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogc291cmNlXG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuLyoqXG4gKiBDcmVhdGUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI2NyZWF0ZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lOyAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG5cbiAgdmFyIHByb3BzID0ge307XG4gIHZhciBrZXkgPSBudWxsO1xuICB2YXIgcmVmID0gbnVsbDtcbiAgdmFyIHNlbGYgPSBudWxsO1xuICB2YXIgc291cmNlID0gbnVsbDtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgcmVmID0gY29uZmlnLnJlZjtcblxuICAgICAge1xuICAgICAgICB3YXJuSWZTdHJpbmdSZWZDYW5ub3RCZUF1dG9Db252ZXJ0ZWQoY29uZmlnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7IC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCB0byBhIG5ldyBwcm9wcyBvYmplY3RcblxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfSAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcblxuXG4gIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IHR5cGUuZGVmYXVsdFByb3BzO1xuXG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCAnVW5rbm93bicgOiB0eXBlO1xuXG4gICAgICBpZiAoa2V5KSB7XG4gICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQsIHByb3BzKTtcbn1cbmZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcbiAgcmV0dXJuIG5ld0VsZW1lbnQ7XG59XG4vKipcbiAqIENsb25lIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IHVzaW5nIGVsZW1lbnQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNjbG9uZWVsZW1lbnRcbiAqL1xuXG5mdW5jdGlvbiBjbG9uZUVsZW1lbnQoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICBpZiAoISEoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB1bmRlZmluZWQpKSB7XG4gICAge1xuICAgICAgdGhyb3cgRXJyb3IoIFwiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgXCIgKyBlbGVtZW50ICsgXCIuXCIgKTtcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvcE5hbWU7IC8vIE9yaWdpbmFsIHByb3BzIGFyZSBjb3BpZWRcblxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTsgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuXG5cbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7IC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG5cbiAgdmFyIHNlbGYgPSBlbGVtZW50Ll9zZWxmOyAvLyBTb3VyY2UgaXMgcHJlc2VydmVkIHNpbmNlIGNsb25lRWxlbWVudCBpcyB1bmxpa2VseSB0byBiZSB0YXJnZXRlZCBieSBhXG4gIC8vIHRyYW5zcGlsZXIsIGFuZCB0aGUgb3JpZ2luYWwgc291cmNlIGlzIHByb2JhYmx5IGEgYmV0dGVyIGluZGljYXRvciBvZiB0aGVcbiAgLy8gdHJ1ZSBvd25lci5cblxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlOyAvLyBPd25lciB3aWxsIGJlIHByZXNlcnZlZCwgdW5sZXNzIHJlZiBpcyBvdmVycmlkZGVuXG5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG5cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH0gLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgb3ZlcnJpZGUgZXhpc3RpbmcgcHJvcHNcblxuXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcblxuICAgIGlmIChlbGVtZW50LnR5cGUgJiYgZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcykge1xuICAgICAgZGVmYXVsdFByb3BzID0gZWxlbWVudC50eXBlLmRlZmF1bHRQcm9wcztcbiAgICB9XG5cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IC8vIENoaWxkcmVuIGNhbiBiZSBtb3JlIHRoYW4gb25lIGFyZ3VtZW50LCBhbmQgdGhvc2UgYXJlIHRyYW5zZmVycmVkIG9udG9cbiAgLy8gdGhlIG5ld2x5IGFsbG9jYXRlZCBwcm9wcyBvYmplY3QuXG5cblxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcblxuICBpZiAoY2hpbGRyZW5MZW5ndGggPT09IDEpIHtcbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICB9IGVsc2UgaWYgKGNoaWxkcmVuTGVuZ3RoID4gMSkge1xuICAgIHZhciBjaGlsZEFycmF5ID0gQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn1cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgUmVhY3RFbGVtZW50LlxuICogQGZpbmFsXG4gKi9cblxuZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJiBvYmplY3QgIT09IG51bGwgJiYgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEU7XG59XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyArIGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG52YXIgdXNlclByb3ZpZGVkS2V5RXNjYXBlUmVnZXggPSAvXFwvKy9nO1xuXG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gKCcnICsgdGV4dCkucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuXG52YXIgUE9PTF9TSVpFID0gMTA7XG52YXIgdHJhdmVyc2VDb250ZXh0UG9vbCA9IFtdO1xuXG5mdW5jdGlvbiBnZXRQb29sZWRUcmF2ZXJzZUNvbnRleHQobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1bmN0aW9uLCBtYXBDb250ZXh0KSB7XG4gIGlmICh0cmF2ZXJzZUNvbnRleHRQb29sLmxlbmd0aCkge1xuICAgIHZhciB0cmF2ZXJzZUNvbnRleHQgPSB0cmF2ZXJzZUNvbnRleHRQb29sLnBvcCgpO1xuICAgIHRyYXZlcnNlQ29udGV4dC5yZXN1bHQgPSBtYXBSZXN1bHQ7XG4gICAgdHJhdmVyc2VDb250ZXh0LmtleVByZWZpeCA9IGtleVByZWZpeDtcbiAgICB0cmF2ZXJzZUNvbnRleHQuZnVuYyA9IG1hcEZ1bmN0aW9uO1xuICAgIHRyYXZlcnNlQ29udGV4dC5jb250ZXh0ID0gbWFwQ29udGV4dDtcbiAgICB0cmF2ZXJzZUNvbnRleHQuY291bnQgPSAwO1xuICAgIHJldHVybiB0cmF2ZXJzZUNvbnRleHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlc3VsdDogbWFwUmVzdWx0LFxuICAgICAga2V5UHJlZml4OiBrZXlQcmVmaXgsXG4gICAgICBmdW5jOiBtYXBGdW5jdGlvbixcbiAgICAgIGNvbnRleHQ6IG1hcENvbnRleHQsXG4gICAgICBjb3VudDogMFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVsZWFzZVRyYXZlcnNlQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQpIHtcbiAgdHJhdmVyc2VDb250ZXh0LnJlc3VsdCA9IG51bGw7XG4gIHRyYXZlcnNlQ29udGV4dC5rZXlQcmVmaXggPSBudWxsO1xuICB0cmF2ZXJzZUNvbnRleHQuZnVuYyA9IG51bGw7XG4gIHRyYXZlcnNlQ29udGV4dC5jb250ZXh0ID0gbnVsbDtcbiAgdHJhdmVyc2VDb250ZXh0LmNvdW50ID0gMDtcblxuICBpZiAodHJhdmVyc2VDb250ZXh0UG9vbC5sZW5ndGggPCBQT09MX1NJWkUpIHtcbiAgICB0cmF2ZXJzZUNvbnRleHRQb29sLnB1c2godHJhdmVyc2VDb250ZXh0KTtcbiAgfVxufVxuLyoqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZVNvRmFyIE5hbWUgb2YgdGhlIGtleSBwYXRoIHNvIGZhci5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBlYWNoIGNoaWxkIGZvdW5kLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoZSB0cmF2ZXJzYWxcbiAqIHByb2Nlc3MuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29GYXIsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIHZhciBpbnZva2VDYWxsYmFjayA9IGZhbHNlO1xuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCkge1xuICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBpbnZva2VDYWxsYmFjayA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICBzd2l0Y2ggKGNoaWxkcmVuLiQkdHlwZW9mKSB7XG4gICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgIGludm9rZUNhbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgaWYgKGludm9rZUNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbiwgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cblxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG5cbiAgICAgIHtcbiAgICAgICAgLy8gV2FybiBhYm91dCB1c2luZyBNYXBzIGFzIGNoaWxkcmVuXG4gICAgICAgIGlmIChpdGVyYXRvckZuID09PSBjaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgICAgaWYgKCFkaWRXYXJuQWJvdXRNYXBzKSB7XG4gICAgICAgICAgICB3YXJuKCdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIGNvbnZlcnRpbmcgY2hpbGRyZW4gdG8gJyArICdhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGlpID0gMDtcblxuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcblxuICAgICAge1xuICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQuJyArIFJlYWN0RGVidWdDdXJyZW50RnJhbWUuZ2V0U3RhY2tBZGRlbmR1bSgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSAnJyArIGNoaWxkcmVuO1xuXG4gICAgICB7XG4gICAgICAgIHtcbiAgICAgICAgICB0aHJvdyBFcnJvciggXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICsgKGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZykgKyBcIikuXCIgKyBhZGRlbmR1bSApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cbi8qKlxuICogVHJhdmVyc2VzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCwgYnV0XG4gKiBtaWdodCBhbHNvIGJlIHNwZWNpZmllZCB0aHJvdWdoIGF0dHJpYnV0ZXM6XG4gKlxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuLCAuLi4pYFxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmxlZnRQYW5lbENoaWxkcmVuLCAuLi4pYFxuICpcbiAqIFRoZSBgdHJhdmVyc2VDb250ZXh0YCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogZW50aXJlIHRyYXZlcnNhbC4gSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYWNjdW11bGF0aW9ucyBvciBhbnl0aGluZyBlbHNlIHRoYXRcbiAqIHRoZSBjYWxsYmFjayBtaWdodCBmaW5kIHJlbGV2YW50LlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgb2JqZWN0LlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIFRvIGludm9rZSB1cG9uIHRyYXZlcnNpbmcgZWFjaCBjaGlsZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IGZvciB0cmF2ZXJzYWwuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgY29tcG9uZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5cblxuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQgIT09IG51bGwgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIGVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfSAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuXG5cbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJvb2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkge1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcbiAgZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBib29rS2VlcGluZy5jb3VudCsrKTtcbn1cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9yZWFjdC1hcGkuaHRtbCNyZWFjdGNoaWxkcmVuZm9yZWFjaFxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmb3JFYWNoRnVuY1xuICogQHBhcmFtIHsqfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IGZvciBmb3JFYWNoQ29udGV4dC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IGdldFBvb2xlZFRyYXZlcnNlQ29udGV4dChudWxsLCBudWxsLCBmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpO1xuICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGQsIHRyYXZlcnNlQ29udGV4dCk7XG4gIHJlbGVhc2VUcmF2ZXJzZUNvbnRleHQodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuZnVuY3Rpb24gbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dChib29rS2VlcGluZywgY2hpbGQsIGNoaWxkS2V5KSB7XG4gIHZhciByZXN1bHQgPSBib29rS2VlcGluZy5yZXN1bHQsXG4gICAgICBrZXlQcmVmaXggPSBib29rS2VlcGluZy5rZXlQcmVmaXgsXG4gICAgICBmdW5jID0gYm9va0tlZXBpbmcuZnVuYyxcbiAgICAgIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0O1xuICB2YXIgbWFwcGVkQ2hpbGQgPSBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGZ1bmN0aW9uIChjKSB7XG4gICAgICByZXR1cm4gYztcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChtYXBwZWRDaGlsZCAhPSBudWxsKSB7XG4gICAgaWYgKGlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgbWFwcGVkQ2hpbGQgPSBjbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsIC8vIEtlZXAgYm90aCB0aGUgKG1hcHBlZCkgYW5kIG9sZCBrZXlzIGlmIHRoZXkgZGlmZmVyLCBqdXN0IGFzXG4gICAgICAvLyB0cmF2ZXJzZUFsbENoaWxkcmVuIHVzZWQgdG8gZG8gZm9yIG9iamVjdHMgYXMgY2hpbGRyZW5cbiAgICAgIGtleVByZWZpeCArIChtYXBwZWRDaGlsZC5rZXkgJiYgKCFjaGlsZCB8fCBjaGlsZC5rZXkgIT09IG1hcHBlZENoaWxkLmtleSkgPyBlc2NhcGVVc2VyUHJvdmlkZWRLZXkobWFwcGVkQ2hpbGQua2V5KSArICcvJyA6ICcnKSArIGNoaWxkS2V5KTtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaChtYXBwZWRDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgYXJyYXksIHByZWZpeCwgZnVuYywgY29udGV4dCkge1xuICB2YXIgZXNjYXBlZFByZWZpeCA9ICcnO1xuXG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuXG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBnZXRQb29sZWRUcmF2ZXJzZUNvbnRleHQoYXJyYXksIGVzY2FwZWRQcmVmaXgsIGZ1bmMsIGNvbnRleHQpO1xuICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0LCB0cmF2ZXJzZUNvbnRleHQpO1xuICByZWxlYXNlVHJhdmVyc2VDb250ZXh0KHRyYXZlcnNlQ29udGV4dCk7XG59XG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm1hcFxuICpcbiAqIFRoZSBwcm92aWRlZCBtYXBGdW5jdGlvbihjaGlsZCwga2V5LCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMgVGhlIG1hcCBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBtYXBGdW5jdGlvbi5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cblxuXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBmdW5jLCBjb250ZXh0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbmNvdW50XG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4uXG4gKi9cblxuXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sIG51bGwpO1xufVxuLyoqXG4gKiBGbGF0dGVuIGEgY2hpbGRyZW4gb2JqZWN0ICh0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmApIGFuZFxuICogcmV0dXJuIGFuIGFycmF5IHdpdGggYXBwcm9wcmlhdGVseSByZS1rZXllZCBjaGlsZHJlbi5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL3JlYWN0LWFwaS5odG1sI3JlYWN0Y2hpbGRyZW50b2FycmF5XG4gKi9cblxuXG5mdW5jdGlvbiB0b0FycmF5KGNoaWxkcmVuKSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgcmVzdWx0LCBudWxsLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICByZXR1cm4gY2hpbGQ7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL3JlYWN0anMub3JnL2RvY3MvcmVhY3QtYXBpLmh0bWwjcmVhY3RjaGlsZHJlbm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIlJlYWN0LkNoaWxkcmVuLm9ubHkgZXhwZWN0ZWQgdG8gcmVjZWl2ZSBhIHNpbmdsZSBSZWFjdCBlbGVtZW50IGNoaWxkLlwiICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250ZXh0KGRlZmF1bHRWYWx1ZSwgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpIHtcbiAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICBjYWxjdWxhdGVDaGFuZ2VkQml0cyA9IG51bGw7XG4gIH0gZWxzZSB7XG4gICAge1xuICAgICAgaWYgKGNhbGN1bGF0ZUNoYW5nZWRCaXRzICE9PSBudWxsICYmIHR5cGVvZiBjYWxjdWxhdGVDaGFuZ2VkQml0cyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBlcnJvcignY3JlYXRlQ29udGV4dDogRXhwZWN0ZWQgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byBiZSBhICcgKyAnZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzJywgY2FsY3VsYXRlQ2hhbmdlZEJpdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBjb250ZXh0ID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9DT05URVhUX1RZUEUsXG4gICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjYWxjdWxhdGVDaGFuZ2VkQml0cyxcbiAgICAvLyBBcyBhIHdvcmthcm91bmQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb25jdXJyZW50IHJlbmRlcmVycywgd2UgY2F0ZWdvcml6ZVxuICAgIC8vIHNvbWUgcmVuZGVyZXJzIGFzIHByaW1hcnkgYW5kIG90aGVycyBhcyBzZWNvbmRhcnkuIFdlIG9ubHkgZXhwZWN0XG4gICAgLy8gdGhlcmUgdG8gYmUgdHdvIGNvbmN1cnJlbnQgcmVuZGVyZXJzIGF0IG1vc3Q6IFJlYWN0IE5hdGl2ZSAocHJpbWFyeSkgYW5kXG4gICAgLy8gRmFicmljIChzZWNvbmRhcnkpOyBSZWFjdCBET00gKHByaW1hcnkpIGFuZCBSZWFjdCBBUlQgKHNlY29uZGFyeSkuXG4gICAgLy8gU2Vjb25kYXJ5IHJlbmRlcmVycyBzdG9yZSB0aGVpciBjb250ZXh0IHZhbHVlcyBvbiBzZXBhcmF0ZSBmaWVsZHMuXG4gICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgIF9jdXJyZW50VmFsdWUyOiBkZWZhdWx0VmFsdWUsXG4gICAgLy8gVXNlZCB0byB0cmFjayBob3cgbWFueSBjb25jdXJyZW50IHJlbmRlcmVycyB0aGlzIGNvbnRleHQgY3VycmVudGx5XG4gICAgLy8gc3VwcG9ydHMgd2l0aGluIGluIGEgc2luZ2xlIHJlbmRlcmVyLiBTdWNoIGFzIHBhcmFsbGVsIHNlcnZlciByZW5kZXJpbmcuXG4gICAgX3RocmVhZENvdW50OiAwLFxuICAgIC8vIFRoZXNlIGFyZSBjaXJjdWxhclxuICAgIFByb3ZpZGVyOiBudWxsLFxuICAgIENvbnN1bWVyOiBudWxsXG4gIH07XG4gIGNvbnRleHQuUHJvdmlkZXIgPSB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX1BST1ZJREVSX1RZUEUsXG4gICAgX2NvbnRleHQ6IGNvbnRleHRcbiAgfTtcbiAgdmFyIGhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzID0gZmFsc2U7XG4gIHZhciBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IGZhbHNlO1xuXG4gIHtcbiAgICAvLyBBIHNlcGFyYXRlIG9iamVjdCwgYnV0IHByb3hpZXMgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGV4dCBvYmplY3QgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGhhcyBhIGRpZmZlcmVudCAkJHR5cGVvZiwgc28gd2UgY2FuIHByb3Blcmx5XG4gICAgLy8gd2FybiBmb3IgdGhlIGluY29ycmVjdCB1c2FnZSBvZiBDb250ZXh0IGFzIGEgQ29uc3VtZXIuXG4gICAgdmFyIENvbnN1bWVyID0ge1xuICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgIF9jb250ZXh0OiBjb250ZXh0LFxuICAgICAgX2NhbGN1bGF0ZUNoYW5nZWRCaXRzOiBjb250ZXh0Ll9jYWxjdWxhdGVDaGFuZ2VkQml0c1xuICAgIH07IC8vICRGbG93Rml4TWU6IEZsb3cgY29tcGxhaW5zIGFib3V0IG5vdCBzZXR0aW5nIGEgdmFsdWUsIHdoaWNoIGlzIGludGVudGlvbmFsIGhlcmVcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKENvbnN1bWVyLCB7XG4gICAgICBQcm92aWRlcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdDb25zdW1lclByb3ZpZGVyKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nQ29uc3VtZXJQcm92aWRlciA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuUHJvdmlkZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuUHJvdmlkZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuUHJvdmlkZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9Qcm92aWRlcikge1xuICAgICAgICAgIGNvbnRleHQuUHJvdmlkZXIgPSBfUHJvdmlkZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBfY3VycmVudFZhbHVlOiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9jdXJyZW50VmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBfY3VycmVudFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX2N1cnJlbnRWYWx1ZTI6IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuX2N1cnJlbnRWYWx1ZTI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKF9jdXJyZW50VmFsdWUyKSB7XG4gICAgICAgICAgY29udGV4dC5fY3VycmVudFZhbHVlMiA9IF9jdXJyZW50VmFsdWUyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgX3RocmVhZENvdW50OiB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0Ll90aHJlYWRDb3VudDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoX3RocmVhZENvdW50KSB7XG4gICAgICAgICAgY29udGV4dC5fdGhyZWFkQ291bnQgPSBfdGhyZWFkQ291bnQ7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBDb25zdW1lcjoge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZEFib3V0VXNpbmdOZXN0ZWRDb250ZXh0Q29uc3VtZXJzKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRBYm91dFVzaW5nTmVzdGVkQ29udGV4dENvbnN1bWVycyA9IHRydWU7XG5cbiAgICAgICAgICAgIGVycm9yKCdSZW5kZXJpbmcgPENvbnRleHQuQ29uc3VtZXIuQ29uc3VtZXI+IGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIERpZCB5b3UgbWVhbiB0byByZW5kZXIgPENvbnRleHQuQ29uc3VtZXI+IGluc3RlYWQ/Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQuQ29uc3VtZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTsgLy8gJEZsb3dGaXhNZTogRmxvdyBjb21wbGFpbnMgYWJvdXQgbWlzc2luZyBwcm9wZXJ0aWVzIGJlY2F1c2UgaXQgZG9lc24ndCB1bmRlcnN0YW5kIGRlZmluZVByb3BlcnR5XG5cbiAgICBjb250ZXh0LkNvbnN1bWVyID0gQ29uc3VtZXI7XG4gIH1cblxuICB7XG4gICAgY29udGV4dC5fY3VycmVudFJlbmRlcmVyID0gbnVsbDtcbiAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIyID0gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBsYXp5KGN0b3IpIHtcbiAgdmFyIGxhenlUeXBlID0ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9MQVpZX1RZUEUsXG4gICAgX2N0b3I6IGN0b3IsXG4gICAgLy8gUmVhY3QgdXNlcyB0aGVzZSBmaWVsZHMgdG8gc3RvcmUgdGhlIHJlc3VsdC5cbiAgICBfc3RhdHVzOiAtMSxcbiAgICBfcmVzdWx0OiBudWxsXG4gIH07XG5cbiAge1xuICAgIC8vIEluIHByb2R1Y3Rpb24sIHRoaXMgd291bGQganVzdCBzZXQgaXQgb24gdGhlIG9iamVjdC5cbiAgICB2YXIgZGVmYXVsdFByb3BzO1xuICAgIHZhciBwcm9wVHlwZXM7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobGF6eVR5cGUsIHtcbiAgICAgIGRlZmF1bHRQcm9wczoge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0UHJvcHM7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld0RlZmF1bHRQcm9wcykge1xuICAgICAgICAgIGVycm9yKCdSZWFjdC5sYXp5KC4uLik6IEl0IGlzIG5vdCBzdXBwb3J0ZWQgdG8gYXNzaWduIGBkZWZhdWx0UHJvcHNgIHRvICcgKyAnYSBsYXp5IGNvbXBvbmVudCBpbXBvcnQuIEVpdGhlciBzcGVjaWZ5IHRoZW0gd2hlcmUgdGhlIGNvbXBvbmVudCAnICsgJ2lzIGRlZmluZWQsIG9yIGNyZWF0ZSBhIHdyYXBwaW5nIGNvbXBvbmVudCBhcm91bmQgaXQuJyk7XG5cbiAgICAgICAgICBkZWZhdWx0UHJvcHMgPSBuZXdEZWZhdWx0UHJvcHM7IC8vIE1hdGNoIHByb2R1Y3Rpb24gYmVoYXZpb3IgbW9yZSBjbG9zZWx5OlxuXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxhenlUeXBlLCAnZGVmYXVsdFByb3BzJywge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvcFR5cGVzOiB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3BUeXBlcztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3UHJvcFR5cGVzKSB7XG4gICAgICAgICAgZXJyb3IoJ1JlYWN0LmxhenkoLi4uKTogSXQgaXMgbm90IHN1cHBvcnRlZCB0byBhc3NpZ24gYHByb3BUeXBlc2AgdG8gJyArICdhIGxhenkgY29tcG9uZW50IGltcG9ydC4gRWl0aGVyIHNwZWNpZnkgdGhlbSB3aGVyZSB0aGUgY29tcG9uZW50ICcgKyAnaXMgZGVmaW5lZCwgb3IgY3JlYXRlIGEgd3JhcHBpbmcgY29tcG9uZW50IGFyb3VuZCBpdC4nKTtcblxuICAgICAgICAgIHByb3BUeXBlcyA9IG5ld1Byb3BUeXBlczsgLy8gTWF0Y2ggcHJvZHVjdGlvbiBiZWhhdmlvciBtb3JlIGNsb3NlbHk6XG5cbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGF6eVR5cGUsICdwcm9wVHlwZXMnLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBsYXp5VHlwZTtcbn1cblxuZnVuY3Rpb24gZm9yd2FyZFJlZihyZW5kZXIpIHtcbiAge1xuICAgIGlmIChyZW5kZXIgIT0gbnVsbCAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHJlY2VpdmVkIGEgYG1lbW9gICcgKyAnY29tcG9uZW50LiBJbnN0ZWFkIG9mIGZvcndhcmRSZWYobWVtbyguLi4pKSwgdXNlICcgKyAnbWVtbyhmb3J3YXJkUmVmKC4uLikpLicpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHJlbmRlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVxdWlyZXMgYSByZW5kZXIgZnVuY3Rpb24gYnV0IHdhcyBnaXZlbiAlcy4nLCByZW5kZXIgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgcmVuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlbmRlci5sZW5ndGggIT09IDAgJiYgcmVuZGVyLmxlbmd0aCAhPT0gMikge1xuICAgICAgICBlcnJvcignZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlcycsIHJlbmRlci5sZW5ndGggPT09IDEgPyAnRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyPycgOiAnQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVyIHdpbGwgYmUgdW5kZWZpbmVkLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZW5kZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlbmRlci5kZWZhdWx0UHJvcHMgIT0gbnVsbCB8fCByZW5kZXIucHJvcFR5cGVzICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IoJ2ZvcndhcmRSZWYgcmVuZGVyIGZ1bmN0aW9ucyBkbyBub3Qgc3VwcG9ydCBwcm9wVHlwZXMgb3IgZGVmYXVsdFByb3BzLiAnICsgJ0RpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgYSBSZWFjdCBjb21wb25lbnQ/Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSxcbiAgICByZW5kZXI6IHJlbmRlclxuICB9O1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkRWxlbWVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nIHx8IC8vIE5vdGU6IGl0cyB0eXBlb2YgbWlnaHQgYmUgb3RoZXIgdGhhbiAnc3ltYm9sJyBvciAnbnVtYmVyJyBpZiBpdCdzIGEgcG9seWZpbGwuXG4gIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfQ09OQ1VSUkVOVF9NT0RFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fCB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8IHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHwgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX1BST1ZJREVSX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRlVOREFNRU5UQUxfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9SRVNQT05ERVJfVFlQRSB8fCB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9TQ09QRV9UWVBFIHx8IHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0JMT0NLX1RZUEUpO1xufVxuXG5mdW5jdGlvbiBtZW1vKHR5cGUsIGNvbXBhcmUpIHtcbiAge1xuICAgIGlmICghaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKSB7XG4gICAgICBlcnJvcignbWVtbzogVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBjb21wb25lbnQuIEluc3RlYWQgJyArICdyZWNlaXZlZDogJXMnLCB0eXBlID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgJCR0eXBlb2Y6IFJFQUNUX01FTU9fVFlQRSxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGNvbXBhcmU6IGNvbXBhcmUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb21wYXJlXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVEaXNwYXRjaGVyKCkge1xuICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0Q3VycmVudERpc3BhdGNoZXIuY3VycmVudDtcblxuICBpZiAoIShkaXNwYXRjaGVyICE9PSBudWxsKSkge1xuICAgIHtcbiAgICAgIHRocm93IEVycm9yKCBcIkludmFsaWQgaG9vayBjYWxsLiBIb29rcyBjYW4gb25seSBiZSBjYWxsZWQgaW5zaWRlIG9mIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24gY29tcG9uZW50LiBUaGlzIGNvdWxkIGhhcHBlbiBmb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG4xLiBZb3UgbWlnaHQgaGF2ZSBtaXNtYXRjaGluZyB2ZXJzaW9ucyBvZiBSZWFjdCBhbmQgdGhlIHJlbmRlcmVyIChzdWNoIGFzIFJlYWN0IERPTSlcXG4yLiBZb3UgbWlnaHQgYmUgYnJlYWtpbmcgdGhlIFJ1bGVzIG9mIEhvb2tzXFxuMy4gWW91IG1pZ2h0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0IGluIHRoZSBzYW1lIGFwcFxcblNlZSBodHRwczovL2ZiLm1lL3JlYWN0LWludmFsaWQtaG9vay1jYWxsIGZvciB0aXBzIGFib3V0IGhvdyB0byBkZWJ1ZyBhbmQgZml4IHRoaXMgcHJvYmxlbS5cIiApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyO1xufVxuXG5mdW5jdGlvbiB1c2VDb250ZXh0KENvbnRleHQsIHVuc3RhYmxlX29ic2VydmVkQml0cykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG5cbiAge1xuICAgIGlmICh1bnN0YWJsZV9vYnNlcnZlZEJpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IoJ3VzZUNvbnRleHQoKSBzZWNvbmQgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAnICsgJ3VzZSBpbiBSZWFjdC4gUGFzc2luZyBpdCBpcyBub3Qgc3VwcG9ydGVkLiAnICsgJ1lvdSBwYXNzZWQ6ICVzLiVzJywgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzLCB0eXBlb2YgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzID09PSAnbnVtYmVyJyAmJiBBcnJheS5pc0FycmF5KGFyZ3VtZW50c1syXSkgPyAnXFxuXFxuRGlkIHlvdSBjYWxsIGFycmF5Lm1hcCh1c2VDb250ZXh0KT8gJyArICdDYWxsaW5nIEhvb2tzIGluc2lkZSBhIGxvb3AgaXMgbm90IHN1cHBvcnRlZC4gJyArICdMZWFybiBtb3JlIGF0IGh0dHBzOi8vZmIubWUvcnVsZXMtb2YtaG9va3MnIDogJycpO1xuICAgIH0gLy8gVE9ETzogYWRkIGEgbW9yZSBnZW5lcmljIHdhcm5pbmcgZm9yIGludmFsaWQgdmFsdWVzLlxuXG5cbiAgICBpZiAoQ29udGV4dC5fY29udGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgcmVhbENvbnRleHQgPSBDb250ZXh0Ll9jb250ZXh0OyAvLyBEb24ndCBkZWR1cGxpY2F0ZSBiZWNhdXNlIHRoaXMgbGVnaXRpbWF0ZWx5IGNhdXNlcyBidWdzXG4gICAgICAvLyBhbmQgbm9ib2R5IHNob3VsZCBiZSB1c2luZyB0aGlzIGluIGV4aXN0aW5nIGNvZGUuXG5cbiAgICAgIGlmIChyZWFsQ29udGV4dC5Db25zdW1lciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuQ29uc3VtZXIpIGlzIG5vdCBzdXBwb3J0ZWQsIG1heSBjYXVzZSBidWdzLCBhbmQgd2lsbCBiZSAnICsgJ3JlbW92ZWQgaW4gYSBmdXR1cmUgbWFqb3IgcmVsZWFzZS4gRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfSBlbHNlIGlmIChyZWFsQ29udGV4dC5Qcm92aWRlciA9PT0gQ29udGV4dCkge1xuICAgICAgICBlcnJvcignQ2FsbGluZyB1c2VDb250ZXh0KENvbnRleHQuUHJvdmlkZXIpIGlzIG5vdCBzdXBwb3J0ZWQuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGNhbGwgdXNlQ29udGV4dChDb250ZXh0KSBpbnN0ZWFkPycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUNvbnRleHQoQ29udGV4dCwgdW5zdGFibGVfb2JzZXJ2ZWRCaXRzKTtcbn1cbmZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVN0YXRlKGluaXRpYWxTdGF0ZSk7XG59XG5mdW5jdGlvbiB1c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xufVxuZnVuY3Rpb24gdXNlUmVmKGluaXRpYWxWYWx1ZSkge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZVJlZihpbml0aWFsVmFsdWUpO1xufVxuZnVuY3Rpb24gdXNlRWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlTGF5b3V0RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xufVxuZnVuY3Rpb24gdXNlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG59XG5mdW5jdGlvbiB1c2VNZW1vKGNyZWF0ZSwgZGVwcykge1xuICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gIHJldHVybiBkaXNwYXRjaGVyLnVzZU1lbW8oY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpIHtcbiAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICByZXR1cm4gZGlzcGF0Y2hlci51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbn1cbmZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKSB7XG4gIHtcbiAgICB2YXIgZGlzcGF0Y2hlciA9IHJlc29sdmVEaXNwYXRjaGVyKCk7XG4gICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlRGVidWdWYWx1ZSh2YWx1ZSwgZm9ybWF0dGVyRm4pO1xuICB9XG59XG5cbnZhciBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93bjtcblxue1xuICBwcm9wVHlwZXNNaXNzcGVsbFdhcm5pbmdTaG93biA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQudHlwZSk7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICdcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oc291cmNlKSB7XG4gIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJ1xcblxcbkNoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bUZvclByb3BzKGVsZW1lbnRQcm9wcykge1xuICBpZiAoZWxlbWVudFByb3BzICE9PSBudWxsICYmIGVsZW1lbnRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKGVsZW1lbnRQcm9wcy5fX3NvdXJjZSk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG4vKipcbiAqIFdhcm4gaWYgdGhlcmUncyBubyBrZXkgZXhwbGljaXRseSBzZXQgb24gZHluYW1pYyBhcnJheXMgb2YgY2hpbGRyZW4gb3JcbiAqIG9iamVjdCBrZXlzIGFyZSBub3QgdmFsaWQuIFRoaXMgYWxsb3dzIHVzIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGRyZW4gYmV0d2VlblxuICogdXBkYXRlcy5cbiAqL1xuXG5cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG5cbiAgICBpZiAocGFyZW50TmFtZSkge1xuICAgICAgaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHRvcC1sZXZlbCByZW5kZXIgY2FsbCB1c2luZyA8XCIgKyBwYXJlbnROYW1lICsgXCI+LlwiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuLyoqXG4gKiBXYXJuIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbiBleHBsaWNpdCBrZXkgYXNzaWduZWQgdG8gaXQuXG4gKiBUaGlzIGVsZW1lbnQgaXMgaW4gYW4gYXJyYXkuIFRoZSBhcnJheSBjb3VsZCBncm93IGFuZCBzaHJpbmsgb3IgYmVcbiAqIHJlb3JkZXJlZC4gQWxsIGNoaWxkcmVuIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGFyZSByZXF1aXJlZCB0b1xuICogaGF2ZSBhIFwia2V5XCIgcHJvcGVydHkgYXNzaWduZWQgdG8gaXQuIEVycm9yIHN0YXR1c2VzIGFyZSBjYWNoZWQgc28gYSB3YXJuaW5nXG4gKiB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdGhhdCByZXF1aXJlcyBhIGtleS5cbiAqIEBwYXJhbSB7Kn0gcGFyZW50VHlwZSBlbGVtZW50J3MgcGFyZW50J3MgdHlwZS5cbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuXG4gIGlmIChvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBvd25lckhhc0tleVVzZVdhcm5pbmdbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlOyAvLyBVc3VhbGx5IHRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBvZmZlbmRlciwgYnV0IGlmIGl0IGFjY2VwdHMgY2hpbGRyZW4gYXMgYVxuICAvLyBwcm9wZXJ0eSwgaXQgbWF5IGJlIHRoZSBjcmVhdG9yIG9mIHRoZSBjaGlsZCB0aGF0J3MgcmVzcG9uc2libGUgZm9yXG4gIC8vIGFzc2lnbmluZyBpdCBhIGtleS5cblxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuXG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgZ2V0Q29tcG9uZW50TmFtZShlbGVtZW50Ll9vd25lci50eXBlKSArIFwiLlwiO1xuICB9XG5cbiAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG5cbiAge1xuICAgIGVycm9yKCdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJyArICclcyVzIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyKTtcbiAgfVxuXG4gIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcblxuICAgICAgaWYgKGlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcblxuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gRW50cnkgaXRlcmF0b3JzIHVzZWQgdG8gcHJvdmlkZSBpbXBsaWNpdCBrZXlzLFxuICAgICAgLy8gYnV0IG5vdyB3ZSBwcmludCBhIHNlcGFyYXRlIHdhcm5pbmcgZm9yIHRoZW0gbGF0ZXIuXG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChpc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYW4gZWxlbWVudCwgdmFsaWRhdGUgdGhhdCBpdHMgcHJvcHMgZm9sbG93IHRoZSBwcm9wVHlwZXMgZGVmaW5pdGlvbixcbiAqIHByb3ZpZGVkIGJ5IHRoZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50XG4gKi9cblxuXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHtcbiAgICB2YXIgdHlwZSA9IGVsZW1lbnQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBudWxsIHx8IHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWUodHlwZSk7XG4gICAgdmFyIHByb3BUeXBlcztcblxuICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcHJvcFR5cGVzID0gdHlwZS5wcm9wVHlwZXM7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgKHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHwgLy8gTm90ZTogTWVtbyBvbmx5IGNoZWNrcyBvdXRlciBwcm9wcyBoZXJlLlxuICAgIC8vIElubmVyIHByb3BzIGFyZSBjaGVja2VkIGluIHRoZSByZWNvbmNpbGVyLlxuICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRSkpIHtcbiAgICAgIHByb3BUeXBlcyA9IHR5cGUucHJvcFR5cGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BUeXBlcykge1xuICAgICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZWxlbWVudCk7XG4gICAgICBjaGVja1Byb3BUeXBlcyhwcm9wVHlwZXMsIGVsZW1lbnQucHJvcHMsICdwcm9wJywgbmFtZSwgUmVhY3REZWJ1Z0N1cnJlbnRGcmFtZS5nZXRTdGFja0FkZGVuZHVtKTtcbiAgICAgIHNldEN1cnJlbnRseVZhbGlkYXRpbmdFbGVtZW50KG51bGwpO1xuICAgIH0gZWxzZSBpZiAodHlwZS5Qcm9wVHlwZXMgIT09IHVuZGVmaW5lZCAmJiAhcHJvcFR5cGVzTWlzc3BlbGxXYXJuaW5nU2hvd24pIHtcbiAgICAgIHByb3BUeXBlc01pc3NwZWxsV2FybmluZ1Nob3duID0gdHJ1ZTtcblxuICAgICAgZXJyb3IoJ0NvbXBvbmVudCAlcyBkZWNsYXJlZCBgUHJvcFR5cGVzYCBpbnN0ZWFkIG9mIGBwcm9wVHlwZXNgLiBEaWQgeW91IG1pc3NwZWxsIHRoZSBwcm9wZXJ0eSBhc3NpZ25tZW50PycsIG5hbWUgfHwgJ1Vua25vd24nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHR5cGUuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nICYmICF0eXBlLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCkge1xuICAgICAgZXJyb3IoJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKTtcbiAgICB9XG4gIH1cbn1cbi8qKlxuICogR2l2ZW4gYSBmcmFnbWVudCwgdmFsaWRhdGUgdGhhdCBpdCBjYW4gb25seSBiZSBwcm92aWRlZCB3aXRoIGZyYWdtZW50IHByb3BzXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZnJhZ21lbnRcbiAqL1xuXG5cbmZ1bmN0aW9uIHZhbGlkYXRlRnJhZ21lbnRQcm9wcyhmcmFnbWVudCkge1xuICB7XG4gICAgc2V0Q3VycmVudGx5VmFsaWRhdGluZ0VsZW1lbnQoZnJhZ21lbnQpO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZnJhZ21lbnQucHJvcHMpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcblxuICAgICAgaWYgKGtleSAhPT0gJ2NoaWxkcmVuJyAmJiBrZXkgIT09ICdrZXknKSB7XG4gICAgICAgIGVycm9yKCdJbnZhbGlkIHByb3AgYCVzYCBzdXBwbGllZCB0byBgUmVhY3QuRnJhZ21lbnRgLiAnICsgJ1JlYWN0LkZyYWdtZW50IGNhbiBvbmx5IGhhdmUgYGtleWAgYW5kIGBjaGlsZHJlbmAgcHJvcHMuJywga2V5KTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZnJhZ21lbnQucmVmICE9PSBudWxsKSB7XG4gICAgICBlcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgYHJlZmAgc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4nKTtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50bHlWYWxpZGF0aW5nRWxlbWVudChudWxsKTtcbiAgfVxufVxuZnVuY3Rpb24gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uKHR5cGUsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgdmFsaWRUeXBlID0gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpOyAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAvLyBzdWNjZWVkIGFuZCB0aGVyZSB3aWxsIGxpa2VseSBiZSBlcnJvcnMgaW4gcmVuZGVyLlxuXG4gIGlmICghdmFsaWRUeXBlKSB7XG4gICAgdmFyIGluZm8gPSAnJztcblxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGUgIT09IG51bGwgJiYgT2JqZWN0LmtleXModHlwZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArIFwiaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgIH1cblxuICAgIHZhciBzb3VyY2VJbmZvID0gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW1Gb3JQcm9wcyhwcm9wcyk7XG5cbiAgICBpZiAoc291cmNlSW5mbykge1xuICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuICAgIH1cblxuICAgIHZhciB0eXBlU3RyaW5nO1xuXG4gICAgaWYgKHR5cGUgPT09IG51bGwpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSAnbnVsbCc7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgICB0eXBlU3RyaW5nID0gJ2FycmF5JztcbiAgICB9IGVsc2UgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICAgIHR5cGVTdHJpbmcgPSBcIjxcIiArIChnZXRDb21wb25lbnROYW1lKHR5cGUudHlwZSkgfHwgJ1Vua25vd24nKSArIFwiIC8+XCI7XG4gICAgICBpbmZvID0gJyBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50Pyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZTtcbiAgICB9XG5cbiAgICB7XG4gICAgICBlcnJvcignUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgJyArICdidWlsdC1pbiBjb21wb25lbnRzKSBvciBhIGNsYXNzL2Z1bmN0aW9uIChmb3IgY29tcG9zaXRlICcgKyAnY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlU3RyaW5nLCBpbmZvKTtcbiAgICB9XG4gIH1cblxuICB2YXIgZWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgLy8gVE9ETzogRHJvcCB0aGlzIHdoZW4gdGhlc2UgYXJlIG5vIGxvbmdlciBhbGxvd2VkIGFzIHRoZSB0eXBlIGFyZ3VtZW50LlxuXG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gIC8vIFdlIGRvbid0IHdhbnQgZXhjZXB0aW9uIGJlaGF2aW9yIHRvIGRpZmZlciBiZXR3ZWVuIGRldiBhbmQgcHJvZC5cbiAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuXG5cbiAgaWYgKHZhbGlkVHlwZSkge1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgdmFsaWRhdGVGcmFnbWVudFByb3BzKGVsZW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIHZhbGlkYXRlUHJvcFR5cGVzKGVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG52YXIgZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkgPSBmYWxzZTtcbmZ1bmN0aW9uIGNyZWF0ZUZhY3RvcnlXaXRoVmFsaWRhdGlvbih0eXBlKSB7XG4gIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uLmJpbmQobnVsbCwgdHlwZSk7XG4gIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAge1xuICAgIGlmICghZGlkV2FybkFib3V0RGVwcmVjYXRlZENyZWF0ZUZhY3RvcnkpIHtcbiAgICAgIGRpZFdhcm5BYm91dERlcHJlY2F0ZWRDcmVhdGVGYWN0b3J5ID0gdHJ1ZTtcblxuICAgICAgd2FybignUmVhY3QuY3JlYXRlRmFjdG9yeSgpIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAnICsgJ2EgZnV0dXJlIG1ham9yIHJlbGVhc2UuIENvbnNpZGVyIHVzaW5nIEpTWCAnICsgJ29yIHVzZSBSZWFjdC5jcmVhdGVFbGVtZW50KCkgZGlyZWN0bHkgaW5zdGVhZC4nKTtcbiAgICB9IC8vIExlZ2FjeSBob29rOiByZW1vdmUgaXRcblxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2FybignRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpO1xuXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAndHlwZScsIHtcbiAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsaWRhdGVkRmFjdG9yeTtcbn1cbmZ1bmN0aW9uIGNsb25lRWxlbWVudFdpdGhWYWxpZGF0aW9uKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICB2YXIgbmV3RWxlbWVudCA9IGNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCBuZXdFbGVtZW50LnR5cGUpO1xuICB9XG5cbiAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gIHJldHVybiBuZXdFbGVtZW50O1xufVxuXG57XG5cbiAgdHJ5IHtcbiAgICB2YXIgZnJvemVuT2JqZWN0ID0gT2JqZWN0LmZyZWV6ZSh7fSk7XG4gICAgdmFyIHRlc3RNYXAgPSBuZXcgTWFwKFtbZnJvemVuT2JqZWN0LCBudWxsXV0pO1xuICAgIHZhciB0ZXN0U2V0ID0gbmV3IFNldChbZnJvemVuT2JqZWN0XSk7IC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBSb2xsdXAgdG8gbm90IGNvbnNpZGVyIHRoZXNlIHVudXNlZC5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcm9sbHVwL3JvbGx1cC9pc3N1ZXMvMTc3MVxuICAgIC8vIFRPRE86IHdlIGNhbiByZW1vdmUgdGhlc2UgaWYgUm9sbHVwIGZpeGVzIHRoZSBidWcuXG5cbiAgICB0ZXN0TWFwLnNldCgwLCAwKTtcbiAgICB0ZXN0U2V0LmFkZCgwKTtcbiAgfSBjYXRjaCAoZSkge1xuICB9XG59XG5cbnZhciBjcmVhdGVFbGVtZW50JDEgPSAgY3JlYXRlRWxlbWVudFdpdGhWYWxpZGF0aW9uIDtcbnZhciBjbG9uZUVsZW1lbnQkMSA9ICBjbG9uZUVsZW1lbnRXaXRoVmFsaWRhdGlvbiA7XG52YXIgY3JlYXRlRmFjdG9yeSA9ICBjcmVhdGVGYWN0b3J5V2l0aFZhbGlkYXRpb24gO1xudmFyIENoaWxkcmVuID0ge1xuICBtYXA6IG1hcENoaWxkcmVuLFxuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5LFxuICBvbmx5OiBvbmx5Q2hpbGRcbn07XG5cbmV4cG9ydHMuQ2hpbGRyZW4gPSBDaGlsZHJlbjtcbmV4cG9ydHMuQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5leHBvcnRzLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbmV4cG9ydHMuUHVyZUNvbXBvbmVudCA9IFB1cmVDb21wb25lbnQ7XG5leHBvcnRzLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuZXhwb3J0cy5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5leHBvcnRzLl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEID0gUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG5leHBvcnRzLmNsb25lRWxlbWVudCA9IGNsb25lRWxlbWVudCQxO1xuZXhwb3J0cy5jcmVhdGVDb250ZXh0ID0gY3JlYXRlQ29udGV4dDtcbmV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGNyZWF0ZUVsZW1lbnQkMTtcbmV4cG9ydHMuY3JlYXRlRmFjdG9yeSA9IGNyZWF0ZUZhY3Rvcnk7XG5leHBvcnRzLmNyZWF0ZVJlZiA9IGNyZWF0ZVJlZjtcbmV4cG9ydHMuZm9yd2FyZFJlZiA9IGZvcndhcmRSZWY7XG5leHBvcnRzLmlzVmFsaWRFbGVtZW50ID0gaXNWYWxpZEVsZW1lbnQ7XG5leHBvcnRzLmxhenkgPSBsYXp5O1xuZXhwb3J0cy5tZW1vID0gbWVtbztcbmV4cG9ydHMudXNlQ2FsbGJhY2sgPSB1c2VDYWxsYmFjaztcbmV4cG9ydHMudXNlQ29udGV4dCA9IHVzZUNvbnRleHQ7XG5leHBvcnRzLnVzZURlYnVnVmFsdWUgPSB1c2VEZWJ1Z1ZhbHVlO1xuZXhwb3J0cy51c2VFZmZlY3QgPSB1c2VFZmZlY3Q7XG5leHBvcnRzLnVzZUltcGVyYXRpdmVIYW5kbGUgPSB1c2VJbXBlcmF0aXZlSGFuZGxlO1xuZXhwb3J0cy51c2VMYXlvdXRFZmZlY3QgPSB1c2VMYXlvdXRFZmZlY3Q7XG5leHBvcnRzLnVzZU1lbW8gPSB1c2VNZW1vO1xuZXhwb3J0cy51c2VSZWR1Y2VyID0gdXNlUmVkdWNlcjtcbmV4cG9ydHMudXNlUmVmID0gdXNlUmVmO1xuZXhwb3J0cy51c2VTdGF0ZSA9IHVzZVN0YXRlO1xuZXhwb3J0cy52ZXJzaW9uID0gUmVhY3RWZXJzaW9uO1xuICB9KSgpO1xufVxuIiwiLyoqIEBsaWNlbnNlIFJlYWN0IHYxNi4xNC4wXG4gKiByZWFjdC5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbid1c2Ugc3RyaWN0Jzt2YXIgbD1yZXF1aXJlKFwib2JqZWN0LWFzc2lnblwiKSxuPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3IscD1uP1N5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpOjYwMTAzLHE9bj9TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpOjYwMTA2LHI9bj9TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIik6NjAxMDcsdD1uP1N5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKTo2MDEwOCx1PW4/U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpOjYwMTE0LHY9bj9TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik6NjAxMDksdz1uP1N5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpOjYwMTEwLHg9bj9TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIik6NjAxMTIseT1uP1N5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKTo2MDExMyx6PW4/U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIik6NjAxMTUsQT1uP1N5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpOlxuNjAxMTYsQj1cImZ1bmN0aW9uXCI9PT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gQyhhKXtmb3IodmFyIGI9XCJodHRwczovL3JlYWN0anMub3JnL2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD1cIithLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKWIrPVwiJmFyZ3NbXT1cIitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKTtyZXR1cm5cIk1pbmlmaWVkIFJlYWN0IGVycm9yICNcIithK1wiOyB2aXNpdCBcIitiK1wiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5cIn1cbnZhciBEPXtpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKCl7fSxlbnF1ZXVlU2V0U3RhdGU6ZnVuY3Rpb24oKXt9fSxFPXt9O2Z1bmN0aW9uIEYoYSxiLGMpe3RoaXMucHJvcHM9YTt0aGlzLmNvbnRleHQ9Yjt0aGlzLnJlZnM9RTt0aGlzLnVwZGF0ZXI9Y3x8RH1GLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O0YucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGEsYil7aWYoXCJvYmplY3RcIiE9PXR5cGVvZiBhJiZcImZ1bmN0aW9uXCIhPT10eXBlb2YgYSYmbnVsbCE9YSl0aHJvdyBFcnJvcihDKDg1KSk7dGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLGEsYixcInNldFN0YXRlXCIpfTtGLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihhKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsYSxcImZvcmNlVXBkYXRlXCIpfTtcbmZ1bmN0aW9uIEcoKXt9Ry5wcm90b3R5cGU9Ri5wcm90b3R5cGU7ZnVuY3Rpb24gSChhLGIsYyl7dGhpcy5wcm9wcz1hO3RoaXMuY29udGV4dD1iO3RoaXMucmVmcz1FO3RoaXMudXBkYXRlcj1jfHxEfXZhciBJPUgucHJvdG90eXBlPW5ldyBHO0kuY29uc3RydWN0b3I9SDtsKEksRi5wcm90b3R5cGUpO0kuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIEo9e2N1cnJlbnQ6bnVsbH0sSz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEw9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtcbmZ1bmN0aW9uIE0oYSxiLGMpe3ZhciBlLGQ9e30sZz1udWxsLGs9bnVsbDtpZihudWxsIT1iKWZvcihlIGluIHZvaWQgMCE9PWIucmVmJiYoaz1iLnJlZiksdm9pZCAwIT09Yi5rZXkmJihnPVwiXCIrYi5rZXkpLGIpSy5jYWxsKGIsZSkmJiFMLmhhc093blByb3BlcnR5KGUpJiYoZFtlXT1iW2VdKTt2YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWYpZC5jaGlsZHJlbj1jO2Vsc2UgaWYoMTxmKXtmb3IodmFyIGg9QXJyYXkoZiksbT0wO208ZjttKyspaFttXT1hcmd1bWVudHNbbSsyXTtkLmNoaWxkcmVuPWh9aWYoYSYmYS5kZWZhdWx0UHJvcHMpZm9yKGUgaW4gZj1hLmRlZmF1bHRQcm9wcyxmKXZvaWQgMD09PWRbZV0mJihkW2VdPWZbZV0pO3JldHVybnskJHR5cGVvZjpwLHR5cGU6YSxrZXk6ZyxyZWY6ayxwcm9wczpkLF9vd25lcjpKLmN1cnJlbnR9fVxuZnVuY3Rpb24gTihhLGIpe3JldHVybnskJHR5cGVvZjpwLHR5cGU6YS50eXBlLGtleTpiLHJlZjphLnJlZixwcm9wczphLnByb3BzLF9vd25lcjphLl9vd25lcn19ZnVuY3Rpb24gTyhhKXtyZXR1cm5cIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09cH1mdW5jdGlvbiBlc2NhcGUoYSl7dmFyIGI9e1wiPVwiOlwiPTBcIixcIjpcIjpcIj0yXCJ9O3JldHVyblwiJFwiKyhcIlwiK2EpLnJlcGxhY2UoL1s9Ol0vZyxmdW5jdGlvbihhKXtyZXR1cm4gYlthXX0pfXZhciBQPS9cXC8rL2csUT1bXTtmdW5jdGlvbiBSKGEsYixjLGUpe2lmKFEubGVuZ3RoKXt2YXIgZD1RLnBvcCgpO2QucmVzdWx0PWE7ZC5rZXlQcmVmaXg9YjtkLmZ1bmM9YztkLmNvbnRleHQ9ZTtkLmNvdW50PTA7cmV0dXJuIGR9cmV0dXJue3Jlc3VsdDphLGtleVByZWZpeDpiLGZ1bmM6Yyxjb250ZXh0OmUsY291bnQ6MH19XG5mdW5jdGlvbiBTKGEpe2EucmVzdWx0PW51bGw7YS5rZXlQcmVmaXg9bnVsbDthLmZ1bmM9bnVsbDthLmNvbnRleHQ9bnVsbDthLmNvdW50PTA7MTA+US5sZW5ndGgmJlEucHVzaChhKX1cbmZ1bmN0aW9uIFQoYSxiLGMsZSl7dmFyIGQ9dHlwZW9mIGE7aWYoXCJ1bmRlZmluZWRcIj09PWR8fFwiYm9vbGVhblwiPT09ZClhPW51bGw7dmFyIGc9ITE7aWYobnVsbD09PWEpZz0hMDtlbHNlIHN3aXRjaChkKXtjYXNlIFwic3RyaW5nXCI6Y2FzZSBcIm51bWJlclwiOmc9ITA7YnJlYWs7Y2FzZSBcIm9iamVjdFwiOnN3aXRjaChhLiQkdHlwZW9mKXtjYXNlIHA6Y2FzZSBxOmc9ITB9fWlmKGcpcmV0dXJuIGMoZSxhLFwiXCI9PT1iP1wiLlwiK1UoYSwwKTpiKSwxO2c9MDtiPVwiXCI9PT1iP1wiLlwiOmIrXCI6XCI7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGs9MDtrPGEubGVuZ3RoO2srKyl7ZD1hW2tdO3ZhciBmPWIrVShkLGspO2crPVQoZCxmLGMsZSl9ZWxzZSBpZihudWxsPT09YXx8XCJvYmplY3RcIiE9PXR5cGVvZiBhP2Y9bnVsbDooZj1CJiZhW0JdfHxhW1wiQEBpdGVyYXRvclwiXSxmPVwiZnVuY3Rpb25cIj09PXR5cGVvZiBmP2Y6bnVsbCksXCJmdW5jdGlvblwiPT09dHlwZW9mIGYpZm9yKGE9Zi5jYWxsKGEpLGs9XG4wOyEoZD1hLm5leHQoKSkuZG9uZTspZD1kLnZhbHVlLGY9YitVKGQsaysrKSxnKz1UKGQsZixjLGUpO2Vsc2UgaWYoXCJvYmplY3RcIj09PWQpdGhyb3cgYz1cIlwiK2EsRXJyb3IoQygzMSxcIltvYmplY3QgT2JqZWN0XVwiPT09Yz9cIm9iamVjdCB3aXRoIGtleXMge1wiK09iamVjdC5rZXlzKGEpLmpvaW4oXCIsIFwiKStcIn1cIjpjLFwiXCIpKTtyZXR1cm4gZ31mdW5jdGlvbiBWKGEsYixjKXtyZXR1cm4gbnVsbD09YT8wOlQoYSxcIlwiLGIsYyl9ZnVuY3Rpb24gVShhLGIpe3JldHVyblwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJm51bGwhPWEua2V5P2VzY2FwZShhLmtleSk6Yi50b1N0cmluZygzNil9ZnVuY3Rpb24gVyhhLGIpe2EuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyl9XG5mdW5jdGlvbiBhYShhLGIsYyl7dmFyIGU9YS5yZXN1bHQsZD1hLmtleVByZWZpeDthPWEuZnVuYy5jYWxsKGEuY29udGV4dCxiLGEuY291bnQrKyk7QXJyYXkuaXNBcnJheShhKT9YKGEsZSxjLGZ1bmN0aW9uKGEpe3JldHVybiBhfSk6bnVsbCE9YSYmKE8oYSkmJihhPU4oYSxkKyghYS5rZXl8fGImJmIua2V5PT09YS5rZXk/XCJcIjooXCJcIithLmtleSkucmVwbGFjZShQLFwiJCYvXCIpK1wiL1wiKStjKSksZS5wdXNoKGEpKX1mdW5jdGlvbiBYKGEsYixjLGUsZCl7dmFyIGc9XCJcIjtudWxsIT1jJiYoZz0oXCJcIitjKS5yZXBsYWNlKFAsXCIkJi9cIikrXCIvXCIpO2I9UihiLGcsZSxkKTtWKGEsYWEsYik7UyhiKX12YXIgWT17Y3VycmVudDpudWxsfTtmdW5jdGlvbiBaKCl7dmFyIGE9WS5jdXJyZW50O2lmKG51bGw9PT1hKXRocm93IEVycm9yKEMoMzIxKSk7cmV0dXJuIGF9XG52YXIgYmE9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6WSxSZWFjdEN1cnJlbnRCYXRjaENvbmZpZzp7c3VzcGVuc2U6bnVsbH0sUmVhY3RDdXJyZW50T3duZXI6SixJc1NvbWVSZW5kZXJlckFjdGluZzp7Y3VycmVudDohMX0sYXNzaWduOmx9O2V4cG9ydHMuQ2hpbGRyZW49e21hcDpmdW5jdGlvbihhLGIsYyl7aWYobnVsbD09YSlyZXR1cm4gYTt2YXIgZT1bXTtYKGEsZSxudWxsLGIsYyk7cmV0dXJuIGV9LGZvckVhY2g6ZnVuY3Rpb24oYSxiLGMpe2lmKG51bGw9PWEpcmV0dXJuIGE7Yj1SKG51bGwsbnVsbCxiLGMpO1YoYSxXLGIpO1MoYil9LGNvdW50OmZ1bmN0aW9uKGEpe3JldHVybiBWKGEsZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sbnVsbCl9LHRvQXJyYXk6ZnVuY3Rpb24oYSl7dmFyIGI9W107WChhLGIsbnVsbCxmdW5jdGlvbihhKXtyZXR1cm4gYX0pO3JldHVybiBifSxvbmx5OmZ1bmN0aW9uKGEpe2lmKCFPKGEpKXRocm93IEVycm9yKEMoMTQzKSk7cmV0dXJuIGF9fTtcbmV4cG9ydHMuQ29tcG9uZW50PUY7ZXhwb3J0cy5GcmFnbWVudD1yO2V4cG9ydHMuUHJvZmlsZXI9dTtleHBvcnRzLlB1cmVDb21wb25lbnQ9SDtleHBvcnRzLlN0cmljdE1vZGU9dDtleHBvcnRzLlN1c3BlbnNlPXk7ZXhwb3J0cy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1iYTtcbmV4cG9ydHMuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGEsYixjKXtpZihudWxsPT09YXx8dm9pZCAwPT09YSl0aHJvdyBFcnJvcihDKDI2NyxhKSk7dmFyIGU9bCh7fSxhLnByb3BzKSxkPWEua2V5LGc9YS5yZWYsaz1hLl9vd25lcjtpZihudWxsIT1iKXt2b2lkIDAhPT1iLnJlZiYmKGc9Yi5yZWYsaz1KLmN1cnJlbnQpO3ZvaWQgMCE9PWIua2V5JiYoZD1cIlwiK2Iua2V5KTtpZihhLnR5cGUmJmEudHlwZS5kZWZhdWx0UHJvcHMpdmFyIGY9YS50eXBlLmRlZmF1bHRQcm9wcztmb3IoaCBpbiBiKUsuY2FsbChiLGgpJiYhTC5oYXNPd25Qcm9wZXJ0eShoKSYmKGVbaF09dm9pZCAwPT09YltoXSYmdm9pZCAwIT09Zj9mW2hdOmJbaF0pfXZhciBoPWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09aCllLmNoaWxkcmVuPWM7ZWxzZSBpZigxPGgpe2Y9QXJyYXkoaCk7Zm9yKHZhciBtPTA7bTxoO20rKylmW21dPWFyZ3VtZW50c1ttKzJdO2UuY2hpbGRyZW49Zn1yZXR1cm57JCR0eXBlb2Y6cCx0eXBlOmEudHlwZSxcbmtleTpkLHJlZjpnLHByb3BzOmUsX293bmVyOmt9fTtleHBvcnRzLmNyZWF0ZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXt2b2lkIDA9PT1iJiYoYj1udWxsKTthPXskJHR5cGVvZjp3LF9jYWxjdWxhdGVDaGFuZ2VkQml0czpiLF9jdXJyZW50VmFsdWU6YSxfY3VycmVudFZhbHVlMjphLF90aHJlYWRDb3VudDowLFByb3ZpZGVyOm51bGwsQ29uc3VtZXI6bnVsbH07YS5Qcm92aWRlcj17JCR0eXBlb2Y6dixfY29udGV4dDphfTtyZXR1cm4gYS5Db25zdW1lcj1hfTtleHBvcnRzLmNyZWF0ZUVsZW1lbnQ9TTtleHBvcnRzLmNyZWF0ZUZhY3Rvcnk9ZnVuY3Rpb24oYSl7dmFyIGI9TS5iaW5kKG51bGwsYSk7Yi50eXBlPWE7cmV0dXJuIGJ9O2V4cG9ydHMuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O2V4cG9ydHMuZm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6eCxyZW5kZXI6YX19O2V4cG9ydHMuaXNWYWxpZEVsZW1lbnQ9TztcbmV4cG9ydHMubGF6eT1mdW5jdGlvbihhKXtyZXR1cm57JCR0eXBlb2Y6QSxfY3RvcjphLF9zdGF0dXM6LTEsX3Jlc3VsdDpudWxsfX07ZXhwb3J0cy5tZW1vPWZ1bmN0aW9uKGEsYil7cmV0dXJueyQkdHlwZW9mOnosdHlwZTphLGNvbXBhcmU6dm9pZCAwPT09Yj9udWxsOmJ9fTtleHBvcnRzLnVzZUNhbGxiYWNrPWZ1bmN0aW9uKGEsYil7cmV0dXJuIFooKS51c2VDYWxsYmFjayhhLGIpfTtleHBvcnRzLnVzZUNvbnRleHQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gWigpLnVzZUNvbnRleHQoYSxiKX07ZXhwb3J0cy51c2VEZWJ1Z1ZhbHVlPWZ1bmN0aW9uKCl7fTtleHBvcnRzLnVzZUVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlRWZmZWN0KGEsYil9O2V4cG9ydHMudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIFooKS51c2VJbXBlcmF0aXZlSGFuZGxlKGEsYixjKX07XG5leHBvcnRzLnVzZUxheW91dEVmZmVjdD1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlTGF5b3V0RWZmZWN0KGEsYil9O2V4cG9ydHMudXNlTWVtbz1mdW5jdGlvbihhLGIpe3JldHVybiBaKCkudXNlTWVtbyhhLGIpfTtleHBvcnRzLnVzZVJlZHVjZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBaKCkudXNlUmVkdWNlcihhLGIsYyl9O2V4cG9ydHMudXNlUmVmPWZ1bmN0aW9uKGEpe3JldHVybiBaKCkudXNlUmVmKGEpfTtleHBvcnRzLnVzZVN0YXRlPWZ1bmN0aW9uKGEpe3JldHVybiBaKCkudXNlU3RhdGUoYSl9O2V4cG9ydHMudmVyc2lvbj1cIjE2LjE0LjBcIjtcbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5wcm9kdWN0aW9uLm1pbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuXG5jb25zdCBQcml2YWN5ID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgZG9tYWluLFxuICAgIGlzVHJhZGVtYXJrZWQsXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IHJlbmRlckRvbWFpbiA9ICgpID0+IHtcbiAgICByZXR1cm4gPHNwYW4+e2RvbWFpbi5yZXBsYWNlKCcuY29tJywgJycpfXtpc1RyYWRlbWFya2VkICYmIDxzcGFuPiZ0cmFkZTs8L3NwYW4+fTwvc3Bhbj5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgPGgyPlByaXZhY3kgUG9saWN5PC9oMj5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgIHtkb21haW59PGJyIC8+XG4gICAgICAgICAge3JlbmRlckRvbWFpbigpfSBXZWJzaXRlPGJyIC8+XG4gICAgICAgICAgUHJpdmFjeSBQb2xpY3kgTGFzdCBVcGRhdGVkOiBKYW51YXJ5IDEgLCAyMDIwXG4gICAgICAgIDwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPGgzPlN1bW1hcnk8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFRoYW5rIHlvdSBmb3IgdmlzaXRpbmcgdGhlIGVMb2NhbCZ0cmFkZTsge3JlbmRlckRvbWFpbigpfSB3ZWJzaXRlIGxvY2F0ZWQgYXQgd3d3Lntkb21haW59IChpbmRpdmlkdWFsbHkgcmVmZXJyZWQgdG8gYXMgdGhlIFwiU2l0ZVwiKS5cbiAgICAgICAgVGhlIFNpdGUgaXMgYW4gSW50ZXJuZXQgcHJvcGVydHkgb2YgZUxvY2FsIFVTQSBMTEMgKFwie3JlbmRlckRvbWFpbigpfSxcIiBcIndlXCIgb3IgXCJ1c1wiKS4gVGhlIGZvbGxvd2luZyB7cmVuZGVyRG9tYWluKCl9XG4gICAgICAgIFdlYnNpdGUgUHJpdmFjeSBQb2xpY3kgKFwiUHJpdmFjeSBQb2xpY3lcIilcbiAgICAgICAgc2V0cyBmb3J0aCBvdXIgcG9saWN5IHdpdGggcmVzcGVjdCB0byB0aGUgY29sbGVjdGlvbiwgc3RvcmFnZSBhbmQgdXNlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIHRoYXQgd2UgY29sbGVjdCBmcm9tXG4gICAgICAgIHlvdS4gPHN0cm9uZz5QbGVhc2Ugbm90ZSwgaWYgeW91IGFyZSBhIHJlc2lkZW50IG9mIGEgRXVyb3BlYW4gVW5pb24gTWVtYmVyIFN0YXRlIChcIkVVIFJlc2lkZW50XCIpLCB5b3UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gdXNlIHRoZSBTaXRlIGFuZC9vciB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyAoYXMgZGVmaW5lZCBiZWxvdykuPC9zdHJvbmc+XG4gICAgICA8L3A+XG4gICAgICA8cCBjbGFzc05hbWU9XCJkaXNjbGFpbWVyXCI+XG4gICAgICAgIFVzZXJzIHdpdGggZGlzYWJpbGl0aWVzIHdobyB3aXNoIHRvIGFjY2VzcyB0aGlzIFByaXZhY3kgUG9saWN5IGluIGFuIGFsdGVybmF0aXZlIGZvcm1hdCBjYW4gY29udGFjdCB1cyB2aWEgY29udGFjdCBmb3JtXG4gICAgICAgIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPiBoZXJlPC9hPjsgYnkgY2FsbGluZyB1cyBhdDogKDg3NykgOTEzLTU2MjI7IG9yIGJ5IHNlbmRpbmcgdXMgbWFpbCB0bzogZUxvY2FsLmNvbSB8IDEwMTAgU3ByaW5nIE1pbGwgQXZlIHwgU3VpdGUgMjAwIHwgQ29uc2hvaG9ja2VuLCBQQSB8IDE5NDI4LlxuICAgICAgPC9wPlxuICAgICAgPGgzPkJhY2tncm91bmQ8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFlvdSBhZ3JlZSB0byB0aGlzIFByaXZhY3kgUG9saWN5LCBpbiBpdHMgZW50aXJldHksIHdoZW4geW91OiBhY2Nlc3MgdGhlIFNpdGU7IHV0aWxpemUgdGhlIHtyZW5kZXJEb21haW4oKX0gc2VhcmNoIGRpcmVjdG9yeSAoXCJEaXJlY3RvcnkgU2VydmljZVwiKSBpbiBvcmRlciB0byBvYnRhaW4gTGlzdGluZ3MgcmVnYXJkaW5nIGEgdmFyaWV0eSBvZiBidXNpbmVzc2VzLCBwcm9mZXNzaW9uYWxzLCB2ZW51ZXMsIHByb2R1Y3RzIGFuZC9vciBzZXJ2aWNlcyAoY29sbGVjdGl2ZWx5LCBcIlRoaXJkIFBhcnR5IE9mZmVyaW5nc1wiKSBhcyBvZmZlcmVkIGFuZCBwcm92aWRlZCBieSB0aGUgdGhpcmQgcGFydHkgYnVzaW5lc3MgZW50aXRpZXMgYW5kIHByb2Zlc3Npb25hbHMgZmVhdHVyZWQgb24gdGhlIFNpdGUgKGNvbGxlY3RpdmVseSwgXCJUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVyc1wiKTsgYWNjZXNzIGFydGljbGVzLCBkaXNjdXNzaW9ucyBhbmQgZmVlZGJhY2sgb24gdGhlIHtyZW5kZXJEb21haW4oKX0gSG9tZSBFeHBlcnQgTmV0d29yayAoXCJIb21lIEV4cGVydCBOZXR3b3JrXCIpIGFuZC9vciBhY2Nlc3Mgb3RoZXIgY29udGVudCBvbiB0aGUgU2l0ZSAoY29sbGVjdGl2ZWx5LCBcIkNvbnRlbnRcIik7IHV0aWxpemUgdGhlIFNpdGUncyBtYW55IGludGVyYWN0aXZlIGZlYXR1cmVzIGRlc2lnbmVkIHRvIGZhY2lsaXRhdGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB5b3UsIHtyZW5kZXJEb21haW4oKX0sIHRoZSBPbmdvaW5nIENvbnRyaWJ1dG9ycyBhbmQgRXhwZXJ0IFBhbmVsaXN0cyBwYXJ0aWNpcGF0aW5nIGluIHRoZSBIb21lIEV4cGVydCBOZXR3b3JrIGFuZCBvdGhlciBTaXRlIHVzZXJzIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBibG9ncywgY29tbWVudCBzZWN0aW9ucywgcmV2aWV3cyBhbmQgcXVlc3Rpb24gYW5kIGFuc3dlciBvcHRpb25zIGxvY2F0ZWQgaW4gZGVzaWduYXRlZCBhcmVhcyBvZiB0aGUgU2l0ZSAoY29sbGVjdGl2ZWx5LCBcIkludGVyYWN0aXZlIFNlcnZpY2VzXCIpOyByZWdpc3RlciB0byBzdWJtaXQgYSBmcmVlIExpc3Rpbmcgb2YgeW91ciBUaGlyZCBQYXJ0eSBPZmZlcmluZ3M7IHJlZ2lzdGVyIGZvciBQYWlkIEFkdmVydGlzZXIgU2VydmljZXMgaW4gY29ubmVjdGlvbiB3aXRoIHByb21vdGluZyB5b3VyIFRoaXJkIFBhcnR5IE9mZmVyaW5ncyBhcyBhbiBBZHZlcnRpc2VyOyBhbmQvb3IgYWNjZXNzIGxpbmtzIHRvIG91ciBzb2NpYWwgbWVkaWEgcGFnZXMgb24gdGhpcmQgcGFydHkgc29jaWFsIG1lZGlhIHdlYnNpdGVzLCBzdWNoIGFzIEZhY2Vib29rwq4gYW5kIFR3aXR0ZXLCriAoXCJTb2NpYWwgTWVkaWEgUGFnZXMsXCIgYW5kIHRvZ2V0aGVyIHdpdGggdGhlIFNpdGUsIERpcmVjdG9yeSBTZXJ2aWNlcywgTGlzdGluZ3MsIEhvbWUgRXhwZXJ0IE5ldHdvcmssIENvbnRlbnQsIEludGVyYWN0aXZlIFNlcnZpY2VzLCBQYWlkIEFkdmVydGlzZXIgU2VydmljZXMgYW5kIFNvY2lhbCBNZWRpYSBQYWdlcywgdGhlIFwie3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3NcIikuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgQ2FwaXRhbGl6ZWQgdGVybXMgbm90IGRlZmluZWQgaGVyZWluIHNoYWxsIGhhdmUgdGhlIG1lYW5pbmcgc2V0IGZvcnRoIGluIHRoZSB7cmVuZGVyRG9tYWluKCl9IFdlYnNpdGUgVGVybXMgYW5kIENvbmRpdGlvbnMgKFwiVGVybXMgYW5kIENvbmRpdGlvbnNcIikuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZyBzdHlsZT17e3RleHRUcmFuc2Zvcm06ICd1cHBlcmNhc2UnfX0+SUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSElTIFBSSVZBQ1kgUE9MSUNZIElOIElUUyBFTlRJUkVUWSwgWU9VIE1BWSBOT1QgQUNDRVNTIE9SIE9USEVSV0lTRSBVU0UgVEhFIHtyZW5kZXJEb21haW4oKX0gT0ZGRVJJTkdTLjwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIEFueSB1c2Ugb2YgdGhlIERpcmVjdG9yeSBTZXJ2aWNlIGJ5IFNpdGUgVXNlcnMgaXMgbm90IGludGVuZGVkIHRvLCBhbmQgd2lsbCBub3QgY3JlYXRlLCBhbiBhdHRvcm5leS1jbGllbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gYW55IHN1Y2ggU2l0ZSBVc2Vyc1xuICAgICAgICBhbmQge3JlbmRlckRvbWFpbigpfS4gV2l0aG91dCBsaW1pdGluZyB0aGUgZm9yZWdvaW5nLCBhbnkgaW5mb3JtYXRpb24gc3VibWl0dGVkIHRvIHtyZW5kZXJEb21haW4oKX0gYW5kL29yIGFueVxuICAgICAgICBlbGVjdHJvbmljIG9yIG90aGVyIGNvbW11bmljYXRpb24gc2VudCB0byB7cmVuZGVyRG9tYWluKCl9IHdpbGwgbm90IGNyZWF0ZSwgb3IgYmUgY292ZXJlZCBieSwgYW4gYXR0b3JuZXktY2xpZW50IHJlbGF0aW9uc2hpcFxuICAgICAgICBiZXR3ZWVuIFNpdGUgVXNlcnMgYW5kIHtyZW5kZXJEb21haW4oKX0uXG4gICAgICA8L3A+XG4gICAgICA8aDM+WW91ciBDYWxpZm9ybmlhIFByaXZhY3kgUmlnaHRzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgIDxpPlNoaW5lIHRoZSBMaWdodC48L2k+IElmIHlvdSBhcmUgYSByZXNpZGVudCBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSBhbmQgd291bGQgbGlrZSB0byBrbm93IGhvdyB5b3VyIFwicGVyc29uYWwgaW5mb3JtYXRpb25cIiAoYXMgZGVmaW5lZCBpblxuICAgICAgICAgIHRoZSBTaGluZSB0aGUgTGlnaHQgTGF3LCBDYWwuIENpdi4gQ29kZSAmc2VjdDsgMTc5OC44MykgaXMgc2hhcmVkIHdpdGggdGhpcmQgcGFydGllcywgd2hhdCBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBzaGFyZWQgd2l0aFxuICAgICAgICAgIHRoaXJkIHBhcnRpZXMgaW4gdGhlIHByZWNlZGluZyB5ZWFyLCBhcyB3ZWxsIGFzIHRoZSBuYW1lcyBhbmQgYWRkcmVzc2VzIG9mIHRob3NlIHRoaXJkIHBhcnRpZXMsIHBsZWFzZSBjb250YWN0IHVzIGF0OiB2aWEgY29udGFjdCBmb3JtIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmhlcmU8L2E+IG9yXG4gICAgICAgICAgZUxvY2FsLmNvbSB8IDEwMTAgU3ByaW5nIE1pbGwgQXZlIHwgU3VpdGUgMjAwIHwgQ29uc2hvaG9ja2VuLCBQQSB8IDE5NDI4LCBQaG9uZTogODc3LTkxMy01NjIyLlxuICAgICAgICA8L3N0cm9uZz5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgIEZ1cnRoZXIsIGlmIHlvdSBhcmUgYSByZXNpZGVudCBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSBhbmQgd291bGQgbGlrZSB0byBvcHQtb3V0IGZyb20gdGhlIGRpc2Nsb3N1cmUgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byBhbnlcbiAgICAgICAgICB0aGlyZCBwYXJ0eSBmb3IgbWFya2V0aW5nIHB1cnBvc2VzLCBwbGVhc2UgY29udGFjdCB2aWEgY29udGFjdCBmb3JtIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmhlcmU8L2E+IG9yIGVMb2NhbC5jb20gfCAxMDEwIFNwcmluZyBNaWxsIEF2ZSB8IFN1aXRlIDIwMCB8IENvbnNob2hvY2tlbiwgUEEgfCAxOTQyOCwgUGhvbmU6IDg3Ny05MTMtNTYyMi5cbiAgICAgICAgICBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHdoZXJlIENhbGlmb3JuaWEgU3RhdGUgcmVzaWRlbnRzIG9wdC1vdXQgZnJvbSBwZXJtaXR0aW5nIHRoZWlyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIGJlIHNoYXJlZCwgc3VjaCBpbmRpdmlkdWFscyBtYXkgc3RpbGxcbiAgICAgICAgICByZWNlaXZlIHNlbGVjdGVkIG9mZmVycyBkaXJlY3RseSBmcm9tIHVzLCBpbiBhY2NvcmRhbmNlIHdpdGggYXBwbGljYWJsZSBsYXcuXG4gICAgICAgIDwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgPGk+Q2FsaWZvcm5pYSBDb25zdW1lciBQcml2YWN5IEFjdCBvZiAyMDE4IChcIkNDUEFcIikuPC9pPiBJbiBhZGRpdGlvbiB0byB0aGUgZm9yZWdvaW5nLCBpZiB5b3UgYXJlIGEgcmVzaWRlbnQgb2YgdGhlIFN0YXRlIG9mIENhbGlmb3JuaWEgY2VydGFpbiBvdGhlclxuICAgICAgICAgIHByaXZhY3ktcmVsYXRlZCByaWdodHMgbWF5IGFwcGx5IHRvIHlvdSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIENDUEEsIGluY2x1ZGluZyB0aGUgcmlnaHQgdG8gb3B0LW91dCBvZiBvdXIgc2FsZSBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBhcyB3ZWxsIGFzXG4gICAgICAgICAgdGhlIHJpZ2h0IHRvIGtub3cgd2hhdCBwZXJzb25hbCBpbmZvcm1hdGlvbiBhYm91dCB5b3Ugd2UgaGF2ZSBjb2xsZWN0ZWQsIHdoZXRoZXIgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB3YXMgc2hhcmVkIHdpdGggdGhpcmQtcGFydGllcyBpbiB0aGUgcHJlY2VkaW5nXG4gICAgICAgICAgeWVhciBhbmQsIGlmIHNvLCB3aGF0IGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gd2VyZSBzaGFyZWQsIGFzIHdlbGwgYXMgdGhlIGNhdGVnb3JpZXMgb2YgdGhpcmQgcGFydGllcyB3aXRoIHdob20gd2Ugc2hhcmVkIHRoYXQgcGVyc29uYWwgaW5mb3JtYXRpb24uXG4gICAgICAgICAgUGxlYXNlIHNlZSBvdXIgXCJQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50c1wiIDxhIGhyZWY9XCIjY2FsaWZvcm5pYVwiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+YmVsb3c8L2E+IGZvciBhIG1vcmUgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhlIENDUEEgYXMgYSBDYWxpZm9ybmlhIHJlc2lkZW50LlxuICAgICAgICA8L3N0cm9uZz5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBpZD1cInF1aWNrbGlua3NcIj5Qcml2YWN5IFBvbGljeSBRdWljayBMaW5rczwvaDM+XG4gICAgICA8cD5CZWxvdyBhcmUgbGlua3MgdG8ga2V5IHNlY3Rpb25zIG9mIG91ciBQcml2YWN5IFBvbGljeTo8L3A+XG4gICAgICA8dWwgY2xhc3NOYW1lPVwidW5kZWNvcmF0ZWRcIj5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjcXVpY2tsaW5rc1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+UHJpdmFjeSBQb2xpY3kgUXVpY2sgTGlua3M8L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjbmV2YWRhXCIgZGF0YS1kZWxlZ2F0ZT1cIlByaXZhY3lcIj5Zb3VyIE5ldmFkYSBQcml2YWN5IFJpZ2h0czwvYT48L2xpPlxuICAgICAgICA8bGk+PGEgaHJlZj1cIiNwZXJzb25hbGx5aWRlbnRpZmlhYmxlXCIgZGF0YS1kZWxlZ2F0ZT1cIlByaXZhY3lcIj5QZXJzb25hbGx5IElkZW50aWZpYWJsZSBJbmZvcm1hdGlvbiBXZSBDb2xsZWN0PC9hPjwvbGk+XG4gICAgICAgIDxsaT48YSBocmVmPVwiI3NoYXJpbmdpbmZvXCIgZGF0YS1kZWxlZ2F0ZT1cIlByaXZhY3lcIj5Vc2UgYW5kIFNoYXJpbmcgb2YgUGVyc29uYWxseSBJZGVudGlmaWFibGUgSW5mb3JtYXRpb248L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjbm9ucGVyc29uYWxcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPk5vbi1QZXJzb25hbCBJbmZvcm1hdGlvbiBDb2xsZWN0aW9uIGFuZCBVc2U8L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjYmVoYXZpb3JhbFwiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+QmVoYXZpb3JhbCBUcmFja2luZy9EbyBOb3QgVHJhY2s8L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjc2VjdXJpdHlcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPlNlY3VyaXR5IG9mIFlvdXIgUGVyc29uYWwgSW5mb3JtYXRpb248L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjY2hpbGRyZW5cIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPkNoaWxkcmVuJ3MgUHJpdmFjeTwvYT48L2xpPlxuICAgICAgICA8bGk+PGEgaHJlZj1cIiNvcHRvdXRcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPk9wdC1PdXQvVW5zdWJzY3JpYmU8L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjZGVsZXRpbmdcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPkRlbGV0aW5nLCBNb2RpZnlpbmcgYW5kIFVwZGF0aW5nIFlvdXIgSW5mb3JtYXRpb248L2E+PC9saT5cbiAgICAgICAgPGxpPjxhIGhyZWY9XCIjY2hhbmdlc1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+Q2hhbmdlcyB0byB0aGlzIFByaXZhY3kgUG9saWN5PC9hPjwvbGk+XG4gICAgICAgIDxsaT48YSBocmVmPVwiI2NvbnRhY3R1c1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+Q29udGFjdCBVczwvYT48L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxoMyBpZD1cIm5ldmFkYVwiPllvdXIgTmV2YWRhIFByaXZhY3kgUmlnaHRzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgIElmIHlvdSBhcmUgYSByZXNpZGVudCBvZiB0aGUgU3RhdGUgb2YgTmV2YWRhIGFuZCB3b3VsZCBsaWtlIHRvIG9wdC1vdXQgZnJvbSB0aGUgZGlzY2xvc3VyZSBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIGFueSB0aGlyZCBwYXJ0eSBkYXRhIGJyb2tlcixcbiAgICAgICAgICBwbGVhc2UgY29udGFjdCB1cyB2aWEgY29udGFjdCBmb3JtIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmhlcmU8L2E+IG9yIGVMb2NhbC5jb20gfCAxMDEwIFNwcmluZyBNaWxsIEF2ZSB8IFN1aXRlIDIwMCB8IENvbnNob2hvY2tlbiwgUEEgfCAxOTQyOCwgUGhvbmU6IDg3Ny05MTMtNTYyMi5cbiAgICAgICAgPC9zdHJvbmc+XG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJwZXJzb25hbGx5aWRlbnRpZmlhYmxlXCI+UGVyc29uYWxseSBJZGVudGlmaWFibGUgSW5mb3JtYXRpb24gV2UgQ29sbGVjdDwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgV2UgY29sbGVjdCB5b3VyIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIHdoZW4geW91IHJlZ2lzdGVyIG9uIHRoZSBTaXRlIGluIG9yZGVyIHRvIHV0aWxpemUgdGhlIHZhcmlvdXMge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MuICZuYnNwOzxzdHJvbmc+V2UgbWF5IGFsc28gY29sbGVjdCB5b3VyIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIHdoZW4geW91IG90aGVyd2lzZSBhZ3JlZSB0byB0aGUgdGVybXMgb2YgdGhpcyBQcml2YWN5IFBvbGljeSwgYnV0IGRvIG5vdCBjb21wbGV0ZSB0aGUgYXBwbGljYWJsZSByZWdpc3RyYXRpb24gcHJvY2VzcyBpbiBmdWxsLjwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFRoZSBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiB0aGF0IHlvdSBtdXN0IHByb3ZpZGUgb24gdGhlIGFwcGxpY2FibGUgU2l0ZSBGb3JtcyBhbmQvb3IgaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgcmVxdWVzdCBmb3Ige3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgbWF5IGluY2x1ZGUsIGRlcGVuZGluZyBvbiB0aGUgYXBwbGljYWJsZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyByZXF1ZXN0ZWQsIGFsbCBvciBzb21lIG9mIHRoZSBmb2xsb3dpbmc6IHlvdXIgZmlyc3QgYW5kIGxhc3QgbmFtZTsgeW91ciBlLW1haWwgYWRkcmVzczsgeW91ciBwcmltYXJ5IHRlbGVwaG9uZSBudW1iZXI7IHlvdXIgY3JlZGl0IGNhcmQgaW5mb3JtYXRpb247IHRoZSBjYXRlZ29yeSBhcHBsaWNhYmxlIHRvIHlvdXIgaW5xdWlyeSAod2hlcmUgc2VhcmNoaW5nIGZvciBhIExpc3RpbmcpOyB5b3VyIGNvbXBhbnkgbmFtZTsgeW91ciBjb21wYW55J3MgYWRkcmVzczsgeW91ciBidXNpbmVzcyB0ZWxlcGhvbmUgbnVtYmVyOyBjYXRlZ29yaWVzIHRoYXQgYXBwbHkgdG8geW91ciBjb21wYW55J3MgYnVzaW5lc3MgcHJhY3RpY2UsIGlmIGFwcGxpY2FibGU7IGF0IHlvdXIgb3B0aW9uLCB5b3VyIG1vYmlsZSB0ZWxlcGhvbmUgbnVtYmVyOyBhdCB5b3VyIG9wdGlvbiwgeW91ciBidXNpbmVzcyBwcm9maWxlIGFuZCBsaW5rIHRvIHlvdXIgY29tcGFueSdzIHdlYnNpdGU7IGFueSBvdGhlciBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgb24gdGhlIGFwcGxpY2FibGUgU2l0ZSBGb3JtLlxuICAgICAgICBGb3IgcHVycG9zZXMgb2YgdGhpcyBQcml2YWN5IFBvbGljeSwgaXRlbSAoZCkgaW4gdGhlIHByZWNlZGluZyBzZW50ZW5jZSBzaGFsbCBiZSBjb25zaWRlcmVkIFwiU2Vuc2l0aXZlIEluZm9ybWF0aW9uXCIuXG4gICAgICA8L3A+XG4gICAgICA8aDM+Q29uc2VudCB0byBDYWxsIFJlY29yZGluZzwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgRnJvbSB0aW1lIHRvIHRpbWUsIHdoZW4geW91IGNhbGwgdXMsIHdoZW4gd2UgY2FsbCB5b3UsIG9yIHdoZW4gd2UgZm9yd2FyZCBjYWxscyBiZXR3ZWVuIHVzZXJzIGFuZCB0aGlydHkgcGFydHkgYnVzaW5lc3Nlcywgd2UgbWF5IHJlY29yZCB0aG9zZSBjYWxscyBmb3IgcXVhbGl0eSBhc3N1cmFuY2UgYW5kIGN1c3RvbWVyIHNhdGlzZmFjdGlvbiBwdXJwb3Nlcy4gV2Ugd2lsbCBub3RpZnkgeW91IGF0IHRoZSBiZWdpbm5pbmcgb2YgYW55IGFuZCBhbGwgY2FsbHMgdGhhdCB3ZSByZWNvcmQuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJzaGFyaW5naW5mb1wiPlVzZSBhbmQgU2hhcmluZyBvZiBQZXJzb25hbGx5IElkZW50aWZpYWJsZSBJbmZvcm1hdGlvbjwvaDM+XG4gICAgICA8cD5QbGVhc2Ugc2VlIG91ciBQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50cyA8YSBocmVmPVwiI2NhbGlmb3JuaWFcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmJlbG93PC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIHJlZ2FyZGluZyBob3cgd2UgdXNlIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQuPC9wPlxuICAgICAgPHA+XG4gICAgICAgIE90aGVyIHRoYW4gYXMgZXhwcmVzc2x5IHByb3ZpZGVkIGZvciBoZXJldW5kZXIsIHtyZW5kZXJEb21haW4oKX0gd2lsbCBuZXZlciBzZWxsLCByZW50LCBleGNoYW5nZSBvciBiYXJ0ZXIgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byBvciB3aXRoIGFueSB0aGlyZCBwYXJ0eSBmb3IgZmluYW5jaWFsIGdhaW4gb3IgbWFya2V0aW5nIHB1cnBvc2VzLiBCeSBzdWJtaXR0aW5nIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gb24gdGhlIFNpdGUsIHlvdSBhZ3JlZSB0aGF0IHdlIG1heSBzaGFyZSBzdWNoIHBlcnNvbmFsIGluZm9ybWF0aW9uIChvdGhlciB0aGFuIHlvdXIgU2Vuc2l0aXZlIEluZm9ybWF0aW9uKSB3aXRoIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzIHRoYXQgeW91IHJlcXVlc3QgdG8gYmUgY29udGFjdGVkIGJ5IGluIG9yZGVyIHRvIGNvbXBsZXRlIHlvdXIgcmVxdWVzdCBmb3IgVGhpcmQgUGFydHkgT2ZmZXJpbmdzLCBhbmQgdGhhdCB0aGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgbWF5IHVzZSBzdWNoIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZvciBhbnkgbGF3ZnVsIHB1cnBvc2VzLCBzdWJqZWN0IHRvIGFueSByZXN0cmljdGlvbnMgY29udGFpbmVkIGhlcmVpbi4gQW55IGluZm9ybWF0aW9uIHRoYXQgeW91IHN1cHBseSB0byBhbnkgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlciBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgYXBwbGljYWJsZSBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVyJ3MgcHJpdmFjeSBwb2xpY3kuIDxzdHJvbmc+UGxlYXNlIGJlIGFkdmlzZWQgdGhhdCB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IGl0c2VsZiBwcm92aWRlIFRoaXJkIFBhcnR5IE9mZmVyaW5ncywgb3IgYW55IG90aGVyIHJlbGF0ZWQgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzLiBUaGUgdWx0aW1hdGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IFRoaXJkIFBhcnR5IE9mZmVyaW5ncyBwcm92aWRlZCBieSBhbnkgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRob3NlIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLjwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdoZXJlIHlvdSByZWdpc3RlciB0byBhY2Nlc3MgYW55IG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncywgd2UgdXNlIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IHlvdSBtYWtlIGF2YWlsYWJsZSB0byBwZXJzb25hbGl6ZSB5b3VyIGV4cGVyaWVuY2Ugd2l0aCB0aGUgU2l0ZSwgZmFjaWxpdGF0ZSB0aGUgcHJvdmlzaW9uIG9mIHRoZSBhcHBsaWNhYmxlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIHRvIHlvdSBhbmQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gWW91IGFsc28gYWdyZWUgdGhhdCB3ZSBtYXkgY29udGFjdCB5b3UgYXQgYW55IHRpbWUsIHZpYSBlLW1haWwgb3Igb3RoZXIgbWVhbnM6IHdpdGggdXBkYXRlcyBhbmQvb3IgYW55IG90aGVyIGluZm9ybWF0aW9uIHRoYXQgd2UgbWF5IGRlZW0gYXBwcm9wcmlhdGUgZm9yIHlvdSB0byByZWNlaXZlIGluIGNvbm5lY3Rpb24gd2l0aCB5b3VyIGNvbnRpbnVlZCB1c2Ugb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzOyB3aXRoIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlyZCBwYXJ0eSBwcm9kdWN0cywgc2VydmljZXMsIG9mZmVycyBhbmQvb3IgcHJvbW90aW9ucyB0aGF0IHdlIHRoaW5rIG1pZ2h0IGJlIG9mIGludGVyZXN0IHRvIHlvdS5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBJZiB5b3Ugd2lzaCB0byBzdG9wIHJlY2VpdmluZyBmdXR1cmUgY29tbXVuaWNhdGlvbnMgZnJvbSB1cywgcGxlYXNlIHNlZSB0aGUgT3B0LU91dC9VbnN1YnNjcmliZSBzZWN0aW9uIDxhIGhyZWY9XCIjb3B0b3V0XCIgZGF0YS1kZWxlZ2F0ZT1cIlByaXZhY3lcIj5iZWxvdzwvYT4uXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgQnkgc3VibWl0dGluZyB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MsIHlvdSBhZ3JlZSB0aGF0IHN1Y2ggYWN0IGNvbnN0aXR1dGVzIGFuIGlucXVpcnkgYW5kL29yIGFwcGxpY2F0aW9uIGZvciBwdXJwb3NlcyBvZiB0aGUgQW1lbmRlZCBUZWxlbWFya2V0aW5nIFNhbGVzIFJ1bGUgKDE2IENGUiDCpzMxMCBldCBzZXEuKSwgYXMgYW1lbmRlZCBmcm9tIHRpbWUgdG8gdGltZSAodGhlIFwiUnVsZVwiKSBhbmQgYXBwbGljYWJsZSBzdGF0ZSBkby1ub3QtY2FsbCByZWd1bGF0aW9ucy4gQXMgc3VjaCwgbm90d2l0aHN0YW5kaW5nIHRoYXQgeW91ciB0ZWxlcGhvbmUgbnVtYmVyIG1heSBiZSBsaXN0ZWQgb24gdGhlIEZlZGVyYWwgVHJhZGUgQ29tbWlzc2lvbidzIERvLU5vdC1DYWxsIExpc3QsIGFuZC9vciBvbiBhcHBsaWNhYmxlIHN0YXRlIGRvLW5vdC1jYWxsIGxpc3RzLCB3ZSByZXRhaW4gdGhlIHJpZ2h0IHRvIGNvbnRhY3QgeW91IHZpYSB0ZWxlbWFya2V0aW5nIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgUnVsZSBhbmQgYXBwbGljYWJsZSBzdGF0ZSBkby1ub3QtY2FsbCByZWd1bGF0aW9ucy5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBJbiBhZGRpdGlvbiwgd2hlcmUgeW91IHByb3ZpZGUgXCJleHByZXNzIHdyaXR0ZW4gY29uc2VudFwiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiB0aGUgVGVsZXBob25lIENvbnN1bWVyIFByb3RlY3Rpb24gQWN0ICg0NyBVU0MgwqcgMjI3KSwgYW5kIGl0cyBpbXBsZW1lbnRpbmcgcmVndWxhdGlvbnMgYWRvcHRlZCBieSB0aGUgRmVkZXJhbCBDb21tdW5pY2F0aW9ucyBDb21taXNzaW9uICg0NyBDRlIgwqcgNjQuMTIwMCksIGFzIGFtZW5kZWQgZnJvbSB0aW1lLXRvLXRpbWUgKFwiVENQQVwiKSwgeW91IGNvbnNlbnQgdG8gcmVjZWl2ZSB0ZWxlcGhvbmUgY2FsbHMgZnJvbSB7cmVuZGVyRG9tYWluKCl9IGFuZCBhbnkgZGVzaWduYXRlZCBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVyKHMpLCBpbmNsdWRpbmcgYXJ0aWZpY2lhbCB2b2ljZSBhbmQgcHJlLXJlY29yZGVkIG1lc3NhZ2VzIGFuZC9vciBjYWxscyAoaW5jbHVkaW5nIFNNUyB0ZXh0IG1lc3NhZ2VzKSBkZWxpdmVyZWQgdmlhIGF1dG9tYXRlZCB0ZWNobm9sb2d5LCB0byB0aGUgdGVsZXBob25lIG51bWJlcihzKSB0aGF0IHlvdSBwcm92aWRlZC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIHRoaXMgY29uc2VudCBpbiBvcmRlciB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncywgYW5kIHlvdXIgY29uc2VudCBzaW1wbHkgYWxsb3dzIHtyZW5kZXJEb21haW4oKX0sIGFzIHdlbGwgYXMgdGhlIGRlc2lnbmF0ZWQgVGhpcmQtUGFydHkgU2VydmljZSBQcm92aWRlcihzKSwgdG8gY29udGFjdCB5b3UgdmlhIHRoZXNlIG1lYW5zLiA8c3Ryb25nPlBsZWFzZSBiZSBhZHZpc2VkIHRoYXQgYnkgYWdyZWVpbmcgdG8gdGhpcyBQcml2YWN5IFBvbGljeSwgeW91IGFyZSBvYmxpZ2F0ZWQgdG8gaW1tZWRpYXRlbHkgaW5mb3JtIHVzIGlmIGFuZCB3aGVuIHRoZSB0ZWxlcGhvbmUgbnVtYmVyIHRoYXQgeW91IGhhdmUgcHJldmlvdXNseSBwcm92aWRlZCB0byB1cyBjaGFuZ2VzLiBXaXRob3V0IGxpbWl0aW5nIHRoZSBmb3JlZ29pbmcsIGlmIHlvdTogaGF2ZSB5b3VyIHRlbGVwaG9uZSBudW1iZXIgcmVhc3NpZ25lZCB0byBhbm90aGVyIHBlcnNvbiBvciBlbnRpdHk7IGdpdmUgdXAgeW91ciB0ZWxlcGhvbmUgbnVtYmVyIHNvIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgeW91OyBwb3J0IHlvdXIgdGVsZXBob25lIG51bWJlciB0byBhIGxhbmRsaW5lIG9yIHZpY2UgdmVyc2E7IG9yIG90aGVyd2lzZSBzdG9wIHVzaW5nIHRoYXQgdGVsZXBob25lIG51bWJlciBmb3IgYW55IHJlYXNvbiAoY29sbGVjdGl2ZWx5IFwiUGhvbmUgTnVtYmVyIENoYW5nZVwiKSx5b3UgYWdyZWUgdGhhdCB5b3Ugc2hhbGwgcHJvbXB0bHkgbm90aWZ5IHtyZW5kZXJEb21haW4oKX0gb2YgdGhlIFBob25lIE51bWJlciBDaGFuZ2UgdmlhIGUtbWFpbCBhdDogY29ycmVzcG9uZGVuY2VAZUxvY2FsLmNvbS48L3N0cm9uZz4gV2UgbWF5IGFsc28gZW1wbG95IG90aGVyIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgdG8gcGVyZm9ybSBjZXJ0YWluIGZ1bmN0aW9ucyBvbiBvdXIgYmVoYWxmLiBFeGFtcGxlcyBpbmNsdWRlIHNlbmRpbmcgZGlyZWN0IGFuZCBlbGVjdHJvbmljIG1haWwsIHJlbW92aW5nIGR1cGxpY2F0ZSBpbmZvcm1hdGlvbiBmcm9tIHVzZXIgbGlzdHMsIGFuYWx5emluZyBkYXRhIGFuZCBwcm92aWRpbmcgbWFya2V0aW5nIGFuYWx5c2lzLiBUaGUgYWdlbnRzIHBlcmZvcm1pbmcgdGhlc2UgbGltaXRlZCBmdW5jdGlvbnMgb24gb3VyIGJlaGFsZiBzaGFsbCBoYXZlIGFjY2VzcyB0byBvdXIgdXNlcnMnIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFzIG5lZWRlZCB0byBwZXJmb3JtIHRoZWlyIGZ1bmN0aW9ucyBmb3IgdXMsIGJ1dCB3ZSBkbyBub3QgcGVybWl0IHRoZW0gdG8gdXNlIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIG90aGVyIHB1cnBvc2VzLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIHdpbGwgYWxzbyB1c2UgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgY3VzdG9tZXIgc2VydmljZSwgdG8gcHJvdmlkZSB5b3Ugd2l0aCBpbmZvcm1hdGlvbiB0aGF0IHlvdSBtYXkgcmVxdWVzdCwgdG8gY3VzdG9taXplIHlvdXIgZXhwZXJpZW5jZSBvbiB0aGUgU2l0ZSBhbmQvb3IgdG8gY29udGFjdCB5b3Ugd2hlbiBuZWNlc3NhcnkgaW4gY29ubmVjdGlvbiB3aXRoIHRyYW5zYWN0aW9ucyBlbnRlcmVkIGludG8gYnkgeW91IG9uIHRoZSBTaXRlLiBXZSBtYXkgYWxzbyB1c2UgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgaW50ZXJuYWwgYnVzaW5lc3MgcHVycG9zZXMsIHN1Y2ggYXMgYW5hbHl6aW5nIGFuZCBtYW5hZ2luZyBvdXIgYnVzaW5lc3MuIFdlIG1heSBhbHNvIGNvbWJpbmUgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUgZ2F0aGVyZWQgYWJvdXQgeW91IHdpdGggaW5mb3JtYXRpb24gZnJvbSBvdGhlciBzb3VyY2VzLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGFsc28gcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gcmVsZWFzZSBjdXJyZW50IG9yIHBhc3QgdXNlciBpbmZvcm1hdGlvbjogaW4gdGhlIGV2ZW50IHRoYXQgd2UgYmVsaWV2ZSB0aGF0IHRoZSB1c2VyIGlzIHVzaW5nLCBvciBoYXMgdXNlZCwgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIHRvIGNvbW1pdCB1bmxhd2Z1bCBhY3RzIGFuZC9vciBpbiB2aW9sYXRpb24gb2YgdGhlIFRlcm1zIGFuZCBDb25kaXRpb25zLCB0aGlzIFByaXZhY3kgUG9saWN5IG9yIGFueSBvdGhlciBvZiBvdXIgb3BlcmF0aW5nIHJ1bGVzLCBwb2xpY2llcywgcHJpY2Ugc2NoZWR1bGVzIGFuZCBvdGhlciBzdXBwbGVtZW50YWwgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3IgZG9jdW1lbnRzIHRoYXQgbWF5IGJlIHB1Ymxpc2hlZCBieSB1cyBmcm9tIHRpbWUgdG8gdGltZTsgaWYgdGhlIGluZm9ybWF0aW9uIGlzIHN1YnBvZW5hZWQ7IHByb3ZpZGVkLCBob3dldmVyLCB0aGF0LCB3aGVyZSBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcsIHdlIHNoYWxsIHByb3ZpZGUgeW91IHdpdGggZS1tYWlsIG5vdGljZSwgYW5kIG9wcG9ydHVuaXR5IHRvIGNoYWxsZW5nZSB0aGUgc3VicG9lbmEsIHByaW9yIHRvIGRpc2Nsb3N1cmUgb2YgYW55IHBlcnNvbmFsIGluZm9ybWF0aW9uIHB1cnN1YW50IHRvIGEgc3VicG9lbmE7IG9yIGlmIHdlIGFyZSBzb2xkLCBtZXJnZSB3aXRoIGEgdGhpcmQgcGFydHkgb3IgYXJlIGFjcXVpcmVkOyBwcm92aWRlZCwgaG93ZXZlciwgdGhhdCBpZiB7cmVuZGVyRG9tYWluKCl9IGlzIGludm9sdmVkIGluIGEgbWVyZ2VyLCBhY3F1aXNpdGlvbiBvciBzYWxlIG9mIGFsbCBvciBhIHBvcnRpb24gb2YgaXRzIGFzc2V0cywgeW91IHdpbGwgYmUgbm90aWZpZWQgdmlhIGVtYWlsIGFuZC9vciBhIHByb21pbmVudCBub3RpY2Ugb24gdGhlIFNpdGUgb2YgYW55IGNoYW5nZSBpbiBvd25lcnNoaXAgb3IgdXNlcyBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBhcyB3ZWxsIGFzIGFueSBjaG9pY2VzIHRoYXQgeW91IG1heSBoYXZlIHJlZ2FyZGluZyB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uLiBNb3Jlb3ZlciwgeW91IGhlcmVieSBjb25zZW50IHRvIGRpc2Nsb3N1cmUgb2YgYW55IHJlY29yZCBvciBjb21tdW5pY2F0aW9uIHRvIGFueSB0aGlyZC1wYXJ0eSB3aGVuIHtyZW5kZXJEb21haW4oKX0sIGluIGl0cyBzb2xlIGRpc2NyZXRpb24sIGRldGVybWluZXMgdGhlIGRpc2Nsb3N1cmUgdG8gYmUgYXBwcm9wcmlhdGUgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHNoYXJpbmcgeW91ciBlLW1haWwgYWRkcmVzcyB3aXRoIG90aGVyIHRoaXJkLXBhcnRpZXMgZm9yIHN1cHByZXNzaW9uIHB1cnBvc2VzIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ0FOLVNQQU0gQWN0IG9mIDIwMDMsIGFzIGFtZW5kZWQgZnJvbSB0aW1lIHRvIHRpbWUuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJub25wZXJzb25hbFwiPk5vbi1QZXJzb25hbCBJbmZvcm1hdGlvbiBDb2xsZWN0aW9uIGFuZCBVc2U8L2gzPlxuICAgICAgPHAgY2xhc3NOYW1lPVwiZGlzY2xhaW1lclwiPlxuICAgICAgICBQbGVhc2Ugc2VlIG91ciBQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50cyA8YSBocmVmPVwiI2NhbGlmb3JuaWFcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmJlbG93PC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIHJlZ2FyZGluZyBob3cgd2UgY29sbGVjdCBhbmQgc2hhcmUgeW91ciBub24tcGVyc29uYWwgaW5mb3JtYXRpb24uXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZz5JUCBBZGRyZXNzZXMvQnJvd3NlciBUeXBlPC9zdHJvbmc+IFdlIG1heSBjb2xsZWN0IGNlcnRhaW4gbm9uLXBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIGFib3V0IHlvdSB3aGVuIHlvdSB2aXNpdCBtYW55IG9mIHRoZSBwYWdlcyBvZiB0aGUgU2l0ZS4gVGhpcyBub24tcGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24gaW5jbHVkZXMsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhlIHR5cGUgb2YgYnJvd3NlciB0aGF0IHlvdSB1c2UgKGUuZy4sIEludGVybmV0IEV4cGxvcmVyLCBDaHJvbWUsIFNhZmFyaSksIHlvdXIgSVAgYWRkcmVzcywgdGhlIHR5cGUgb2Ygb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSB1c2UgKGUuZy4sIFdpbmRvd3Mgb3IgTWFjIE9TKSBhbmQgdGhlIGRvbWFpbiBuYW1lIG9mIHlvdXIgSW50ZXJuZXQgc2VydmljZSBwcm92aWRlciAoZS5nLiwgVmVyaXpvbiwgQVQmVCkuIFdlIHVzZSB0aGUgbm9uLXBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIHRoYXQgd2UgY29sbGVjdCB0byBpbXByb3ZlIHRoZSBkZXNpZ24gYW5kIGNvbnRlbnQgb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFuZCB0byBlbmFibGUgdXMgdG8gcGVyc29uYWxpemUgeW91ciBJbnRlcm5ldCBleHBlcmllbmNlLiBXZSBhbHNvIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgYWdncmVnYXRlIHRvIGFuYWx5emUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgdXNhZ2UsIGFzIHdlbGwgYXMgdG8gb2ZmZXIgeW91IHByb2R1Y3RzIGFuZCBzZXJ2aWNlcy5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICA8c3Ryb25nPkNvb2tpZXM8L3N0cm9uZz4gV2hlbiBhbiBlbmQtdXNlciB2aXNpdHMgdGhlIFNpdGUsIHdlIHNlbmQgb25lICgxKSBvciBtb3JlIGNvb2tpZXMgYW5kL29yIGdpZiBmaWxlcyAoY29sbGVjdGl2ZWx5LCBcIkNvb2tpZXNcIikgdG8gYXNzaWduIGFuIGFub255bW91cywgdW5pcXVlIGlkZW50aWZpZXIgdG8gdGhlIGFwcGxpY2FibGUgZW5kLXVzZXIncyBjb21wdXRlciBvciBvdGhlciBkZXZpY2UuIEEgQ29va2llIGlzIGEgcGllY2Ugb2YgZGF0YSBzdG9yZWQgb24geW91ciBoYXJkIGRyaXZlIGNvbnRhaW5pbmcgbm9uLXBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIGFib3V0IHlvdS4gQ29va2llcyBoYXZlIG1hbnkgYmVuZWZpdHMgdG8gZW5oYW5jZSB5b3VyIGV4cGVyaWVuY2UgYXQgdGhlIFNpdGUuIFRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgQ29va2llcywgcGxlYXNlIHZpc2l0IHd3dy5jb29raWVjZW50cmFsLmNvbS4gV2UgdXNlIENvb2tpZXMgdG8gaW1wcm92ZSB0aGUgcXVhbGl0eSBvZiB0aGUgU2l0ZSwgaW5jbHVkaW5nIGZvciBzdG9yaW5nIHVzZXIgcHJlZmVyZW5jZXMsIGFuZCB0cmFja2luZyBTaXRlLXVzZXIgdHJlbmRzIChzdWNoIGFzIHBhZ2VzIG9wZW5lZCBhbmQgbGVuZ3RoIG9mIHN0YXkgYXQgdGhlIFNpdGUpLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIE1vc3QgSW50ZXJuZXQgYnJvd3NlcnMgYXJlIGluaXRpYWxseSBzZXQgdXAgdG8gYWNjZXB0IENvb2tpZXMsIGJ1dCB5b3UgY2FuIHJlc2V0IHlvdXIgYnJvd3NlciB0byByZWZ1c2UgYWxsIENvb2tpZXMgb3IgdG8gaW5kaWNhdGUgd2hlbiBhIGNvb2tpZSBpcyBiZWluZyBzZW50LiBUbyBkaXNhYmxlIGFuZCByZWplY3QgY2VydGFpbiBDb29raWVzLCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggeW91ciBJbnRlcm5ldCBicm93c2VyLiBFdmVuIGluIHRoZSBjYXNlIHdoZXJlIGEgdXNlciByZWplY3RzIGEgQ29va2llLCBoZSBvciBzaGUgbWF5IHN0aWxsIHVzZSB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MuIFdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIHJldGFpbiBDb29raWUgZGF0YSBpbmRlZmluaXRlbHkuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJiZWhhdmlvcmFsXCI+QmVoYXZpb3JhbCBUcmFja2luZy9EbyBOb3QgVHJhY2s8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIEFzIGEgZ2VuZXJhbCBydWxlLCBvdGhlciB0aGFuIGFzIHNldCBmb3J0aCBiZWxvdywgbmVpdGhlciB7cmVuZGVyRG9tYWluKCl9LCBub3IgYW55IHRoaXJkIHBhcnRpZXMsIHRyYWNrIHRoZSBhY3Rpdml0eSBvZiBTaXRlIFVzZXJzIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgU2l0ZS4gSG93ZXZlciwgd2hlbiBhbiBBZHZlcnRpc2VyIGlzIGxvZ2dlZCBpbnRvIGl0cyBhY2NvdW50LCB3ZSB0cmFjayBjaGFuZ2VzIGluIHN1Y2ggQWR2ZXJ0aXNlcidzIHN0YXR1cyBhbmQgdXBkYXRlcyB0byBpdHMgcHJvZmlsZS4gV2UgbWF5IHVzZSB0aGlzIGFjdGl2aXR5IGRhdGEgdG8gdGFyZ2V0IHRob3NlIEFkdmVydGlzZXJzIHdpdGggbW9yZSBzcGVjaWZpYyBtYXJrZXRpbmcgbWVzc2FnZXMuIEluIGFkZGl0aW9uLCB3aGVuIGFuIEFkdmVydGlzZXIgb3BlbnMgb3IgY2xpY2tzIG9uIGxpbmtzIGluIGVtYWlsIG1hcmtldGluZyBtZXNzYWdlcyBmcm9tIHVzLCB3ZSByZWNvcmQgdGhhdCBpbmZvcm1hdGlvbiBhbmQgbWF5IHVzZSBpdCB0byByZWZpbmUgc3Vic2VxdWVudCBtYXJrZXRpbmcgbWVzc2FnZXMuIFRoaXMgdHJhY2tpbmcgd2lsbCB1c3VhbGx5IG9jY3VyIGV2ZW4gd2hlcmUgdGhlIGFwcGxpY2FibGUgQWR2ZXJ0aXNlciBoYXMgc2VsZWN0ZWQgdGhlIFwiZG8tbm90LXRyYWNrXCIgb3B0aW9uIG9uIGl0cyBJbnRlcm5ldCBicm93c2VyLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIHVzZSBHb29nbGUgQW5hbHl0aWNzIG9uIHRoZSBTaXRlLCBhcyB3ZWxsIGFzIGEgY29udmVyc2lvbiByYXRlIG9wdGltaXphdGlvbiBwbGF0Zm9ybSBjYWxsZWQgVmlzdWFsIFdlYnNpdGUgT3B0aW1pemVyLiBUaGVzZSBwbGF0Zm9ybXMgZG8gbm90IHJlY29yZCBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZiBTaXRlIFVzZXJzLCBidXQgYWdncmVnYXRlIGluZm9ybWF0aW9uIGFuZCBhY3Rpdml0eSBvbmx5LlxuICAgICAgPC9wPlxuICAgICAgPGgzPkNyb3NzIERldmljZSBUcmFja2luZzwvaDM+XG4gICAgICA8cD57cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IHRyYWNrIFNpdGUgVXNlcnMmYXBvczsgdXNlIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBhY3Jvc3MgbXVsdGlwbGUgZGV2aWNlcywgaW5jbHVkaW5nIHBlcnNvbmFsIGNvbXB1dGVycyBhbmQgbW9iaWxlIGRldmljZXMuPC9wPlxuICAgICAgPGgzPk90aGVyIFdlYnNpdGVzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBUaGUgU2l0ZSBtYXkgY29udGFpbiBsaW5rcyB0byB0aGlyZC1wYXJ0eSBvd25lZCBhbmQvb3Igb3BlcmF0ZWQgd2Vic2l0ZXMgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHdlYnNpdGVzIG93bmVkIGFuZC9vciBvcGVyYXRlZCBieSBvdXIgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMuIHtyZW5kZXJEb21haW4oKX0gaXMgbm90IHJlc3BvbnNpYmxlIGZvciB0aGUgcHJpdmFjeSBwcmFjdGljZXMgb3IgdGhlIGNvbnRlbnQgb2Ygc3VjaCB3ZWJzaXRlcy4gSW4gc29tZSBjYXNlcywgeW91IG1heSBiZSBhYmxlIHRvIG1ha2UgYSBwdXJjaGFzZSB0aHJvdWdoIG9uZSBvZiB0aGVpciB0aGlyZC1wYXJ0eSB3ZWJzaXRlcy4gSW4gdGhlc2UgaW5zdGFuY2VzLCB5b3UgbWF5IGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgY2VydGFpbiBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhIGNyZWRpdCBjYXJkIG51bWJlciwgdG8gcmVnaXN0ZXIgb3IgY29tcGxldGUgYSB0cmFuc2FjdGlvbiBhdCBzdWNoIHdlYnNpdGUuIFRoZXNlIHRoaXJkLXBhcnR5IHdlYnNpdGVzIGhhdmUgc2VwYXJhdGUgcHJpdmFjeSBhbmQgZGF0YSBjb2xsZWN0aW9uIHByYWN0aWNlcyBhbmQge3JlbmRlckRvbWFpbigpfSBoYXMgbm8gcmVzcG9uc2liaWxpdHkgb3IgbGlhYmlsaXR5IHJlbGF0aW5nIHRvIHRoZW0uXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJzZWN1cml0eVwiPlNlY3VyaXR5IG9mIFlvdXIgUGVyc29uYWwgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGVuZGVhdm9yIHRvIHNhZmVndWFyZCBhbmQgcHJvdGVjdCBvdXIgdXNlcnMmYXBvczsgcGVyc29uYWwgaW5mb3JtYXRpb24uIFdoZW4gdXNlcnMgbWFrZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gdXMsIHRoZWlyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGlzIHByb3RlY3RlZCBib3RoIG9ubGluZSBhbmQgb2ZmbGluZSAodG8gdGhlIGV4dGVudCB0aGF0IHdlIG1haW50YWluIGFueSBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZmZsaW5lKS4gVGhlIHByaXZhY3kgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBpcyB2ZXJ5IGltcG9ydGFudCB0byB1cy4gV2hlbiBvdXIgcmVnaXN0cmF0aW9uIHByb2Nlc3MgYXNrcyB1c2VycyB0byBzdWJtaXQgU2Vuc2l0aXZlIEluZm9ybWF0aW9uIChzdWNoIGFzIGNyZWRpdCBjYXJkIGluZm9ybWF0aW9uKSwgYW5kIHdoZW4gd2UgdHJhbnNtaXQgc3VjaCBTZW5zaXRpdmUgSW5mb3JtYXRpb24sIHRoYXQgU2Vuc2l0aXZlICBJbmZvcm1hdGlvbiBpcyBlbmNyeXB0ZWQgYW5kIGlzIHByb3RlY3RlZCB3aXRoIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAo4oCcVExT4oCdKSBlbmNyeXB0aW9uIHNvZnR3YXJlLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIEFjY2VzcyB0byB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGlzIHN0cmljdGx5IGxpbWl0ZWQsIGFuZCB3ZSB0YWtlIHJlYXNvbmFibGUgbWVhc3VyZXMgdG8gZW5zdXJlIHRoYXQgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBpcyBub3QgYWNjZXNzaWJsZSB0byB0aGUgcHVibGljLiBUaGUgc2VydmVycyB0aGF0IHdlIHN0b3JlIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9uIGFyZSBrZXB0IGluIGEgc2VjdXJlIHBoeXNpY2FsIGVudmlyb25tZW50LiBXZSBhbHNvIGhhdmUgc2VjdXJpdHkgbWVhc3VyZXMgaW4gcGxhY2UgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBsb3NzLCBtaXN1c2UgYW5kIGFsdGVyYXRpb24gb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gdW5kZXIgb3VyIGNvbnRyb2wuIFBsZWFzZSBiZSBhZHZpc2VkLCBob3dldmVyLCB0aGF0IHdoaWxlIHdlIHRha2UgZXZlcnkgcmVhc29uYWJsZSBwcmVjYXV0aW9uIGF2YWlsYWJsZSB0byBwcm90ZWN0IHlvdXIgZGF0YSwgbm8gc3RvcmFnZSBmYWNpbGl0eSwgdGVjaG5vbG9neSwgc29mdHdhcmUsIHNlY3VyaXR5IHByb3RvY29scyBvciBkYXRhIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBJbnRlcm5ldCBjYW4gYmUgZ3VhcmFudGVlZCB0byBiZSAxMDAlIHNlY3VyZS5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBDb21wdXRlciBoYWNrZXJzIHRoYXQgY2lyY3VtdmVudCBvdXIgc2VjdXJpdHkgbWVhc3VyZXMgbWF5IGdhaW4gYWNjZXNzIHRvIGNlcnRhaW4gcG9ydGlvbnMgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiwgYW5kIHRlY2hub2xvZ2ljYWwgYnVncywgZXJyb3JzIGFuZCBnbGl0Y2hlcyBtYXkgY2F1c2UgaW5hZHZlcnRlbnQgZGlzY2xvc3VyZXMgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbjsgcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgYW55IGF0dGVtcHQgdG8gYnJlYWNoIHRoZSBzZWN1cml0eSBvZiB0aGUgbmV0d29yaywgb3VyIHNlcnZlcnMsIGRhdGFiYXNlcyBvciBvdGhlciBoYXJkd2FyZSBvciBzb2Z0d2FyZSBtYXkgY29uc3RpdHV0ZSBhIGNyaW1lIHB1bmlzaGFibGUgYnkgbGF3LiBGb3IgdGhlIHJlYXNvbnMgbWVudGlvbmVkIGFib3ZlLCB3ZSBjYW5ub3Qgd2FycmFudCB0aGF0IHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gd2lsbCBiZSBhYnNvbHV0ZWx5IHNlY3VyZS4gQW55IHRyYW5zbWlzc2lvbiBvZiBkYXRhIGF0IG9yIHRocm91Z2ggdGhlIFNpdGUgaXMgYXQgeW91ciBvd24gcmlzay5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBBbGwgb2Ygb3VyIHVzZXJzJmFwb3M7IHBlcnNvbmFsIGluZm9ybWF0aW9uIGlzIHJlc3RyaWN0ZWQgaW4gb3VyIG9mZmljZXMuIE9ubHkgZW1wbG95ZWVzIG9yIHRoaXJkIHBhcnR5IGFnZW50cyB3aG8gbmVlZCBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byBwZXJmb3JtIGEgc3BlY2lmaWMgam9iIGFyZSBncmFudGVkIGFjY2VzcyB0byBwZXJzb25hbCBpbmZvcm1hdGlvbi4gT3VyIGVtcGxveWVlcyBhcmUgZGVkaWNhdGVkIHRvIGVuc3VyaW5nIHRoZSBzZWN1cml0eSBhbmQgcHJpdmFjeSBvZiBhbGwgdXNlciBwZXJzb25hbCBpbmZvcm1hdGlvbi4gRW1wbG95ZWVzIG5vdCBhZGhlcmluZyB0byBvdXIgZmlybSBwb2xpY2llcyBhcmUgc3ViamVjdCB0byBkaXNjaXBsaW5hcnkgYWN0aW9uLiBJbiBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBmZWRlcmFsIGFuZCBzdGF0ZSBsYXdzLCB3ZSBzaGFsbCBub3RpZnkgeW91IGFuZCBhbnkgYXBwbGljYWJsZSByZWd1bGF0b3J5IGFnZW5jaWVzIGluIHRoZSBldmVudCB0aGF0IHdlIGxlYXJuIG9mIGFuIGluZm9ybWF0aW9uIHNlY3VyaXR5IGJyZWFjaCB3aXRoIHJlc3BlY3QgdG8geW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbi4gWW91IHdpbGwgYmUgbm90aWZpZWQgdmlhIGUtbWFpbCBpbiB0aGUgZXZlbnQgb2Ygc3VjaCBhIGJyZWFjaC4gUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCBub3RpY2UgbWF5IGJlIGRlbGF5ZWQgaW4gb3JkZXIgdG8gYWRkcmVzcyB0aGUgbmVlZHMgb2YgbGF3IGVuZm9yY2VtZW50LCBkZXRlcm1pbmUgdGhlIHNjb3BlIG9mIG5ldHdvcmsgZGFtYWdlLCBhbmQgdG8gZW5nYWdlIGluIHJlbWVkaWFsIG1lYXN1cmVzLlxuICAgICAgPC9wPlxuICAgICAgPGgzIGlkPVwiY2hpbGRyZW5cIj5DaGlsZHJlbiZhcG9zO3MgUHJpdmFjeTwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgVmlzaXRvcnMgdW5kZXIgZWlnaHRlZW4gKDE4KSB5ZWFycyBvZiBhZ2UgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gdXNlIGFuZC9vciBzdWJtaXQgdGhlaXIgcGVyc29uYWwgaW5mb3JtYXRpb24gYXQgdGhlIFNpdGUuIHtyZW5kZXJEb21haW4oKX0gZG9lcyBub3Qga25vd2luZ2x5IHNvbGljaXQgb3IgY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIHZpc2l0b3JzIHVuZGVyIGVpZ2h0ZWVuICgxOCkgeWVhcnMgb2YgYWdlLiB7cmVuZGVyRG9tYWluKCl9IGVuY291cmFnZXMgcGFyZW50cyBhbmQgZ3VhcmRpYW5zIHRvIHNwZW5kIHRpbWUgb25saW5lIHdpdGggdGhlaXIgY2hpbGRyZW4gYW5kIHRvIHBhcnRpY2lwYXRlIGFuZCBtb25pdG9yIHRoZSBpbnRlcmFjdGl2ZSBhY3Rpdml0aWVzIG9mIHRoZWlyIGNoaWxkcmVuLlxuICAgICAgPC9wPlxuICAgICAgPGgzIGlkPVwib3B0b3V0XCI+T3B0LU91dC9VbnN1YnNjcmliZTwvaDM+XG4gICAgICA8cD5QbGVhc2Ugc2VlIG91ciBQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50cyA8YSBocmVmPVwiI2NhbGlmb3JuaWFcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmJlbG93PC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIHJlZ2FyZGluZyBob3cgQ2FsaWZvcm5pYSBTdGF0ZSByZXNpZGVudHMgY2FuIG9wdC1vdXQgZnJvbSB0aGUgc2FsZSBvZiB0aGVpciBwZXJzb25hbCBpbmZvcm1hdGlvbi48L3A+XG4gICAgICA8cD5cbiAgICAgICAgVG8gb3B0LW91dCBvZiByZWNlaXZpbmcgZS1tYWlsIGFkdmVydGlzaW5nLCBTTVMgdGV4dC1iYXNlZCBtYXJrZXRpbmcgKHdoZXJlIGFuZCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdyksIHRlbGVtYXJrZXRpbmcgYW5kIGRpcmVjdCBtYWlsIG1hcmtldGluZyBmcm9tIHVzLCB5b3UgY2FuIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIGFwcGxpY2FibGUgbWFya2V0aW5nIG1lc3NhZ2Ugb3IgZW1haWwgdXMgYnkgc3VibWl0dGluZyBhIGNvbnRhY3QgZm9ybSBoZXJlIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmhlcmU8L2E+LlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgZm9yZWdvaW5nLCB3ZSBtYXkgY29udGludWUgdG8gY29udGFjdCB5b3UgZm9yIHRoZSBwdXJwb3NlIG9mIGNvbW11bmljYXRpbmcgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8geW91ciB1c2Ugb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFuZCB0byByZXNwb25kIHRvIGFueSBpbnF1aXJ5IG9yIHJlcXVlc3QgbWFkZSBieSB5b3UuIFRvIG9wdC1vdXQgb2YgcmVjZWl2aW5nIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLXJlbGF0ZWQgYW5kIGlucXVpcnkgcmVzcG9uc2UtcmVsYXRlZCBtZXNzYWdlcyBmcm9tIHtyZW5kZXJEb21haW4oKX0sIHlvdSBtdXN0IGNlYXNlIHV0aWxpemluZyB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgYW5kIHN1Ym1pdHRpbmcgaW5xdWlyaWVzIHRvIHtyZW5kZXJEb21haW4oKX0sIGFzIGFwcGxpY2FibGUuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJkZWxldGluZ1wiPkRlbGV0aW5nIGFuZCBVcGRhdGluZyBZb3VyIEluZm9ybWF0aW9uPC9oMz5cbiAgICAgIDxwPlBsZWFzZSBzZWUgb3VyIFByb3Zpc2lvbnMgZm9yIENhbGlmb3JuaWEgUmVzaWRlbnRzIDxhIGhyZWY9XCIjY2FsaWZvcm5pYVwiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+YmVsb3c8L2E+IGZvciBhZGRpdGlvbmFsIGRldGFpbHMgcmVnYXJkaW5nIGhvdyBDYWxpZm9ybmlhIFN0YXRlIHJlc2lkZW50cyBjYW4gZGVsZXRlIGFuZC9vciBhY2Nlc3MgdGhlaXIgcGVyc29uYWwgaW5mb3JtYXRpb24uPC9wPlxuICAgICAgPHA+XG4gICAgICAgIEF0IHlvdXIgcmVxdWVzdCwgd2Ugd2lsbCBpbmZvcm0geW91IG9mIHdoYXQgcGVyc29uYWwgaW5mb3JtYXRpb24gd2UgaGF2ZSBvbiBmaWxlIGZvciB5b3UuIEluIGFkZGl0aW9uLCBhdCB5b3VyIHJlcXVlc3QsIHdlIHdpbGwgcmVtb3ZlIGFuZC9vciBtb2RpZnkgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQgeW91IGhhdmUgcHJvdmlkZWQgdG8gdXMsIG9yIHRoYXQgd2UgaGF2ZSBjb2xsZWN0ZWQuIFlvdSBtYXkgZG8gc28gYnkgY29udGFjdGluZyB1cyB2aWEgY29udGFjdCBmb3JtIDxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2luZm9ybWF0aW9uI2NvbnRhY3RcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmhlcmU8L2E+OyBwcm92aWRlZCwgaG93ZXZlciwgdGhhdCB3ZSBhc2sgaW5kaXZpZHVhbHMgdG8gaWRlbnRpZnkgdGhlbXNlbHZlcyBhbmQgdGhlIGluZm9ybWF0aW9uIHJlcXVlc3RlZCB0byBiZSBhY2Nlc3NlZCwgY29ycmVjdGVkIG9yIHJlbW92ZWQgYmVmb3JlIHByb2Nlc3Npbmcgc3VjaCByZXF1ZXN0cywgYW5kIHdlIG1heSBkZWNsaW5lIHRvIHByb2Nlc3MgcmVxdWVzdHMgdGhhdCBhcmUgdW5yZWFzb25hYmx5IHJlcGV0aXRpdmUgb3Igc3lzdGVtYXRpYywgcmVxdWlyZSBkaXNwcm9wb3J0aW9uYXRlIHRlY2huaWNhbCBlZmZvcnQsIGplb3BhcmRpemUgdGhlIHByaXZhY3kgb2Ygb3RoZXJzIG9yIHdvdWxkIGJlIGV4dHJlbWVseSBpbXByYWN0aWNhbCAoZm9yIGluc3RhbmNlLCByZXF1ZXN0cyBjb25jZXJuaW5nIGluZm9ybWF0aW9uIHJlc2lkaW5nIG9uIGJhY2t1cCB0YXBlcykuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCBkZWxldGluZyB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHdpbGwgdGVybWluYXRlIHlvdXIgYWNjZXNzIHRvIHNvbWUgb3IgYWxsIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncy4gSWYgeW91IHdpc2ggdG8gY29udGludWUgdXNpbmcgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLCB5b3UgbWF5IG5vdCBkZWxldGUgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBvbiBmaWxlIGZvciB5b3UuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgUGxlYXNlIGJlIGZ1cnRoZXIgYWR2aXNlZCB0aGF0LCBhZnRlciB5b3UgZGVsZXRlIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24sIHJlc2lkdWFsIGNvcGllcyBtYXkgdGFrZSBhIHBlcmlvZCBvZiB0aW1lIGJlZm9yZSB0aGV5IGFyZSBkZWxldGVkIGZyb20gb3VyIGFjdGl2ZSBzZXJ2ZXJzIGFuZCBtYXkgcmVtYWluIGluIG91ciBiYWNrdXAgc3lzdGVtcy5cbiAgICAgIDwvcD5cbiAgICAgIDxoMz5UcmFuc2ZlciBvZiBQZXJzb25hbCBJbmZvcm1hdGlvbiBJbnRlcm5hdGlvbmFsbHk8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIElmIHlvdSBhcmUgdmlzaXRpbmcgdGhlIFNpdGUgZnJvbSBhIGNvdW50cnkgb3RoZXIgdGhhbiB0aGUgY291bnRyeSBpbiB3aGljaCBvdXIgc2VydmVycyBhcmUgbG9jYXRlZCwgeW91ciBjb21tdW5pY2F0aW9ucyB3aXRoIHVzIG1heSByZXN1bHQgaW4gdGhlIHRyYW5zZmVyIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFjcm9zcyBpbnRlcm5hdGlvbmFsIGJvdW5kYXJpZXMuIEJ5IHZpc2l0aW5nIHRoZSBTaXRlIGFuZC9vciBvdGhlcndpc2UgY29tbXVuaWNhdGluZyBlbGVjdHJvbmljYWxseSB3aXRoIHVzLCB5b3UgY29uc2VudCB0byBzdWNoIHRyYW5zZmVycy4gRXZlbiBpZiB5b3VyIGp1cmlzZGljdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHByaXZhY3kgbGF3cyBhcyB0aGUganVyaXNkaWN0aW9uIHdoZXJlIG91ciBzZXJ2ZXJzIGFyZSBsb2NhdGVkLCB3ZSB3aWxsIHRyZWF0IHlvdXIgaW5mb3JtYXRpb24gYXMgc3ViamVjdCB0byB0aGUgcHJvdGVjdGlvbnMgZGVzY3JpYmVkIGluIHRoaXMgUHJpdmFjeSBQb2xpY3kuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJjaGFuZ2VzXCI+Q2hhbmdlcyB0byB0aGlzIFByaXZhY3kgUG9saWN5PC9oMz5cbiAgICAgIDxwPlxuICAgICAgICB7cmVuZGVyRG9tYWluKCl9IHJlc2VydmVzIHRoZSByaWdodCB0byBjaGFuZ2Ugb3IgdXBkYXRlIHRoaXMgUHJpdmFjeSBQb2xpY3kgYXQgYW55IHRpbWUgYnkgcG9zdGluZyBhIG5vdGljZSBvbiB0aGUgU2l0ZSB0aGF0IHdlIGFyZSBjaGFuZ2luZyB0aGlzIFByaXZhY3kgUG9saWN5LiBJZiB0aGUgbWFubmVyIGluIHdoaWNoIHdlIHVzZSBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiBjaGFuZ2VzLCB7cmVuZGVyRG9tYWluKCl9IHdpbGwgbm90aWZ5IHVzZXJzIGJ5OiAoYSkgc2VuZGluZyB0aGUgbW9kaWZpZWQgcG9saWN5IHRvIG91ciB1c2VycyB2aWEgZW1haWw7IGFuZC9vciAoYikgYW55IG90aGVyIHJlYXNvbmFibGUgbWVhbnMgYWNjZXB0YWJsZSB1bmRlciBhcHBsaWNhYmxlIHN0YXRlIGFuZCBmZWRlcmFsIGxhdy4gWW91IHdpbGwgaGF2ZSBhIGNob2ljZSBhcyB0byB3aGV0aGVyIG9yIG5vdCB3ZSB1c2UgeW91ciBpbmZvcm1hdGlvbiBpbiB0aGlzIGRpZmZlcmVudCBtYW5uZXIsIGFuZCB3ZSB3aWxsIG9ubHkgdXNlIHlvdXIgaW5mb3JtYXRpb24gaW4gdGhpcyBkaWZmZXJlbnQgbWFubmVyIHdoZXJlIHlvdSBvcHQtaW4gdG8gc3VjaCB1c2UuXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJjb250YWN0dXNcIj5Db250YWN0aW5nIHRoZSBTaXRlPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBJZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIGFib3V0IHRoaXMgUHJpdmFjeSBQb2xpY3kgb3IgdGhlIHByaXZhY3kgcHJhY3RpY2VzIG9mIHtyZW5kZXJEb21haW4oKX0sIHBsZWFzZSBmZWVsIGZyZWUgdG8gZS1tYWlsIHVzIGF0OjxhIGhyZWY9XCJtYWlsdG86IGNvcnJlc3BvbmRlbmNlQGVsb2NhbC5jb21cIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeVwiPmNvcnJlc3BvbmRlbmNlQGVsb2NhbC5jb208L2E+LlxuICAgICAgPC9wPlxuICAgICAgPGgzPkZpbGluZyBhIENvbXBsYWludCB3aXRoIHRoZSBGZWRlcmFsIFRyYWRlIENvbW1pc3Npb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFRvIGZpbGUgYSBjb21wbGFpbnQgcmVnYXJkaW5nIG91ciBwcml2YWN5IHByYWN0aWNlcywgcGxlYXNlJm5ic3A7PGEgaHJlZj1cImh0dHBzOi8vd3d3LmZ0Y2NvbXBsYWludGFzc2lzdGFudC5nb3YvSW5mb3JtYXRpb24/T3JnQ29kZT0jY3JudCZwYW5lbDEtMVwiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+Y2xpY2sgaGVyZTwvYT4uXG4gICAgICA8L3A+XG4gICAgICA8aDMgaWQ9XCJjYWxpZm9ybmlhXCI+UHJpdmFjeSBQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50czwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgVGhlc2UgUHJpdmFjeSBQcm92aXNpb25zIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50cyAo4oCcUHJpdmFjeSBQcm92aXNpb25z4oCdKSBzdXBwbGVtZW50IHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIFByaXZhY3kgUG9saWN5IHNldCBmb3J0aCBhYm92ZSBUaGVzZSBQcml2YWN5IFByb3Zpc2lvbnMgYXBwbHkgc29sZWx5IHRvIHJlc2lkZW50cyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSAo4oCcQ0EgVXNlcnPigJ0pLiBXZSBhZG9wdCB0aGVzZSBQcml2YWN5IFByb3Zpc2lvbnMgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBDYWxpZm9ybmlhIENvbnN1bWVyIFByaXZhY3kgQWN0IG9mIDIwMTggKOKAnENDUEHigJ0pLiBBbnkgdGVybXMgZGVmaW5lZCBpbiB0aGUgQ0NQQSBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgd2hlbiB1c2VkIGluIHRoZXNlIFByaXZhY3kgUHJvdmlzaW9ucy5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+Q2F0ZWdvcmllcyBvZiBJbmZvcm1hdGlvbiBXZSBDb2xsZWN0PC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBXZSBjb2xsZWN0IGluZm9ybWF0aW9uIHRoYXQgaWRlbnRpZmllcywgcmVsYXRlcyB0bywgZGVzY3JpYmVzLCByZWZlcmVuY2VzLCBpcyBjYXBhYmxlIG9mIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCwgb3IgY291bGQgcmVhc29uYWJseSBiZSBsaW5rZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIHdpdGggYSBwYXJ0aWN1bGFyIENBIFVzZXIgb3IgZGV2aWNlXG4gICAgICAgIChcIjx1PnBlcnNvbmFsIGluZm9ybWF0aW9uPC91PlwiKS4gSW4gcGFydGljdWxhciwgd2UgaGF2ZSBjb2xsZWN0ZWQgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZyb20gQ0EgVXNlcnMgd2l0aGluIHRoZSBsYXN0IHR3ZWx2ZSAoMTIpIG1vbnRoczpcbiAgICAgIDwvcD5cbiAgICAgIDx0YWJsZSBjbGFzc05hbWU9XCJjYWxpZm9ybmlhLWluZm9ybWF0aW9uLWNvbnRhaW5lclwiIGJvcmRlcj1cIjFweFwiIGNlbGxTcGFjaW5nPVwiMFwiPlxuICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPkNhdGVnb3J5PC90aD5cbiAgICAgICAgICAgIDx0aD5FeGFtcGxlczwvdGg+XG4gICAgICAgICAgICA8dGg+Q29sbGVjdGVkPC90aD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZD5BLiBJZGVudGlmaWVycy48L3RkPlxuICAgICAgICAgICAgPHRkPkEgcmVhbCBuYW1lLCBhbGlhcywgcG9zdGFsIGFkZHJlc3MsIHVuaXF1ZSBwZXJzb25hbCBpZGVudGlmaWVyLCBvbmxpbmUgaWRlbnRpZmllciwgSW50ZXJuZXQgUHJvdG9jb2wgYWRkcmVzcywgZW1haWwgYWRkcmVzcywgYWNjb3VudCBuYW1lLCB0ZWxlcGhvbmUgbnVtYmVyLCBvciBvdGhlciBzaW1pbGFyIGlkZW50aWZpZXJzLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+WUVTPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZD5CLiBQZXJzb25hbCBpbmZvcm1hdGlvbiBjYXRlZ29yaWVzIGxpc3RlZCBpbiB0aGUgQ2FsaWZvcm5pYSBDdXN0b21lciBSZWNvcmRzIHN0YXR1dGUgKENhbC4gQ2l2LiBDb2RlIMKnIDE3OTguODAoZSkpLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgIEEgbmFtZSwgc2lnbmF0dXJlLCBTb2NpYWwgU2VjdXJpdHkgbnVtYmVyLCBwaHlzaWNhbCBjaGFyYWN0ZXJpc3RpY3Mgb3IgZGVzY3JpcHRpb24sIHBvc3RhbCBhZGRyZXNzLCB0ZWxlcGhvbmUgbnVtYmVyLCBwYXNzcG9ydCBudW1iZXIsIGRyaXZlcidzIGxpY2Vuc2Ugb3IgU3RhdGUgaWRlbnRpZmljYXRpb24gY2FyZCBudW1iZXIsIGluc3VyYW5jZSBwb2xpY3kgbnVtYmVyLCBlZHVjYXRpb24sIGVtcGxveW1lbnQsIGVtcGxveW1lbnQgaGlzdG9yeSwgYmFuayBhY2NvdW50IG51bWJlciwgY3JlZGl0IGNhcmQgbnVtYmVyLCBkZWJpdCBjYXJkIG51bWJlciwgb3IgYW55IG90aGVyIGZpbmFuY2lhbCBpbmZvcm1hdGlvbiwgbWVkaWNhbCBpbmZvcm1hdGlvbiwgb3IgaGVhbHRoIGluc3VyYW5jZSBpbmZvcm1hdGlvbi4gU29tZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBpbiB0aGlzIGNhdGVnb3J5IG1heSBvdmVybGFwIHdpdGggb3RoZXIgY2F0ZWdvcmllcy5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8dGQ+WUVTPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZD5ELiBDb21tZXJjaWFsIGluZm9ybWF0aW9uLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+UmVjb3JkcyBvZiBwZXJzb25hbCBwcm9wZXJ0eSwgcHJvZHVjdHMgb3Igc2VydmljZXMgcHVyY2hhc2VkLCBvYnRhaW5lZCwgb3IgY29uc2lkZXJlZCwgb3Igb3RoZXIgcHVyY2hhc2luZyBvciBjb25zdW1pbmcgaGlzdG9yaWVzIG9yIHRlbmRlbmNpZXMuPC90ZD5cbiAgICAgICAgICAgIDx0ZD5ZRVM8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPkYuIEludGVybmV0IG9yIG90aGVyIHNpbWlsYXIgbmV0d29yayBhY3Rpdml0eS48L3RkPlxuICAgICAgICAgICAgPHRkPkJyb3dzaW5nIGhpc3RvcnksIHNlYXJjaCBoaXN0b3J5LCBpbmZvcm1hdGlvbiBvbiBhIENBIFVzZXIncyBpbnRlcmFjdGlvbiB3aXRoIGEgd2Vic2l0ZSwgYXBwbGljYXRpb24gb3IgYWR2ZXJ0aXNlbWVudC48L3RkPlxuICAgICAgICAgICAgPHRkPllFUzwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+SS4gUHJvZmVzc2lvbmFsIG9yIGVtcGxveW1lbnQtcmVsYXRlZCBpbmZvcm1hdGlvbi48L3RkPlxuICAgICAgICAgICAgPHRkPkN1cnJlbnQgb3IgcGFzdCBqb2IgaGlzdG9yeSBvciBwZXJmb3JtYW5jZSBldmFsdWF0aW9ucy48L3RkPlxuICAgICAgICAgICAgPHRkPllFUzwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgICA8cD5QZXJzb25hbCBpbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlOjwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPlB1YmxpY2x5IGF2YWlsYWJsZSBpbmZvcm1hdGlvbiBmcm9tIGdvdmVybm1lbnQgcmVjb3Jkcy48L2xpPlxuICAgICAgICA8bGk+RGUtaWRlbnRpZmllZCBvciBhZ2dyZWdhdGVkIENBIFVzZXIgaW5mb3JtYXRpb24uPC9saT5cbiAgICAgICAgPGxpPkluZm9ybWF0aW9uIGV4Y2x1ZGVkIGZyb20gdGhlIENDUEEmYXBvcztzIHNjb3BlLCBzdWNoIGFzOjwvbGk+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGk+aGVhbHRoIG9yIG1lZGljYWwgaW5mb3JtYXRpb24gY292ZXJlZCBieSB0aGUgSGVhbHRoIEluc3VyYW5jZSBQb3J0YWJpbGl0eSBhbmQgQWNjb3VudGFiaWxpdHkgQWN0IG9mIDE5OTYgKEhJUEFBKSBhbmQgdGhlIENhbGlmb3JuaWEgQ29uZmlkZW50aWFsaXR5IG9mIE1lZGljYWwgSW5mb3JtYXRpb24gQWN0IChDTUlBKSBvciBjbGluaWNhbCB0cmlhbCBkYXRhOyBhbmQ8L2xpPlxuICAgICAgICAgIDxsaT5wZXJzb25hbCBpbmZvcm1hdGlvbiBjb3ZlcmVkIGJ5IGNlcnRhaW4gc2VjdG9yLXNwZWNpZmljIHByaXZhY3kgbGF3cywgaW5jbHVkaW5nIHRoZSBGYWlyIENyZWRpdCBSZXBvcnRpbmcgQWN0IChGUkNBKSwgdGhlIEdyYW1tLUxlYWNoLUJsaWxleSBBY3QgKEdMQkEpIG9yIENhbGlmb3JuaWEgRmluYW5jaWFsIEluZm9ybWF0aW9uIFByaXZhY3kgQWN0IChGSVBBKSwgYW5kIHRoZSBEcml2ZXIncyBQcml2YWN5IFByb3RlY3Rpb24gQWN0IG9mIDE5OTQuPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvdWw+XG4gICAgICA8cD5XZSBvYnRhaW4gdGhlIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gbGlzdGVkIGFib3ZlIGZyb20gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHNvdXJjZXMgKHdpdGggdGhlIHNwZWNpZmljIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gaW5kaWNhdGVkIGluIHBhcmVudGhlc2lzKTo8L3A+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaT5EaXJlY3RseSBmcm9tIG91ciBDQSBVc2Vycy4gRm9yIGV4YW1wbGUsIGZyb20gb25saW5lIHJlZ2lzdHJhdGlvbiBmb3JtcyB0aGF0IG91ciBDQSBVc2VycyBzdWJtaXQgdG8gdXMgcmVsYXRlZCB0byB0aGUgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIHRoYXQgd2UgKGFuZCBvdXIgdGhpcmQgcGFydHkgc2VydmljZSBwcm92aWRlcnMpIG9mZmVyIGJ5IGFuZCB0aHJvdWdoIHRoZSBTaXRlLiAoQ2F0ZWdvcnkgQSwgQiwgRCBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+SW5kaXJlY3RseSBmcm9tIG91ciBDQSBVc2Vycy4gRm9yIGV4YW1wbGUsIHRocm91Z2ggaW5mb3JtYXRpb24gd2UgY29sbGVjdCBmcm9tIG91ciBDQSBVc2VycyBpbiB0aGUgY291cnNlIG9mIHByb3ZpZGluZyBvdXIgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIHRvIHRoZW0uIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5EaXJlY3RseSBhbmQgaW5kaXJlY3RseSBmcm9tIGFjdGl2aXR5IG9uIHRoZSBTaXRlLiBUaGlzIGluY2x1ZGVzIHRoZSB0eXBlIG9mIGJyb3dzZXIgdGhhdCB5b3UgdXNlIChlLmcuLCBTYWZhcmksIENocm9tZSwgSW50ZXJuZXQgRXhwbG9yZXIpLCB5b3VyIElQIGFkZHJlc3MsIHRoZSB0eXBlIG9mIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCB5b3UgdXNlIChlLmcuLCBXaW5kb3dzIG9yIGlPUykgYW5kIHRoZSBkb21haW4gbmFtZSBvZiB5b3VyIEludGVybmV0IFNlcnZpY2UgUHJvdmlkZXIuIEluIGFkZGl0aW9uLCB3ZSBvYnRhaW4gY2VydGFpbiBTaXRlIHVzYWdlIGRldGFpbHMgYW5kIGFuYWx5dGljcyBhcyBzYW1lIGFyZSBjb2xsZWN0ZWQgYXV0b21hdGljYWxseSBieSB1cyBhbmQgb3VyIHRoaXJkIHBhcnR5IHBhcnRuZXJzLiAoQ2F0ZWdvcnkgRik8L2xpPlxuICAgICAgICA8bGk+RnJvbSB0aGlyZC1wYXJ0aWVzIHRoYXQgaW50ZXJhY3Qgd2l0aCB1cyBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHByb2R1Y3RzIGFuZC9vciBzZXJ2aWNlcyB0aGF0IHdlIG9mZmVyIHRvIG91ciBDQSBVc2Vycy4gRm9yIGV4YW1wbGUsIHRoaXJkIHBhcnR5IGVudGl0aWVzIHRoYXQgYXNzaXN0IHVzIGluIHNlbmRpbmcgZGlyZWN0IGFuZCBlbGVjdHJvbmljIG1haWwsIHJlbW92aW5nIGR1cGxpY2F0ZSBpbmZvcm1hdGlvbiBmcm9tIENBIFVzZXIgbGlzdHMsIGFuYWx5emluZyBkYXRhIGFuZCBwcm92aWRpbmcgbWFya2V0aW5nIGFuYWx5c2lzLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+RnJvbSB0aGlyZC1wYXJ0eSBkYXRhIGJyb2tlcnMgb3IgYWdncmVnYXRvcnMuIChDYXRlZ29yeSBBLCBCLCBEIGFuZCBJKTwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5Vc2Ugb2YgUGVyc29uYWwgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+V2UgbWF5IHVzZSBvciBkaXNjbG9zZSB0aGUgcGVyc29uYWwgaW5mb3JtYXRpb24gdGhhdCB3ZSBjb2xsZWN0IGZvciBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGJ1c2luZXNzIHB1cnBvc2VzICh3aXRoIHRoZSBzcGVjaWZpYyBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIGluZGljYXRlZCBpbiBwYXJlbnRoZXNpcyk6PC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+VG8gZnVsZmlsbCBvciBtZWV0IHRoZSByZWFzb24gZm9yIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZC4gRm9yIGV4YW1wbGUsIGlmIHlvdSBwcm92aWRlIHVzIHdpdGggcGVyc29uYWwgaW5mb3JtYXRpb24gaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgcmVxdWVzdCBmb3IgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIGZyb20gdGhlIHRoaXJkIHBhcnR5IHNlcnZpY2UgcHJvdmlkZXJzIGZlYXR1cmVkIG9uIHRoZSBTaXRlLCBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgb3RoZXIgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIGZlYXR1cmVkIG9uIHRoZSBTaXRlLCB3ZSB3aWxsIHVzZSB0aGF0IHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIGJldHRlciBwcm92aWRlIHlvdSB3aXRoIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24uIChDYXRlZ29yeSBBLCBCLCBEIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBlbmFibGUgdGhlIHRoaXJkLXBhcnR5IHNlcnZpY2UgcHJvdmlkZXJzIGZlYXR1cmVkIG9uIHRoZSBTaXRlIHRvIGNvbnRhY3QgeW91IHJlZ2FyZGluZyB0aGUgZmVhdHVyZWQgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzLiAoQ2F0ZWdvcnkgQSwgQiwgRCBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gcHJvdmlkZSB5b3Ugd2l0aCBpbmZvcm1hdGlvbiwgcHJvZHVjdHMgb3Igc2VydmljZXMgdGhhdCB5b3UgcmVxdWVzdCBmcm9tIHVzLiAoQ2F0ZWdvcnkgQSwgQiwgRCBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gY3JlYXRlLCBtYWludGFpbiwgY3VzdG9taXplIGFuZCBzZWN1cmUgeW91ciBhY2NvdW50IHdpdGggdXMuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBwcm92aWRlIHlvdSB3aXRoIGUtbWFpbCwgZGlyZWN0IG1haWwgYW5kIHRlbGVtYXJrZXRpbmcgbWVzc2FnZXMgY29uY2VybmluZyBjZXJ0YWluIENvbXBhbnkgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzLCBhcyB3ZWxsIGFzIHRoaXJkLXBhcnR5IHByb2R1Y3RzIGFuZC9vciBzZXJ2aWNlcywgdGhhdCB3ZSBiZWxpZXZlIG1heSBiZSBvZiBpbnRlcmVzdCB0byB5b3UuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBkZWxpdmVyIHJlbGV2YW50IFNpdGUgY29udGVudCBhbmQgYWR2ZXJ0aXNlbWVudHMgdG8geW91IGFuZCBtZWFzdXJlIG9yIHVuZGVyc3RhbmQgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIGFkdmVydGlzaW5nIHdlIHNlcnZlIHRvIHlvdS4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIGNhcnJ5IG91dCBvdXIgb2JsaWdhdGlvbnMgYW5kIGVuZm9yY2Ugb3VyIHJpZ2h0cyBhcmlzaW5nIGZyb20gYW55IGNvbnRyYWN0cyBlbnRlcmVkIGludG8gYmV0d2VlbiB5b3UgYW5kIHVzLCBpbmNsdWRpbmcgdGhlIFNpdGUmYXBvcztzIFRlcm1zIGFuZCBDb25kaXRpb25zLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gaW1wcm92ZSB0aGUgU2l0ZSBhbmQgYmV0dGVyIHByZXNlbnQgaXRzIGNvbnRlbnRzIHRvIHlvdS4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPkZvciBjdXN0b21lciBzZXJ2aWNlIHB1cnBvc2VzIGFuZCB0byByZXNwb25kIHRvIGlucXVpcmllcyBmcm9tIHlvdS4gKENhdGVnb3J5IEEgYW5kIEIpPC9saT5cbiAgICAgICAgPGxpPkZvciB0ZXN0aW5nLCByZXNlYXJjaCwgYW5hbHlzaXMgYW5kIHByb2R1Y3QgZGV2ZWxvcG1lbnQuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5BcyBuZWNlc3Nhcnkgb3IgYXBwcm9wcmlhdGUgdG8gcHJvdGVjdCBvdXIgcmlnaHRzLCBwcm9wZXJ0eSBvciBzYWZldHksIGFuZCB0aGF0IG9mIG91ciBjbGllbnRzIG9yIG90aGVycy4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIHJlc3BvbmQgdG8gbGF3IGVuZm9yY2VtZW50IHJlcXVlc3RzIGFuZCBhcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdywgY291cnQgb3JkZXIsIG9yIGdvdmVybm1lbnRhbCByZWd1bGF0aW9ucy4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPkFzIGRlc2NyaWJlZCB0byB5b3Ugd2hlbiBjb2xsZWN0aW5nIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gb3IgYXMgb3RoZXJ3aXNlIHNldCBmb3J0aCBpbiB0aGUgQ0NQQS4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIGV2YWx1YXRlIG9yIGNvbmR1Y3QgYSBtZXJnZXIsIGRpdmVzdGl0dXJlLCByZXN0cnVjdHVyaW5nLCByZW9yZ2FuaXphdGlvbiwgZGlzc29sdXRpb24gb3Igb3RoZXIgc2FsZSBvciB0cmFuc2ZlciBvZiBzb21lIG9yIGFsbCBvZiBvdXIgYXNzZXRzLCB3aGV0aGVyIGFzIGEgZ29pbmcgY29uY2VybiBvciBhcyBwYXJ0IG9mIGJhbmtydXB0Y3ksIGxpcXVpZGF0aW9uIG9yIHNpbWlsYXIgcHJvY2VlZGluZywgaW4gd2hpY2ggcGVyc29uYWwgaW5mb3JtYXRpb24gaGVsZCBieSB1cyBpcyBhbW9uZyB0aGUgYXNzZXRzIHRyYW5zZmVycmVkLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxwPlxuICAgICAgICBXZSB3aWxsIG5vdCBjb2xsZWN0IGFkZGl0aW9uYWwgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiBvciB1c2UgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHdlIGNvbGxlY3RlZCBmb3IgbWF0ZXJpYWxseSBkaWZmZXJlbnQsIHVucmVsYXRlZCBvciBpbmNvbXBhdGlibGUgcHVycG9zZXMgd2l0aG91dCBwcm92aWRpbmcgeW91IHdpdGggbm90aWNlLlxuICAgICAgPC9wPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5TaGFyaW5nIFBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBTdWJqZWN0IHRvIHlvdXIgcmlnaHQgdG8gb3B0LW91dCBvZiBzdWNoIHNoYXJpbmcvc2FsZSwgd2UgbWF5IHNoYXJlLCByZW50IGFuZC9vciBzZWxsIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpOiAoYSkgd2l0aC90byB0aGUgdGhpcmQgcGFydHkgc2VydmljZSBwcm92aWRlcnMgdGhhdCBvZmZlciB0aGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzIGZlYXR1cmVkIG9uIHRoZSBTaXRlOyBhbmQgKGIpIGZvciB0aGUgb3RoZXIgYnVzaW5lc3MgcHVycG9zZXMgc2V0IGZvcnRoIGFib3ZlLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdoZW4gd2UgZGlzY2xvc2UgcGVyc29uYWwgaW5mb3JtYXRpb24gdG8gYSB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVyIG9yIG90aGVyIGVudGl0eSwgd2UgZW50ZXIgaW50byBhIGNvbnRyYWN0dWFsIHJlbGF0aW9uc2hpcCB0aGF0IGRlc2NyaWJlcyB0aGUgcHVycG9zZSBmb3Igd2hpY2ggc3VjaCB0aGlyZCBwYXJ0eSBtYXkgdXNlIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGlyZCBwYXJ0eSB0byBib3RoIGtlZXAgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIGNvbmZpZGVudGlhbCBhbmQgbm90IHVzZSBpdCBmb3IgYW55IHB1cnBvc2Ugb3RoZXIgdGhhbiB0aGUgcGVyZm9ybWFuY2Ugb2YgaXRzIHNlcnZpY2VzIHVuZGVyIHRoZSBhcHBsaWNhYmxlIGNvbnRyYWN0LiBQbGVhc2Ugbm90ZSwgd2UgZG8gbm90IGNvbGxlY3QgaW5mb3JtYXRpb24gZnJvbSBDQSBVc2VycyB0aGF0IHdlIGFjdHVhbGx5IGtub3cgYXJlIGxlc3MgdGhhbiBlaWdodGVlbiAoMTgpIHllYXJzIG9mIGFnZSBhbmQgd2UgZG8gbm90IHNoYXJlIG9yIHNlbGwgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9mIENBIFVzZXJzIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhcmUgbGVzcyB0aGFuIGVpZ2h0ZWVuICgxOCkgeWVhcnMgb2YgYWdlLiBXaXRob3V0IGxpbWl0aW5nIHRoZSBmb3JlZ29pbmcsIHdlIGhhdmUgbm90IHNoYXJlZCBvciBzb2xkIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZiBDQSBVc2VycyB0aGF0IHdlIGFjdHVhbGx5IGtub3cgYXJlIGxlc3MgdGhhbiBzaXh0ZWVuICgxNikgeWVhcnMgb2YgYWdlIGluIHRoZSBwcmVjZWRpbmcgdHdlbHZlICgxMikgbW9udGhzLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIEluIHRoZSBwcmVjZWRpbmcgdHdlbHZlICgxMikgbW9udGhzLCB3ZSBoYXZlIGRpc2Nsb3NlZCB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIGEgYnVzaW5lc3MgcHVycG9zZTpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEEuXHRJZGVudGlmaWVycy48L2xpPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgQi4gQ2FsaWZvcm5pYSBDdXN0b21lciBSZWNvcmRzIHBlcnNvbmFsIGluZm9ybWF0aW9uIGNhdGVnb3JpZXMuPC9saT5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEQuIENvbW1lcmNpYWwgaW5mb3JtYXRpb24uPC9saT5cbiAgICAgICAgPGxpPuKAqENhdGVnb3J5IEYuIEludGVybmV0IG9yIG90aGVyIHNpbWlsYXIgbmV0d29yayBhY3Rpdml0eS48L2xpPlxuICAgICAgICA8bGk+4oCoQ2F0ZWdvcnkgSS4gUHJvZmVzc2lvbmFsIG9yIGVtcGxveW1lbnQtcmVsYXRlZCBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxwPlxuICAgICAgICBXZSBkaXNjbG9zZSB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZvciBhIGJ1c2luZXNzIHB1cnBvc2UgdG8gdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHRoaXJkIHBhcnRpZXMgKHdpdGggdGhlIHNwZWNpZmljIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gaW5kaWNhdGVkIGluIHBhcmVudGhlc2lzKTpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPk91ciBhZmZpbGlhdGVzLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+U2VydmljZSBwcm92aWRlcnMuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UaGUgdGhpcmQgcGFydHkgc2VydmljZSBwcm92aWRlcnMgdGhhdCBvZmZlciB0aGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzIGZlYXR1cmVkIG9uIHRoZSBTaXRlLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VGhpcmQgcGFydGllcyB0byB3aG9tIHlvdSBhdXRob3JpemUgdXMgdG8gZGlzY2xvc2UgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHByb2R1Y3RzIGFuZC9vciBzZXJ2aWNlcyB0aGF0IHdlIHByb3ZpZGUgdG8geW91LiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxwPlxuICAgICAgICBJbiB0aGUgcHJlY2VkaW5nIHR3ZWx2ZSAoMTIpIG1vbnRocywgd2UgaGF2ZSBzb2xkIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byB0aGlyZCBwYXJ0aWVzOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgQS4gSWRlbnRpZmllcnMuPC9saT5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEIuIENhbGlmb3JuaWEgQ3VzdG9tZXIgUmVjb3JkcyBwZXJzb25hbCBpbmZvcm1hdGlvbiBjYXRlZ29yaWVzLjwvbGk+XG4gICAgICAgIDxsaT5DYXRlZ29yeSBELiBDb21tZXJjaWFsIGluZm9ybWF0aW9uLuKAqDwvbGk+XG4gICAgICAgIDxsaT5DYXRlZ29yeSBGLiBJbnRlcm5ldCBvciBvdGhlciBzaW1pbGFyIG5ldHdvcmsgYWN0aXZpdHku4oCoPC9saT5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEkuIFByb2Zlc3Npb25hbCBvciBlbXBsb3ltZW50LXJlbGF0ZWQgaW5mb3JtYXRpb24uPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8cD5cbiAgICAgICAgSW4gdGhlIHByZWNlZGluZyB0d2VsdmUgKDEyKSBtb250aHMsIHdlIGhhdmUgc29sZCB0aGUgYWJvdmUgcmVmZXJlbmNlZCBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IG9mZmVyIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgZmVhdHVyZWQgb24gdGhlIFNpdGUuXG4gICAgICA8L3A+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPllvdXIgUmlnaHRzIGFuZCBDaG9pY2VzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBUaGUgQ0NQQSBwcm92aWRlcyBDQSBVc2VycyAoQ2FsaWZvcm5pYSByZXNpZGVudHMpIHdpdGggc3BlY2lmaWMgcmlnaHRzIHJlZ2FyZGluZyB0aGVpciBwZXJzb25hbCBpbmZvcm1hdGlvbi4gVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB5b3VyIENDUEEgcmlnaHRzIGFuZCBleHBsYWlucyBob3cgdG8gZXhlcmNpc2UgdGhvc2UgcmlnaHRzLlxuICAgICAgPC9wPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5PcHQtT3V0IGZyb20gdGhlIFNhbGUgb2YgWW91ciBQZXJzb25hbCBJbmZvcm1hdGlvbjwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgWW91IGhhdmUgdGhlIHJpZ2h0IHRvIG9wdC1vdXQgb2Ygb3VyIHNhbGUgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byB0aGlyZCBwYXJ0aWVzLiBUbyBleGVyY2lzZSB5b3VyIHJpZ2h0IHRvIG9wdC1vdXQgb2Ygb3VyIHNhbGUgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byB0aGlyZCBwYXJ0aWVzLCBwbGVhc2Ugc3VibWl0IGEgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdG8gdXMgYnkgZWl0aGVyOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2xpY2tpbmc8YSBocmVmPVwiaHR0cHM6Ly93d3cuZWxvY2FsLmNvbS9jY3BhL29wdF9vdXRzL25ld1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+IGhlcmU8L2E+PC9saT5cbiAgICAgICAgPGxpPkNhbGxpbmcgdXMgYXQ6ICg4NzcpIDkxMy01NjIyOyA8L2xpPlxuICAgICAgICA8bGk+RW1haWxpbmcgdXMgYXQ6IGNvcnJlc3BvbmRlbmNlQGVsb2NhbC5jb207IG9yIDwvbGk+XG4gICAgICAgIDxsaT5TZW5kaW5nIHVzIFUuUy4gbWFpbCB0bzogZUxvY2FsLmNvbSwgMTAxMCBTcHJpbmcgTWlsbCBBdmUsIFN1aXRlIDIwMCwgQ29uc2hvaG9ja2VuLCBQQSwgMTk0MjguPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8cD5cbiAgICAgICAgV2UgZW5kZWF2b3IgdG8gYWN0IG9uIGFsbCBvcHQtb3V0IHJlcXVlc3RzIGFzIHNvb24gYXMgcHJhY3RpY2FibGUsIGJ1dCBpbiBhbGwgY2FzZXMgd2l0aGluIGZpZnRlZW4gKDE1KSBkYXlzIG9mIHRoZSByZWNlaXB0IG9mIHlvdXIgcmVxdWVzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+QWNjZXNzIHRvIFNwZWNpZmljIEluZm9ybWF0aW9uIGFuZCBEYXRhIFBvcnRhYmlsaXR5IFJpZ2h0czwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgWW91IGhhdmUgdGhlIHJpZ2h0IHRvIHJlcXVlc3QgdGhhdCB3ZSBkaXNjbG9zZSBjZXJ0YWluIGluZm9ybWF0aW9uIHRvIHlvdSBhYm91dCBvdXIgY29sbGVjdGlvbiBhbmQgdXNlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gb3ZlciB0aGUgcGFzdCB0d2VsdmUgKDEyKSBtb250aHMuIE9uY2Ugd2UgcmVjZWl2ZSBhbmQgY29uZmlybSB5b3VyIHZlcmlmaWFibGUgQ0EgVXNlciByZXF1ZXN0LCB3ZSB3aWxsIGRpc2Nsb3NlIHRvIHlvdTpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPlRoZSBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHdlIGNvbGxlY3RlZCBhYm91dCB5b3UuPC9saT5cbiAgICAgICAgPGxpPlRoZSBjYXRlZ29yaWVzIG9mIHNvdXJjZXMgZm9yIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB3ZSBjb2xsZWN0ZWQgYWJvdXQgeW91LjwvbGk+XG4gICAgICAgIDxsaT5PdXIgYnVzaW5lc3Mgb3IgY29tbWVyY2lhbCBwdXJwb3NlIGZvciBjb2xsZWN0aW5nIG9yIHNlbGxpbmcgdGhhdCBwZXJzb25hbCBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgICA8bGk+VGhlIGNhdGVnb3JpZXMgb2YgdGhpcmQgcGFydGllcyB3aXRoIHdob20gd2UgaGF2ZSBzaGFyZWQgdGhhdCBwZXJzb25hbCBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgICA8bGk+VGhlIHNwZWNpZmljIHBpZWNlcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiB3ZSBjb2xsZWN0ZWQgYWJvdXQgeW91IChhbHNvIGNhbGxlZCBhIGRhdGEgcG9ydGFiaWxpdHkgcmVxdWVzdCkuPC9saT5cbiAgICAgICAgPGxpPklmIHdlIHNvbGQgb3IgZGlzY2xvc2VkIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIGEgYnVzaW5lc3MgcHVycG9zZSwgdHdvIHNlcGFyYXRlIGxpc3RzIGRpc2Nsb3Npbmc6PC9saT5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5zYWxlcywgaWRlbnRpZnlpbmcgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIGNhdGVnb3JpZXMgdGhhdCBlYWNoIGNhdGVnb3J5IG9mIHJlY2lwaWVudCBwdXJjaGFzZWQ7IGFuZDwvbGk+XG4gICAgICAgICAgPGxpPmRpc2Nsb3N1cmVzIGZvciBhIGJ1c2luZXNzIHB1cnBvc2UsIGlkZW50aWZ5aW5nIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiBjYXRlZ29yaWVzIHRoYXQgZWFjaCBjYXRlZ29yeSBvZiByZWNpcGllbnQgb2J0YWluZWQuPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvdWw+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPkRlbGV0aW9uIFJlcXVlc3QgUmlnaHRzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBZb3UgaGF2ZSB0aGUgcmlnaHQgdG8gcmVxdWVzdCB0aGF0IHdlIGRlbGV0ZSBhbnkgb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IHdlIGNvbGxlY3RlZCBmcm9tIHlvdSBhbmQgcmV0YWluZWQsIHN1YmplY3QgdG8gY2VydGFpbiBleGNlcHRpb25zLiBPbmNlIHdlIHJlY2VpdmUgYW5kIGNvbmZpcm0geW91ciB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCwgd2Ugd2lsbCBkZWxldGUgKGFuZCBkaXJlY3Qgb3VyIHNlcnZpY2UgcHJvdmlkZXJzIHRvIGRlbGV0ZSkgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBmcm9tIG91ciAodGhlaXIpIHJlY29yZHMsIHVubGVzcyBhbiBleGNlcHRpb24gYXBwbGllcy5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBXZSBtYXkgZGVueSB5b3VyIGRlbGV0aW9uIHJlcXVlc3QgaWYgcmV0YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWNlc3NhcnkgZm9yIHVzIG9yIG91ciBzZXJ2aWNlIHByb3ZpZGVycyB0bzpcbiAgICAgIDwvcD5cbiAgICAgIDxvbD5cbiAgICAgICAgPGxpPkNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBmb3Igd2hpY2ggd2UgY29sbGVjdGVkIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiwgcHJvdmlkZSBhIGdvb2Qgb3Igc2VydmljZSB0aGF0IHlvdSByZXF1ZXN0ZWQsIHRha2UgYWN0aW9ucyByZWFzb25hYmx5IGFudGljaXBhdGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBvdXIgb25nb2luZyBidXNpbmVzcyByZWxhdGlvbnNoaXAgd2l0aCB5b3UsIG9yIG90aGVyd2lzZSBwZXJmb3JtIG91ciBvYmxpZ2F0aW9ucyBpbiBjb25uZWN0aW9uIHdpdGggb3VyIGNvbnRyYWN0IHdpdGggeW91LjwvbGk+XG4gICAgICAgIDxsaT5EZXRlY3Qgc2VjdXJpdHkgaW5jaWRlbnRzLCBwcm90ZWN0IGFnYWluc3QgbWFsaWNpb3VzLCBkZWNlcHRpdmUsIGZyYXVkdWxlbnQgb3IgaWxsZWdhbCBhY3Rpdml0eSwgb3IgcHJvc2VjdXRlIHRob3NlIHJlc3BvbnNpYmxlIGZvciBzdWNoIGFjdGl2aXRpZXMuPC9saT5cbiAgICAgICAgPGxpPkRlYnVnIHByb2R1Y3RzIHRvIGlkZW50aWZ5IGFuZCByZXBhaXIgZXJyb3JzIHRoYXQgaW1wYWlyIGV4aXN0aW5nIGludGVuZGVkIGZ1bmN0aW9uYWxpdHkuPC9saT5cbiAgICAgICAgPGxpPkV4ZXJjaXNlIGZyZWUgc3BlZWNoIHJpZ2h0cywgZW5zdXJlIHRoZSByaWdodCBvZiBhbm90aGVyIENBIFVzZXIgdG8gZXhlcmNpc2UgdGhlaXIgZnJlZSBzcGVlY2ggcmlnaHRzIG9yIGV4ZXJjaXNlIGFub3RoZXIgcmlnaHQgcHJvdmlkZWQgZm9yIGJ5IGxhdy48L2xpPlxuICAgICAgICA8bGk+Q29tcGx5IHdpdGggdGhlIENhbGlmb3JuaWEgRWxlY3Ryb25pYyBDb21tdW5pY2F0aW9ucyBQcml2YWN5IEFjdCAoQ2FsLiBQZW5hbCBDb2RlICZzZWN0OyAxNTQ2Jm5ic3A7c2VxLikuPC9saT5cbiAgICAgICAgPGxpPkVuZ2FnZSBpbiBwdWJsaWMgb3IgcGVlci1yZXZpZXdlZCBzY2llbnRpZmljLCBoaXN0b3JpY2FsLCBvciBzdGF0aXN0aWNhbCByZXNlYXJjaCBpbiB0aGUgcHVibGljIGludGVyZXN0IHRoYXQgYWRoZXJlcyB0byBhbGwgb3RoZXIgYXBwbGljYWJsZSBldGhpY3MgYW5kIHByaXZhY3kgbGF3cywgd2hlbiB0aGUgaW5mb3JtYXRpb24mYXBvcztzIGRlbGV0aW9uIG1heSBsaWtlbHkgcmVuZGVyIGltcG9zc2libGUgb3Igc2VyaW91c2x5IGltcGFpciB0aGUgcmVzZWFyY2gmYXBvcztzIGFjaGlldmVtZW50LCBpZiB5b3UgcHJldmlvdXNseSBwcm92aWRlZCBpbmZvcm1lZCBjb25zZW50LjwvbGk+XG4gICAgICAgIDxsaT5FbmFibGUgc29sZWx5IGludGVybmFsIHVzZXMgdGhhdCBhcmUgcmVhc29uYWJseSBhbGlnbmVkIHdpdGggQ0EgVXNlciBleHBlY3RhdGlvbnMgYmFzZWQgb24geW91ciByZWxhdGlvbnNoaXAgd2l0aCB1cy48L2xpPlxuICAgICAgICA8bGk+Q29tcGx5IHdpdGggYSBsZWdhbCBvYmxpZ2F0aW9uLjwvbGk+XG4gICAgICAgIDxsaT5NYWtlIG90aGVyIGludGVybmFsIGFuZCBsYXdmdWwgdXNlcyBvZiB0aGF0IGluZm9ybWF0aW9uIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCB0aGUgY29udGV4dCBpbiB3aGljaCB5b3UgcHJvdmlkZWQgaXQuPC9saT5cbiAgICAgIDwvb2w+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPkV4ZXJjaXNpbmcgQWNjZXNzLCBEYXRhIFBvcnRhYmlsaXR5IGFuZCBEZWxldGlvbiBSaWdodHM8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFRvIGV4ZXJjaXNlIHlvdXIgYWNjZXNzLCBkYXRhIHBvcnRhYmlsaXR5IGFuZC9vciBkZWxldGlvbiByaWdodHMgZGVzY3JpYmVkIGFib3ZlLCBwbGVhc2Ugc3VibWl0IGEgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdG8gdXMgYnkgZWl0aGVyOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2xpY2tpbmc8YSBocmVmPVwiaHR0cHM6Ly93d3cuZWxvY2FsLmNvbS9jY3BhL3ByaXZhY3lfcmlnaHRzX3JlcXVlc3RzL25ld1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+IGhlcmU8L2E+PC9saT5cbiAgICAgICAgPGxpPkNhbGxpbmcgdXMgYXQ6ICg4NzcpIDkxMy01NjIyOzwvbGk+XG4gICAgICAgIDxsaT5FbWFpbGluZyB1cyBhdDogY29ycmVzcG9uZGVuY2VAZWxvY2FsLmNvbTsgb3I8L2xpPlxuICAgICAgICA8bGk+U2VuZGluZyB1cyBVLlMuIG1haWwgdG86IGVMb2NhbC5jb20sIDEwMTAgU3ByaW5nIE1pbGwgQXZlLCBTdWl0ZSAyMDAsIENvbnNob2hvY2tlbiwgUEEsIDE5NDI4LjwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPHA+XG4gICAgICAgIE9ubHkgeW91IG9yIGEgcGVyc29uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQ2FsaWZvcm5pYSBTZWNyZXRhcnkgb2YgU3RhdGUgdGhhdCB5b3UgYXV0aG9yaXplIHRvIGFjdCBvbiB5b3VyIGJlaGFsZiwgbWF5IG1ha2UgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCByZWxhdGVkIHRvIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24uXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgWW91IG1heSBvbmx5IG1ha2UgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCBmb3IgYWNjZXNzIG9yIGRhdGEgcG9ydGFiaWxpdHkgdHdpY2Ugd2l0aGluIGEgMTItbW9udGggcGVyaW9kLiBUaGUgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgbXVzdDpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPlByb3ZpZGUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0aGF0IGFsbG93cyB1cyB0byByZWFzb25hYmx5IHZlcmlmeSB0aGF0IHlvdSBhcmU6ICgxKSB0aGUgcGVyc29uIGFib3V0IHdob20gd2UgY29sbGVjdGVkIHBlcnNvbmFsIGluZm9ybWF0aW9uOyBvciAoMikgYW4gYXV0aG9yaXplZCByZXByZXNlbnRhdGl2ZSBvZiB0aGUgYXBwbGljYWJsZSBDQSBVc2VyLjwvbGk+XG4gICAgICAgIDxsaT5EZXNjcmliZSB5b3VyIHJlcXVlc3Qgd2l0aCBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGFsbG93cyB1cyB0byBwcm9wZXJseSB1bmRlcnN0YW5kLCBldmFsdWF0ZSwgYW5kIHJlc3BvbmQgdG8gaXQuPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8cD5cbiAgICAgICAgV2UgY2Fubm90IHJlc3BvbmQgdG8geW91ciByZXF1ZXN0IG9yIHByb3ZpZGUgeW91IHdpdGggcGVyc29uYWwgaW5mb3JtYXRpb24gaWYgd2UgY2Fubm90IHZlcmlmeSB5b3VyIGlkZW50aXR5IG9yIGF1dGhvcml0eSB0byBtYWtlIHRoZSByZXF1ZXN0IGFuZCBjb25maXJtIHRoYXQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZXMgdG8geW91LiBNYWtpbmcgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCBkb2VzIG5vdCByZXF1aXJlIHlvdSB0byBjcmVhdGUgYW4gYWNjb3VudCB3aXRoIHVzLiBXZSB3aWxsIG9ubHkgdXNlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIGEgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdG8gdmVyaWZ5IHRoZSByZXF1ZXN0b3IncyBpZGVudGl0eSBvciBhdXRob3JpdHkgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+UmVzcG9uc2UgVGltaW5nIGFuZCBGb3JtYXQ8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGVuZGVhdm9yIHRvIHJlc3BvbmQgdG8gYWxsIHZlcmlmaWFibGUgQ0EgVXNlciByZXF1ZXN0cyB3aXRoaW4gZm9ydHktZml2ZSAoNDUpIGRheXMgb2YgdGhlIHJlY2VpcHQgdGhlcmVvZi4gSWYgd2UgcmVxdWlyZSBtb3JlIHRpbWUgKHVwIHRvIG5pbmV0eSAoOTApIGRheXMpLCB3ZSB3aWxsIGluZm9ybSB5b3Ugb2YgdGhlIHJlYXNvbiBhbmQgZXh0ZW5zaW9uIHBlcmlvZCBpbiB3cml0aW5nLiBXZSB3aWxsIGRlbGl2ZXIgb3VyIHdyaXR0ZW4gcmVzcG9uc2UgYnkgbWFpbCBvciBlbGVjdHJvbmljYWxseSwgYXQgeW91ciBvcHRpb24uIEFueSBkaXNjbG9zdXJlcyB3ZSBwcm92aWRlIHdpbGwgb25seSBjb3ZlciB0aGUgdHdlbHZlICgxMikgbW9udGggcGVyaW9kIHByZWNlZGluZyB0aGUgcmVjZWlwdCBvZiB5b3VyIHZlcmlmaWFibGUgcmVxdWVzdC4gVGhlIHJlc3BvbnNlIHdlIHByb3ZpZGUgd2lsbCBhbHNvIGV4cGxhaW4gdGhlIHJlYXNvbnMgd2UgY2Fubm90IGNvbXBseSB3aXRoIGEgcmVxdWVzdCwgaWYgYXBwbGljYWJsZS4gRm9yIGRhdGEgcG9ydGFiaWxpdHkgcmVxdWVzdHMsIHdlIHdpbGwgc2VsZWN0IGEgZm9ybWF0IHRvIHByb3ZpZGUgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlYWRpbHkgdXNlYWJsZSBhbmQgc2hvdWxkIGFsbG93IHlvdSB0byB0cmFuc21pdCB0aGUgaW5mb3JtYXRpb24gZnJvbSBvbmUgZW50aXR5IHRvIGFub3RoZXIgZW50aXR5IHdpdGhvdXQgaGluZHJhbmNlLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGRvIG5vdCBjaGFyZ2UgYSBmZWUgdG8gcHJvY2VzcyBvciByZXNwb25kIHRvIHlvdXIgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdW5sZXNzIGl0IGlzIGV4Y2Vzc2l2ZSwgcmVwZXRpdGl2ZSwgb3IgbWFuaWZlc3RseSB1bmZvdW5kZWQuIElmIHdlIGRldGVybWluZSB0aGF0IHRoZSByZXF1ZXN0IHdhcnJhbnRzIGEgZmVlLCB3ZSB3aWxsIHRlbGwgeW91IHdoeSB3ZSBtYWRlIHRoYXQgZGVjaXNpb24gYW5kIHByb3ZpZGUgeW91IHdpdGggYSBjb3N0IGVzdGltYXRlIGJlZm9yZSBjb21wbGV0aW5nIHlvdXIgcmVxdWVzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+Tm9uLURpc2NyaW1pbmF0aW9uPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBXZSB3aWxsIG5vdCBkaXNjcmltaW5hdGUgYWdhaW5zdCB5b3UgZm9yIGV4ZXJjaXNpbmcgYW55IG9mIHlvdXIgQ0NQQSByaWdodHMuIFVubGVzcyBwZXJtaXR0ZWQgYnkgdGhlIENDUEEsIHdlIHdpbGwgbm90OlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+RGVueSB5b3UgZ29vZHMgb3Igc2VydmljZXM7PC9saT5cbiAgICAgICAgPGxpPkNoYXJnZSB5b3UgZGlmZmVyZW50IHByaWNlcyBvciByYXRlcyBmb3IgZ29vZHMgb3Igc2VydmljZXMsIGluY2x1ZGluZyB0aHJvdWdoIGdyYW50aW5nIGRpc2NvdW50cyBvciBvdGhlciBiZW5lZml0cywgb3IgaW1wb3NpbmcgcGVuYWx0aWVzOzwvbGk+XG4gICAgICAgIDxsaT5Qcm92aWRlIHlvdSBhIGRpZmZlcmVudCBsZXZlbCBvciBxdWFsaXR5IG9mIGdvb2RzIG9yIHNlcnZpY2VzOyBhbmQvb3I8L2xpPlxuICAgICAgICA8bGk+U3VnZ2VzdCB0aGF0IHlvdSBtYXkgcmVjZWl2ZSBhIGRpZmZlcmVudCBwcmljZSBvciByYXRlIGZvciBnb29kcyBvciBzZXJ2aWNlcyBvciBhIGRpZmZlcmVudCBsZXZlbCBvciBxdWFsaXR5IG9mIGdvb2RzIG9yIHNlcnZpY2VzLjwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5DaGFuZ2VzIHRvIHRoZXNlIFByb3Zpc2lvbnM8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGFtZW5kIHRoZXNlIFByb3Zpc2lvbnMgaW4gb3VyIGRpc2NyZXRpb24gYW5kIGF0IGFueSB0aW1lLiBXaGVuIHdlIG1ha2UgY2hhbmdlcyB0byB0aGVzZSBQcm92aXNpb25zLCB3ZSB3aWxsIG5vdGlmeSB5b3UgYnkgZW1haWwgb3IgdGhyb3VnaCBhIG5vdGljZSBvbiB0aGUgU2l0ZSZhcG9zO3MgaG9tZXBhZ2UuXG4gICAgICA8L3A+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPkNvbnRhY3QgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMgYWJvdXQgdGhlc2UgUHJvdmlzaW9ucywgb3VyIFByaXZhY3kgUG9saWN5LCB0aGUgd2F5cyBpbiB3aGljaCB3ZSBjb2xsZWN0IGFuZCB1c2UgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiwgeW91ciBjaG9pY2VzIGFuZCByaWdodHMgcmVnYXJkaW5nIHN1Y2ggdXNlLCBvciB3aXNoIHRvIGV4ZXJjaXNlIHlvdXIgcmlnaHRzIHVuZGVyIENhbGlmb3JuaWEgbGF3LCBwbGVhc2UgZG8gbm90IGhlc2l0YXRlIHRvIGNvbnRhY3QgdXMgYnkgZWl0aGVyOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2xpY2tpbmc8YSBocmVmPVwiaHR0cHM6Ly93d3cuZWxvY2FsLmNvbS9jY3BhL3ByaXZhY3lfcmlnaHRzX3JlcXVlc3RzL25ld1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5XCI+IGhlcmU8L2E+PC9saT5cbiAgICAgICAgPGxpPkNhbGxpbmcgdXMgYXQ6ICg4NzcpIDkxMy01NjIyOzwvbGk+XG4gICAgICAgIDxsaT5FbWFpbGluZyB1cyBhdDogY29ycmVzcG9uZGVuY2VAZWxvY2FsLmNvbTsgb3I8L2xpPlxuICAgICAgICA8bGk+U2VuZGluZyB1cyBVLlMuIG1haWwgdG86IGVMb2NhbC5jb20sIDEwMTAgU3ByaW5nIE1pbGwgQXZlLCBTdWl0ZSAyMDAsIENvbnNob2hvY2tlbiwgUEEsIDE5NDI4LjwvbGk+XG4gICAgICA8L3VsPlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gIClcbn1cblxuUHJpdmFjeS5wcm9wVHlwZXMgPSB7XG4gIGRvbWFpbjogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBpc1RyYWRlbWFya2VkOiBQcm9wVHlwZXMuYm9vbCxcbn1cblxuUHJpdmFjeS5kZWZhdWx0UHJvcHMgPSB7XG4gIGlzVHJhZGVtYXJrZWQ6IGZhbHNlLFxufVxuXG5leHBvcnQgZGVmYXVsdCBQcml2YWN5XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgUHJvcFR5cGVzIGZyb20gJ3Byb3AtdHlwZXMnXG5cbmNvbnN0IFByaXZhY3lDYWxpZm9ybmlhID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgZG9tYWluLFxuICAgIGlzVHJhZGVtYXJrZWQsXG4gIH0gPSBwcm9wc1xuXG4gIGNvbnN0IHJlbmRlckRvbWFpbiA9ICgpID0+IHtcbiAgICByZXR1cm4gPHNwYW4+e2RvbWFpbi5yZXBsYWNlKCcuY29tJywgJycpfXtpc1RyYWRlbWFya2VkICYmIDxzcGFuPiZ0cmFkZTs8L3NwYW4+fTwvc3Bhbj5cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFJlYWN0LkZyYWdtZW50PlxuICAgICAgPGgyPkNhbGlmb3JuaWEgUHJpdmFjeSBQb2xpY3k8L2gyPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAge2RvbWFpbn08YnIgLz5cbiAgICAgICAgICB7cmVuZGVyRG9tYWluKCl9IFdlYnNpdGU8YnIgLz5cbiAgICAgICAgICBDYWxpZm9ybmlhIFByaXZhY3kgTm90aWNlIExhc3QgVXBkYXRlZDogSmFudWFyeSAxLCAyMDIwXG4gICAgICAgIDwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPGgzPlByaXZhY3kgTm90aWNlIGZvciBDYWxpZm9ybmlhIFJlc2lkZW50czwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgVGhpcyBQcml2YWN5IE5vdGljZSBmb3IgQ2FsaWZvcm5pYSBSZXNpZGVudHMgKFwiUHJpdmFjeSBOb3RpY2VcIikgc3VwcGxlbWVudHMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUge3JlbmRlckRvbWFpbigpfSBQcml2YWN5IFBvbGljeSAodGhlIFwiUHJpdmFjeSBQb2xpY3lcIikgbWFkZSBhdmFpbGFibGUgb24gdGhlIHdlYnNpdGUgbG9jYXRlZCBhdCB7ZG9tYWlufSAodGhlIFwiU2l0ZVwiKS4gVGhlIFNpdGUgaXMgb3duZWQgYW5kIG9wZXJhdGVkIGJ5IGVMb2NhbCBVU0EgTExDIChcIkNvbXBhbnksXCIgXCJ3ZSxcIiBcInVzXCIgb3IgXCJvdXJcIikuIFRoaXMgUHJpdmFjeSBOb3RpY2UgYXBwbGllcyBzb2xlbHkgdG8gcmVzaWRlbnRzIG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhIChcIlVzZXJzXCIpLiBXZSBhZG9wdCB0aGlzIFByaXZhY3kgTm90aWNlIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgQ2FsaWZvcm5pYSBDb25zdW1lciBQcml2YWN5IEFjdCBvZiAyMDE4IChcIkNDUEFcIikuIEFueSB0ZXJtcyBkZWZpbmVkIGluIHRoZSBDQ1BBIGhhdmUgdGhlIHNhbWUgbWVhbmluZyB3aGVuIHVzZWQgaW4gdGhpcyBQcml2YWN5IE5vdGljZS4gVXNlcnMgd2l0aCBkaXNhYmlsaXRpZXMgd2hvIHdpc2ggdG8gYWNjZXNzIHRoaXMgUHJpdmFjeSBOb3RpY2UgaW4gYW4gYWx0ZXJuYXRpdmUgZm9ybWF0IGNhbiBjb250YWN0IHVzIGJ5IGNhbGxpbmcgdXMgYXQ6ICg4NzcpIDkxMy01NjIyOyBlbWFpbGluZyB1cyBhdDogY29ycmVzcG9uZGVuY2VAZUxvY2FsLmNvbTsgb3Igc2VuZGluZyB1cyBVLlMuIG1haWwgdG86IGVMb2NhbC5jb20sIDEwMTAgU3ByaW5nIE1pbGwgQXZlLCBTdWl0ZSAyMDAsIENvbnNob2hvY2tlbiwgUEEsIDE5NDI4LlxuICAgICAgPC9wPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5DYXRlZ29yaWVzIG9mIEluZm9ybWF0aW9uIFdlIENvbGxlY3Q8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGNvbGxlY3QgaW5mb3JtYXRpb24gdGhhdCBpZGVudGlmaWVzLCByZWxhdGVzIHRvLCBkZXNjcmliZXMsIHJlZmVyZW5jZXMsIGlzIGNhcGFibGUgb2YgYmVpbmcgYXNzb2NpYXRlZCB3aXRoLCBvciBjb3VsZCByZWFzb25hYmx5IGJlIGxpbmtlZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgd2l0aCBhIHBhcnRpY3VsYXIgQ0EgVXNlciBvciBkZXZpY2VcbiAgICAgICAgKFwiPHU+cGVyc29uYWwgaW5mb3JtYXRpb248L3U+XCIpLiBJbiBwYXJ0aWN1bGFyLCB3ZSBoYXZlIGNvbGxlY3RlZCB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gZnJvbSBDQSBVc2VycyB3aXRoaW4gdGhlIGxhc3QgdHdlbHZlICgxMikgbW9udGhzOlxuICAgICAgPC9wPlxuICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cImNhbGlmb3JuaWEtaW5mb3JtYXRpb24tY29udGFpbmVyXCIgYm9yZGVyPVwiMXB4XCIgY2VsbFNwYWNpbmc9XCIwXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGg+Q2F0ZWdvcnk8L3RoPlxuICAgICAgICAgICAgPHRoPkV4YW1wbGVzPC90aD5cbiAgICAgICAgICAgIDx0aD5Db2xsZWN0ZWQ8L3RoPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPkEuIElkZW50aWZpZXJzLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+QSByZWFsIG5hbWUsIGFsaWFzLCBwb3N0YWwgYWRkcmVzcywgdW5pcXVlIHBlcnNvbmFsIGlkZW50aWZpZXIsIG9ubGluZSBpZGVudGlmaWVyLCBJbnRlcm5ldCBQcm90b2NvbCBhZGRyZXNzLCBlbWFpbCBhZGRyZXNzLCBhY2NvdW50IG5hbWUsIHRlbGVwaG9uZSBudW1iZXIsIG9yIG90aGVyIHNpbWlsYXIgaWRlbnRpZmllcnMuPC90ZD5cbiAgICAgICAgICAgIDx0ZD5ZRVM8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPkIuIFBlcnNvbmFsIGluZm9ybWF0aW9uIGNhdGVnb3JpZXMgbGlzdGVkIGluIHRoZSBDYWxpZm9ybmlhIEN1c3RvbWVyIFJlY29yZHMgc3RhdHV0ZSAoQ2FsLiBDaXYuIENvZGUgwqcgMTc5OC44MChlKSkuPC90ZD5cbiAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgQSBuYW1lLCBzaWduYXR1cmUsIFNvY2lhbCBTZWN1cml0eSBudW1iZXIsIHBoeXNpY2FsIGNoYXJhY3RlcmlzdGljcyBvciBkZXNjcmlwdGlvbiwgcG9zdGFsIGFkZHJlc3MsIHRlbGVwaG9uZSBudW1iZXIsIHBhc3Nwb3J0IG51bWJlciwgZHJpdmVyJ3MgbGljZW5zZSBvciBTdGF0ZSBpZGVudGlmaWNhdGlvbiBjYXJkIG51bWJlciwgaW5zdXJhbmNlIHBvbGljeSBudW1iZXIsIGVkdWNhdGlvbiwgZW1wbG95bWVudCwgZW1wbG95bWVudCBoaXN0b3J5LCBiYW5rIGFjY291bnQgbnVtYmVyLCBjcmVkaXQgY2FyZCBudW1iZXIsIGRlYml0IGNhcmQgbnVtYmVyLCBvciBhbnkgb3RoZXIgZmluYW5jaWFsIGluZm9ybWF0aW9uLCBtZWRpY2FsIGluZm9ybWF0aW9uLCBvciBoZWFsdGggaW5zdXJhbmNlIGluZm9ybWF0aW9uLiBTb21lIHBlcnNvbmFsIGluZm9ybWF0aW9uIGluY2x1ZGVkIGluIHRoaXMgY2F0ZWdvcnkgbWF5IG92ZXJsYXAgd2l0aCBvdGhlciBjYXRlZ29yaWVzLlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDx0ZD5ZRVM8L3RkPlxuICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRkPkQuIENvbW1lcmNpYWwgaW5mb3JtYXRpb24uPC90ZD5cbiAgICAgICAgICAgIDx0ZD5SZWNvcmRzIG9mIHBlcnNvbmFsIHByb3BlcnR5LCBwcm9kdWN0cyBvciBzZXJ2aWNlcyBwdXJjaGFzZWQsIG9idGFpbmVkLCBvciBjb25zaWRlcmVkLCBvciBvdGhlciBwdXJjaGFzaW5nIG9yIGNvbnN1bWluZyBoaXN0b3JpZXMgb3IgdGVuZGVuY2llcy48L3RkPlxuICAgICAgICAgICAgPHRkPllFUzwvdGQ+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQ+Ri4gSW50ZXJuZXQgb3Igb3RoZXIgc2ltaWxhciBuZXR3b3JrIGFjdGl2aXR5LjwvdGQ+XG4gICAgICAgICAgICA8dGQ+QnJvd3NpbmcgaGlzdG9yeSwgc2VhcmNoIGhpc3RvcnksIGluZm9ybWF0aW9uIG9uIGEgQ0EgVXNlcidzIGludGVyYWN0aW9uIHdpdGggYSB3ZWJzaXRlLCBhcHBsaWNhdGlvbiBvciBhZHZlcnRpc2VtZW50LjwvdGQ+XG4gICAgICAgICAgICA8dGQ+WUVTPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0ZD5JLiBQcm9mZXNzaW9uYWwgb3IgZW1wbG95bWVudC1yZWxhdGVkIGluZm9ybWF0aW9uLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+Q3VycmVudCBvciBwYXN0IGpvYiBoaXN0b3J5IG9yIHBlcmZvcm1hbmNlIGV2YWx1YXRpb25zLjwvdGQ+XG4gICAgICAgICAgICA8dGQ+WUVTPC90ZD5cbiAgICAgICAgICA8L3RyPlxuICAgICAgICA8L3Rib2R5PlxuICAgICAgPC90YWJsZT5cbiAgICAgIDxwPlBlcnNvbmFsIGluZm9ybWF0aW9uIGRvZXMgbm90IGluY2x1ZGU6PC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+UHVibGljbHkgYXZhaWxhYmxlIGluZm9ybWF0aW9uIGZyb20gZ292ZXJubWVudCByZWNvcmRzLjwvbGk+XG4gICAgICAgIDxsaT5EZS1pZGVudGlmaWVkIG9yIGFnZ3JlZ2F0ZWQgQ0EgVXNlciBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgICA8bGk+SW5mb3JtYXRpb24gZXhjbHVkZWQgZnJvbSB0aGUgQ0NQQSZhcG9zO3Mgc2NvcGUsIHN1Y2ggYXM6PC9saT5cbiAgICAgICAgPHVsPlxuICAgICAgICAgIDxsaT5oZWFsdGggb3IgbWVkaWNhbCBpbmZvcm1hdGlvbiBjb3ZlcmVkIGJ5IHRoZSBIZWFsdGggSW5zdXJhbmNlIFBvcnRhYmlsaXR5IGFuZCBBY2NvdW50YWJpbGl0eSBBY3Qgb2YgMTk5NiAoSElQQUEpIGFuZCB0aGUgQ2FsaWZvcm5pYSBDb25maWRlbnRpYWxpdHkgb2YgTWVkaWNhbCBJbmZvcm1hdGlvbiBBY3QgKENNSUEpIG9yIGNsaW5pY2FsIHRyaWFsIGRhdGE7IGFuZDwvbGk+XG4gICAgICAgICAgPGxpPnBlcnNvbmFsIGluZm9ybWF0aW9uIGNvdmVyZWQgYnkgY2VydGFpbiBzZWN0b3Itc3BlY2lmaWMgcHJpdmFjeSBsYXdzLCBpbmNsdWRpbmcgdGhlIEZhaXIgQ3JlZGl0IFJlcG9ydGluZyBBY3QgKEZSQ0EpLCB0aGUgR3JhbW0tTGVhY2gtQmxpbGV5IEFjdCAoR0xCQSkgb3IgQ2FsaWZvcm5pYSBGaW5hbmNpYWwgSW5mb3JtYXRpb24gUHJpdmFjeSBBY3QgKEZJUEEpLCBhbmQgdGhlIERyaXZlcidzIFByaXZhY3kgUHJvdGVjdGlvbiBBY3Qgb2YgMTk5NC48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC91bD5cbiAgICAgIDxwPldlIG9idGFpbiB0aGUgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiBsaXN0ZWQgYWJvdmUgZnJvbSB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMgb2Ygc291cmNlcyAod2l0aCB0aGUgc3BlY2lmaWMgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbmRpY2F0ZWQgaW4gcGFyZW50aGVzaXMpOjwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPkRpcmVjdGx5IGZyb20gb3VyIENBIFVzZXJzLiBGb3IgZXhhbXBsZSwgZnJvbSBvbmxpbmUgcmVnaXN0cmF0aW9uIGZvcm1zIHRoYXQgb3VyIENBIFVzZXJzIHN1Ym1pdCB0byB1cyByZWxhdGVkIHRvIHRoZSBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMgdGhhdCB3ZSAoYW5kIG91ciB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVycykgb2ZmZXIgYnkgYW5kIHRocm91Z2ggdGhlIFNpdGUuIChDYXRlZ29yeSBBLCBCLCBEIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5JbmRpcmVjdGx5IGZyb20gb3VyIENBIFVzZXJzLiBGb3IgZXhhbXBsZSwgdGhyb3VnaCBpbmZvcm1hdGlvbiB3ZSBjb2xsZWN0IGZyb20gb3VyIENBIFVzZXJzIGluIHRoZSBjb3Vyc2Ugb2YgcHJvdmlkaW5nIG91ciBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMgdG8gdGhlbS4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPkRpcmVjdGx5IGFuZCBpbmRpcmVjdGx5IGZyb20gYWN0aXZpdHkgb24gdGhlIFNpdGUuIFRoaXMgaW5jbHVkZXMgdGhlIHR5cGUgb2YgYnJvd3NlciB0aGF0IHlvdSB1c2UgKGUuZy4sIFNhZmFyaSwgQ2hyb21lLCBJbnRlcm5ldCBFeHBsb3JlciksIHlvdXIgSVAgYWRkcmVzcywgdGhlIHR5cGUgb2Ygb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSB1c2UgKGUuZy4sIFdpbmRvd3Mgb3IgaU9TKSBhbmQgdGhlIGRvbWFpbiBuYW1lIG9mIHlvdXIgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlci4gSW4gYWRkaXRpb24sIHdlIG9idGFpbiBjZXJ0YWluIFNpdGUgdXNhZ2UgZGV0YWlscyBhbmQgYW5hbHl0aWNzIGFzIHNhbWUgYXJlIGNvbGxlY3RlZCBhdXRvbWF0aWNhbGx5IGJ5IHVzIGFuZCBvdXIgdGhpcmQgcGFydHkgcGFydG5lcnMuIChDYXRlZ29yeSBGKTwvbGk+XG4gICAgICAgIDxsaT5Gcm9tIHRoaXJkLXBhcnRpZXMgdGhhdCBpbnRlcmFjdCB3aXRoIHVzIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIHRoYXQgd2Ugb2ZmZXIgdG8gb3VyIENBIFVzZXJzLiBGb3IgZXhhbXBsZSwgdGhpcmQgcGFydHkgZW50aXRpZXMgdGhhdCBhc3Npc3QgdXMgaW4gc2VuZGluZyBkaXJlY3QgYW5kIGVsZWN0cm9uaWMgbWFpbCwgcmVtb3ZpbmcgZHVwbGljYXRlIGluZm9ybWF0aW9uIGZyb20gQ0EgVXNlciBsaXN0cywgYW5hbHl6aW5nIGRhdGEgYW5kIHByb3ZpZGluZyBtYXJrZXRpbmcgYW5hbHlzaXMuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5Gcm9tIHRoaXJkLXBhcnR5IGRhdGEgYnJva2VycyBvciBhZ2dyZWdhdG9ycy4gKENhdGVnb3J5IEEsIEIsIEQgYW5kIEkpPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPlVzZSBvZiBQZXJzb25hbCBJbmZvcm1hdGlvbjwvaDM+XG4gICAgICA8cD5XZSBtYXkgdXNlIG9yIGRpc2Nsb3NlIHRoZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IHdlIGNvbGxlY3QgZm9yIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgYnVzaW5lc3MgcHVycG9zZXMgKHdpdGggdGhlIHNwZWNpZmljIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gaW5kaWNhdGVkIGluIHBhcmVudGhlc2lzKTo8L3A+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaT5UbyBmdWxmaWxsIG9yIG1lZXQgdGhlIHJlYXNvbiBmb3Igd2hpY2ggdGhlIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IHByb3ZpZGUgdXMgd2l0aCBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbiBjb25uZWN0aW9uIHdpdGggeW91ciByZXF1ZXN0IGZvciBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMgZnJvbSB0aGUgdGhpcmQgcGFydHkgc2VydmljZSBwcm92aWRlcnMgZmVhdHVyZWQgb24gdGhlIFNpdGUsIGFzIHdlbGwgYXMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBvdGhlciBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMgZmVhdHVyZWQgb24gdGhlIFNpdGUsIHdlIHdpbGwgdXNlIHRoYXQgcGVyc29uYWwgaW5mb3JtYXRpb24gdG8gYmV0dGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHJlcXVlc3RlZCBpbmZvcm1hdGlvbi4gKENhdGVnb3J5IEEsIEIsIEQgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIGVuYWJsZSB0aGUgdGhpcmQtcGFydHkgc2VydmljZSBwcm92aWRlcnMgZmVhdHVyZWQgb24gdGhlIFNpdGUgdG8gY29udGFjdCB5b3UgcmVnYXJkaW5nIHRoZSBmZWF0dXJlZCBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMuIChDYXRlZ29yeSBBLCBCLCBEIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBwcm92aWRlIHlvdSB3aXRoIGluZm9ybWF0aW9uLCBwcm9kdWN0cyBvciBzZXJ2aWNlcyB0aGF0IHlvdSByZXF1ZXN0IGZyb20gdXMuIChDYXRlZ29yeSBBLCBCLCBEIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBjcmVhdGUsIG1haW50YWluLCBjdXN0b21pemUgYW5kIHNlY3VyZSB5b3VyIGFjY291bnQgd2l0aCB1cy4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIHByb3ZpZGUgeW91IHdpdGggZS1tYWlsLCBkaXJlY3QgbWFpbCBhbmQgdGVsZW1hcmtldGluZyBtZXNzYWdlcyBjb25jZXJuaW5nIGNlcnRhaW4gQ29tcGFueSBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMsIGFzIHdlbGwgYXMgdGhpcmQtcGFydHkgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzLCB0aGF0IHdlIGJlbGlldmUgbWF5IGJlIG9mIGludGVyZXN0IHRvIHlvdS4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRvIGRlbGl2ZXIgcmVsZXZhbnQgU2l0ZSBjb250ZW50IGFuZCBhZHZlcnRpc2VtZW50cyB0byB5b3UgYW5kIG1lYXN1cmUgb3IgdW5kZXJzdGFuZCB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgYWR2ZXJ0aXNpbmcgd2Ugc2VydmUgdG8geW91LiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gY2Fycnkgb3V0IG91ciBvYmxpZ2F0aW9ucyBhbmQgZW5mb3JjZSBvdXIgcmlnaHRzIGFyaXNpbmcgZnJvbSBhbnkgY29udHJhY3RzIGVudGVyZWQgaW50byBiZXR3ZWVuIHlvdSBhbmQgdXMsIGluY2x1ZGluZyB0aGUgU2l0ZSZhcG9zO3MgVGVybXMgYW5kIENvbmRpdGlvbnMuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UbyBpbXByb3ZlIHRoZSBTaXRlIGFuZCBiZXR0ZXIgcHJlc2VudCBpdHMgY29udGVudHMgdG8geW91LiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+Rm9yIGN1c3RvbWVyIHNlcnZpY2UgcHVycG9zZXMgYW5kIHRvIHJlc3BvbmQgdG8gaW5xdWlyaWVzIGZyb20geW91LiAoQ2F0ZWdvcnkgQSBhbmQgQik8L2xpPlxuICAgICAgICA8bGk+Rm9yIHRlc3RpbmcsIHJlc2VhcmNoLCBhbmFseXNpcyBhbmQgcHJvZHVjdCBkZXZlbG9wbWVudC4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPkFzIG5lY2Vzc2FyeSBvciBhcHByb3ByaWF0ZSB0byBwcm90ZWN0IG91ciByaWdodHMsIHByb3BlcnR5IG9yIHNhZmV0eSwgYW5kIHRoYXQgb2Ygb3VyIGNsaWVudHMgb3Igb3RoZXJzLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gcmVzcG9uZCB0byBsYXcgZW5mb3JjZW1lbnQgcmVxdWVzdHMgYW5kIGFzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3LCBjb3VydCBvcmRlciwgb3IgZ292ZXJubWVudGFsIHJlZ3VsYXRpb25zLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+QXMgZGVzY3JpYmVkIHRvIHlvdSB3aGVuIGNvbGxlY3RpbmcgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBvciBhcyBvdGhlcndpc2Ugc2V0IGZvcnRoIGluIHRoZSBDQ1BBLiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk8L2xpPlxuICAgICAgICA8bGk+VG8gZXZhbHVhdGUgb3IgY29uZHVjdCBhIG1lcmdlciwgZGl2ZXN0aXR1cmUsIHJlc3RydWN0dXJpbmcsIHJlb3JnYW5pemF0aW9uLCBkaXNzb2x1dGlvbiBvciBvdGhlciBzYWxlIG9yIHRyYW5zZmVyIG9mIHNvbWUgb3IgYWxsIG9mIG91ciBhc3NldHMsIHdoZXRoZXIgYXMgYSBnb2luZyBjb25jZXJuIG9yIGFzIHBhcnQgb2YgYmFua3J1cHRjeSwgbGlxdWlkYXRpb24gb3Igc2ltaWxhciBwcm9jZWVkaW5nLCBpbiB3aGljaCBwZXJzb25hbCBpbmZvcm1hdGlvbiBoZWxkIGJ5IHVzIGlzIGFtb25nIHRoZSBhc3NldHMgdHJhbnNmZXJyZWQuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPHA+XG4gICAgICAgIFdlIHdpbGwgbm90IGNvbGxlY3QgYWRkaXRpb25hbCBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9yIHVzZSB0aGUgcGVyc29uYWwgaW5mb3JtYXRpb24gd2UgY29sbGVjdGVkIGZvciBtYXRlcmlhbGx5IGRpZmZlcmVudCwgdW5yZWxhdGVkIG9yIGluY29tcGF0aWJsZSBwdXJwb3NlcyB3aXRob3V0IHByb3ZpZGluZyB5b3Ugd2l0aCBub3RpY2UuXG4gICAgICA8L3A+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPlNoYXJpbmcgUGVyc29uYWwgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFN1YmplY3QgdG8geW91ciByaWdodCB0byBvcHQtb3V0IG9mIHN1Y2ggc2hhcmluZy9zYWxlLCB3ZSBtYXkgc2hhcmUsIHJlbnQgYW5kL29yIHNlbGwgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiAoQ2F0ZWdvcnkgQSwgQiwgRCwgRiBhbmQgSSk6IChhKSB3aXRoL3RvIHRoZSB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IG9mZmVyIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgZmVhdHVyZWQgb24gdGhlIFNpdGU7IGFuZCAoYikgZm9yIHRoZSBvdGhlciBidXNpbmVzcyBwdXJwb3NlcyBzZXQgZm9ydGggYWJvdmUuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgV2hlbiB3ZSBkaXNjbG9zZSBwZXJzb25hbCBpbmZvcm1hdGlvbiB0byBhIHRoaXJkIHBhcnR5IHNlcnZpY2UgcHJvdmlkZXIgb3Igb3RoZXIgZW50aXR5LCB3ZSBlbnRlciBpbnRvIGEgY29udHJhY3R1YWwgcmVsYXRpb25zaGlwIHRoYXQgZGVzY3JpYmVzIHRoZSBwdXJwb3NlIGZvciB3aGljaCBzdWNoIHRoaXJkIHBhcnR5IG1heSB1c2UgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIGFuZCByZXF1aXJlcyB0aGF0IHRoaXJkIHBhcnR5IHRvIGJvdGgga2VlcCB0aGUgcGVyc29uYWwgaW5mb3JtYXRpb24gY29uZmlkZW50aWFsIGFuZCBub3QgdXNlIGl0IGZvciBhbnkgcHVycG9zZSBvdGhlciB0aGFuIHRoZSBwZXJmb3JtYW5jZSBvZiBpdHMgc2VydmljZXMgdW5kZXIgdGhlIGFwcGxpY2FibGUgY29udHJhY3QuIFBsZWFzZSBub3RlLCB3ZSBkbyBub3QgY29sbGVjdCBpbmZvcm1hdGlvbiBmcm9tIENBIFVzZXJzIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhcmUgbGVzcyB0aGFuIGVpZ2h0ZWVuICgxOCkgeWVhcnMgb2YgYWdlIGFuZCB3ZSBkbyBub3Qgc2hhcmUgb3Igc2VsbCB0aGUgcGVyc29uYWwgaW5mb3JtYXRpb24gb2YgQ0EgVXNlcnMgdGhhdCB3ZSBhY3R1YWxseSBrbm93IGFyZSBsZXNzIHRoYW4gZWlnaHRlZW4gKDE4KSB5ZWFycyBvZiBhZ2UuIFdpdGhvdXQgbGltaXRpbmcgdGhlIGZvcmVnb2luZywgd2UgaGF2ZSBub3Qgc2hhcmVkIG9yIHNvbGQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9mIENBIFVzZXJzIHRoYXQgd2UgYWN0dWFsbHkga25vdyBhcmUgbGVzcyB0aGFuIHNpeHRlZW4gKDE2KSB5ZWFycyBvZiBhZ2UgaW4gdGhlIHByZWNlZGluZyB0d2VsdmUgKDEyKSBtb250aHMuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgSW4gdGhlIHByZWNlZGluZyB0d2VsdmUgKDEyKSBtb250aHMsIHdlIGhhdmUgZGlzY2xvc2VkIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgYSBidXNpbmVzcyBwdXJwb3NlOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgQS5cdElkZW50aWZpZXJzLjwvbGk+XG4gICAgICAgIDxsaT5DYXRlZ29yeSBCLiBDYWxpZm9ybmlhIEN1c3RvbWVyIFJlY29yZHMgcGVyc29uYWwgaW5mb3JtYXRpb24gY2F0ZWdvcmllcy48L2xpPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgRC4gQ29tbWVyY2lhbCBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgICA8bGk+4oCoQ2F0ZWdvcnkgRi4gSW50ZXJuZXQgb3Igb3RoZXIgc2ltaWxhciBuZXR3b3JrIGFjdGl2aXR5LjwvbGk+XG4gICAgICAgIDxsaT7igKhDYXRlZ29yeSBJLiBQcm9mZXNzaW9uYWwgb3IgZW1wbG95bWVudC1yZWxhdGVkIGluZm9ybWF0aW9uLjwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGRpc2Nsb3NlIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIGEgYnVzaW5lc3MgcHVycG9zZSB0byB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXMgb2YgdGhpcmQgcGFydGllcyAod2l0aCB0aGUgc3BlY2lmaWMgY2F0ZWdvcmllcyBvZiBwZXJzb25hbCBpbmZvcm1hdGlvbiBpbmRpY2F0ZWQgaW4gcGFyZW50aGVzaXMpOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+T3VyIGFmZmlsaWF0ZXMuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5TZXJ2aWNlIHByb3ZpZGVycy4gKENhdGVnb3J5IEEsIEIsIEQsIEYgYW5kIEkpPC9saT5cbiAgICAgICAgPGxpPlRoZSB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IG9mZmVyIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgZmVhdHVyZWQgb24gdGhlIFNpdGUuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICAgIDxsaT5UaGlyZCBwYXJ0aWVzIHRvIHdob20geW91IGF1dGhvcml6ZSB1cyB0byBkaXNjbG9zZSB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIHRoYXQgd2UgcHJvdmlkZSB0byB5b3UuIChDYXRlZ29yeSBBLCBCLCBELCBGIGFuZCBJKTwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPHA+XG4gICAgICAgIEluIHRoZSBwcmVjZWRpbmcgdHdlbHZlICgxMikgbW9udGhzLCB3ZSBoYXZlIHNvbGQgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIHRoaXJkIHBhcnRpZXM6XG4gICAgICA8L3A+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaT5DYXRlZ29yeSBBLiBJZGVudGlmaWVycy48L2xpPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgQi4gQ2FsaWZvcm5pYSBDdXN0b21lciBSZWNvcmRzIHBlcnNvbmFsIGluZm9ybWF0aW9uIGNhdGVnb3JpZXMuPC9saT5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEQuIENvbW1lcmNpYWwgaW5mb3JtYXRpb24u4oCoPC9saT5cbiAgICAgICAgPGxpPkNhdGVnb3J5IEYuIEludGVybmV0IG9yIG90aGVyIHNpbWlsYXIgbmV0d29yayBhY3Rpdml0eS7igKg8L2xpPlxuICAgICAgICA8bGk+Q2F0ZWdvcnkgSS4gUHJvZmVzc2lvbmFsIG9yIGVtcGxveW1lbnQtcmVsYXRlZCBpbmZvcm1hdGlvbi48L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxwPlxuICAgICAgICBJbiB0aGUgcHJlY2VkaW5nIHR3ZWx2ZSAoMTIpIG1vbnRocywgd2UgaGF2ZSBzb2xkIHRoZSBhYm92ZSByZWZlcmVuIGNlZCBjYXRlZ29yaWVzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSB0aGlyZCBwYXJ0eSBzZXJ2aWNlIHByb3ZpZGVycyB0aGF0IG9mZmVyIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgZmVhdHVyZWQgb24gdGhlIFNpdGUuXG4gICAgICA8L3A+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPllvdXIgUmlnaHRzIGFuZCBDaG9pY2VzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBUaGUgQ0NQQSBwcm92aWRlcyBDQSBVc2VycyAoQ2FsaWZvcm5pYSByZXNpZGVudHMpIHdpdGggc3BlY2lmaWMgcmlnaHRzIHJlZ2FyZGluZyB0aGVpciBwZXJzb25hbCBpbmZvcm1hdGlvbi4gVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB5b3VyIENDUEEgcmlnaHRzIGFuZCBleHBsYWlucyBob3cgdG8gZXhlcmNpc2UgdGhvc2UgcmlnaHRzLlxuICAgICAgPC9wPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIiBpZD1cImRvLW5vdC1zZWxsXCI+T3B0LU91dCBmcm9tIHRoZSBTYWxlIG9mIFlvdXIgUGVyc29uYWwgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFlvdSBoYXZlIHRoZSByaWdodCB0byBvcHQtb3V0IG9mIG91ciBzYWxlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gdG8gdGhpcmQgcGFydGllcy4gVG8gZXhlcmNpc2UgeW91ciByaWdodCB0byBvcHQtb3V0IG9mIG91ciBzYWxlIG9mIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24gdG8gdGhpcmQgcGFydGllcywgcGxlYXNlIHN1Ym1pdCBhIHZlcmlmaWFibGUgQ0EgVXNlciByZXF1ZXN0IHRvIHVzIGJ5IGVpdGhlcjpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPkNsaWNraW5nPGEgaHJlZj1cImh0dHBzOi8vd3d3LmVsb2NhbC5jb20vY2NwYS9vcHRfb3V0cy9uZXdcIiBkYXRhLWRlbGVnYXRlPVwiUHJpdmFjeUNhbGlmb3JuaWFcIj4gaGVyZTwvYT48L2xpPlxuICAgICAgICA8bGk+Q2FsbGluZyB1cyBhdDogKDg3NykgOTEzLTU2MjI7IDwvbGk+XG4gICAgICAgIDxsaT5FbWFpbGluZyB1cyBhdDogY29ycmVzcG9uZGVuY2VAZWxvY2FsLmNvbTsgb3IgPC9saT5cbiAgICAgICAgPGxpPlNlbmRpbmcgdXMgVS5TLiBtYWlsIHRvOiBlTG9jYWwuY29tLCAxMDEwIFNwcmluZyBNaWxsIEF2ZSwgU3VpdGUgMjAwLCBDb25zaG9ob2NrZW4sIFBBLCAxOTQyOC48L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxwPlxuICAgICAgICBXZSBlbmRlYXZvciB0byBhY3Qgb24gYWxsIG9wdC1vdXQgcmVxdWVzdHMgYXMgc29vbiBhcyBwcmFjdGljYWJsZSwgYnV0IGluIGFsbCBjYXNlcyB3aXRoaW4gZmlmdGVlbiAoMTUpIGRheXMgb2YgdGhlIHJlY2VpcHQgb2YgeW91ciByZXF1ZXN0LlxuICAgICAgPC9wPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5BY2Nlc3MgdG8gU3BlY2lmaWMgSW5mb3JtYXRpb24gYW5kIERhdGEgUG9ydGFiaWxpdHkgUmlnaHRzPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBZb3UgaGF2ZSB0aGUgcmlnaHQgdG8gcmVxdWVzdCB0aGF0IHdlIGRpc2Nsb3NlIGNlcnRhaW4gaW5mb3JtYXRpb24gdG8geW91IGFib3V0IG91ciBjb2xsZWN0aW9uIGFuZCB1c2Ugb2YgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBvdmVyIHRoZSBwYXN0IHR3ZWx2ZSAoMTIpIG1vbnRocy4gT25jZSB3ZSByZWNlaXZlIGFuZCBjb25maXJtIHlvdXIgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QsIHdlIHdpbGwgZGlzY2xvc2UgdG8geW91OlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+VGhlIGNhdGVnb3JpZXMgb2YgcGVyc29uYWwgaW5mb3JtYXRpb24gd2UgY29sbGVjdGVkIGFib3V0IHlvdS48L2xpPlxuICAgICAgICA8bGk+VGhlIGNhdGVnb3JpZXMgb2Ygc291cmNlcyBmb3IgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHdlIGNvbGxlY3RlZCBhYm91dCB5b3UuPC9saT5cbiAgICAgICAgPGxpPk91ciBidXNpbmVzcyBvciBjb21tZXJjaWFsIHB1cnBvc2UgZm9yIGNvbGxlY3Rpbmcgb3Igc2VsbGluZyB0aGF0IHBlcnNvbmFsIGluZm9ybWF0aW9uLjwvbGk+XG4gICAgICAgIDxsaT5UaGUgY2F0ZWdvcmllcyBvZiB0aGlyZCBwYXJ0aWVzIHdpdGggd2hvbSB3ZSBoYXZlIHNoYXJlZCB0aGF0IHBlcnNvbmFsIGluZm9ybWF0aW9uLjwvbGk+XG4gICAgICAgIDxsaT5UaGUgc3BlY2lmaWMgcGllY2VzIG9mIHBlcnNvbmFsIGluZm9ybWF0aW9uIHdlIGNvbGxlY3RlZCBhYm91dCB5b3UgKGFsc28gY2FsbGVkIGEgZGF0YSBwb3J0YWJpbGl0eSByZXF1ZXN0KS48L2xpPlxuICAgICAgICA8bGk+SWYgd2Ugc29sZCBvciBkaXNjbG9zZWQgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiBmb3IgYSBidXNpbmVzcyBwdXJwb3NlLCB0d28gc2VwYXJhdGUgbGlzdHMgZGlzY2xvc2luZzo8L2xpPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpPnNhbGVzLCBpZGVudGlmeWluZyB0aGUgcGVyc29uYWwgaW5mb3JtYXRpb24gY2F0ZWdvcmllcyB0aGF0IGVhY2ggY2F0ZWdvcnkgb2YgcmVjaXBpZW50IHB1cmNoYXNlZDsgYW5kPC9saT5cbiAgICAgICAgICA8bGk+ZGlzY2xvc3VyZXMgZm9yIGEgYnVzaW5lc3MgcHVycG9zZSwgaWRlbnRpZnlpbmcgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIGNhdGVnb3JpZXMgdGhhdCBlYWNoIGNhdGVnb3J5IG9mIHJlY2lwaWVudCBvYnRhaW5lZC48L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC91bD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+RGVsZXRpb24gUmVxdWVzdCBSaWdodHM8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFlvdSBoYXZlIHRoZSByaWdodCB0byByZXF1ZXN0IHRoYXQgd2UgZGVsZXRlIGFueSBvZiB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIHRoYXQgd2UgY29sbGVjdGVkIGZyb20geW91IGFuZCByZXRhaW5lZCwgc3ViamVjdCB0byBjZXJ0YWluIGV4Y2VwdGlvbnMuIE9uY2Ugd2UgcmVjZWl2ZSBhbmQgY29uZmlybSB5b3VyIHZlcmlmaWFibGUgQ0EgVXNlciByZXF1ZXN0LCB3ZSB3aWxsIGRlbGV0ZSAoYW5kIGRpcmVjdCBvdXIgc2VydmljZSBwcm92aWRlcnMgdG8gZGVsZXRlKSB5b3VyIHBlcnNvbmFsIGluZm9ybWF0aW9uIGZyb20gb3VyICh0aGVpcikgcmVjb3JkcywgdW5sZXNzIGFuIGV4Y2VwdGlvbiBhcHBsaWVzLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIG1heSBkZW55IHlvdXIgZGVsZXRpb24gcmVxdWVzdCBpZiByZXRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSBmb3IgdXMgb3Igb3VyIHNlcnZpY2UgcHJvdmlkZXJzIHRvOlxuICAgICAgPC9wPlxuICAgICAgPG9sPlxuICAgICAgICA8bGk+Q29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIGZvciB3aGljaCB3ZSBjb2xsZWN0ZWQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uLCBwcm92aWRlIGEgZ29vZCBvciBzZXJ2aWNlIHRoYXQgeW91IHJlcXVlc3RlZCwgdGFrZSBhY3Rpb25zIHJlYXNvbmFibHkgYW50aWNpcGF0ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIG91ciBvbmdvaW5nIGJ1c2luZXNzIHJlbGF0aW9uc2hpcCB3aXRoIHlvdSwgb3Igb3RoZXJ3aXNlIHBlcmZvcm0gb3VyIG9ibGlnYXRpb25zIGluIGNvbm5lY3Rpb24gd2l0aCBvdXIgY29udHJhY3Qgd2l0aCB5b3UuPC9saT5cbiAgICAgICAgPGxpPkRldGVjdCBzZWN1cml0eSBpbmNpZGVudHMsIHByb3RlY3QgYWdhaW5zdCBtYWxpY2lvdXMsIGRlY2VwdGl2ZSwgZnJhdWR1bGVudCBvciBpbGxlZ2FsIGFjdGl2aXR5LCBvciBwcm9zZWN1dGUgdGhvc2UgcmVzcG9uc2libGUgZm9yIHN1Y2ggYWN0aXZpdGllcy48L2xpPlxuICAgICAgICA8bGk+RGVidWcgcHJvZHVjdHMgdG8gaWRlbnRpZnkgYW5kIHJlcGFpciBlcnJvcnMgdGhhdCBpbXBhaXIgZXhpc3RpbmcgaW50ZW5kZWQgZnVuY3Rpb25hbGl0eS48L2xpPlxuICAgICAgICA8bGk+RXhlcmNpc2UgZnJlZSBzcGVlY2ggcmlnaHRzLCBlbnN1cmUgdGhlIHJpZ2h0IG9mIGFub3RoZXIgQ0EgVXNlciB0byBleGVyY2lzZSB0aGVpciBmcmVlIHNwZWVjaCByaWdodHMgb3IgZXhlcmNpc2UgYW5vdGhlciByaWdodCBwcm92aWRlZCBmb3IgYnkgbGF3LjwvbGk+XG4gICAgICAgIDxsaT5Db21wbHkgd2l0aCB0aGUgQ2FsaWZvcm5pYSBFbGVjdHJvbmljIENvbW11bmljYXRpb25zIFByaXZhY3kgQWN0IChDYWwuIFBlbmFsIENvZGUgJnNlY3Q7IDE1NDYmbmJzcDtzZXEuKS48L2xpPlxuICAgICAgICA8bGk+RW5nYWdlIGluIHB1YmxpYyBvciBwZWVyLXJldmlld2VkIHNjaWVudGlmaWMsIGhpc3RvcmljYWwsIG9yIHN0YXRpc3RpY2FsIHJlc2VhcmNoIGluIHRoZSBwdWJsaWMgaW50ZXJlc3QgdGhhdCBhZGhlcmVzIHRvIGFsbCBvdGhlciBhcHBsaWNhYmxlIGV0aGljcyBhbmQgcHJpdmFjeSBsYXdzLCB3aGVuIHRoZSBpbmZvcm1hdGlvbiZhcG9zO3MgZGVsZXRpb24gbWF5IGxpa2VseSByZW5kZXIgaW1wb3NzaWJsZSBvciBzZXJpb3VzbHkgaW1wYWlyIHRoZSByZXNlYXJjaCZhcG9zO3MgYWNoaWV2ZW1lbnQsIGlmIHlvdSBwcmV2aW91c2x5IHByb3ZpZGVkIGluZm9ybWVkIGNvbnNlbnQuPC9saT5cbiAgICAgICAgPGxpPkVuYWJsZSBzb2xlbHkgaW50ZXJuYWwgdXNlcyB0aGF0IGFyZSByZWFzb25hYmx5IGFsaWduZWQgd2l0aCBDQSBVc2VyIGV4cGVjdGF0aW9ucyBiYXNlZCBvbiB5b3VyIHJlbGF0aW9uc2hpcCB3aXRoIHVzLjwvbGk+XG4gICAgICAgIDxsaT5Db21wbHkgd2l0aCBhIGxlZ2FsIG9ibGlnYXRpb24uPC9saT5cbiAgICAgICAgPGxpPk1ha2Ugb3RoZXIgaW50ZXJuYWwgYW5kIGxhd2Z1bCB1c2VzIG9mIHRoYXQgaW5mb3JtYXRpb24gdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBjb250ZXh0IGluIHdoaWNoIHlvdSBwcm92aWRlZCBpdC48L2xpPlxuICAgICAgPC9vbD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+RXhlcmNpc2luZyBBY2Nlc3MsIERhdGEgUG9ydGFiaWxpdHkgYW5kIERlbGV0aW9uIFJpZ2h0czwvaDM+XG4gICAgICA8cD5cbiAgICAgICAgVG8gZXhlcmNpc2UgeW91ciBhY2Nlc3MsIGRhdGEgcG9ydGFiaWxpdHkgYW5kL29yIGRlbGV0aW9uIHJpZ2h0cyBkZXNjcmliZWQgYWJvdmUsIHBsZWFzZSBzdWJtaXQgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCB0byB1cyBieSBlaXRoZXI6XG4gICAgICA8L3A+XG4gICAgICA8dWw+XG4gICAgICAgIDxsaT5DbGlja2luZzxhIGhyZWY9XCJodHRwczovL3d3dy5lbG9jYWwuY29tL2NjcGEvcHJpdmFjeV9yaWdodHNfcmVxdWVzdHMvbmV3XCIgZGF0YS1kZWxlZ2F0ZT1cIlByaXZhY3lDYWxpZm9ybmlhXCI+IGhlcmU8L2E+PC9saT5cbiAgICAgICAgPGxpPkNhbGxpbmcgdXMgYXQ6ICg4NzcpIDkxMy01NjIyOzwvbGk+XG4gICAgICAgIDxsaT5FbWFpbGluZyB1cyBhdDogY29ycmVzcG9uZGVuY2VAZWxvY2FsLmNvbTsgb3I8L2xpPlxuICAgICAgICA8bGk+U2VuZGluZyB1cyBVLlMuIG1haWwgdG86IGVMb2NhbC5jb20sIDEwMTAgU3ByaW5nIE1pbGwgQXZlLCBTdWl0ZSAyMDAsIENvbnNob2hvY2tlbiwgUEEsIDE5NDI4LjwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPHA+XG4gICAgICAgIE9ubHkgeW91IG9yIGEgcGVyc29uIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQ2FsaWZvcm5pYSBTZWNyZXRhcnkgb2YgU3RhdGUgdGhhdCB5b3UgYXV0aG9yaXplIHRvIGFjdCBvbiB5b3VyIGJlaGFsZiwgbWF5IG1ha2UgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCByZWxhdGVkIHRvIHlvdXIgcGVyc29uYWwgaW5mb3JtYXRpb24uXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgWW91IG1heSBvbmx5IG1ha2UgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCBmb3IgYWNjZXNzIG9yIGRhdGEgcG9ydGFiaWxpdHkgdHdpY2Ugd2l0aGluIGEgMTItbW9udGggcGVyaW9kLiBUaGUgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgbXVzdDpcbiAgICAgIDwvcD5cbiAgICAgIDx1bD5cbiAgICAgICAgPGxpPlByb3ZpZGUgc3VmZmljaWVudCBpbmZvcm1hdGlvbiB0aGF0IGFsbG93cyB1cyB0byByZWFzb25hYmx5IHZlcmlmeSB0aGF0IHlvdSBhcmU6ICgxKSB0aGUgcGVyc29uIGFib3V0IHdob20gd2UgY29sbGVjdGVkIHBlcnNvbmFsIGluZm9ybWF0aW9uOyBvciAoMikgYW4gYXV0aG9yaXplZCByZXByZXNlbnRhdGl2ZSBvZiB0aGUgYXBwbGljYWJsZSBDQSBVc2VyLjwvbGk+XG4gICAgICAgIDxsaT5EZXNjcmliZSB5b3VyIHJlcXVlc3Qgd2l0aCBzdWZmaWNpZW50IGRldGFpbCB0aGF0IGFsbG93cyB1cyB0byBwcm9wZXJseSB1bmRlcnN0YW5kLCBldmFsdWF0ZSwgYW5kIHJlc3BvbmQgdG8gaXQuPC9saT5cbiAgICAgIDwvdWw+XG4gICAgICA8cD5cbiAgICAgICAgV2UgY2Fubm90IHJlc3BvbmQgdG8geW91ciByZXF1ZXN0IG9yIHByb3ZpZGUgeW91IHdpdGggcGVyc29uYWwgaW5mb3JtYXRpb24gaWYgd2UgY2Fubm90IHZlcmlmeSB5b3VyIGlkZW50aXR5IG9yIGF1dGhvcml0eSB0byBtYWtlIHRoZSByZXF1ZXN0IGFuZCBjb25maXJtIHRoYXQgdGhlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHJlbGF0ZXMgdG8geW91LiBNYWtpbmcgYSB2ZXJpZmlhYmxlIENBIFVzZXIgcmVxdWVzdCBkb2VzIG5vdCByZXF1aXJlIHlvdSB0byBjcmVhdGUgYW4gYWNjb3VudCB3aXRoIHVzLiBXZSB3aWxsIG9ubHkgdXNlIHBlcnNvbmFsIGluZm9ybWF0aW9uIHByb3ZpZGVkIGluIGEgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdG8gdmVyaWZ5IHRoZSByZXF1ZXN0b3IncyBpZGVudGl0eSBvciBhdXRob3JpdHkgdG8gbWFrZSB0aGUgcmVxdWVzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+UmVzcG9uc2UgVGltaW5nIGFuZCBGb3JtYXQ8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGVuZGVhdm9yIHRvIHJlc3BvbmQgdG8gYWxsIHZlcmlmaWFibGUgQ0EgVXNlciByZXF1ZXN0cyB3aXRoaW4gZm9ydHktZml2ZSAoNDUpIGRheXMgb2YgdGhlIHJlY2VpcHQgdGhlcmVvZi4gSWYgd2UgcmVxdWlyZSBtb3JlIHRpbWUgKHVwIHRvIG5pbmV0eSAoOTApIGRheXMpLCB3ZSB3aWxsIGluZm9ybSB5b3Ugb2YgdGhlIHJlYXNvbiBhbmQgZXh0ZW5zaW9uIHBlcmlvZCBpbiB3cml0aW5nLiBXZSB3aWxsIGRlbGl2ZXIgb3VyIHdyaXR0ZW4gcmVzcG9uc2UgYnkgbWFpbCBvciBlbGVjdHJvbmljYWxseSwgYXQgeW91ciBvcHRpb24uIEFueSBkaXNjbG9zdXJlcyB3ZSBwcm92aWRlIHdpbGwgb25seSBjb3ZlciB0aGUgdHdlbHZlICgxMikgbW9udGggcGVyaW9kIHByZWNlZGluZyB0aGUgcmVjZWlwdCBvZiB5b3VyIHZlcmlmaWFibGUgcmVxdWVzdC4gVGhlIHJlc3BvbnNlIHdlIHByb3ZpZGUgd2lsbCBhbHNvIGV4cGxhaW4gdGhlIHJlYXNvbnMgd2UgY2Fubm90IGNvbXBseSB3aXRoIGEgcmVxdWVzdCwgaWYgYXBwbGljYWJsZS4gRm9yIGRhdGEgcG9ydGFiaWxpdHkgcmVxdWVzdHMsIHdlIHdpbGwgc2VsZWN0IGEgZm9ybWF0IHRvIHByb3ZpZGUgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlYWRpbHkgdXNlYWJsZSBhbmQgc2hvdWxkIGFsbG93IHlvdSB0byB0cmFuc21pdCB0aGUgaW5mb3JtYXRpb24gZnJvbSBvbmUgZW50aXR5IHRvIGFub3RoZXIgZW50aXR5IHdpdGhvdXQgaGluZHJhbmNlLlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIFdlIGRvIG5vdCBjaGFyZ2UgYSBmZWUgdG8gcHJvY2VzcyBvciByZXNwb25kIHRvIHlvdXIgdmVyaWZpYWJsZSBDQSBVc2VyIHJlcXVlc3QgdW5sZXNzIGl0IGlzIGV4Y2Vzc2l2ZSwgcmVwZXRpdGl2ZSwgb3IgbWFuaWZlc3RseSB1bmZvdW5kZWQuIElmIHdlIGRldGVybWluZSB0aGF0IHRoZSByZXF1ZXN0IHdhcnJhbnRzIGEgZmVlLCB3ZSB3aWxsIHRlbGwgeW91IHdoeSB3ZSBtYWRlIHRoYXQgZGVjaXNpb24gYW5kIHByb3ZpZGUgeW91IHdpdGggYSBjb3N0IGVzdGltYXRlIGJlZm9yZSBjb21wbGV0aW5nIHlvdXIgcmVxdWVzdC5cbiAgICAgIDwvcD5cbiAgICAgIDxoMyBjbGFzc05hbWU9XCJjYWxpZm9ybmlhXCI+Tm9uLURpc2NyaW1pbmF0aW9uPC9oMz5cbiAgICAgIDxwPlxuICAgICAgICBXZSB3aWxsIG5vdCBkaXNjcmltaW5hdGUgYWdhaW5zdCB5b3UgZm9yIGV4ZXJjaXNpbmcgYW55IG9mIHlvdXIgQ0NQQSByaWdodHMuIFVubGVzcyBwZXJtaXR0ZWQgYnkgdGhlIENDUEEsIHdlIHdpbGwgbm90OlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+RGVueSB5b3UgZ29vZHMgb3Igc2VydmljZXM7PC9saT5cbiAgICAgICAgPGxpPkNoYXJnZSB5b3UgZGlmZmVyZW50IHByaWNlcyBvciByYXRlcyBmb3IgZ29vZHMgb3Igc2VydmljZXMsIGluY2x1ZGluZyB0aHJvdWdoIGdyYW50aW5nIGRpc2NvdW50cyBvciBvdGhlciBiZW5lZml0cywgb3IgaW1wb3NpbmcgcGVuYWx0aWVzOzwvbGk+XG4gICAgICAgIDxsaT5Qcm92aWRlIHlvdSBhIGRpZmZlcmVudCBsZXZlbCBvciBxdWFsaXR5IG9mIGdvb2RzIG9yIHNlcnZpY2VzOyBhbmQvb3I8L2xpPlxuICAgICAgICA8bGk+U3VnZ2VzdCB0aGF0IHlvdSBtYXkgcmVjZWl2ZSBhIGRpZmZlcmVudCBwcmljZSBvciByYXRlIGZvciBnb29kcyBvciBzZXJ2aWNlcyBvciBhIGRpZmZlcmVudCBsZXZlbCBvciBxdWFsaXR5IG9mIGdvb2RzIG9yIHNlcnZpY2VzLjwvbGk+XG4gICAgICA8L3VsPlxuICAgICAgPGgzIGNsYXNzTmFtZT1cImNhbGlmb3JuaWFcIj5DaGFuZ2VzIHRvIHRoZXNlIFByb3Zpc2lvbnM8L2gzPlxuICAgICAgPHA+XG4gICAgICAgIFdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGFtZW5kIHRoZXNlIFByb3Zpc2lvbnMgaW4gb3VyIGRpc2NyZXRpb24gYW5kIGF0IGFueSB0aW1lLiBXaGVuIHdlIG1ha2UgY2hhbmdlcyB0byB0aGVzZSBQcm92aXNpb25zLCB3ZSB3aWxsIG5vdGlmeSB5b3UgYnkgZW1haWwgb3IgdGhyb3VnaCBhIG5vdGljZSBvbiB0aGUgU2l0ZSZhcG9zO3MgaG9tZXBhZ2UuXG4gICAgICA8L3A+XG4gICAgICA8aDMgY2xhc3NOYW1lPVwiY2FsaWZvcm5pYVwiPkNvbnRhY3QgSW5mb3JtYXRpb248L2gzPlxuICAgICAgPHA+XG4gICAgICAgIElmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMgYWJvdXQgdGhlc2UgUHJvdmlzaW9ucywgb3VyIFByaXZhY3kgUG9saWN5LCB0aGUgd2F5cyBpbiB3aGljaCB3ZSBjb2xsZWN0IGFuZCB1c2UgeW91ciBwZXJzb25hbCBpbmZvcm1hdGlvbiwgeW91ciBjaG9pY2VzIGFuZCByaWdodHMgcmVnYXJkaW5nIHN1Y2ggdXNlLCBvciB3aXNoIHRvIGV4ZXJjaXNlIHlvdXIgcmlnaHRzIHVuZGVyIENhbGlmb3JuaWEgbGF3LCBwbGVhc2UgZG8gbm90IGhlc2l0YXRlIHRvIGNvbnRhY3QgdXMgYnkgZWl0aGVyOlxuICAgICAgPC9wPlxuICAgICAgPHVsPlxuICAgICAgICA8bGk+Q2xpY2tpbmc8YSBocmVmPVwiaHR0cHM6Ly93d3cuZWxvY2FsLmNvbS9jY3BhL3ByaXZhY3lfcmlnaHRzX3JlcXVlc3RzL25ld1wiIGRhdGEtZGVsZWdhdGU9XCJQcml2YWN5Q2FsaWZvcm5pYVwiPiBoZXJlPC9hPjwvbGk+XG4gICAgICAgIDxsaT5DYWxsaW5nIHVzIGF0OiAoODc3KSA5MTMtNTYyMjs8L2xpPlxuICAgICAgICA8bGk+RW1haWxpbmcgdXMgYXQ6IGNvcnJlc3BvbmRlbmNlQGVsb2NhbC5jb207IG9yPC9saT5cbiAgICAgICAgPGxpPlNlbmRpbmcgdXMgVS5TLiBtYWlsIHRvOiBlTG9jYWwuY29tLCAxMDEwIFNwcmluZyBNaWxsIEF2ZSwgU3VpdGUgMjAwLCBDb25zaG9ob2NrZW4sIFBBLCAxOTQyOC48L2xpPlxuICAgICAgPC91bD5cbiAgICA8L1JlYWN0LkZyYWdtZW50PlxuICApXG59XG5cblByaXZhY3lDYWxpZm9ybmlhLnByb3BUeXBlcyA9IHtcbiAgZG9tYWluOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGlzVHJhZGVtYXJrZWQ6IFByb3BUeXBlcy5ib29sLFxufVxuXG5Qcml2YWN5Q2FsaWZvcm5pYS5kZWZhdWx0UHJvcHMgPSB7XG4gIGlzVHJhZGVtYXJrZWQ6IGZhbHNlLFxufVxuXG5leHBvcnQgZGVmYXVsdCBQcml2YWN5Q2FsaWZvcm5pYVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJ1xuXG5jb25zdCBUZXJtcyA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIGRvbWFpbixcbiAgICBpY29uLFxuICAgIGlzVHJhZGVtYXJrZWQsXG4gICAgcHJpdmFjeVVybCxcbiAgfSA9IHByb3BzXG5cbiAgY29uc3QgcmVuZGVyRG9tYWluID0gKCkgPT4ge1xuICAgIHJldHVybiA8c3Bhbj57ZG9tYWluLnJlcGxhY2UoJy5jb20nLCAnJyl9e2lzVHJhZGVtYXJrZWQgJiYgPHNwYW4+JnRyYWRlOzwvc3Bhbj59PC9zcGFuPlxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8UmVhY3QuRnJhZ21lbnQ+XG4gICAgICA8aDI+VGVybXMgJmFtcDsgQ29uZGl0aW9uczwvaDI+XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICB7ZG9tYWlufTxiciAvPlxuICAgICAgICAgIHtyZW5kZXJEb21haW4oKX0gV2Vic2l0ZTxiciAvPlxuICAgICAgICAgIFRlcm1zIGFuZCBDb25kaXRpb25zIExhc3QgVXBkYXRlZDogSmFudWFyeSAwMSwgMjAyMFxuICAgICAgICA8L3N0cm9uZz5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBUaGFuayB5b3UgZm9yIHZpc2l0aW5nIHRoZSB7cmVuZGVyRG9tYWluKCl9IHdlYnNpdGUgbG9jYXRlZCBhdCB3d3cue2RvbWFpbn0uY29tICh0aGUgXCJTaXRlXCIpLiBUaGUgU2l0ZSBpcyBhbiBJbnRlcm5ldCBwcm9wZXJ0eSBvZiBlTG9jYWwgVVNBIExMQyAoXCJ7cmVuZGVyRG9tYWluKCl9LFwiIFwid2UsXCIg4oCcb3Vy4oCdIG9yIFwidXNcIikuIFRoZSBmb2xsb3dpbmcge3JlbmRlckRvbWFpbigpfSBXZWJzaXRlIFRlcm1zIGFuZCBDb25kaXRpb25zIChcIlRlcm1zIGFuZCBDb25kaXRpb25zXCIpIHNoYWxsIGluY29ycG9yYXRlIGFuZCBnb3Zlcm4gdGhlIHtyZW5kZXJEb21haW4oKX0gV2Vic2l0ZSBQcml2YWN5IFBvbGljeSAoXCJQcml2YWN5IFBvbGljeVwiKSwgdGhlIHtyZW5kZXJEb21haW4oKX0gQWR2ZXJ0aXNlciBUZXJtcyAoXCJBZHZlcnRpc2VyIFRlcm1zXCIpIGFuZCBhbnkgYW5kIGFsbCBvdGhlciBhcHBsaWNhYmxlIHtyZW5kZXJEb21haW4oKX0gb3BlcmF0aW5nIHJ1bGVzLCBwb2xpY2llcywgcHJpY2Ugc2NoZWR1bGVzIGFuZCBvdGhlciBzdXBwbGVtZW50YWwgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3IgZG9jdW1lbnRzIHRoYXQgbWF5IGJlIHB1Ymxpc2hlZCBmcm9tIHRpbWUgdG8gdGltZSAoY29sbGVjdGl2ZWx5LCB0aGUgXCJBZ3JlZW1lbnRcIikuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgWW91IGFncmVlLCB3aXRob3V0IGxpbWl0YXRpb24gb3IgcXVhbGlmaWNhdGlvbiwgdG8gYmUgYm91bmQgYnkgdGhlIHRlcm1zIG9mIHRoZSBBZ3JlZW1lbnQgaW4gaXRzIGVudGlyZXR5IHdoZW4geW91OiAoYSkgYWNjZXNzIHRoZSBTaXRlOyAoYikgdXRpbGl6ZSB0aGUge3JlbmRlckRvbWFpbigpfSBzZWFyY2ggZGlyZWN0b3J5IChcIkRpcmVjdG9yeSBTZXJ2aWNlXCIpIGluIG9yZGVyIHRvIG9idGFpbiBzZWFyY2ggbGlzdGluZ3MgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gKGNvbGxlY3RpdmVseSwgXCJMaXN0aW5nc1wiKSByZWdhcmRpbmcgYSB2YXJpZXR5IG9mIGJ1c2luZXNzZXMsIHByb2Zlc3Npb25hbHMsIHZlbnVlcywgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzIChjb2xsZWN0aXZlbHksIFwiVGhpcmQgUGFydHkgT2ZmZXJpbmdzXCIpIGFzIG9mZmVyZWQgYW5kIHByb3ZpZGVkIGJ5IHRoZSB0aGlyZCBwYXJ0eSBidXNpbmVzcyBlbnRpdGllcyBhbmQgcHJvZmVzc2lvbmFscyBmZWF0dXJlZCBvbiB0aGUgU2l0ZSAoY29sbGVjdGl2ZWx5LCBcIlRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzXCIpOyAoYykgYWNjZXNzIGFydGljbGVzLCBkaXNjdXNzaW9ucyBhbmQgZmVlZGJhY2sgb24gdGhlIHtyZW5kZXJEb21haW4oKX0gSG9tZSBFeHBlcnQgTmV0d29yayBhbmQvb3Ige3JlbmRlckRvbWFpbigpfSBMZWdhbCBSZXNvdXJjZSBOZXR3b3JrIChjb2xsZWN0aXZlbHksIFwiUmVzb3VyY2UgTmV0d29ya1wiKSBhbmQvb3IgYWNjZXNzIG90aGVyIGNvbnRlbnQgb24gdGhlIFNpdGUgKGNvbGxlY3RpdmVseSwgXCJDb250ZW50XCIpOyAoZCkgdXRpbGl6ZSB0aGUgU2l0ZSZhcG9zO3MgbWFueSBpbnRlcmFjdGl2ZSBmZWF0dXJlcyBkZXNpZ25lZCB0byBmYWNpbGl0YXRlIGludGVyYWN0aW9uIGJldHdlZW4geW91LCB7cmVuZGVyRG9tYWluKCl9LCB0aGUgXCJDb250cmlidXRvcnMsXCIgXCJFeHBlcnQgUGFuZWxpc3RzLFwiIFwiTWVtYmVyc1wiIGFuZCBcIk9uZ29pbmcgQ29udHJpYnV0b3JzXCIgKGNvbGxlY3RpdmVseSwgXCJOZXR3b3JrIFBhcnRpY2lwYW50c1wiKSBwYXJ0aWNpcGF0aW5nIGluIHRoZSBSZXNvdXJjZSBOZXR3b3JrIGFuZCBvdGhlciBTaXRlIHVzZXJzIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBibG9ncywgY29tbWVudCBzZWN0aW9ucywgcmV2aWV3cyBhbmQgcXVlc3Rpb24gYW5kIGFuc3dlciBvcHRpb25zIGxvY2F0ZWQgaW4gZGVzaWduYXRlZCBhcmVhcyBvZiB0aGUgU2l0ZSAoXCJJbnRlcmFjdGl2ZSBTZXJ2aWNlc1wiKTsgKGUpIHJlZ2lzdGVyIHRvIHN1Ym1pdCBhIGZyZWUgTGlzdGluZyBvZiB5b3VyIFRoaXJkIFBhcnR5IE9mZmVyaW5nczsgKGYpIHJlZ2lzdGVyIGZvciBlbmhhbmNlZCBzZXJ2aWNlcyAoXCJQYWlkIEFkdmVydGlzZXIgU2VydmljZXNcIikgaW4gY29ubmVjdGlvbiB3aXRoIHByb21vdGluZyB5b3VyIFRoaXJkIFBhcnR5IE9mZmVyaW5ncyBhcyBhbiBcIkFkdmVydGlzZXJcIjsgKGcpIHBhcnRpY2lwYXRlIGluIHRoZSB7cmVuZGVyRG9tYWluKCl9IFJld2FyZHMgUHJvZ3JhbSAoXCJSZXdhcmRzIFByb2dyYW1cIik7IGFuZC9vciAoaCkgYWNjZXNzIGxpbmtzIHRvIG91ciBzb2NpYWwgbWVkaWEgcGFnZXMgb24gdGhpcmQgcGFydHkgc29jaWFsIG1lZGlhIHdlYnNpdGVzLCBzdWNoIGFzIEZhY2Vib29rJnJlZzssIEluc3RhZ3JhbSZyZWc7LCBMaW5rZWRJbiZyZWc7IGFuZCBUd2l0dGVyJnJlZzsgKFwiU29jaWFsIE1lZGlhIFBhZ2VzLFwiIGFuZCB0b2dldGhlciB3aXRoIHRoZSBTaXRlLCBEaXJlY3RvcnkgU2VydmljZXMsIExpc3RpbmdzLCBSZXNvdXJjZSBOZXR3b3JrLCBDb250ZW50LCBJbnRlcmFjdGl2ZSBTZXJ2aWNlcywgUGFpZCBBZHZlcnRpc2VyIFNlcnZpY2VzLCBSZXdhcmRzIFByb2dyYW0gYW5kIFNvY2lhbCBNZWRpYSBQYWdlcywgdGhlIFwie3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3NcIikuXG4gICAgICA8L3A+XG4gICAgICA8cD5cbiAgICAgICAgPHN0cm9uZz5QTEVBU0UgUkVWSUVXIFRIRSBBR1JFRU1FTlQgQ0FSRUZVTExZLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBPRiBUSEUgQUdSRUVNRU5UIElOIFRIRUlSIEVOVElSRVRZLCBZT1UgQVJFIE5PVCBBVVRIT1JJWkVEIFRPIFVTRSBUSEUge3JlbmRlckRvbWFpbigpfSBPRkZFUklOR1MgSU4gQU5ZIE1BTk5FUiBPUiBGT1JNLjwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+Tk9USUNFOiBUSEUgQUdSRUVNRU5UIENPTlRBSU5TIERJU0NMQUlNRVJTIE9GIFdBUlJBTlRJRVMsIExJTUlUQVRJT05TIE9GIExJQUJJTElUWSwgUkVMRUFTRVMsIEEgQ0xBU1MtQUNUSU9OIFdBSVZFUiwgQU5EIFRIRSBSRVFVSVJFTUVOVCBUTyBBUkJJVFJBVEUgQU5ZIEFORCBBTEwgQ0xBSU1TIFRIQVQgTUFZIEFSSVNFIEhFUkVVTkRFUiBBR0FJTlNUIHtyZW5kZXJEb21haW4oKX0sIEFTIFdFTEwgQVMgSVRTIFBBUkVOVCwgU1VCU0lESUFSSUVTLCBBRkZJTElBVEVEIENPTVBBTklFUywgUkVMQVRFRCBQQVJUSUVTLCBORVRXT1JLIFBBUlRJQ0lQQU5UUyBBTkQgVEhJUkQgUEFSVFkgU0VSVklDRSBQUk9WSURFUlMgKENPTExFQ1RJVkVMWSwg4oCcQ09WRVJFRCBQQVJUSUVT4oCdKSwgV0hPIEFSRSBFWFBSRVNTIFRISVJELVBBUlRZIEJFTkVGSUNJQVJJRVMgT0YgVEhFIE1BTkRBVE9SWSBBUkJJVFJBVElPTiBQUk9WSVNJT04gQ09OVEFJTkVEIEhFUkVJTi4gVEhFIEFGT1JFTUVOVElPTkVEIFBST1ZJU0lPTlMgQVJFIEFOIEVTU0VOVElBTCBCQVNJUyBPRiBUSEUgQUdSRUVNRU5ULjwvc3Ryb25nPlxuICAgICAgPC9wPlxuICAgICAgPHA+XG4gICAgICAgIDxzdHJvbmc+TkVXIEpFUlNFWSBTVEFURSBSRVNJREVOVFMgQVJFIEVOQ09VUkFHRUQgVE8gUkVWSUVXIFRIRUlSIFJJR0hUUyBVTkRFUiBUSEUgQUdSRUVNRU5ULCBBUyBQUk9WSURFRCBVTkRFUiBUSEUgTkVXIEpFUlNFWSBUUlVUSC1JTi1DT05TVU1FUiBDT05UUkFDVCBXQVJSQU5UWSBBTkQgTk9USUNFIEFDVCAo4oCcVENDV05B4oCdKS48L3N0cm9uZz5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBZb3UgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB7cmVuZGVyRG9tYWluKCl9IHNoYWxsIG5vdCBiZSBsaWFibGUgdG8geW91LCBhbnkgb3RoZXIgU2l0ZSBVc2VyIChhcyBkZWZpbmVkIGJlbG93KSBvciBhbnkgdGhpcmQgcGFydHkgZm9yIGFueSBjbGFpbSBpbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YsIG9yIGluYWJpbGl0eSB0byB1c2UsIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncy4ge3JlbmRlckRvbWFpbigpfSBkaXNjbGFpbXMgYW55IGFuZCBhbGwgbGlhYmlsaXR5IGZvciBhbnkgbG9zcywgZGFtYWdlLCBvciBpbmp1cnkgYmFzZWQgb24gU2l0ZSBDb250ZW50LCBUaGlyZCBQYXJ0eSBPZmZlcmluZ3Mgb3Igb3RoZXIgcHJvZHVjdHMsIHNlcnZpY2VzIGFuZCBpbmZvcm1hdGlvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IG9idGFpbmVkIHRocm91Z2ggdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLiBZb3UgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB7cmVuZGVyRG9tYWluKCl9IGlzIG5vdCByZXNwb25zaWJsZSBvciBsaWFibGUgaW4gYW55IG1hbm5lciB3aGF0c29ldmVyIGZvciBhbnkgZGlzcHV0ZSBiZXR3ZWVuIHlvdSBhbmQgYW55IFNpdGUgVXNlci5cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICBJbnN0YWdyYW0mcmVnOyBhbmQgRmFjZWJvb2smcmVnOyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIEZhY2Vib29rLCBJbmMuIChcIkZhY2Vib29rXCIpLiBMaW5rZWRJbiZyZWc7IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgTGlua2VkSW4gQ29ycG9yYXRpb24gKOKAnExpbmtlZElu4oCdKS4gVHdpdHRlciZyZWc7IGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgVHdpdHRlciwgSW5jLiAoXCJUd2l0dGVyXCIpLiBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHtyZW5kZXJEb21haW4oKX0gaXMgbm90IGluIGFueSB3YXkgYWZmaWxpYXRlZCB3aXRoIEZhY2Vib29rLCBMaW5rZWRJbiBvciBUd2l0dGVyLCBhbmQgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFyZSBub3QgZW5kb3JzZWQsIGFkbWluaXN0ZXJlZCBvciBzcG9uc29yZWQgYnkgYW55IG9mIHRoZSBhZm9yZW1lbnRpb25lZCBlbnRpdGllcy5cbiAgICAgIDwvcD5cbiAgICAgIDxvbD5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+U2NvcGUvTW9kaWZpY2F0aW9uIG9mIEFncmVlbWVudC48L3N0cm9uZz5cbiAgICAgICAgICBUaGUgQWdyZWVtZW50IGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYW5kIG9ubHkgYWdyZWVtZW50IGJldHdlZW4geW91IGFuZCB7cmVuZGVyRG9tYWluKCl9IHdpdGggcmVzcGVjdCB0byB5b3VyIHVzZSBvZiB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MsIGFuZCBzdXBlcnNlZGVzIGFsbCBwcmlvciBvciBjb250ZW1wb3JhbmVvdXMgYWdyZWVtZW50cywgcmVwcmVzZW50YXRpb25zLCB3YXJyYW50aWVzIGFuZC9vciB1bmRlcnN0YW5kaW5ncyB3aXRoIHJlc3BlY3QgdG8gdGhlIFNpdGUuIFdlIG1heSBhbWVuZCB0aGUgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lIGluIG91ciBzb2xlIGRpc2NyZXRpb24sIHdpdGhvdXQgc3BlY2lmaWMgbm90aWNlIHRvIHlvdTsgcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQ6IChhKSBhbnkgYW1lbmRtZW50IG9yIG1vZGlmaWNhdGlvbiB0byB0aGUgYXJiaXRyYXRpb24gcHJvdmlzaW9ucywgcHJvaGliaXRpb24gb24gY2xhc3MgYWN0aW9uIHByb3Zpc2lvbnMgb3IgYW55IG90aGVyIHByb3Zpc2lvbnMgYXBwbGljYWJsZSB0byBkaXNwdXRlIHJlc29sdXRpb24gKGNvbGxlY3RpdmVseSwgXCJEaXNwdXRlIFJlc29sdXRpb24gUHJvdmlzaW9uc1wiKSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IGRpc3B1dGVzIGluY3VycmVkIHByaW9yIHRvIHRoZSBhcHBsaWNhYmxlIGFtZW5kbWVudCBvciBtb2RpZmljYXRpb247IGFuZCAoYikgYW55IGFtZW5kbWVudCBvciBtb2RpZmljYXRpb24gdG8gcHJpY2luZyBhbmQvb3IgYmlsbGluZyBwcm92aXNpb25zIChcIkJpbGxpbmcgUHJvdmlzaW9uc1wiKSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IGNoYXJnZXMgaW5jdXJyZWQgcHJpb3IgdG8gdGhlIGFwcGxpY2FibGUgYW1lbmRtZW50IG9yIG1vZGlmaWNhdGlvbi4gVGhlIGxhdGVzdCBBZ3JlZW1lbnQgd2lsbCBiZSBwb3N0ZWQgb24gdGhlIFNpdGUsIGFuZCB5b3Ugc2hvdWxkIHJldmlldyB0aGUgQWdyZWVtZW50IHByaW9yIHRvIHVzaW5nIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncy4gQnkgeW91ciBjb250aW51ZWQgdXNlIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncywgeW91IGhlcmVieSBhZ3JlZSB0byBjb21wbHkgd2l0aCwgYW5kIGJlIGJvdW5kIGJ5LCBhbGwgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGNvbnRhaW5lZCB3aXRoaW4gdGhlIEFncmVlbWVudCBlZmZlY3RpdmUgYXQgdGhhdCB0aW1lIChvdGhlciB0aGFuIHdpdGggcmVzcGVjdCB0byBkaXNwdXRlcyBhcmlzaW5nIHByaW9yIHRvIHRoZSBhbWVuZG1lbnQgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBEaXNwdXRlIFJlc29sdXRpb24gUHJvdmlzaW9ucywgb3IgY2hhcmdlcyBpbmN1cnJlZCBwcmlvciB0byB0aGUgYW1lbmRtZW50IG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUgQmlsbGluZyBQcm92aXNpb25zLCB3aGljaCBzaGFsbCBiZSBnb3Zlcm5lZCBieSB0aGUgRGlzcHV0ZSBSZXNvbHV0aW9uIFByb3Zpc2lvbnMgYW5kL29yIEJpbGxpbmcgUHJvdmlzaW9ucyB0aGVuIGluIGVmZmVjdCBhdCB0aGUgdGltZSBvZiB0aGUgc3ViamVjdCBkaXNwdXRlIG9yIGluY3VycmVkIGNoYXJnZXMsIGFzIGFwcGxpY2FibGUpLiBVbmxlc3MgZXhwbGljaXRseSBzdGF0ZWQgb3RoZXJ3aXNlLCBhbnkgZnV0dXJlIG9mZmVyKHMpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdSBvbiB0aGUgU2l0ZSB0aGF0IGF1Z21lbnQocykgb3Igb3RoZXJ3aXNlIGVuaGFuY2UocykgdGhlIGN1cnJlbnQgZmVhdHVyZXMgb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIHNoYWxsIGJlIHN1YmplY3QgdG8gdGhlIEFncmVlbWVudC4gSWYge3JlbmRlckRvbWFpbigpfSB0ZXJtaW5hdGVzIHRoZSBBZ3JlZW1lbnQgZm9yIGFueSByZWFzb24sIHtyZW5kZXJEb21haW4oKX0gc2hhbGwgaGF2ZSBubyBsaWFiaWxpdHkgb3IgcmVzcG9uc2liaWxpdHkgdG8geW91LiBZb3UgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCByZWZ1c2FsIHRvIHVzZSB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaXMgeW91ciBzb2xlIHJpZ2h0IGFuZCByZW1lZHkgd2l0aCByZXNwZWN0IHRvIGFueSBkaXNwdXRlIHdpdGgge3JlbmRlckRvbWFpbigpfS4gVGhlIEFncmVlbWVudCBvbmx5IGdvdmVybnMgeW91ciB1c2Ugb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgPHN0cm9uZz5Ob24tRW5kb3JzZW1lbnQ6IFNpdGUgQ29udGVudCBhbmQgU2l0ZSBVc2Vycy48L3N0cm9uZz5cbiAgICAgICAgICAgIDxvbD5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIHtyZW5kZXJEb21haW4oKX0gZG9lcyBub3Qgc3BvbnNvciwgcmVjb21tZW5kIG9yIGVuZG9yc2U6IChpKSBhbnkgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgKGluY2x1ZGluZyBBZHZlcnRpc2VycykgdGhhdCBhcmUgYWNjZXNzaWJsZSBieSBhbmQgdGhyb3VnaCB0aGUgRGlyZWN0b3J5IFNlcnZpY2UgYW5kL29yIEludGVyYWN0aXZlIFNlcnZpY2VzOyBhbmQvb3IgKGlpKSBhbnkgTmV0d29yayBQYXJ0aWNpcGFudHMgdGhhdCBhcmUgYWNjZXNzaWJsZSBieSBhbmQgdGhyb3VnaCB0aGUgUmVzb3VyY2UgTmV0d29yayBhbmQvb3IgSW50ZXJhY3RpdmUgU2VydmljZXM7IGFuZC9vciAoaWlpKSBhbnkgU2l0ZSB2aXNpdG9ycyAoXCJWaXNpdG9yc1wiKSB0aGF0IGFyZSBhY2Nlc3NpYmxlIGJ5IGFuZCB0aHJvdWdoIHRoZSBSZXNvdXJjZSBOZXR3b3JrIGFuZC9vciBJbnRlcmFjdGl2ZSBTZXJ2aWNlcy4gVGhlIFNpdGUgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLCBOZXR3b3JrIFBhcnRpY2lwYW50cywgVmlzaXRvcnMgYW5kIHBvdGVudGlhbCB1c2VycyBvZiBhc3NvY2lhdGVkIFRoaXJkIFBhcnR5IE9mZmVyaW5ncy4gU29tZSBvZiB0aGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgdGhhdCBhcmUgYWNjZXNzaWJsZSBieSBhbmQgdGhyb3VnaCB0aGUgRGlyZWN0b3J5IFNlcnZpY2UgcGF5IGEgZmVlIGZvciBpbmNsdXNpb24gaW4gdGhlIERpcmVjdG9yeSBTZXJ2aWNlLlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIFRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBjb250YWluIGNvbW1lbnRzLCBvcGluaW9ucywgc3RhdGVtZW50cywgZmVlZGJhY2sgYW5kIG90aGVyIGNvbnRlbnQgKGNvbGxlY3RpdmVseSwgXCJGZWVkYmFja1wiKSwgTGlzdGluZ3MsIENvbnRlbnQsIE5ldHdvcmsgQXJ0aWNsZXMgKGFzIGRlZmluZWQgYmVsb3cpLCBhZHZlcnRpc2VtZW50cywgcmVzcG9uc2VzLCBzdGF0ZW1lbnRzLCBwcm9taXNlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gKGNvbGxlY3RpdmVseSwgXCJTaXRlIENvbnRlbnRcIikgdGhhdCBpcyBwcm92aWRlZCBkaXJlY3RseSBieSBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVycywgTmV0d29yayBQYXJ0aWNpcGFudHMsIFZpc2l0b3JzIGFuZCBhbnkgb3RoZXIgcGFydGllcyB0aGF0IHVzZSB0aGUgU2l0ZSAoY29sbGVjdGl2ZWx5LCBcIlNpdGUgVXNlcnNcIikuIFlvdSBhZ3JlZSB0aGF0IHtyZW5kZXJEb21haW4oKX0gc2hhbGwgaGF2ZSBubyBvYmxpZ2F0aW9uIGFuZCBpbmN1ciBubyBsaWFiaWxpdHkgdG8geW91IGluIGNvbm5lY3Rpb24gd2l0aCBhbnkgRmVlZGJhY2sgYXBwZWFyaW5nIGluIG9yIHRocm91Z2ggdGhlIEludGVyYWN0aXZlIFNlcnZpY2VzLiB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IHJlcHJlc2VudCBvciB3YXJyYW50IHRoYXQgdGhlIEZlZWRiYWNrIHBvc3RlZCB0aHJvdWdoIHRoZSBJbnRlcmFjdGl2ZSBTZXJ2aWNlcyBpcyBhY2N1cmF0ZSwgY29tcGxldGUgb3IgYXBwcm9wcmlhdGUuIFBsZWFzZSB1c2UgY2F1dGlvbiBhbmQgY29tbW9uIHNlbnNlIHdoZW4gdXNpbmcgdGhlIFNpdGUgYW5kIERpcmVjdG9yeSBTZXJ2aWNlLiB7cmVuZGVyRG9tYWluKCl9IGluIG5vIHdheSBlbmRvcnNlcyB0aGUgU2l0ZSBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IFNpdGUgVXNlcnMgdGhyb3VnaCB0aGUgSW50ZXJhY3RpdmUgU2VydmljZXMsIERpcmVjdG9yeSBTZXJ2aWNlLCBSZXNvdXJjZSBOZXR3b3JrIGFuZC9vciBhbnkgb3RoZXIge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MuIFRoZSBTaXRlIENvbnRlbnQgYW5kIG90aGVyIGluZm9ybWF0aW9uIHN1Ym1pdHRlZCBvciBtYWRlIGF2YWlsYWJsZSBieSBTaXRlIFVzZXJzIGlzIG5vdCB2ZXJpZmllZCBvciByZXZpZXdlZCBpbiBhbnkgd2F5IGJlZm9yZSBpdCBhcHBlYXJzIG9uIHRoZSBTaXRlIG9yIG90aGVyd2lzZSB0aHJvdWdoIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncy4ge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCB3YXJyYW50IHRoZSB2YWxpZGl0eSBvciBhY2N1cmFjeSBvZiBhbnkgc3VjaCBTaXRlIENvbnRlbnQuIEVhY2ggU2l0ZSBVc2VyIHNoYWxsIGJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgdGhlIFNpdGUgQ29udGVudCBwb3N0ZWQgYnkgYW5kIHRocm91Z2ggdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLiB7cmVuZGVyRG9tYWluKCl9IHJlc2VydmVzIHRoZSByaWdodCB0byBwcm9oaWJpdCBhbnkgY29uZHVjdCBieSBTaXRlIFVzZXJzIG9yIHJlbW92ZSBhbnkgU2l0ZSBDb250ZW50IGZyb20gdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGF0IGFueSB0aW1lIGFuZCBmb3IgYW55IHJlYXNvbiwgaW4ge3JlbmRlckRvbWFpbigpfSdzIHNvbGUgZGlzY3JldGlvbi4gVGhlIHJlYXNvbnMgZm9yIHJlbW92YWwgbWF5IGluY2x1ZGUgd2hlcmUge3JlbmRlckRvbWFpbigpfSBiZWxpZXZlcyB0aGF0IHRoZSBTaXRlIENvbnRlbnQgcG9zdGVkIGJ5IGEgU2l0ZSBVc2VyIGlzIHVuc3VpdGFibGUgZm9yIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBmb3IgYW55IHJlYXNvbiBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgd2hlcmU6IChpKSB0aGUgU2l0ZSBDb250ZW50IGNvbnRhaW5zIG9yIGxpbmtzIHRvIG1hdGVyaWFsIHRoYXQgY291bGQgYmUgY29uc2lkZXJlZCB1bmxhd2Z1bCwgaGFybWZ1bCwgdGhyZWF0ZW5pbmcsIGRlZmFtYXRvcnksIG9ic2NlbmUsIGhhcmFzc2luZyBvciBvdGhlcndpc2Ugb2JqZWN0aW9uYWJsZTsgKGlpKSB0aGUgU2l0ZSBDb250ZW50IGNvbnRhaW5zIG9yIGxpbmtzIHRvIG1hdGVyaWFsIHRoYXQgaW5mcmluZ2VzIHVwb24gdGhlIHRyYWRlbWFyaywgdHJhZGUgbmFtZSwgc2VydmljZSBtYXJrLCBjb3B5cmlnaHQsIGxpY2Vuc2UsIG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvciBwcm9wcmlldGFyeSByaWdodCBvZiBhbnkgdGhpcmQgcGFydHk7IChpaWkpIHtyZW5kZXJEb21haW4oKX0gYmVsaWV2ZXMgdGhhdCBhIFNpdGUgVXNlciBpcywgYXQgYW55IHRpbWUsIGNvbmR1Y3RpbmcgYW55IGNvbW1lcmNpYWwgYWN0aXZpdHkgYnkgYW5kIHRocm91Z2ggdGhlIFNpdGU7IGFuZC9vciAoaXYpIHtyZW5kZXJEb21haW4oKX0gYmVsaWV2ZXMgdGhhdCBhIFNpdGUgVXNlciBpcyBpbiB2aW9sYXRpb24gb2YgdGhlIEFncmVlbWVudCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgU2VjdGlvbiAxMiBiZWxvdy5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IGludm9sdmUgaXRzZWxmIGluIHRoZSBhZ3JlZW1lbnRzIGFycml2ZWQgYXQgYnkgYW5kIGJldHdlZW4gVmlzaXRvcnMgYW5kIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLCBvciBpbiB0aGUgYWN0dWFsIHByb3Zpc2lvbiBvZiBUaGlyZCBQYXJ0eSBPZmZlcmluZ3MgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSByZWxhdGlvbnNoaXBzIGNyZWF0ZWQgdGhlcmVieS4gVGhlcmVmb3JlLCB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IG1ha2UgYW55IHJlcHJlc2VudGF0aW9ucyByZWdhcmRpbmcgdGhlIGNvbXBldGVuY3ksIHRydXN0d29ydGhpbmVzcywgaG9uZXN0eSwgaW50ZWdyaXR5IGFuZC9vciBiZWhhdmlvciBvZiBlaXRoZXIgaXRzIFZpc2l0b3JzIG9yIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLiBWaXNpdG9ycywgYW5kIG5vdCB7cmVuZGVyRG9tYWluKCl9LCBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBhc3Nlc3NpbmcgdGhlIGNvbXBldGVuY3ksIHRydXN0d29ydGhpbmVzcywgaG9uZXN0eSBhbmQgaW50ZWdyaXR5IG9mIGFsbCBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVycyB0aGF0IHN1Y2ggVmlzaXRvcnMgY29udGFjdCB2aWEgdGhlIERpcmVjdG9yeSBTZXJ2aWNlLlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICA8c3Ryb25nPlRlcm1zIEFwcGxpY2FibGUgdG8gQXR0b3JuZXkgTGlzdGluZ3MuPC9zdHJvbmc+XG4gICAgICAgICAgICA8b2w+XG4gICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICB7cmVuZGVyRG9tYWluKCl9IGlzIG5vdCBhIGxhdyBmaXJtIG9yIGEgbGF3eWVyIHJlZmVycmFsIHNlcnZpY2UuIEFzIHN1Y2gsIHtyZW5kZXJEb21haW4oKX0gb2ZmZXJzIG5vIGxlZ2FsIGFkdmljZSwgcmVjb21tZW5kYXRpb25zLCBtZWRpYXRpb24gb3IgY291bnNlbGluZyBpbiBjb25uZWN0aW9uIHdpdGggYW55IGxlZ2FsIG1hdHRlciwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsIGFuZCBub3RoaW5nIHdlIGRvIGFuZCBubyBlbGVtZW50IG9mIHRoZSBTaXRlLCBEaXJlY3RvcnkgU2VydmljZSBvciBvdGhlciB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBzaG91bGQgYmUgY29uc3RydWVkIGFzIHN1Y2guIFlvdSBzaG91bGQgYWx3YXlzIGNoZWNrIHdpdGggeW91ciBhdHRvcm5leSwgYWNjb3VudGFudCBhbmQvb3Igb3RoZXIgYWR2aXNvcnMgdG8gYmUgc3VyZSB0aGF0IGFueSBsZWdhbCBhZHZpY2UsIGxhdy1yZWxhdGVkIFRoaXJkIFBhcnR5IE9mZmVyaW5ncywgbGF3LXJlbGF0ZWQgU2l0ZSBDb250ZW50IG9yIG90aGVyIGxlZ2FsIHByb2R1Y3RzIGFuZC9vciBzZXJ2aWNlcyBhdmFpbGFibGUgYnkgYW5kIHRocm91Z2ggdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIChjb2xsZWN0aXZlbHksIFwiTGVnYWwgU2VydmljZXNcIikgaXMvYXJlIGFwcHJvcHJpYXRlIGZvciB5b3UuXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgVGhlIFNpdGUgcHJvdmlkZXMgcGFpZCBhdHRvcm5leSBhZHZlcnRpc2luZyB0byB0aG9zZSBhdHRvcm5leXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCBhcyBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVycyAoXCJUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzXCIpLiBTb21lIG9mIHRoZSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzIHRoYXQgYXJlIGFjY2Vzc2libGUgYnkgYW5kIHRocm91Z2ggdGhlIERpcmVjdG9yeSBTZXJ2aWNlIHBheSBhIGZlZSBmb3IgaW5jbHVzaW9uIGluIHRoZSBEaXJlY3RvcnkgU2VydmljZS4ge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCByZWNlaXZlIGFueSBwb3J0aW9uIG9mIGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwncyBmZWVzLlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgIEFueSB1c2Ugb2YgdGhlIERpcmVjdG9yeSBTZXJ2aWNlIGJ5IFNpdGUgVXNlcnMgaXMgbm90IGludGVuZGVkIHRvLCBhbmQgd2lsbCBub3QgY3JlYXRlLCBhbiBhdHRvcm5leS1jbGllbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gYW55IHN1Y2ggU2l0ZSBVc2VycyBhbmQge3JlbmRlckRvbWFpbigpfS4gV2l0aG91dCBsaW1pdGluZyB0aGUgZm9yZWdvaW5nLCBhbnkgaW5mb3JtYXRpb24gc3VibWl0dGVkIHRvIHtyZW5kZXJEb21haW4oKX0gYW5kL29yIGFueSBlbGVjdHJvbmljIG9yIG90aGVyIGNvbW11bmljYXRpb24gc2VudCB0byB7cmVuZGVyRG9tYWluKCl9IHdpbGwgbm90IGNyZWF0ZSwgb3IgYmUgY292ZXJlZCBieSwgYW4gYXR0b3JuZXktY2xpZW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNpdGUgVXNlcnMgYW5kIHtyZW5kZXJEb21haW4oKX0gb3IgYW55IFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbHMuXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgVGhlIFNpdGUgZmFjaWxpdGF0ZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbHMgYW5kIHBvdGVudGlhbCB1c2VycyBvZiBhc3NvY2lhdGVkIExlZ2FsIFNlcnZpY2VzLiB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IFNpdGUgVXNlcnMgd2lsbCBzdWNjZXNzZnVsbHkgZmluZCBsZWdhbCByZXByZXNlbnRhdGlvbiB0aHJvdWdoIHRoZSBEaXJlY3RvcnkgU2VydmljZS4gVGhlIGRldGVybWluYXRpb24gb2YgdGhlIG5lZWQgZm9yIGxlZ2FsIHNlcnZpY2VzIGFuZCB0aGUgY2hvaWNlIG9mIGxlZ2FsIHJlcHJlc2VudGF0aW9uIGFyZSBleHRyZW1lbHkgaW1wb3J0YW50IGRlY2lzaW9ucyBhbmQgc2hvdWxkIG5vdCBiZSBiYXNlZCBzb2xlbHkgb24gYWR2ZXJ0aXNlbWVudHMsIGNsYWltcyBvZiBleHBlcnRpc2Ugb3IgY29zdCBvZmZlcmVkIGJ5IGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwuXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCByZXZpZXcgdGhlIHN0YW5kaW5nIG9mIGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzIHdpdGggYW55IHJlZ3VsYXRvcnkgYXV0aG9yaXR5IG9yIGJhciBhc3NvY2lhdGlvbi4gVGhlcmVmb3JlLCB7cmVuZGVyRG9tYWluKCl9IG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIHJlZ2FyZGluZyB0aGUgc3RhdHVzLCBzdGFuZGluZyBvciBhYmlsaXR5IG9mIGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwuIFdoZW4gY29uc2lkZXJpbmcgcmV0YWluaW5nIGEgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFsLCBTaXRlIFVzZXJzIHNob3VsZCBhc2sgZm9yIGZyZWUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBmcm9tIHRoYXQgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFsIGFuZCBjaGVjayB0aGF0IFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCdzIHN0YW5kaW5nIHdpdGggdGhlIGFwcGxpY2FibGUgc3RhdGUgYmFyIGFzc29jaWF0aW9uLiB7cmVuZGVyRG9tYWluKCl9IGlzIG5vdCByZXNwb25zaWJsZSBmb3IsIGFuZCBpbiBubyB3YXkgZW5kb3JzZXMsIGFueSBkZXNjcmlwdGlvbiBvciBpbmRpY2F0aW9uIG9mIHNwZWNpYWxpemF0aW9uIG9yIGxpbWl0YXRpb24gb2YgcHJhY3RpY2UgYnkgYW55IFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbHMgdGhhdCBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBEaXJlY3RvcnkgU2VydmljZS4gUGxlYXNlIGJlIGF3YXJlIHRoYXQgbm8gYWdlbmN5IG9yIGJvYXJkIG1heSBoYXZlIGNlcnRpZmllZCBzdWNoIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBhcyBhIHNwZWNpYWxpc3Qgb3IgZXhwZXJ0IGluIGFueSBpbmRpY2F0ZWQgZmllbGQgb2YgbGF3IHByYWN0aWNlLiBJbiBhZGRpdGlvbiwgYSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgY2xhaW1pbmcgc3BlY2lhbGl6YXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGFueSBtb3JlIGV4cGVydCBvciBjb21wZXRlbnQgdGhhbiBvdGhlciBsZWdhbCBwcm9mZXNzaW9uYWxzLiBTaXRlIFVzZXJzIHNob3VsZCBtYWtlIGFuIGluZGVwZW5kZW50IGludmVzdGlnYXRpb24sIGNvbmZpcm0gYW5kIHZlcmlmeSBhbGwgY2xhaW1zIG1hZGUgYnkgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFscy4gU2l0ZSBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgY2F1dGlvbiB3aGVuIHJldmlld2luZyBhbnkgaW5mb3JtYXRpb24gc3VibWl0dGVkIGJ5IFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbHMuIEV4Y2VwdCB3aGVyZSBvdGhlcndpc2UgaW5kaWNhdGVkLCB0aGUgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFscyBhcmUgbm90IGNlcnRpZmllZCBieSB0aGUgRmxvcmlkYSBTdGF0ZSBCYXIgQm9hcmQgb2YgTGVnYWwgU3BlY2lhbGl6YXRpb24gYW5kIEVkdWNhdGlvbiwgdGhlIFRleGFzIFN0YXRlIEJvYXJkIG9mIExlZ2FsIFNwZWNpYWxpemF0aW9uIChcIk5vdCBDZXJ0aWZpZWQgYnkgdGhlIFRleGFzIEJvYXJkIG9mIExlZ2FsIFNwZWNpYWxpemF0aW9uXCIpLCBvciBhbnkgb3RoZXIgZW50aXR5IG9yIGJvZHkuXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgTGF3cyB2YXJ5IGFjcm9zcyBsZWdhbCBqdXJpc2RpY3Rpb25zIGFuZCBtYXkgYmUgc3ViamVjdCB0byBpbnRlcnByZXRhdGlvbiBieSBkaWZmZXJlbnQgY291cnRzLiBMYXdzIGFyZSBhbHNvIHZlcnkgc3BlY2lmaWMgdG8gaW5kaXZpZHVhbCBmYWN0cyBhbmQgY2lyY3Vtc3RhbmNlcywgYW5kIHRoZSBsYXctcmVsYXRlZCBTaXRlIENvbnRlbnQgbWF5IG5vdCBmaXQgeW91ciBwYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZS4gVGhlIGxhdy1yZWxhdGVkIFNpdGUgQ29udGVudCBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgbWF5IG5vdCByZWZsZWN0IGN1cnJlbnQgbGVnYWwgZGV2ZWxvcG1lbnRzIG9yIHZhcmlhbmNlcyBpbiB0aGUgbGF3IG9mIGRpZmZlcmVudCBqdXJpc2RpY3Rpb25zLiBUaGUgbGF3LXJlbGF0ZWQgU2l0ZSBDb250ZW50IGRvZXMgbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIG9waW5pb25zIG9mIGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzLCB0aGVpciBwYXJ0bmVycywgY2xpZW50cyBvciBhZmZpbGlhdGVzLlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgICAgICAgICAgQ2VydGFpbiBMaXN0aW5ncyBhbmQgb3RoZXIgbGF3LXJlbGF0ZWQgU2l0ZSBDb250ZW50IG1heSBpbmNsdWRlIGRlc2NyaXB0aW9ucyBvZiBzdWNjZXNzZnVsIGxhd3N1aXRzIGJyb3VnaHQgYnkgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFscy4gVGhlc2UgZGVzY3JpcHRpb25zIGFyZSBub3QgbWVhbnQgdG8gY3JlYXRlIGFueSB1bmp1c3RpZmllZCBleHBlY3RhdGlvbnMgdGhhdCBzaW1pbGFyIHJlc3VsdHMgY2FuIGJlIG9idGFpbmVkIGZvciBvdGhlcnMsIGJlY2F1c2UgZWFjaCBjYXNlIGlzIGRldGVybWluZWQgb24gaXRzIG93biBzcGVjaWZpYyBmYWN0dWFsIGFuZCBsZWdhbCBjaXJjdW1zdGFuY2VzLiBObyBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgY2FuIGd1YXJhbnRlZSB0aGUgc3VjY2VzcyBvZiBhIGNhc2UsIGFuZCBwYXN0IHN1Y2Nlc3NlcywgZXZlbiBpbiB2ZXJ5IHNpbWlsYXIgbGF3c3VpdHMsIGRvIG5vdCBtZWFuIHRoYXQgc3VjY2VzcyBpbiBhIHN1YnNlcXVlbnQgY2FzZSBpcyBndWFyYW50ZWVkIG9yIGV2ZW4gbGlrZWx5LiBSZXN1bHRzIGRlcGVuZCB1cG9uIGEgdmFyaWV0eSBvZiBmYWN0b3JzIHVuaXF1ZSB0byBlYWNoIGNhc2UuXG4gICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPkFERElUSU9OQUwgU1RBVEUgU1BFQ0lGSUMgRElTQ0xPU1VSRVM6PC9iPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5BbGFiYW1hPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPk5vIHJlcHJlc2VudGF0aW9uIGlzIG1hZGUgdGhhdCB0aGUgcXVhbGl0eSBvZiB0aGUgTGVnYWwgU2VydmljZXMgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcXVhbGl0eSBvZiBsZWdhbCBzZXJ2aWNlcyBwZXJmb3JtZWQgYnkgb3RoZXIgYXR0b3JuZXlzLjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5BbGFza2E8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VGhlIEFsYXNrYSBCYXIgQXNzb2NpYXRpb24gZG9lcyBub3QgYWNjcmVkaXQgb3IgZW5kb3JzZSBjZXJ0aWZ5aW5nIG9yZ2FuaXphdGlvbnMuPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPkZsb3JpZGE8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+e3JlbmRlckRvbWFpbigpfSBvcGVyYXRlcyBhcyBhIFwiTGF3eWVyIERpcmVjdG9yeVwiIGFzIGRlZmluZWQgdW5kZXIgRmxvcmlkYSBSdWxlIDQtNy4yMy48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+SGF3YWlpPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlRoZXJlIGlzIG5vIHByb2NlZHVyZSBmb3IgcmV2aWV3IG9yIGFwcHJvdmFsIG9mIHNwZWNpYWxpc3QgY2VydGlmaWNhdGlvbiBvcmdhbml6YXRpb25zIGluIEhhd2FpaS48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+SWxsaW5vaXM8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VGhlIFN1cHJlbWUgQ291cnQgb2YgSWxsaW5vaXMgZG9lcyBub3QgcmVjb2duaXplIGNlcnRpZmljYXRpb25zIG9mIHNwZWNpYWx0aWVzIGluIHRoZSBwcmFjdGljZSBvZiBsYXcgYW5kIHN1Y2ggYSBjZXJ0aWZpY2F0ZSwgYXdhcmQgb3IgcmVjb2duaXRpb24gaXMgbm90IGEgcmVxdWlyZW1lbnQgdG8gcHJhY3RpY2UgbGF3IGluIElsbGlub2lzLjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5Jb3dhPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPk1lbWJlcnNoaXBzIGFuZCBvZmZpY2VzIGluIGxlZ2FsIGZyYXRlcm5pdGllcyBhbmQgbGVnYWwgc29jaWV0aWVzLCB0ZWNobmljYWwgYW5kIHByb2Zlc3Npb25hbCBsaWNlbnNlcywgYW5kIG1lbWJlcnNoaXBzIGluIHNjaWVudGlmaWMsIHRlY2huaWNhbCBhbmQgcHJvZmVzc2lvbmFsIGFzc29jaWF0aW9ucyBhbmQgc29jaWV0aWVzIG9mIGxhdyBvciBmaWVsZCBvZiBwcmFjdGljZSBkbyBub3QgbWVhbiB0aGF0IGEgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFsIGlzIGEgc3BlY2lhbGlzdCBvciBleHBlcnQgaW4gYSBmaWVsZCBvZiBsYXcsIG5vciBkbyB0aGV5IG1lYW4gdGhhdCBzdWNoIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBpcyBuZWNlc3NhcmlseSBhbnkgbW9yZSBleHBlcnQgb3IgY29tcGV0ZW50IHRoYW4gYW55IG90aGVyIGxhd3llci4gQSBkZXNjcmlwdGlvbiBvciBpbmRpY2F0aW9uIG9mIGxpbWl0YXRpb24gb2YgcHJhY3RpY2UgZG9lcyBub3QgbWVhbiB0aGF0IGFueSBhZ2VuY3kgb3IgYm9hcmQgaGFzIGNlcnRpZmllZCBzdWNoIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBhcyBhIHNwZWNpYWxpc3Qgb3IgZXhwZXJ0IGluIGFuIGluZGljYXRlZCBmaWVsZCBvZiBsYXcgcHJhY3RpY2UsIG5vciBkb2VzIGl0IG1lYW4gdGhhdCBzdWNoIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBpcyBuZWNlc3NhcmlseSBhbnkgbW9yZSBleHBlcnQgb3IgY29tcGV0ZW50IHRoYW4gYW55IG90aGVyIGxhd3llci48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+S2VudHVja3k8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VEhJUyBJUyBBTiBBRFZFUlRJU0VNRU5ULjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5NYXNzYWNodXNldHRzPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPklmIGEgTWFzc2FjaHVzZXR0cyBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgaG9sZHMgaGltc2VsZiBvciBoZXJzZWxmIG91dCBhcyBcImNlcnRpZmllZFwiIGluIGEgcGFydGljdWxhciBzZXJ2aWNlLCBmaWVsZCBvciBhcmVhIG9mIGxhdyBieSBhIG5vbi1nb3Zlcm5tZW50YWwgYm9keSwgdGhlIGNlcnRpZnlpbmcgb3JnYW5pemF0aW9uIGlzIGEgcHJpdmF0ZSBvcmdhbml6YXRpb24sIHdob3NlIHN0YW5kYXJkcyBmb3IgY2VydGlmaWNhdGlvbiBhcmUgbm90IHJlZ3VsYXRlZCBieSB0aGUgQ29tbW9ud2VhbHRoIG9mIE1hc3NhY2h1c2V0dHMuPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPk1pc3Npc3NpcHBpPC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPkZyZWUgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdXBvbiByZXF1ZXN0IGZvciBhbnkgTWlzc2lzc2lwcGkgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFsLiBUaGUgbGlzdGluZyBvZiBhbnkgYXJlYSBvZiBwcmFjdGljZSBieSBhIE1pc3Npc3NpcHBpIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBkb2VzIG5vdCBpbmRpY2F0ZSBhbnkgY2VydGlmaWNhdGlvbiBvZiBleHBlcnRpc2UgdGhlcmVpbi48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+TWlzc291cmk8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+TmVpdGhlciB0aGUgU3VwcmVtZSBDb3VydCBvZiBNaXNzb3VyaSwgbm9yIHRoZSBNaXNzb3VyaSBCYXIsIHJldmlld3Mgb3IgYXBwcm92ZXMgY2VydGlmeWluZyBvcmdhbml6YXRpb25zIG9yIHNwZWNpYWxpc3QgZGVzaWduYXRpb25zLjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5OZXZhZGE8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+TmVpdGhlciB0aGUgU3RhdGUgQmFyIG9mIE5ldmFkYSwgbm9yIGFueSBhZ2VuY3kgb2YgdGhlIFN0YXRlIEJhciwgaGFzIGNlcnRpZmllZCBhbnkgVGhpcmQgUGFydHkgTGVnYWwgUHJvZmVzc2lvbmFsIGlkZW50aWZpZWQgaGVyZSBhcyBhIHNwZWNpYWxpc3Qgb3IgYXMgYW4gZXhwZXJ0LjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5OZXcgSmVyc2V5PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2I+XG4gICAgICAgICAgICAgICAgICAgIDxiciAvPkFueSBjZXJ0aWZpY2F0aW9uIGFzIGEgc3BlY2lhbGlzdCwgb3IgYW55IGNlcnRpZmljYXRpb24gaW4gYSBmaWVsZCBvZiBwcmFjdGljZSwgdGhhdCBkb2VzIG5vdCBzdGF0ZSB0aGF0IHN1Y2ggY2VydGlmaWNhdGlvbiBoYXMgYmVlbiBncmFudGVkIGJ5IHRoZSBTdXByZW1lIENvdXJ0IG9mIHRoZSBTdGF0ZSBvZiBOZXcgSmVyc2V5IG9yIGJ5IGFuIG9yZ2FuaXphdGlvbiB0aGF0IGhhcyBiZWVuIGFwcHJvdmVkIGJ5IHRoZSBBbWVyaWNhbiBCYXIgQXNzb2NpYXRpb24sIGluZGljYXRlcyB0aGF0IHRoZSBjZXJ0aWZ5aW5nIG9yZ2FuaXphdGlvbiBoYXMgbm90IGJlZW4gYXBwcm92ZWQsIG9yIGhhcyBiZWVuIGRlbmllZCBhcHByb3ZhbCwgYnkgdGhlIFN1cHJlbWUgQ291cnQgb2YgdGhlIFN0YXRlIG9mIE5ldyBKZXJzZXkgYW5kIHRoZSBBbWVyaWNhbiBCYXIgQXNzb2NpYXRpb24uPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPk5ldyBNZXhpY288L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+QW55IGNlcnRpZmljYXRpb24gYnkgYW4gb3JnYW5pemF0aW9uIG90aGVyIHRoYW4gdGhlIE5ldyBNZXhpY28gQm9hcmQgb2YgTGVnYWwgU3BlY2lhbGl6YXRpb24gZG9lcyBub3QgY29uc3RpdHV0ZSByZWNvZ25pdGlvbiBieSB0aGUgTmV3IE1leGljbyBCb2FyZCBvZiBMZWdhbCBTcGVjaWFsaXphdGlvbiwgdW5sZXNzIHRoZSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgaXMgYWxzbyByZWNvZ25pemVkIGJ5IHRoZSBCb2FyZCBhcyBhIHNwZWNpYWxpc3QgaW4gdGhhdCBhcmVhIG9mIGxhdy48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+TmV3IFlvcms8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+UHJpb3IgcmVzdWx0cyBvYnRhaW5lZCBieSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzIGRvIG5vdCBndWFyYW50ZWUgYSBzaW1pbGFyIG91dGNvbWUuPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPlJob2RlIElzbGFuZDwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9iPlxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5UaGUgUmhvZGUgSXNsYW5kIFN1cHJlbWUgQ291cnQgZG9lcyBub3QgbGljZW5zZSBvciBjZXJ0aWZ5IGFueSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgYXMgYW4gZXhwZXJ0IG9yIHNwZWNpYWxpc3QgaW4gYW55IGZpZWxkIG9mIHByYWN0aWNlLjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgICAgICAgICAgICA8aT5UZW5uZXNzZWU8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFRlbm5lc3NlZSBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWxzIGFyZSBub3QgY2VydGlmaWVkIGFzIHNwZWNpYWxpc3RzIGJ5IHRoZSBUZW5uZXNzZWUgQ29tbWlzc2lvbiBvbiBDb250aW51aW5nIExlZ2FsIEVkdWNhdGlvbiBhbmQgU3BlY2lhbGl6YXRpb24gaW4gdGhlIGFyZWFzIG9mIHByYWN0aWNlIGxpc3RlZCBvbiB0aGVpciBMaXN0aW5ncy48YnIgLz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGk+VGV4YXM8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIFRleGFzIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbHMgYXJlIE5vdCBDZXJ0aWZpZWQgYnkgdGhlIFRleGFzIEJvYXJkIG9mIExlZ2FsIFNwZWNpYWxpemF0aW9uIGluIHRoZSBhcmVhcyBvZiBwcmFjdGljZSBsaXN0ZWQgb24gdGhlaXIgTGlzdGluZ3MuPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPldhc2hpbmd0b248L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VGhlIFN1cHJlbWUgQ291cnQgb2YgV2FzaGluZ3RvbiBkb2VzIG5vdCByZWNvZ25pemUgY2VydGlmaWNhdGlvbiBvZiBzcGVjaWFsdGllcyBpbiB0aGUgcHJhY3RpY2Ugb2YgbGF3LiBBbnkgY2VydGlmaWNhdGUsIGF3YXJkIG9yIHJlY29nbml0aW9uIGJ5IGEgZ3JvdXAsIG9yZ2FuaXphdGlvbiBvciBhc3NvY2lhdGlvbiB1c2VkIGJ5IGEgV2FzaGluZ3RvbiBUaGlyZCBQYXJ0eSBMZWdhbCBQcm9mZXNzaW9uYWwgdG8gZGVzY3JpYmUgaGlzIG9yIGhlciBxdWFsaWZpY2F0aW9ucyBhcyBhIGxhd3llciBvciBxdWFsaWZpY2F0aW9ucyBpbiBhbnkgc3Vic3BlY2lhbHR5IG9mIGxhdyBpcyBub3QgYSByZXF1aXJlbWVudCB0byBwcmFjdGljZSBsYXcgaW4gdGhlIFN0YXRlIG9mIFdhc2hpbmd0b24uPGJyIC8+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpPld5b21pbmc8L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYj5cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+VGhlIFd5b21pbmcgU3RhdGUgQmFyIGRvZXMgbm90IGNlcnRpZnkgYW55IFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCBhcyBhIHNwZWNpYWxpc3Qgb3IgZXhwZXJ0LjxiciAvPlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvb2w+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5SZXF1aXJlbWVudHMuPC9zdHJvbmc+XG4gICAgICAgICAgVGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFyZSBhdmFpbGFibGUgb25seSB0byBpbmRpdmlkdWFscyB3aG8gY2FuIGVudGVyIGludG8gbGVnYWxseSBiaW5kaW5nIGNvbnRyYWN0cyB1bmRlciBhcHBsaWNhYmxlIGxhdy4gVGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFyZSBub3QgaW50ZW5kZWQgZm9yIHVzZSBieSBpbmRpdmlkdWFscyB1bmRlciBlaWdodGVlbiAoMTgpIHllYXJzIG9mIGFnZSAob3IgdGhlIGFwcGxpY2FibGUgYWdlIG9mIG1ham9yaXR5LCBpZiBncmVhdGVyIHRoYW4gZWlnaHRlZW4gKDE4KSB5ZWFycyBvZiBhZ2UgaW4gdGhlaXIgcmVzcGVjdGl2ZSBqdXJpc2RpY3Rpb25zKS4gSWYgeW91IGFyZSB1bmRlciBlaWdodGVlbiAoMTgpIHllYXJzIG9mIGFnZSAob3IgdGhlIGFwcGxpY2FibGUgYWdlIG9mIG1ham9yaXR5LCBpZiBncmVhdGVyIHRoYW4gZWlnaHRlZW4gKDE4KSB5ZWFycyBvZiBhZ2UgaW4geW91ciBqdXJpc2RpY3Rpb24pLCB5b3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byB1c2UgYW5kL29yIGFjY2VzcyB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5EaXJlY3RvcnkgU2VydmljZS48L3N0cm9uZz5cbiAgICAgICAgICBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHtyZW5kZXJEb21haW4oKX0gZG9lcyBub3QgaXRzZWxmIHByb3ZpZGUgYW55IHVuZGVybHlpbmcgcHJvZHVjdHMgYW5kL29yIHNlcnZpY2VzLCBhbmQgdGhlIHVsdGltYXRlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIGFueSBUaGlyZCBQYXJ0eSBPZmZlcmluZ3Mgd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBhcHBsaWNhYmxlIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLlxuICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgIFBsZWFzZSBiZSBhZHZpc2VkIHRoYXQge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCBpdHNlbGYgcHJvdmlkZSBhbnkgdW5kZXJseWluZyBwcm9kdWN0cyBhbmQvb3Igc2VydmljZXMsIGFuZCB0aGUgdWx0aW1hdGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgYW55IFRoaXJkIFBhcnR5IE9mZmVyaW5ncyB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGFwcGxpY2FibGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMuXG4gICAgICAgICAgPC9iPlxuICAgICAgICAgIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLCB5b3UgbXVzdCBmaXJzdCBmdWxseSBjb21wbGV0ZSB0aGUgcmVnaXN0cmF0aW9uIGZvcm1zIGxvY2F0ZWQgb24gdGhlIFNpdGUgKGNvbGxlY3RpdmVseSwgdGhlIFwiU2l0ZSBGb3JtXCIpLiBUaGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgbXVzdCBzdXBwbHkgb24gdGhlIFNpdGUgRm9ybSBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvOiAoaSkgeW91ciB6aXAgY29kZTsgKGlpKSB0aGUgY2F0ZWdvcnkgYXBwbGljYWJsZSB0byB5b3VyIGlucXVpcnksIGlmIGFueTsgYW5kL29yIChpaWkpIGFueSBvdGhlciBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgb24gdGhlIFNpdGUgRm9ybSAoY29sbGVjdGl2ZWx5LCB0aGUgXCJEaXJlY3RvcnkgUmVnaXN0cmF0aW9uIERhdGFcIikuIFlvdSBhZ3JlZSB0byBwcm92aWRlIHRydWUsIGFjY3VyYXRlLCBjdXJyZW50IGFuZCBjb21wbGV0ZSBEaXJlY3RvcnkgUmVnaXN0cmF0aW9uIERhdGEgYW5kIHRvIHVwZGF0ZSB5b3VyIERpcmVjdG9yeSBSZWdpc3RyYXRpb24gRGF0YSBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXQgaW4gYSBjdXJyZW50IGFuZCBhY2N1cmF0ZSBmYXNoaW9uLiB7cmVuZGVyRG9tYWluKCl9J3MgdXNlIG9mIHRoZSBEaXJlY3RvcnkgUmVnaXN0cmF0aW9uIERhdGEgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIFByaXZhY3kgUG9saWN5LlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJyZWFrXCI+XG4gICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+XG4gICAgICAgICAgUGxlYXNlIGJlIGFkdmlzZWQgdGhhdCB0aGUgRGlyZWN0b3J5IFJlZ2lzdHJhdGlvbiBEYXRhIHN1Ym1pdHRlZCBieSB5b3UsIGFuZCBhbnkgYW5kIGFsbCBvdGhlciBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB5b3UgdG8ge3JlbmRlckRvbWFpbigpfSBpcyBub3QgcHJvdGVjdGVkIGJ5IHRoZSBhdHRvcm5leS1jbGllbnQgcHJpdmlsZWdlLCBhbmQgc3VibWl0dGluZyB0aGlzIGluZm9ybWF0aW9uIGRvZXMgbm90IGNyZWF0ZSBhbiBhdHRvcm5leS1jbGllbnQgcmVsYXRpb25zaGlwLlxuICAgICAgICAgIDwvYj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnJlYWtcIj5cbiAgICAgICAgICBVcG9uIGVudGVyaW5nIHlvdXIgRGlyZWN0b3J5IFJlZ2lzdHJhdGlvbiBEYXRhIGFuZCBjbGlja2luZyBvbiB0aGUgYXBwbGljYWJsZSBzdWJtaXNzaW9uIGJ1dHRvbiBvbiB0aGUgU2l0ZSwgeW91IG1heSBiZSBwcm92aWRlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBwYXJ0aWNpcGF0aW5nIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzIHRoYXQgYXJlIGxvY2F0ZWQgaW4geW91ciBkZXNpZ25hdGVkIGdlb2dyYXBoaWMgYXJlYSB0aGF0IHlvdSBjYW4gY2hvb3NlIHRvIGNvbnRhY3Qgb3IgYmUgY29udGFjdGVkIGJ5LiBVcG9uIHlvdXIgcmVxdWVzdCB0byBjb250YWN0LCBvciBiZSBjb250YWN0ZWQgYnksIGFueSBvZiB0aGUgYXBwbGljYWJsZSBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVycywge3JlbmRlckRvbWFpbigpfSBtYXkgdHJhbnNmZXIgYWxsIG9yIHNvbWUgb2YgeW91ciBEaXJlY3RvcnkgUmVnaXN0cmF0aW9uIERhdGEgdG8gdGhlIGFwcGxpY2FibGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcihzKSBpbiBjb25uZWN0aW9uIHdpdGggZmFjaWxpdGF0aW5nIHlvdXIgcmVxdWVzdCBmb3IgVGhpcmQgUGFydHkgT2ZmZXJpbmdzIGZyb20gc2FtZS5cbiAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICBQbGVhc2UgYmUgYWR2aXNlZCB0aGF0IHNlbGVjdGluZyBhIFRoaXJkIFBhcnR5IExlZ2FsIFByb2Zlc3Npb25hbCB0byBjb250YWN0LCBvciBiZSBjb250YWN0ZWQgYnksIGRvZXMgbm90IGNyZWF0ZSBhbiBhdHRvcm5leS1jbGllbnQgcmVsYXRpb25zaGlwLlxuICAgICAgICAgIDwvYj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYnJlYWtcIj5cbiAgICAgICAgICBZb3UgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB7cmVuZGVyRG9tYWluKCl9IHNoYWxsIG5vdCBiZSBsaWFibGUgdG8geW91IG9yIGFueSB0aGlyZCBwYXJ0eSBmb3IgYW55IG1vZGlmaWNhdGlvbiwgc3VzcGVuc2lvbiBvciBkaXNjb250aW51YXRpb24gb2YgYW55IHNlcnZpY2Ugb2ZmZXJlZCBieSBhbnkgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlci5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5MaXN0aW5ncy9GcmVlIExpc3RpbmdzLjwvc3Ryb25nPlxuICAgICAgICAgIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBBZ3JlZW1lbnQsIGFzIHdlbGwgYXMgdGhlXG4gICAgICAgICAgPGEgY2xhc3NOYW1lPVwidW5kZXJsaW5lLWxpbmtcIiBocmVmPVwiL2luZm9ybWF0aW9uI2FkdmVydGlzZXJfdGVybXNcIiB0YXJnZXQ9XCJfYmxhbmtcIj5BZHZlcnRpc2VyIFRlcm1zPC9hPlxuICAgICAgICAgIHRoYXQgeW91IGFncmVlIHRvIGluIHRoZWlyIGVudGlyZXR5IHdoZW4geW91IHN1Ym1pdCBMaXN0aW5ncyBmb3IgZGlzcGxheSB0byBTaXRlIFVzZXJzLCBieSByZWdpc3RlcmluZyBvbiB0aGUgU2l0ZSwgYWdyZWVpbmcgdG8gdGhlIEFncmVlbWVudCBhbmQgcmVjZWl2aW5nIGFwcHJvdmFsIGZyb20ge3JlbmRlckRvbWFpbigpfSwgeW91IChhY3RpbmcgYXMgYSBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVyKSBjYW4gc3VibWl0LCBvciBhdHRlbXB0IHRvIHN1Ym1pdCwgTGlzdGluZ3MgZm9yIGRpc3BsYXkgdG8gU2l0ZSBVc2VycyB0aGF0IGNvbmR1Y3Qgc2VhcmNoZXMgYnkgYW5kIHRocm91Z2ggdGhlIERpcmVjdG9yeSBTZXJ2aWNlcy4gVG8gc3VibWl0IGEgTGlzdGluZywgeW91IG11c3QgZmlyc3QgZnVsbHkgY29tcGxldGUgdGhlIGFwcGxpY2FibGUgU2l0ZSBGb3JtLiBUaGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgbXVzdCBzdXBwbHkgb24gdGhlIFNpdGUgRm9ybSBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvOiAoYSkgeW91ciBjb21wYW55IG5hbWU7IChiKSB5b3VyIGNvbXBhbnkncyBhZGRyZXNzOyAoYykgeW91ciBidXNpbmVzcyB0ZWxlcGhvbmUgbnVtYmVyOyAoZCkgY2F0ZWdvcmllcyB0aGF0IGFwcGx5IHRvIHlvdXIgY29tcGFueSdzIGJ1c2luZXNzIHByYWN0aWNlLCBpZiBhcHBsaWNhYmxlOyAoZSkgYXQgeW91ciBvcHRpb24sIHlvdXIgYnVzaW5lc3MgcHJvZmlsZSBhbmQgbGluayB0byB5b3VyIGNvbXBhbnkncyB3ZWJzaXRlOyBhbmQvb3IgKGYpIGFueSBvdGhlciBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgb24gdGhlIFNpdGUgRm9ybSAoY29sbGVjdGl2ZWx5LCB0aGUgXCJMaXN0aW5nIFJlZ2lzdHJhdGlvbiBEYXRhXCIpLiBZb3UgYWdyZWUgdG8gcHJvdmlkZSB0cnVlLCBhY2N1cmF0ZSwgY3VycmVudCBhbmQgY29tcGxldGUgTGlzdGluZyBSZWdpc3RyYXRpb24gRGF0YSBhbmQgdG8gdXBkYXRlIHlvdXIgTGlzdGluZyBSZWdpc3RyYXRpb24gRGF0YSBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXQgaW4gYSBjdXJyZW50IGFuZCBhY2N1cmF0ZSBmYXNoaW9uLiB7cmVuZGVyRG9tYWluKCl9J3MgdXNlIG9mIHRoZSBMaXN0aW5nIFJlZ2lzdHJhdGlvbiBEYXRhIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBQcml2YWN5IFBvbGljeS5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJicmVha1wiPlxuICAgICAgICAgIFRoZSBMaXN0aW5ncyBjb250YWluIGRlc2NyaXB0aW9ucyB0aGF0IGFyZSBwcm92aWRlZCBkaXJlY3RseSBieSB0aGUgYXBwbGljYWJsZSBUaGlyZCBQYXJ0eSBTZXJ2aWNlIFByb3ZpZGVycywgb3IgdGhlIG1hbnVmYWN0dXJlcnMgb3IgZGlzdHJpYnV0b3JzIG9mIHRoZSBUaGlyZCBQYXJ0eSBPZmZlcmluZ3MgZmVhdHVyZWQgaW4gdGhlIExpc3RpbmdzLCBhcyBhcHBsaWNhYmxlLiB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IHJlcHJlc2VudCBvciB3YXJyYW50IHRoYXQgdGhlIGRlc2NyaXB0aW9ucyBvZiBzdWNoIGl0ZW1zIGFyZSBhY2N1cmF0ZSBvciBjb21wbGV0ZS4gQXMgYSByZXN1bHQsIHtyZW5kZXJEb21haW4oKX0gaGFzIG5vIGNvbnRyb2wgb3ZlcjogKGkpIHRoZSBxdWFsaXR5LCBzYWZldHkgb3IgbGVnYWxpdHkgb2YgdGhlIFRoaXJkIFBhcnR5IE9mZmVyaW5nczsgKGlpKSB0aGUgdHJ1dGggb3IgYWNjdXJhY3kgb2YgdGhlIExpc3RpbmdzOyBhbmQvb3IgKGlpaSkgdGhlIGFiaWxpdHkgb2YgdGhlIGFwcGxpY2FibGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgdG8gc2VsbCB0aGUgVGhpcmQgUGFydHkgT2ZmZXJpbmdzLiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIG9mZmVyLCBzYWxlLCBwdXJjaGFzZSwgZXhwb3J0IG9yIGltcG9ydCBvZiBhbnkgVGhpcmQgUGFydHkgT2ZmZXJpbmdzIGlzIHZhbGlkIGFuZCBsZWdhbCBzaW1wbHkgYmVjYXVzZSBpdCBpcyBsaXN0ZWQgb24gdGhlIFNpdGUuIFdlIGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGFwcGxpY2FibGUgVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlciBhY3R1YWxseSBjb21wbGV0ZXMgYSB0cmFuc2FjdGlvbi4gV2hlcmUgeW91IHN1Ym1pdCBhIExpc3RpbmcgYnkgYW5kIHRocm91Z2ggdGhlIFNpdGUsIHlvdSByZXByZXNlbnQgYW5kIHdhcnJhbnQgdGhhdDogKEEpIGFsbCBjb250ZW50IGluIHRoZSBMaXN0aW5nIGlzIGFjY3VyYXRlLCBjb21wbGV0ZSBhbmQgY3VycmVudDsgKEIpIHlvdSBoYXZlIGFsbCBuZWNlc3NhcnkgcmlnaHRzLCBwb3dlciBhbmQgYXV0aG9yaXR5IHRvIHB1Ymxpc2ggdGhlIExpc3Rpbmc7IChDKSB0aGUgTGlzdGluZywgYW5kIGFueSB3ZWJzaXRlIGxpc3RlZCBpbiwgb3IgbGlua2VkIHRvIGZyb20sIHRoZSBMaXN0aW5nOiAoSSkgY29tcGxpZXMgd2l0aCBhbGwgYXBwbGljYWJsZSBsYXdzIGFuZCByZWd1bGF0aW9uczsgKElJKSBkb2VzIG5vdCBpbmZyaW5nZSB1cG9uLCBtaXNhcHByb3ByaWF0ZSBvciBvdGhlcndpc2UgdmlvbGF0ZSBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgc2VydmljZSBtYXJrLCB0cmFkZSBzZWNyZXQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0IG9mIGFueSB0aGlyZCBwYXJ0eTsgKElJSSkgZG9lcyBub3QgdmlvbGF0ZSB0aGUgcmlnaHRzIG9mIGFueSBwZXJzb24gb3IgZW50aXR5LCBpbmNsdWRpbmcgcmlnaHRzIG9mIHB1YmxpY2l0eSBvciBwcml2YWN5LCBhbmQgaXMgbm90IGRlZmFtYXRvcnk7IGFuZCAoSVYpIGRvZXMgbm90IHJlc3VsdCBpbiBjb25zdW1lciBmcmF1ZCAoaW5jbHVkaW5nIGJlaW5nIGZhbHNlIG9yIG1pc2xlYWRpbmcpLCBwcm9kdWN0IGxpYWJpbGl0eSwgdG9ydCwgYnJlYWNoIG9mIGNvbnRyYWN0LCBpbmp1cnksIGRhbWFnZSBvciBoYXJtIG9mIGFueSBraW5kIHRvIGFueSBwZXJzb24gb3IgZW50aXR5OyBhbmQgKEQpIHlvdSBwb3NzZXNzIGRvY3VtZW50cyB0aGF0IHN1YnN0YW50aWF0ZSBhbGwgY2xhaW1zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBjb250YWluZWQgd2l0aGluIHRoZSBMaXN0aW5nLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPlBhaWQgQWR2ZXJ0aXNlciBTZXJ2aWNlcy48L3N0cm9uZz5cbiAgICAgICAgICBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQWdyZWVtZW50LCBhcyB3ZWxsIGFzIHRoZVxuICAgICAgICAgIDxhIGNsYXNzTmFtZT1cInVuZGVybGluZS1saW5rXCIgaHJlZj1cIi9pbmZvcm1hdGlvbiNhZHZlcnRpc2VyX3Rlcm1zXCIgdGFyZ2V0PVwiX2JsYW5rXCI+QWR2ZXJ0aXNlciBUZXJtczwvYT5cbiAgICAgICAgICB0aGF0IHlvdSBhZ3JlZSB0byBpbiB0aGVpciBlbnRpcmV0eSB3aGVuIHlvdSByZWdpc3RlciB0byBiZWNvbWUgYW4gQWR2ZXJ0aXNlciwgYnkgcmVnaXN0ZXJpbmcgb24gdGhlIFNpdGUgYW5kIHJlY2VpdmluZyBhcHByb3ZhbCBmcm9tIHtyZW5kZXJEb21haW4oKX0sIHlvdSBjYW4gb2J0YWluLCBvciBhdHRlbXB0IHRvIG9idGFpbiwgZm9yIGEgZmVlLCBhY2Nlc3MgdG8gdGhlIFBhaWQgQWR2ZXJ0aXNlciBTZXJ2aWNlcyBhcyBhbiBBZHZlcnRpc2VyLiBBbGwgcGF5bWVudCB0ZXJtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFBhaWQgQWR2ZXJ0aXNlciBTZXJ2aWNlcyBzaGFsbCBiZSBzZXQgZm9ydGggaW4gdGhlIEFkdmVydGlzZXIgVGVybXMuICBQbGVhc2UgcmV2aWV3IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGVcbiAgICAgICAgICA8YSBjbGFzc05hbWU9XCJ1bmRlcmxpbmUtbGlua1wiIGhyZWY9XCIvaW5mb3JtYXRpb24jYWR2ZXJ0aXNlcl90ZXJtc1wiIHRhcmdldD1cIl9ibGFua1wiPkFkdmVydGlzZXIgVGVybXM8L2E+XG4gICAgICAgICAgY2FyZWZ1bGx5IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggcmVnaXN0cmF0aW9uLiBBZHZlcnRpc2VycyBhcmUgc3ViamVjdCB0byB0aGUgc2FtZSBvYmxpZ2F0aW9ucywgdGVybXMgYW5kIGNvbmRpdGlvbnMgYXMgYXBwbHkgdG8gVGhpcmQgUGFydHkgU2VydmljZSBQcm92aWRlcnMgdW5kZXIgdGhlIEFncmVlbWVudCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgdGhvc2UgYXBwbGljYWJsZSB0byBMaXN0aW5ncyBzZXQgZm9ydGggaW4gU2VjdGlvbiA2IGFib3ZlLiBUbyBzdWJtaXQgYSBMaXN0aW5nLCB5b3UgbXVzdCBmaXJzdCBmdWxseSBjb21wbGV0ZSB0aGUgYXBwbGljYWJsZSBTaXRlIEZvcm0gb24gdGhlIFNpdGUsIG9yIHZpYSB0ZWxlcGhvbmUgd2l0aCBhbiB7cmVuZGVyRG9tYWluKCl9IHJlcHJlc2VudGF0aXZlLiBUaGUgaW5mb3JtYXRpb24gdGhhdCB5b3UgbXVzdCBzdXBwbHkgb24gdGhlIFNpdGUgRm9ybSBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvOiAoYSkgeW91ciBjb21wYW55IG5hbWU7IChiKSB5b3VyIGNvbXBhbnkncyBhZGRyZXNzOyAoYykgeW91ciBidXNpbmVzcyB0ZWxlcGhvbmUgbnVtYmVyOyAoZCkgY2F0ZWdvcmllcyB0aGF0IGFwcGx5IHRvIHlvdXIgY29tcGFueSdzIGJ1c2luZXNzIHByYWN0aWNlLCBpZiBhcHBsaWNhYmxlOyAoZSkgYXQgeW91ciBvcHRpb24sIHlvdXIgbW9iaWxlIHRlbGVwaG9uZSBudW1iZXI7IChmKSBhdCB5b3VyIG9wdGlvbiwgeW91ciBidXNpbmVzcyBwcm9maWxlIGFuZCBsaW5rIHRvIHlvdXIgY29tcGFueSdzIHdlYnNpdGU7IChnKSB5b3VyIGNyZWRpdCBjYXJkIGluZm9ybWF0aW9uOyBhbmQvb3IgKGgpIGFueSBvdGhlciBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgb24gdGhlIFNpdGUgRm9ybSAoY29sbGVjdGl2ZWx5LCB0aGUgXCJBZHZlcnRpc2VyIFJlZ2lzdHJhdGlvbiBEYXRhXCIpLiBZb3UgYWdyZWUgdG8gcHJvdmlkZSB0cnVlLCBhY2N1cmF0ZSwgY3VycmVudCBhbmQgY29tcGxldGUgQWR2ZXJ0aXNlciBSZWdpc3RyYXRpb24gRGF0YSBhbmQgdG8gdXBkYXRlIHlvdXIgQWR2ZXJ0aXNlciBSZWdpc3RyYXRpb24gRGF0YSBhcyBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gaXQgaW4gYSBjdXJyZW50IGFuZCBhY2N1cmF0ZSBmYXNoaW9uLiB7cmVuZGVyRG9tYWluKCl9J3MgdXNlIG9mIHRoZSBBZHZlcnRpc2VyIFJlZ2lzdHJhdGlvbiBEYXRhIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBQcml2YWN5IFBvbGljeS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPlJlc291cmNlIE5ldHdvcmsuPC9zdHJvbmc+XG4gICAgICAgICAgVGhlIFJlc291cmNlIE5ldHdvcmsgZmVhdHVyZXMgb25nb2luZywgaW50ZXJhY3RpdmUgY29udmVyc2F0aW9ucywgZGlzY3Vzc2lvbnMgYW5kIGZvcnVtcyBzdXJyb3VuZGluZyBhcnRpY2xlcyAoXCJOZXR3b3JrIEFydGljbGVzXCIpIG9uIGEgYnJvYWQgcmFuZ2Ugb2YgdG9waWNzIGFzIHN1Ym1pdHRlZCBieSByZWdpc3RlcmVkIE5ldHdvcmsgUGFydGljaXBhbnRzIGFuZC9vciBwZXJtaXR0ZWQgZ3Vlc3RzLiBWaXNpdG9ycyBtYXkgYmUgcGVybWl0dGVkIHRvIHBvc3QgRmVlZGJhY2sgYXQgdGhlIGVuZCBvZiBOZXR3b3JrIEFydGljbGVzLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQWdyZWVtZW50LCBieSBzZW5kaW5nIHtyZW5kZXJEb21haW4oKX0gYSByZXF1ZXN0IHRvOiAoYSlcbiAgICAgICAgICA8YSBjbGFzc05hbWU9XCJ1bmRlcmxpbmUtbGlua1wiIG1haWx0bz1cIkhvbWVFeHBlcnROZXR3b3JrQGVMb2NhbC5jb21cIj5Ib21lRXhwZXJ0TmV0d29ya0BlTG9jYWwuY29tLDwvYT5cbiAgICAgICAgICBhZ3JlZWluZyB0byB0aGUgQWdyZWVtZW50IGFuZCByZWNlaXZpbmcgYXBwcm92YWwgZnJvbSB7cmVuZGVyRG9tYWluKCl9LCB5b3UgbWF5IGJlIGdyYW50ZWQgYWNjZXNzIHRvIHRoZSBIb21lIEV4cGVydCBOZXR3b3JrIGFzIGFuIE9uZ29pbmcgQ29udHJpYnV0b3Igb3IgRXhwZXJ0IFBhbmVsaXN0OyBhbmQvb3IgKGIpXG4gICAgICAgICAgPGEgY2xhc3NOYW1lPVwidW5kZXJsaW5lLWxpbmtcIiBtYWlsdG89XCJMZWdhbFJlc291cmNlTmV0d29ya0BlTG9jYWwuY29tXCI+TGVnYWxSZXNvdXJjZU5ldHdvcmtAZUxvY2FsLmNvbSw8L2E+XG4gICAgICAgICAgeW91IG1heSBiZSBncmFudGVkIGFjY2VzcyB0byB0aGUgTGVnYWwgUmVzb3VyY2UgTmV0d29yayBhcyBhbiBDb250cmlidXRvciBvciBNZW1iZXIuIFRvIGJlY29tZSBhIE5ldHdvcmsgUGFydGljaXBhbnQsIHlvdSBtdXN0IHByb3ZpZGUgY2VydGFpbiBpbmZvcm1hdGlvbiB0byB0aGUgYXBwbGljYWJsZSB7cmVuZGVyRG9tYWluKCl9IHJlcHJlc2VudGF0aXZlIChjb2xsZWN0aXZlbHksIHRoZSBcIk5ldHdvcmsgUmVnaXN0cmF0aW9uIERhdGFcIiBhbmQgdG9nZXRoZXIgd2l0aCB0aGUgRGlyZWN0b3J5IFJlZ2lzdHJhdGlvbiBEYXRhLCBMaXN0aW5nIFJlZ2lzdHJhdGlvbiBEYXRhIGFuZCBBZHZlcnRpc2VyIFJlZ2lzdHJhdGlvbiBEYXRhLCB0aGUgXCJSZWdpc3RyYXRpb24gRGF0YVwiKS4gWW91IGFncmVlIHRvIHByb3ZpZGUgdHJ1ZSwgYWNjdXJhdGUsIGN1cnJlbnQgYW5kIGNvbXBsZXRlIE5ldHdvcmsgUmVnaXN0cmF0aW9uIERhdGEgYW5kIHRvIHVwZGF0ZSB5b3VyIE5ldHdvcmsgUmVnaXN0cmF0aW9uIERhdGEgYXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIG1haW50YWluIGl0IGluIGEgY3VycmVudCBhbmQgYWNjdXJhdGUgZmFzaGlvbi4ge3JlbmRlckRvbWFpbigpfSdzIHVzZSBvZiBOZXR3b3JrIFJlZ2lzdHJhdGlvbiBEYXRhIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBQcml2YWN5IFBvbGljeS5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJicmVha1wiPlxuICAgICAgICAgIFRoZSBOZXR3b3JrIEFydGljbGVzIGFyZSBwcm92aWRlZCBkaXJlY3RseSBieSB0aGUgYXBwbGljYWJsZSBOZXR3b3JrIFBhcnRpY2lwYW50cy4ge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCByZXByZXNlbnQgb3Igd2FycmFudCB0aGF0IHRoZSBOZXR3b3JrIEFydGljbGVzIGFyZSBhY2N1cmF0ZSBvciBjb21wbGV0ZS4gQXMgYSByZXN1bHQsIHtyZW5kZXJEb21haW4oKX0gaGFzIG5vIGNvbnRyb2wgb3ZlcjogKGEpIHRoZSBxdWFsaXR5LCBzYWZldHkgb3IgbGVnYWxpdHkgb2YgdGhlIE5ldHdvcmsgQXJ0aWNsZXM7IGFuZC9vciAoYikgdGhlIHRydXRoIG9yIGFjY3VyYWN5IG9mIHRoZSBOZXR3b3JrIEFydGljbGVzLiBXaGVyZSB5b3Ugc3VibWl0IGEgTmV0d29yayBBcnRpY2xlIGJ5IGFuZCB0aHJvdWdoIHRoZSBTaXRlLCB5b3UgcmVwcmVzZW50IGFuZCB3YXJyYW50IHRoYXQ6IChpKSBhbGwgY29udGVudCBpbiB0aGUgTmV0d29yayBBcnRpY2xlIGlzIGFjY3VyYXRlLCBjb21wbGV0ZSBhbmQgY3VycmVudDsgKGlpKSB5b3UgaGF2ZSBhbGwgbmVjZXNzYXJ5IHJpZ2h0cywgcG93ZXIgYW5kIGF1dGhvcml0eSB0byBwdWJsaXNoIHRoZSBOZXR3b3JrIEFydGljbGUgKGFuZCBncmFudCB7cmVuZGVyRG9tYWluKCl9IHRoZSByaWdodHMgdG8gcHVibGlzaCBhbmQgdXNlIHNhbWUgYXMgY29udGVtcGxhdGVkIGhlcmV1bmRlcik7IChpaWkpIHRoZSBOZXR3b3JrIEFydGljbGUsIGFuZCBhbnkgd2Vic2l0ZSBsaXN0ZWQgaW4sIG9yIGxpbmtlZCB0byBmcm9tLCB0aGUgTmV0d29yayBBcnRpY2xlOiAoQSkgY29tcGxpZXMgd2l0aCBhbGwgYXBwbGljYWJsZSBsYXdzLCBydWxlcyBhbmQgcmVndWxhdGlvbnMgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSBGZWRlcmFsIFRyYWRlIENvbW1pc3Npb24gR3VpZGVsaW5lcyBDb25jZXJuaW5nIHRoZSBVc2Ugb2YgRW5kb3JzZW1lbnRzIGFuZCBUZXN0aW1vbmlhbHM7IChCKSBkb2VzIG5vdCBpbmZyaW5nZSB1cG9uLCBtaXNhcHByb3ByaWF0ZSBvciBvdGhlcndpc2UgdmlvbGF0ZSBhbnkgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgc2VydmljZSBtYXJrLCB0cmFkZSBzZWNyZXQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0IG9mIGFueSB0aGlyZCBwYXJ0eTsgKEMpIGRvZXMgbm90IHZpb2xhdGUgdGhlIHJpZ2h0cyBvZiBhbnkgcGVyc29uIG9yIGVudGl0eSwgaW5jbHVkaW5nIHJpZ2h0cyBvZiBwdWJsaWNpdHkgb3IgcHJpdmFjeSwgYW5kIGlzIG5vdCBkZWZhbWF0b3J5OyBhbmQgKEQpIGRvZXMgbm90IHJlc3VsdCBpbiBjb25zdW1lciBmcmF1ZCAoaW5jbHVkaW5nIGJlaW5nIGZhbHNlIG9yIG1pc2xlYWRpbmcpLCBwcm9kdWN0IGxpYWJpbGl0eSwgdG9ydCwgYnJlYWNoIG9mIGNvbnRyYWN0LCBpbmp1cnksIGRhbWFnZSBvciBoYXJtIG9mIGFueSBraW5kIHRvIGFueSBwZXJzb24gb3IgZW50aXR5OyBhbmQgKGl2KSB5b3UgcG9zc2VzcyBkb2N1bWVudHMgdGhhdCBzdWJzdGFudGlhdGUgYWxsIGNsYWltcywgZXhwcmVzcyBhbmQgaW1wbGllZCwgY29udGFpbmVkIHdpdGhpbiB0aGUgTmV0d29yayBBcnRpY2xlLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPkNvbnRlbnQuPC9zdHJvbmc+XG4gICAgICAgICAgU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEFncmVlbWVudCwgZW5kLXVzZXJzIHRoYXQgcG9zc2VzcyB0aGUgcmVxdWlzaXRlIHRlY2hub2xvZ3kgc2hhbGwgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gdmlldywgZG93bmxvYWQgYW5kL29yIGludGVyYWN0IHdpdGggYWxsIG9yIHNvbWUgb2YgdGhlIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgYW5kIHRocm91Z2ggdGhlIFNpdGUgYW5kL29yIG90aGVyIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLiBUaGUgQ29udGVudCBpcyBjb21waWxlZCwgZGlzdHJpYnV0ZWQgYW5kIGRpc3BsYXllZCBieSB7cmVuZGVyRG9tYWluKCl9LCBhcyB3ZWxsIGFzIHZhcmlvdXMgdGhpcmQtcGFydHkgY29udGVudCBwcm92aWRlcnMgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIFRoaXJkIFBhcnR5IFNlcnZpY2UgUHJvdmlkZXJzLCBWaXNpdG9ycyBhbmQgTmV0d29yayBQYXJ0aWNpcGFudHMgKFwiVGhpcmQtUGFydHkgUHJvdmlkZXJzXCIpLiB7cmVuZGVyRG9tYWluKCl9IGRvZXMgbm90IGNvbnRyb2wgdGhlIENvbnRlbnQgcHJvdmlkZWQgYnkgVGhpcmQtUGFydHkgUHJvdmlkZXJzIHRoYXQgaXMgbWFkZSBhdmFpbGFibGUgYnkgYW5kIHRocm91Z2ggdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLiBTdWNoIFRoaXJkLVBhcnR5IFByb3ZpZGVycyBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjdXJhY3ksIGNvbXBsZXRlbmVzcywgYXBwcm9wcmlhdGVuZXNzIGFuZC9vciB1c2VmdWxuZXNzIG9mIHN1Y2ggQ29udGVudC4gVGhlIENvbnRlbnQgc2hvdWxkIG5vdCBuZWNlc3NhcmlseSBiZSByZWxpZWQgdXBvbi4ge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCByZXByZXNlbnQgb3Igd2FycmFudCB0aGF0IHRoZSBDb250ZW50IGFuZCBvdGhlciBpbmZvcm1hdGlvbiBwb3N0ZWQgYnkgYW5kIHRocm91Z2ggdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGlzIGFjY3VyYXRlLCBjb21wbGV0ZSwgdXAtdG8tZGF0ZSBvciBhcHByb3ByaWF0ZS4gWW91IHVuZGVyc3RhbmQgYW5kIGFncmVlIHRoYXQge3JlbmRlckRvbWFpbigpfSBzaGFsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yLCBhbmQge3JlbmRlckRvbWFpbigpfSB1bmRlcnRha2VzIG5vIHJlc3BvbnNpYmlsaXR5IHRvIG1vbml0b3Igb3Igb3RoZXJ3aXNlIHBvbGljZSwgQ29udGVudCBwcm92aWRlZCBieSBUaGlyZC1QYXJ0eSBQcm92aWRlcnMuXG4gICAgICAgICAgPGIgY2xhc3NOYW1lPVwiZGFya2VuXCI+PC9iPlxuICAgICAgICAgIFlvdSBhZ3JlZSB0aGF0IHtyZW5kZXJEb21haW4oKX0gc2hhbGwgaGF2ZSBubyBvYmxpZ2F0aW9uIGFuZCBpbmN1ciBubyBsaWFiaWxpdHkgdG8geW91IGluIGNvbm5lY3Rpb24gd2l0aCBhbnkgQ29udGVudC4gWW91IG1heSBmaW5kIGNlcnRhaW4gQ29udGVudCB0byBiZSBvdXRkYXRlZCwgaGFybWZ1bCwgaW5hY2N1cmF0ZSBhbmQvb3IgZGVjZXB0aXZlLiBQbGVhc2UgdXNlIGNhdXRpb24sIGNvbW1vbiBzZW5zZSBhbmQgc2FmZXR5IHdoZW4gdXNpbmcgdGhlIENvbnRlbnQuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5Tb2NpYWwgTWVkaWEgUGFnZXMuPC9zdHJvbmc+XG4gICAgICAgICAgVGhlIFNpdGUgY29udGFpbnMgbGlua3MgdG8gdmFyaW91cyB7cmVuZGVyRG9tYWluKCl9IFNvY2lhbCBNZWRpYSBQYWdlcy4gVGhlIFNvY2lhbCBNZWRpYSBQYWdlcyBhcmUgaG9zdGVkIGFuZCBtYWRlIGF2YWlsYWJsZSBvbiB0aGlyZCBwYXJ0eSB3ZWJzaXRlcyAoXCJTb2NpYWwgTWVkaWEgV2Vic2l0ZXNcIikgYnkgdGhpcmQgcGFydHkgZW50aXRpZXMuIFlvdXIgdXNlIG9mIFNvY2lhbCBNZWRpYSBQYWdlcyBhbmQgU29jaWFsIE1lZGlhIFdlYnNpdGVzIHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBhcHBsaWNhYmxlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRob3NlIFNvY2lhbCBNZWRpYSBXZWJzaXRlcy5cbiAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICBZb3UgdW5kZXJzdGFuZCBhbmQgYWdyZWUgdGhhdCB7cmVuZGVyRG9tYWluKCl9IHNoYWxsIG5vdCBiZSBsaWFibGUgdG8geW91LCBhbnkgb3RoZXIgZW5kLXVzZXIgb3IgYW55IHRoaXJkIHBhcnR5IGZvciBhbnkgY2xhaW0gaW4gY29ubmVjdGlvbiB3aXRoIHlvdXIgdXNlIG9mLCBvciBpbmFiaWxpdHkgdG8gdXNlLCB0aGUgU29jaWFsIE1lZGlhIFBhZ2VzIGFuZC9vciBTb2NpYWwgTWVkaWEgV2Vic2l0ZXMuXG4gICAgICAgICAgPC9iPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+SW50ZXJhY3RpdmUgU2VydmljZXMuPC9zdHJvbmc+XG4gICAgICAgICAgU3ViamVjdCB0byB0aGUgcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBoZXJlaW4sIHRoZSBJbnRlcmFjdGl2ZSBTZXJ2aWNlcyB3aWxsIGFsbG93IHlvdSB0byBwYXJ0aWNpcGF0ZSBpbiwgYW5kIHByb3ZpZGUgRmVlZGJhY2sgaW4gY29ubmVjdGlvbiB3aXRoLCBOZXR3b3JrIEFydGljbGVzIGNvbW1lbnQgc2VjdGlvbnMsIGJsb2dzLCBtZXNzYWdlIGJvYXJkcywgcXVlc3Rpb24gYW5kIGFuc3dlciBhcmVhcyBhbmQgb3RoZXIgaW50ZXJhY3RpdmUgYXJlYXMgb2YgdGhlIFNpdGUuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5TaXRlIENvbnRlbnQgU3VibWlzc2lvbiBHdWlkZWxpbmVzLjwvc3Ryb25nPlxuICAgICAgICAgIEFsbCBTaXRlIENvbnRlbnQgdGhhdCB5b3Ugc3VibWl0IHRocm91Z2ggb3IgaW4gYXNzb2NpYXRpb24gd2l0aCB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSBSZWdpc3RyYXRpb24gRGF0YSwgRmVlZGJhY2ssIExpc3RpbmdzLCBDb250ZW50LCBOZXR3b3JrIEFydGljbGVzLCBhZHZlcnRpc2VtZW50cywgcmVzcG9uc2VzLCBzdGF0ZW1lbnRzLCBwcm9taXNlcyBvciBvdGhlciBpbmZvcm1hdGlvbiwgc2hhbGwgYmUgc3ViamVjdCB0byB0aGUgUHJpdmFjeSBQb2xpY3kuIEZvciBhIGNvcHkgb2YgdGhlIFByaXZhY3kgUG9saWN5LCBwbGVhc2VcbiAgICAgICAgICA8YSBjbGFzc05hbWU9XCJ1bmRlcmxpbmUtbGlua1wiIGhyZWY9XCIvaW5mb3JtYXRpb24jcHJpdmFjeVwiIHRhcmdldD1cIl9ibGFua1wiPmNsaWNrIGhlcmUuPC9hPlxuICAgICAgICAgIEJ5IHN1Ym1pdHRpbmcgc3VjaCBTaXRlIENvbnRlbnQgdG8gdXMsIHlvdTogKGEpIHJlcHJlc2VudCBhbmQgd2FycmFudCB0aGF0IHtyZW5kZXJEb21haW4oKX0ncyB1c2Ugb2YgeW91ciBzdWJtaXNzaW9uIGRvZXMgbm90IGFuZCB3aWxsIG5vdCBicmVhY2ggYW55IGFncmVlbWVudCwgdmlvbGF0ZSBhbnkgbGF3IG9yIGluZnJpbmdlIHVwb24gYW55IHRoaXJkIHBhcnR5J3MgcmlnaHRzOyAoYikgYWdyZWUgdGhhdCB7cmVuZGVyRG9tYWluKCl9IGlzIGZyZWUgdG8gdXNlIGluIGFueSBtYW5uZXIgYWxsIG9yIHBhcnQgb2YgdGhlIGNvbnRlbnQgb2YgYW55IHN1Y2ggU2l0ZSBDb250ZW50IG9yIG90aGVyIG1hdGVyaWFscyBpbiBwZXJwZXR1aXR5LCBvbiBhbiB1bnJlc3RyaWN0ZWQgYmFzaXMgd2l0aG91dCB0aGUgb2JsaWdhdGlvbiB0byBub3RpZnksIGlkZW50aWZ5IG9yIGNvbXBlbnNhdGUgeW91IG9yIGFueW9uZSBlbHNlOyBhbmQgKGMpIGdyYW50IHtyZW5kZXJEb21haW4oKX0gYWxsIG5lY2Vzc2FyeSByaWdodHMsIGluY2x1ZGluZyBhIHdhaXZlciBvZiBhbGwgY29weXJpZ2h0LCB0cmFkZW1hcmssIHByaXZhY3kgYW5kIG1vcmFsIHJpZ2h0cywgdG8gdXNlIGFsbCBTaXRlIENvbnRlbnQgYW5kL29yIG1hdGVyaWFscywgaW4gd2hvbGUgb3IgaW4gcGFydCwgb3IgYXMgYSBkZXJpdmF0aXZlIHdvcmssIHdpdGhvdXQgYW55IGR1dHkgYnkge3JlbmRlckRvbWFpbigpfSB0byBhbnlvbmUgd2hhdHNvZXZlci4ge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCBhY2NlcHQgdW5zb2xpY2l0ZWQgaWRlYXMsIHdvcmtzIG9yIG90aGVyIG1hdGVyaWFscyBhbmQgeW91IGFja25vd2xlZGdlIHRoYXQgeW91IGFyZSByZXNwb25zaWJsZSBmb3IsIGFuZCBiZWFyIGFsbCByaXNrIGFzIHRvIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uIG9mLCBhbnkgc3VjaCBpZGVhcywgd29ya3MgYW5kL29yIG1hdGVyaWFscy5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJicmVha1wiPlxuICAgICAgICAgIFlvdSBhZ3JlZSB0aGF0IHlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciB0aGUgU2l0ZSBDb250ZW50IHRoYXQgeW91IHB1Ymxpc2gsIHRyYW5zbWl0IGFuZC9vciBwb3N0IGJ5IGFuZCB0aHJvdWdoIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncy4gWW91IGFncmVlIHRvIHVzZSB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaW4gZnVsbCBjb21wbGlhbmNlIHdpdGggYWxsIGFwcGxpY2FibGUgbGF3cywgcnVsZXMgYW5kIHJlZ3VsYXRpb25zLiBJbiBjb25uZWN0aW9uIHdpdGggeW91ciB1c2Ugb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLCBhbmQgc3VibWlzc2lvbiBvZiBTaXRlIENvbnRlbnQsIHlvdSBhZ3JlZSBub3QgdG86IChpKSBkaXNwbGF5IGFueSB0ZWxlcGhvbmUgbnVtYmVycywgc3RyZWV0IGFkZHJlc3NlcywgbGFzdCBuYW1lcywgVVJMcywgZS1tYWlsIGFkZHJlc3NlcyBvciBhbnkgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIGFueSB0aGlyZCBwYXJ0eTsgKGlpKSBkaXNwbGF5IGFueSBhdWRpbyBmaWxlcywgdGV4dCwgcGhvdG9ncmFwaHMsIHZpZGVvcyBvciBvdGhlciBpbWFnZXMgY29udGFpbmluZyBjb25maWRlbnRpYWwgaW5mb3JtYXRpb247IChpaWkpIGRpc3BsYXkgYW55IGF1ZGlvIGZpbGVzLCB0ZXh0LCBwaG90b2dyYXBocywgdmlkZW9zIG9yIG90aGVyIGltYWdlcyB0aGF0IG1heSBiZSBkZWVtZWQgaW5kZWNlbnQgb3Igb2JzY2VuZSBpbiB5b3VyIGNvbW11bml0eSwgYXMgZGVmaW5lZCB1bmRlciBhcHBsaWNhYmxlIGxhdzsgKGl2KSBpbXBlcnNvbmF0ZSBhbnkgcGVyc29uIG9yIGVudGl0eTsgKHYpIFwic3RhbGtcIiBvciBvdGhlcndpc2UgaGFyYXNzIGFueSBwZXJzb247ICh2aSkgZW5nYWdlIGluIHVuYXV0aG9yaXplZCBhZHZlcnRpc2luZyB0bywgb3IgY29tbWVyY2lhbCBzb2xpY2l0YXRpb24gb2YsIFNpdGUgVXNlcnM7ICh2aWkpIHRyYW5zbWl0IGFueSBjaGFpbiBsZXR0ZXJzLCBzcGFtIG9yIGp1bmsgZS1tYWlsIHRvIFNpdGUgVXNlcnMgb3Igb3RoZXIgcGFydGllczsgKHZpaWkpIGV4cHJlc3Mgb3IgaW1wbHkgdGhhdCBhbnkgc3RhdGVtZW50cyB5b3UgbWFrZSBhcmUgZW5kb3JzZWQgYnkge3JlbmRlckRvbWFpbigpfTsgKGl4KSBoYXJ2ZXN0IG9yIGNvbGxlY3QgcGVyc29uYWwgaW5mb3JtYXRpb24gb2YgU2l0ZSBVc2VycyB3aGV0aGVyIG9yIG5vdCBmb3IgY29tbWVyY2lhbCBwdXJwb3Nlcywgd2l0aG91dCB0aGVpciBleHByZXNzIGNvbnNlbnQ7ICh4KSB1c2UgYW55IHJvYm90LCBzcGlkZXIsIHNpdGUgc2VhcmNoL3JldHJpZXZhbCBhcHBsaWNhdGlvbiwgb3Igb3RoZXIgbWFudWFsIG9yIGF1dG9tYXRpYyBkZXZpY2Ugb3IgcHJvY2VzcyB0byByZXRyaWV2ZSwgaW5kZXgsIFwiZGF0YSBtaW5lLFwiIG9yIGluIGFueSB3YXkgcmVwcm9kdWNlIG9yIGNpcmN1bXZlbnQgdGhlIG5hdmlnYXRpb25hbCBzdHJ1Y3R1cmUgb3IgcHJlc2VudGF0aW9uIG9mIHRoZSBTaXRlIG9yIGl0cyBjb250ZW50czsgKHhpKSBwb3N0LCBkaXN0cmlidXRlIG9yIHJlcHJvZHVjZSBpbiBhbnkgd2F5IGFueSBjb3B5cmlnaHRlZCBtYXRlcmlhbCwgdHJhZGVtYXJrcyBvciBvdGhlciBwcm9wcmlldGFyeSBpbmZvcm1hdGlvbiB3aXRob3V0IG9idGFpbmluZyB0aGUgcHJpb3IgY29uc2VudCBvZiB0aGUgb3duZXIgb2Ygc3VjaCBwcm9wcmlldGFyeSByaWdodHM7ICh4aWkpIHJlbW92ZSBhbnkgY29weXJpZ2h0LCB0cmFkZW1hcmsgb3Igb3RoZXIgcHJvcHJpZXRhcnkgcmlnaHRzIG5vdGljZXMgY29udGFpbmVkIGluIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5nczsgKHhpaWkpIGludGVyZmVyZSB3aXRoIG9yIGRpc3J1cHQgYW55IG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBhbmQvb3IgdGhlIHNlcnZlcnMgb3IgbmV0d29ya3MgY29ubmVjdGVkIHRvIHNhbWU7ICh4aXYpIHBvc3QsIG9mZmVyIGZvciBkb3dubG9hZCwgZS1tYWlsIG9yIG90aGVyd2lzZSB0cmFuc21pdCBhbnkgbWF0ZXJpYWwgdGhhdCBjb250YWlucyBzb2Z0d2FyZSB2aXJ1c2VzIG9yIGFueSBvdGhlciBjb21wdXRlciBjb2RlLCBmaWxlcyBvciBwcm9ncmFtcyBkZXNpZ25lZCB0byBpbnRlcnJ1cHQsIGRlc3Ryb3kgb3IgbGltaXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW55IGNvbXB1dGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlIG9yIHRlbGVjb21tdW5pY2F0aW9ucyBlcXVpcG1lbnQ7ICh4dikgcG9zdCwgb2ZmZXIgZm9yIGRvd25sb2FkLCB0cmFuc21pdCwgcHJvbW90ZSBvciBvdGhlcndpc2UgbWFrZSBhdmFpbGFibGUgYW55IHNvZnR3YXJlLCBwcm9kdWN0IG9yIHNlcnZpY2UgdGhhdCBpcyBpbGxlZ2FsIG9yIHRoYXQgdmlvbGF0ZXMgdGhlIHJpZ2h0cyBvZiBhIHRoaXJkIHBhcnR5IGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBzcHl3YXJlLCBhZHdhcmUsIHByb2dyYW1zIGRlc2lnbmVkIHRvIHNlbmQgdW5zb2xpY2l0ZWQgYWR2ZXJ0aXNlbWVudHMgKGkuZS4gXCJzcGFtd2FyZVwiKSwgc2VydmljZXMgdGhhdCBzZW5kIHVuc29saWNpdGVkIGFkdmVydGlzZW1lbnRzLCBwcm9ncmFtcyBkZXNpZ25lZCB0byBpbml0aWF0ZSBcImRlbmlhbCBvZiBzZXJ2aWNlXCIgYXR0YWNrcywgbWFpbCBib21iIHByb2dyYW1zIGFuZCBwcm9ncmFtcyBkZXNpZ25lZCB0byBnYWluIHVuYXV0aG9yaXplZCBhY2Nlc3MgdG8gbmV0d29ya3Mgb24gdGhlIEludGVybmV0OyAoeHZpKSBcImZyYW1lXCIgb3IgXCJtaXJyb3JcIiBhbnkgcGFydCBvZiB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3M7ICh4dmlpKSB1c2UgbWV0YXRhZ3Mgb3IgY29kZSBvciBvdGhlciBkZXZpY2VzIGNvbnRhaW5pbmcgYW55IHJlZmVyZW5jZSB0byB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaW4gb3JkZXIgdG8gZGlyZWN0IGFueSBwZXJzb24gdG8gYW55IG90aGVyIHdlYnNpdGUgZm9yIGFueSBwdXJwb3NlOyBhbmQvb3IgKHh2aWlpKSBtb2RpZnksIGFkYXB0LCBzdWJsaWNlbnNlLCB0cmFuc2xhdGUsIHNlbGwsIHJldmVyc2UgZW5naW5lZXIsIGRlY2lwaGVyLCBkZWNvbXBpbGUgb3Igb3RoZXJ3aXNlIGRpc2Fzc2VtYmxlIGFueSBwb3J0aW9uIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBvciBhbnkgc29mdHdhcmUgdXNlZCBvbiBvciBpbiBjb25uZWN0aW9uIHdpdGggc2FtZS4gRW5nYWdpbmcgaW4gYW55IG9mIHRoZSBhZm9yZW1lbnRpb25lZCBwcm9oaWJpdGVkIHByYWN0aWNlcyBzaGFsbCBiZSBkZWVtZWQgYSBicmVhY2ggb2YgdGhlIEFncmVlbWVudCBhbmQgbWF5IHJlc3VsdCBpbiB0aGUgaW1tZWRpYXRlIHRlcm1pbmF0aW9uIG9mIHlvdXIgYWNjZXNzIHRvIHNvbWUgb3IgYWxsIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyB3aXRob3V0IG5vdGljZSwgaW4gdGhlIHNvbGUgZGlzY3JldGlvbiBvZiB7cmVuZGVyRG9tYWluKCl9LiB7cmVuZGVyRG9tYWluKCl9IHJlc2VydmVzIHRoZSByaWdodCB0byBwdXJzdWUgYW55IGFuZCBhbGwgbGVnYWwgcmVtZWRpZXMgYWdhaW5zdCBTaXRlIFVzZXJzIHRoYXQgZW5nYWdlIGluIHRoZSBhZm9yZW1lbnRpb25lZCBwcm9oaWJpdGVkIGNvbmR1Y3QuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+TGljZW5zZSBHcmFudC48L3N0cm9uZz5cbiAgICAgICAgICBBcyBhIHVzZXIgb2YgdGhlIFNpdGUsIHlvdSBhcmUgZ3JhbnRlZCBhIG5vbi1leGNsdXNpdmUsIG5vbi10cmFuc2ZlcmFibGUsIHJldm9jYWJsZSBhbmQgbGltaXRlZCBsaWNlbnNlIHRvIGFjY2VzcyBhbmQgdXNlIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBhbmQgYXNzb2NpYXRlZCBjb250ZW50IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgQWdyZWVtZW50LiB7cmVuZGVyRG9tYWluKCl9IG1heSB0ZXJtaW5hdGUgdGhpcyBsaWNlbnNlIGF0IGFueSB0aW1lIGZvciBhbnkgcmVhc29uLiBPdGhlciB0aGFuIHdoZXJlIGV4cHJlc3NseSBwZXJtaXR0ZWQgYnkge3JlbmRlckRvbWFpbigpfSwgeW91IG1heSBvbmx5IHVzZSB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3Mgb24gb25lIGNvbXB1dGVyIGZvciB5b3VyIG93biBwZXJzb25hbCwgbm9uLWNvbW1lcmNpYWwgdXNlLiBObyBwYXJ0IG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBtYXkgYmUgcmVwcm9kdWNlZCBpbiBhbnkgZm9ybSBvciBpbmNvcnBvcmF0ZWQgaW50byBhbnkgaW5mb3JtYXRpb24gcmV0cmlldmFsIHN5c3RlbSwgZWxlY3Ryb25pYyBvciBtZWNoYW5pY2FsLiBZb3UgbWF5IG5vdCB1c2UsIGNvcHksIGVtdWxhdGUsIGNsb25lLCByZW50LCBsZWFzZSwgc2VsbCwgbW9kaWZ5LCBkZWNvbXBpbGUsIGRpc2Fzc2VtYmxlLCByZXZlcnNlIGVuZ2luZWVyIG9yIHRyYW5zZmVyIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBvciBhbnkgcG9ydGlvbiB0aGVyZW9mLiB7cmVuZGVyRG9tYWluKCl9IHJlc2VydmVzIGFsbCByaWdodHMgbm90IGV4cGxpY2l0bHkgZ3JhbnRlZCBpbiB0aGUgQWdyZWVtZW50LiBZb3UgbWF5IG5vdCB1c2UgYW55IGRldmljZSwgc29mdHdhcmUgb3Igcm91dGluZSB0byBpbnRlcmZlcmUgb3IgYXR0ZW1wdCB0byBpbnRlcmZlcmUgd2l0aCB0aGUgcHJvcGVyIHdvcmtpbmcgb2YgdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzLiBZb3UgbWF5IG5vdCB0YWtlIGFueSBhY3Rpb24gdGhhdCBpbXBvc2VzIGFuIHVucmVhc29uYWJsZSBvciBkaXNwcm9wb3J0aW9uYXRlbHkgbGFyZ2UgbG9hZCBvbiB7cmVuZGVyRG9tYWluKCl9IGluZnJhc3RydWN0dXJlLiBZb3VyIHJpZ2h0IHRvIHVzZSB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaXMgbm90IHRyYW5zZmVyYWJsZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPlByb3ByaWV0YXJ5IFJpZ2h0cy48L3N0cm9uZz5cbiAgICAgICAgICBUaGUgY29udGVudCwgb3JnYW5pemF0aW9uLCBncmFwaGljcywgZGVzaWduLCBjb21waWxhdGlvbiwgbWFnbmV0aWMgdHJhbnNsYXRpb24sIGRpZ2l0YWwgY29udmVyc2lvbiwgc29mdHdhcmUsIHNlcnZpY2VzIGFuZCBvdGhlciBtYXR0ZXJzIHJlbGF0ZWQgdG8gdGhlIHtyZW5kZXJEb21haW4oKX0gT2ZmZXJpbmdzIGFyZSBwcm90ZWN0ZWQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQsIHRyYWRlbWFyayBhbmQgb3RoZXIgcHJvcHJpZXRhcnkgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBpbnRlbGxlY3R1YWwgcHJvcGVydHkpIHJpZ2h0cy4gVGhlIGNvcHlpbmcsIHJlZGlzdHJpYnV0aW9uLCBwdWJsaWNhdGlvbiBvciBzYWxlIGJ5IHlvdSBvZiBhbnkgcGFydCBvZiB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gU3lzdGVtYXRpYyByZXRyaWV2YWwgb2YgbWF0ZXJpYWwgZnJvbSB0aGUgU2l0ZSBieSBhdXRvbWF0ZWQgbWVhbnMgb3IgYW55IG90aGVyIGZvcm0gb2Ygc2NyYXBpbmcgb3IgZGF0YSBleHRyYWN0aW9uIGluIG9yZGVyIHRvIGNyZWF0ZSBvciBjb21waWxlLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBhIGNvbGxlY3Rpb24sIGNvbXBpbGF0aW9uLCBkYXRhYmFzZSBvciBkaXJlY3Rvcnkgd2l0aG91dCB3cml0dGVuIHBlcm1pc3Npb24gZnJvbSB7cmVuZGVyRG9tYWluKCl9IGlzIHByb2hpYml0ZWQuIFlvdSBkbyBub3QgYWNxdWlyZSBvd25lcnNoaXAgcmlnaHRzIGluIG9yIHRvIGFueSBjb250ZW50LCBkb2N1bWVudCwgc29mdHdhcmUsIHNlcnZpY2VzIG9yIG90aGVyIG1hdGVyaWFscyB2aWV3ZWQgYXQgdGhlIFNpdGUgb3IgdGhyb3VnaCB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MuIFRoZSBwb3N0aW5nIG9mIGluZm9ybWF0aW9uIG9yIG1hdGVyaWFsIG9uIHRoZSBTaXRlIGJ5IHtyZW5kZXJEb21haW4oKX0gZG9lcyBub3QgY29uc3RpdHV0ZSBhIHdhaXZlciBvZiBhbnkgcmlnaHQgaW4gb3IgdG8gc3VjaCBpbmZvcm1hdGlvbiBhbmQvb3IgbWF0ZXJpYWxzLiBUaGUgXCJlTG9jYWxcIiBuYW1lIGFuZCBsb2dvLCBhbmQgYWxsIGFzc29jaWF0ZWQgZ3JhcGhpY3MsIGljb25zIGFuZCBzZXJ2aWNlIG5hbWVzLCBhcmUgdHJhZGVtYXJrcyBvZiB7cmVuZGVyRG9tYWluKCl9IFVTQSBMTEMuIEFsbCBvdGhlciB0cmFkZW1hcmtzIGFyZSB0aGUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuIFRoZSB1c2Ugb2YgYW55IHRyYWRlbWFyayB3aXRob3V0IHRoZSBhcHBsaWNhYmxlIHRyYWRlbWFyayBvd25lcidzIGV4cHJlc3Mgd3JpdHRlbiBjb25zZW50IGlzIHN0cmljdGx5IHByb2hpYml0ZWQuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5FZGl0aW5nLCBEZWxldGluZyBhbmQgTW9kaWZpY2F0aW9uLjwvc3Ryb25nPlxuICAgICAgICAgIFdlIHJlc2VydmUgdGhlIHJpZ2h0IGluIG91ciBzb2xlIGRpc2NyZXRpb24gdG8gZWRpdCBhbmQvb3IgZGVsZXRlIGFueSBkb2N1bWVudHMsIGluZm9ybWF0aW9uIG9yIG90aGVyIGNvbnRlbnQgYXBwZWFyaW5nIG9uIHRoZSBTaXRlLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+TGVnYWwgV2FybmluZy48L3N0cm9uZz5cbiAgICAgICAgICBBbnkgYXR0ZW1wdCBieSBhbnkgaW5kaXZpZHVhbCwgd2hldGhlciBvciBub3QgYSB7cmVuZGVyRG9tYWluKCl9IGN1c3RvbWVyLCB0byBkYW1hZ2UsIGRlc3Ryb3ksIHRhbXBlciB3aXRoLCB2YW5kYWxpemUgYW5kL29yIG90aGVyd2lzZSBpbnRlcmZlcmUgd2l0aCB0aGUgb3BlcmF0aW9uIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncywgaXMgYSB2aW9sYXRpb24gb2YgY3JpbWluYWwgYW5kIGNpdmlsIGxhdyBhbmQge3JlbmRlckRvbWFpbigpfSB3aWxsIGRpbGlnZW50bHkgcHVyc3VlIGFueSBhbmQgYWxsIHJlbWVkaWVzIGluIHRoaXMgcmVnYXJkIGFnYWluc3QgYW55IG9mZmVuZGluZyBpbmRpdmlkdWFsIG9yIGVudGl0eSB0byB0aGUgZnVsbGVzdCBleHRlbnQgcGVybWlzc2libGUgYnkgbGF3IGFuZCBpbiBlcXVpdHkuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5JbmRlbW5pZmljYXRpb24uPC9zdHJvbmc+XG4gICAgICAgICAgWW91IGFncmVlIHRvIGluZGVtbmlmeSBhbmQgaG9sZCB7cmVuZGVyRG9tYWluKCl9LCBpdHMgcGFyZW50cywgc3Vic2lkaWFyaWVzIGFuZCBhZmZpbGlhdGVzLCBhbmQgZWFjaCBvZiB0aGVpciByZXNwZWN0aXZlIG1lbWJlcnMsIG9mZmljZXJzLCBkaXJlY3RvcnMsIGVtcGxveWVlcywgYWdlbnRzLCBjby1uYXZiYXItYnJhbmRlcnMgYW5kL29yIG90aGVyIHBhcnRuZXJzLCBoYXJtbGVzcyBmcm9tIGFuZCBhZ2FpbnN0IGFueSBhbmQgYWxsIGNsYWltcywgZXhwZW5zZXMgKGluY2x1ZGluZyByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyksIGRhbWFnZXMsIHN1aXRzLCBjb3N0cywgZGVtYW5kcyBhbmQvb3IganVkZ21lbnRzIHdoYXRzb2V2ZXIsIG1hZGUgYnkgYW55IHRoaXJkIHBhcnR5IGR1ZSB0byBvciBhcmlzaW5nIG91dCBvZjogKGEpIHlvdXIgdXNlIG9mIHRoZSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5nczsgKGIpIHlvdXIgYnJlYWNoIG9mIHRoZSBBZ3JlZW1lbnQ7IChjKSBhbnkgZGlzcHV0ZSBiZXR3ZWVuIHlvdSBhbmQgYW55IFNpdGUgVXNlciBvciB0aGlyZCBwYXJ0eTsgYW5kL29yIChkKSB5b3VyIHZpb2xhdGlvbiBvZiBhbnkgcmlnaHRzIG9mIGFub3RoZXIgaW5kaXZpZHVhbCBhbmQvb3IgZW50aXR5LiBUaGUgcHJvdmlzaW9ucyBvZiB0aGlzIFNlY3Rpb24gMTcgYXJlIGZvciB0aGUgYmVuZWZpdCBvZiB7cmVuZGVyRG9tYWluKCl9LCBpdHMgcGFyZW50cywgc3Vic2lkaWFyaWVzIGFuZC9vciBhZmZpbGlhdGVzLCBhbmQgZWFjaCBvZiB0aGVpciByZXNwZWN0aXZlIG9mZmljZXJzLCBkaXJlY3RvcnMsIG1lbWJlcnMsIGVtcGxveWVlcywgYWdlbnRzLCBzaGFyZWhvbGRlcnMsIGxpY2Vuc29ycywgc3VwcGxpZXJzIGFuZC9vciBhdHRvcm5leXMuIEVhY2ggb2YgdGhlc2UgaW5kaXZpZHVhbHMgYW5kIGVudGl0aWVzIHNoYWxsIGhhdmUgdGhlIHJpZ2h0IHRvIGFzc2VydCBhbmQgZW5mb3JjZSB0aGVzZSBwcm92aXNpb25zIGRpcmVjdGx5IGFnYWluc3QgeW91IG9uIGl0cyBvd24gYmVoYWxmLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+RGlzY2xhaW1lciBvZiBXYXJyYW50aWVzLjwvc3Ryb25nPlxuICAgICAgICAgIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIEFSRSBQUk9WSURFRCBUTyBZT1UgT04gQU4gXCJBUyBJU1wiIEFORCBcIkFTIEFWQUlMQUJMRVwiIEJBU0lTIEFORCBBTEwgV0FSUkFOVElFUywgRVhQUkVTUyBBTkQgSU1QTElFRCwgQVJFIERJU0NMQUlNRUQgVE8gVEhFIEZVTExFU1QgRVhURU5UIFBFUk1JU1NJQkxFIFBVUlNVQU5UIFRPIEFQUExJQ0FCTEUgTEFXIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIERJU0NMQUlNRVIgT0YgQU5ZIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBOT04tSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBBTkQvT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UpLiBJTiBQQVJUSUNVTEFSLCBCVVQgTk9UIEFTIEEgTElNSVRBVElPTiBUSEVSRU9GLCBFTE9DQUwgTUFLRVMgTk8gV0FSUkFOVFkgVEhBVDogKEEpIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIFdJTEwgTUVFVCBZT1VSIFJFUVVJUkVNRU5UUzsgKEIpIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIFdJTEwgQkUgVU5JTlRFUlJVUFRFRCwgVElNRUxZLCBTRUNVUkUgT1IgRVJST1ItRlJFRTsgKEMpIFlPVSBXSUxMIFFVQUxJRlkgRk9SIFRISVJEIFBBUlRZIE9GRkVSSU5HUyBGUk9NIEFOWSBUSElSRCBQQVJUWSBTRVJWSUNFIFBST1ZJREVSOyBPUiAoRCkgVEhFIFJFU1VMVFMgVEhBVCBNQVkgQkUgT0JUQUlORUQgRlJPTSBUSEUgVVNFIE9GIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIFdJTEwgQkUgQUNDVVJBVEUgT1IgUkVMSUFCTEUuIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIE1BWSBDT05UQUlOIEJVR1MsIEVSUk9SUywgUFJPQkxFTVMgT1IgT1RIRVIgTElNSVRBVElPTlMuIFdFIFdJTEwgTk9UIEJFIExJQUJMRSBGT1IgVEhFIEFWQUlMQUJJTElUWSBPRiBUSEUgVU5ERVJMWUlORyBJTlRFUk5FVCBDT05ORUNUSU9OIEFTU09DSUFURUQgV0lUSCBUSEUgU0lURS4gTk8gQURWSUNFIE9SIElORk9STUFUSU9OLCBXSEVUSEVSIE9SQUwgT1IgV1JJVFRFTiwgT0JUQUlORUQgQlkgWU9VIEZST00gRUxPQ0FMJnRyYWRlLCBBTlkgU0lURSBVU0VSIE9SIE9USEVSV0lTRSBUSFJPVUdIIE9SIEZST00gVEhFIEVMT0NBTCBPRkZFUklOR1MsIFNIQUxMIENSRUFURSBBTlkgV0FSUkFOVFkgTk9UIEVYUFJFU1NMWSBTVEFURUQgSU4gVEhFIEFHUkVFTUVOVC5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPkxpbWl0YXRpb24gb2YgTGlhYmlsaXR5Ljwvc3Ryb25nPlxuICAgICAgICAgIFlPVSBFWFBSRVNTTFkgVU5ERVJTVEFORCBBTkQgQUdSRUUgVEhBVCBFTE9DQUwgU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBZT1UgT1IgQU5ZIFRISVJEIFBBUlRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgQ09OU0VRVUVOVElBTCBBTkQvT1IgRVhFTVBMQVJZIERBTUFHRVMgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIERBTUFHRVMgRk9SIExPU1MgT0YgUFJPRklUUywgR09PRFdJTEwsIFVTRSwgREFUQSBPUiBPVEhFUiBJTlRBTkdJQkxFIExPU1NFUyAoRVZFTiBJRiBFTE9DQUwgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTKSwgVE8gVEhFIEZVTExFU1QgRVhURU5UIFBFUk1JU1NJQkxFIEJZIExBVyBGT1I6IChBKSBUSEUgVVNFIE9SIFRIRSBJTkFCSUxJVFkgVE8gVVNFIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FOyAoQikgVEhFIENPU1QgT0YgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBBTkQgU0VSVklDRVMgUkVTVUxUSU5HIEZST00gQU5ZIEdPT0RTLCBEQVRBLCBJTkZPUk1BVElPTiBBTkQvT1IgU0VSVklDRVMgUFVSQ0hBU0VEIE9SIE9CVEFJTkVEIEZST00sIE9SIFRSQU5TQUNUSU9OUyBFTlRFUkVEIElOVE8gVEhST1VHSCwgVEhFIEVMT0NBTCBPRkZFUklOR1M7IChDKSBUSEUgRkFJTFVSRSBUTyBRVUFMSUZZIEZPUiBUSElSRCBQQVJUWSBPRkZFUklOR1MgRlJPTSBBTlkgVEhJUkQgUEFSVFkgU0VSVklDRSBQUk9WSURFUjsgKEQpIFRIRSBVTkFVVEhPUklaRUQgQUNDRVNTIFRPLCBPUiBBTFRFUkFUSU9OIE9GLCBZT1VSIFJFR0lTVFJBVElPTiBEQVRBOyBBTkQgKEUpIEFOWSBPVEhFUiBNQVRURVIgUkVMQVRJTkcgVE8gVEhFIEVMT0NBTCBPRkZFUklOR1MgQU5EL09SIEFOWSBPVEhFUiBQUk9EVUNUUyBBTkQvT1IgU0VSVklDRVMgVEhBVCBZT1UgTUFZIEFQUExZIEZPUiBUSFJPVUdIIFNBTUUuIFRISVMgTElNSVRBVElPTiBBUFBMSUVTIFRPIEFMTCBDQVVTRVMgT0YgQUNUSU9OLCBJTiBUSEUgQUdHUkVHQVRFIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBCUkVBQ0ggT0YgQ09OVFJBQ1QsIEJSRUFDSCBPRiBXQVJSQU5UWSwgTkVHTElHRU5DRSwgU1RSSUNUIExJQUJJTElUWSwgTUlTUkVQUkVTRU5UQVRJT05TIEFORCBBTlkgQU5EIEFMTCBPVEhFUiBUT1JUUy4gWU9VIEhFUkVCWSBSRUxFQVNFIEVMT0NBTCBGUk9NIEFOWSBBTkQgQUxMIE9CTElHQVRJT05TLCBMSUFCSUxJVElFUyBBTkQgQ0xBSU1TIElOIEVYQ0VTUyBPRiBUSEUgTElNSVRBVElPTlMgU1RBVEVEIEhFUkVJTi4gSUYgQVBQTElDQUJMRSBMQVcgRE9FUyBOT1QgUEVSTUlUIFNVQ0ggTElNSVRBVElPTlMsIFRIRSBNQVhJTVVNIExJQUJJTElUWSBPRiBFTE9DQUwgVE8gWU9VIFVOREVSIEFOWSBBTkQgQUxMIENJUkNVTVNUQU5DRVMgV0lMTCBCRSBGSVZFIEhVTkRSRUQgRE9MTEFSUyAoJDUwMC4wMCkuIFRIRSBORUdBVElPTiBPRiBEQU1BR0VTIFNFVCBGT1JUSCBBQk9WRSBJUyBBIEZVTkRBTUVOVEFMIEVMRU1FTlQgT0YgVEhFIEJBU0lTIE9GIFRIRSBCQVJHQUlOIEJFVFdFRU4gWU9VIEFORCBFTE9DQUwmdHJhZGUuIFRIRSBFTE9DQUwgT0ZGRVJJTkdTIEFORC9PUiBBTlkgT1RIRVIgUFJPRFVDVFMgQU5EL09SIFNFUlZJQ0VTIFRIQVQgWU9VIE1BWSBBUFBMWSBGT1IgVEhST1VHSCBTQU1FIFdPVUxEIE5PVCBCRSBQUk9WSURFRCBUTyBZT1UgV0lUSE9VVCBTVUNIIExJTUlUQVRJT05TLiAgU09NRSBKVVJJU0RJQ1RJT05TLCBTVUNIIEFTIE5FVyBKRVJTRVksIE1BWSBOT1QgQUxMT1cgQ0VSVEFJTiBMSU1JVEFUSU9OUyBPTiBMSUFCSUxJVFkgQU5EIElOIFNVQ0ggSlVSSVNESUNUSU9OUyBUSEUgTElBQklMSVRZIE9GIEVMT0NBTCBTSEFMTCBCRSBMSU1JVEVEIFRPIFRIRSBNQVhJTVVNIEVYVEVOVCBQRVJNSVRURUQgQlkgTEFXLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpPlxuICAgICAgICAgIDxzcGFuPlxuICAgICAgICAgIDxzdHJvbmc+VGhpcmQgUGFydHkgV2Vic2l0ZXMuPC9zdHJvbmc+XG4gICAgICAgICAgVGhlIFNpdGUgbWF5IHByb3ZpZGUgbGlua3MgdG8gYW5kL29yIHJlZmVyIHlvdSB0byBvdGhlciBJbnRlcm5ldCB3ZWJzaXRlcyBhbmQvb3IgcmVzb3VyY2VzIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBjZXJ0YWluIFNpdGUgVXNlciB3ZWJzaXRlcyBhbmQvb3IgU29jaWFsIE1lZGlhIFdlYnNpdGVzLiBCZWNhdXNlIHtyZW5kZXJEb21haW4oKX0gaGFzIG5vIGNvbnRyb2wgb3ZlciBzdWNoIHRoaXJkIHBhcnR5IHdlYnNpdGVzIGFuZC9vciByZXNvdXJjZXMsIHlvdSBoZXJlYnkgYWNrbm93bGVkZ2UgYW5kIGFncmVlIHRoYXQge3JlbmRlckRvbWFpbigpfSBpcyBub3QgcmVzcG9uc2libGUgZm9yIHRoZSBhdmFpbGFiaWxpdHkgb2Ygc3VjaCB0aGlyZCBwYXJ0eSB3ZWJzaXRlcyBhbmQvb3IgcmVzb3VyY2VzLiBGdXJ0aGVybW9yZSwge3JlbmRlckRvbWFpbigpfSBkb2VzIG5vdCBlbmRvcnNlLCBhbmQgaXMgbm90IHJlc3BvbnNpYmxlIG9yIGxpYWJsZSBmb3IsIGFueSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgcHJpdmFjeSBwb2xpY2llcywgY29udGVudCwgYWR2ZXJ0aXNpbmcsIHNlcnZpY2VzLCBwcm9kdWN0cyBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIGF0IG9yIGF2YWlsYWJsZSBmcm9tIHN1Y2ggdGhpcmQgcGFydHkgd2Vic2l0ZXMgb3IgcmVzb3VyY2VzLCBvciBmb3IgYW55IGRhbWFnZXMgYW5kL29yIGxvc3NlcyBhcmlzaW5nIHRoZXJlZnJvbS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPkRpc3B1dGUgUmVzb2x1dGlvbiBQcm92aXNpb25zLjwvc3Ryb25nPlxuICAgICAgICAgIFRoZSBBZ3JlZW1lbnQgc2hhbGwgYmUgdHJlYXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBleGVjdXRlZCBhbmQgcGVyZm9ybWVkIGluIERlbGF3YXJlIGFuZCBzaGFsbCBiZSBnb3Zlcm5lZCBieSBhbmQgY29uc3RydWVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgRGVsYXdhcmUgKHdpdGhvdXQgcmVnYXJkIHRvIGNvbmZsaWN0IG9mIGxhdyBwcmluY2lwbGVzKS5cbiAgICAgICAgICA8YiBjbGFzc05hbWU9XCJkYXJrZW5cIj5cbiAgICAgICAgICBZb3UgaGVyZWJ5IGFncmVlIHRvIGFyYml0cmF0ZSBhbGwgY2xhaW1zIHRoYXQgbWF5IGFyaXNlIHVuZGVyIHRoZSBBZ3JlZW1lbnQgdGhhdCB5b3UgbWF5IGhhdmUgYWdhaW5zdCB7cmVuZGVyRG9tYWluKCl9IG9yIGFueSBvZiB0aGUgQ292ZXJlZCBQYXJ0aWVzLCB3aG8gYXJlIGV4cHJlc3MgdGhpcmQtcGFydHkgYmVuZWZpY2lhcmllcyBvZiB0aGUgbWFuZGF0b3J5IGFyYml0cmF0aW9uIHByb3Zpc2lvbi4gIFdpdGhvdXQgbGltaXRpbmcgdGhlIGZvcmVnb2luZywgc2hvdWxkIGEgZGlzcHV0ZSBhcmlzZSBiZXR3ZWVuIHlvdSBhbmQge3JlbmRlckRvbWFpbigpfSBhbmQvb3IgYW55IENvdmVyZWQgUGFydHkgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSBtYXR0ZXIgY29uY2VybmluZyB0aGUge3JlbmRlckRvbWFpbigpfSBPZmZlcmluZ3MsIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBBZ3JlZW1lbnQgb3IgdGhlIGJyZWFjaCBvZiBzYW1lIGJ5IGFueSBwYXJ0eSBoZXJldG86IChhKSB0aGUgcGFydGllcyBhZ3JlZSB0byBzdWJtaXQgdGhlaXIgZGlzcHV0ZSBmb3IgcmVzb2x1dGlvbiBieSBhcmJpdHJhdGlvbiBiZWZvcmUgdGhlIEFtZXJpY2FuIEFyYml0cmF0aW9uIEFzc29jaWF0aW9uICh0aGUg4oCcQUFB4oCdKSBpbiBEZWxhd2FyZSBvciB0aGUgY291bnR5IG9mIHlvdXIgcmVzaWRlbmNlLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRoZW4gY3VycmVudCBDb21tZXJjaWFsIEFyYml0cmF0aW9uIHJ1bGVzIG9mIHRoZSBBQUE7IGFuZCAoYikgeW91IGFncmVlIHRvIGZpcnN0IGNvbW1lbmNlIGEgZm9ybWFsIGRpc3B1dGUgcHJvY2VlZGluZyBieSBjb21wbGV0aW5nIGFuZCBzdWJtaXR0aW5nIGFuIEluaXRpYWwgRGlzcHV0ZSBOb3RpY2Ugd2hpY2ggY2FuIGJlIGZvdW5kJm5ic3A7XG4gICAgICAgICAgPGEgY2xhc3NOYW1lPVwidW5kZXJsaW5lLWxpbmtcIiBocmVmPVwiaHR0cDovL2Fzc2V0cy5lbG9jYWwuY29tLnMzLmFtYXpvbmF3cy5jb20vRGlzcHV0ZVJlc29sdXRpb25Qcm92aXNpb24ucGRmXCIgdGFyZ2V0PVwiX2JsYW5rXCI+aGVyZS48L2E+XG4gICAgICAgICAgV2UgbWF5IGNob29zZSB0byBwcm92aWRlIHlvdSB3aXRoIGEgZmluYWwgd3JpdHRlbiBzZXR0bGVtZW50IG9mZmVyIGFmdGVyIHJlY2VpdmluZyB5b3VyIEluaXRpYWwgRGlzcHV0ZSBOb3RpY2UgKFwiRmluYWwgU2V0dGxlbWVudCBPZmZlclwiKS4gSWYgd2UgcHJvdmlkZSB5b3Ugd2l0aCBhIEZpbmFsIFNldHRsZW1lbnQgT2ZmZXIgYW5kIHlvdSBkbyBub3QgYWNjZXB0IGl0LCBvciB3ZSBjYW5ub3Qgb3RoZXJ3aXNlIHNhdGlzZmFjdG9yaWx5IHJlc29sdmUgeW91ciBkaXNwdXRlLCBidXQgeW91IHN0aWxsIHdpc2ggdG8gcHJvY2VlZCB3aXRoIHlvdXIgZGlzcHV0ZSwgeW91IG11c3Qgc3VibWl0IHlvdXIgZGlzcHV0ZSBmb3IgcmVzb2x1dGlvbiBieSBhcmJpdHJhdGlvbiBiZWZvcmUgdGhlIEFBQSBhcyBzZXQgZm9ydGggYWJvdmUsIGJ5IGZpbGluZyBhIHNlcGFyYXRlIERlbWFuZCBmb3IgQXJiaXRyYXRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZVxuICAgICAgICAgIDxhIGNsYXNzTmFtZT1cInVuZGVybGluZS1saW5rXCIgaHJlZj1cImh0dHA6Ly93d3cuYWRyLm9yZy9hYWEvU2hvd1BERj9kb2M9QURSU1RHXzAwNDE3N1wiIHRhcmdldD1cIl9ibGFua1wiPmhlcmUuPC9hPlxuICAgICAgICAgIEZvciBjbGFpbXMgb2YgVGVuIFRob3VzYW5kIERvbGxhcnMgKCQxMCwwMDAuMDApIG9yIGxlc3MsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIGFyYml0cmF0aW9uIHByb2NlZWRzIGluIHBlcnNvbiwgYnkgdGVsZXBob25lIG9yIGJhc2VkIG9ubHkgb24gc3VibWlzc2lvbnMuIElmIHRoZSBhcmJpdHJhdG9yIGF3YXJkcyB5b3UgcmVsaWVmIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG91ciBGaW5hbCBTZXR0bGVtZW50IE9mZmVyLCB0aGVuIHdlIHdpbGwgcGF5IGFsbCBmaWxpbmcsIGFkbWluaXN0cmF0aW9uIGFuZCBhcmJpdHJhdG9yIGZlZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmJpdHJhdGlvbiBhbmQsIGlmIHlvdSByZXRhaW5lZCBhbiBhdHRvcm5leSB0byByZXByZXNlbnQgeW91IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgYXJiaXRyYXRpb24sIHdlIHdpbGwgcmVpbWJ1cnNlIGFueSByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyB0aGF0IHlvdXIgYXR0b3JuZXkgYWNjcnVlZCBmb3IgaW52ZXN0aWdhdGluZywgcHJlcGFyaW5nIGFuZCBwdXJzdWluZyB0aGUgY2xhaW0gaW4gYXJiaXRyYXRpb24uIEFueSBhd2FyZCByZW5kZXJlZCBzaGFsbCBiZSBmaW5hbCBhbmQgY29uY2x1c2l2ZSB0byB0aGUgcGFydGllcyBhbmQgYSBqdWRnbWVudCB0aGVyZW9uIG1heSBiZSBlbnRlcmVkIGluIGFueSBjb3VydCBvZiBjb21wZXRlbnQganVyaXNkaWN0aW9uLiBBbHRob3VnaCB3ZSBtYXkgaGF2ZSBhIHJpZ2h0IHRvIGFuIGF3YXJkIG9mIGF0dG9ybmV5cycgZmVlcyBhbmQgZXhwZW5zZXMgaWYgd2UgcHJldmFpbCBpbiBhcmJpdHJhdGlvbiwgd2Ugd2lsbCBub3Qgc2VlayBzdWNoIGFuIGF3YXJkIGZyb20geW91IHVubGVzcyB0aGUgYXJiaXRyYXRvciBkZXRlcm1pbmVzIHRoYXQgeW91ciBjbGFpbSB3YXMgZnJpdm9sb3VzLlxuICAgICAgICAgIDwvYj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJicmVha1wiPlxuICAgICAgICAgIDxiIGNsYXNzTmFtZT1cImRhcmtlblwiPlxuICAgICAgICAgIFRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdywgeW91IGFncmVlIHRoYXQgeW91IHdpbGwgbm90IGJyaW5nLCBqb2luIG9yIHBhcnRpY2lwYXRlIGluIGFueSBjbGFzcyBhY3Rpb24gbGF3c3VpdCBhcyB0byBhbnkgY2xhaW0sIGRpc3B1dGUgb3IgY29udHJvdmVyc3kgdGhhdCB5b3UgbWF5IGhhdmUgYWdhaW5zdCB7cmVuZGVyRG9tYWluKCl9IGFuZC9vciBhbnkgQ292ZXJlZCBQYXJ0eS4gWW91IGFncmVlIHRvIHRoZSBlbnRyeSBvZiBpbmp1bmN0aXZlIHJlbGllZiB0byBzdG9wIHN1Y2ggYSBsYXdzdWl0IG9yIHRvIHJlbW92ZSB5b3UgYXMgYSBwYXJ0aWNpcGFudCBpbiB0aGUgc3VpdC4gWW91IGFncmVlIHRvIHBheSB0aGUgYXR0b3JuZXkncyBmZWVzIGFuZCBjb3VydCBjb3N0cyB0aGF0IHtyZW5kZXJEb21haW4oKX0gYW5kL29yIGFueSBDb3ZlcmVkIFBhcnR5IGluY3VycyBpbiBzZWVraW5nIHN1Y2ggcmVsaWVmLiBUaGlzIHByb3Zpc2lvbiBwcmV2ZW50aW5nIHlvdSBmcm9tIGJyaW5naW5nLCBqb2luaW5nIG9yIHBhcnRpY2lwYXRpbmcgaW4gY2xhc3MgYWN0aW9uIGxhd3N1aXRzOiAoaSkgZG9lcyBub3QgY29uc3RpdHV0ZSBhIHdhaXZlciBvZiBhbnkgb2YgeW91ciByaWdodHMgb3IgcmVtZWRpZXMgdG8gcHVyc3VlIGEgY2xhaW0gaW5kaXZpZHVhbGx5IGFuZCBub3QgYXMgYSBjbGFzcyBhY3Rpb24gaW4gYmluZGluZyBhcmJpdHJhdGlvbiBhcyBwcm92aWRlZCBhYm92ZTsgYW5kIChpaSkgaXMgYW4gaW5kZXBlbmRlbnQgYWdyZWVtZW50LiBZb3UgbWF5IG9wdC1vdXQgb2YgdGhlc2UgZGlzcHV0ZSByZXNvbHV0aW9uIHByb3Zpc2lvbnMgYnkgcHJvdmlkaW5nIHdyaXR0ZW4gbm90aWNlIG9mIHlvdXIgZGVjaXNpb24gd2l0aGluIHRoaXJ0eSAoMzApIGRheXMgb2YgdGhlIGRhdGUgdGhhdCB5b3UgZmlyc3QgYWNjZXNzIHRoZSBTaXRlLlxuICAgICAgICAgIDwvYj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgICA8bGk+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgPHN0cm9uZz5NaXNjZWxsYW5lb3VzLjwvc3Ryb25nPlxuICAgICAgICAgIFNob3VsZCBhbnkgcGFydCBvZiB0aGUgQWdyZWVtZW50IGJlIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlLCB0aGF0IHBvcnRpb24gc2hhbGwgYmUgY29uc3RydWVkIGNvbnNpc3RlbnQgd2l0aCBhcHBsaWNhYmxlIGxhdyBhbmQgdGhlIHJlbWFpbmluZyBwb3J0aW9ucyBzaGFsbCByZW1haW4gaW4gZnVsbCBmb3JjZSBhbmQgZWZmZWN0LiBUbyB0aGUgZXh0ZW50IHRoYXQgYW55dGhpbmcgaW4gb3IgYXNzb2NpYXRlZCB3aXRoIGFueSB7cmVuZGVyRG9tYWluKCl9IE9mZmVyaW5ncyBpcyBpbiBjb25mbGljdCBvciBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgQWdyZWVtZW50LCB0aGUgQWdyZWVtZW50IHNoYWxsIHRha2UgcHJlY2VkZW5jZS4gT3VyIGZhaWx1cmUgdG8gZW5mb3JjZSBhbnkgcHJvdmlzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgc2hhbGwgbm90IGJlIGRlZW1lZCBhIHdhaXZlciBvZiBzdWNoIHByb3Zpc2lvbiBub3Igb2YgdGhlIHJpZ2h0IHRvIGVuZm9yY2Ugc3VjaCBwcm92aXNpb24uIFRoZSBwYXJ0aWVzIGRvIG5vdCBpbnRlbmQgdGhhdCBhbnkgYWdlbmN5IG9yIHBhcnRuZXJzaGlwIHJlbGF0aW9uc2hpcCBiZSBjcmVhdGVkIHRocm91Z2ggb3BlcmF0aW9uIG9mIHRoZSBBZ3JlZW1lbnQuIHtyZW5kZXJEb21haW4oKX0gbWF5IGFzc2lnbiBpdHMgcmlnaHRzIGFuZCBvYmxpZ2F0aW9ucyB1bmRlciB0aGUgQWdyZWVtZW50LCBpbiB3aG9sZSBvciBpbiBwYXJ0LCB0byBhbnkgcGFydHkgYXQgYW55IHRpbWUgd2l0aG91dCBhbnkgbm90aWNlIHRvIHlvdS4gVGhlIEFncmVlbWVudCBtYXkgbm90LCBob3dldmVyLCBiZSBhc3NpZ25lZCBieSB5b3UsIGFuZCB5b3UgbWF5IG5vdCBkZWxlZ2F0ZSB5b3VyIGR1dGllcyB1bmRlciBpdC4gIEhlYWRpbmdzIGFyZSBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIG9ubHkgYW5kIGluIG5vIHdheSBkZWZpbmUsIGxpbWl0LCBjb25zdHJ1ZSBvciBkZXNjcmliZSB0aGUgc2NvcGUgb3IgZXh0ZW50IG9mIHN1Y2ggc2VjdGlvbi5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaT5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPkNhbGlmb3JuaWEgRW5kLVVzZXIgQ29uc3VtZXIgUmlnaHRzLjwvc3Ryb25nPlxuICAgICAgICAgIEluIGFjY29yZGFuY2Ugd2l0aCBDYWwuIENpdi4gQ29kZSBTZWMuIDE3ODkuMywgQ2FsaWZvcm5pYSBTdGF0ZSByZXNpZGVudCBVc2VycyBtYXkgZmlsZSBncmlldmFuY2VzIGFuZCBjb21wbGFpbnRzIHdpdGggdGhlIENhbGlmb3JuaWEgRGVwYXJ0bWVudCBvZiBDb25zdW1lciBBZmZhaXJzLCA0MDAgUiBTdHJlZXQsIFN0ZS4gMTA4MCwgU2FjcmFtZW50bywgQ0EgOTU4MTQ7IG9yIGJ5IHBob25lIGF0IDkxNi00NDUtMTI1NCBvciA4MDAtOTUyLTUyMTA7IG9yIGJ5IGVtYWlsIHRvIGRjYUBkY2EuY2EuZ292LlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpIGNsYXNzTmFtZT1cInNwYWNlci1sYXJnZSBib3R0b21cIj5cbiAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPkNvbnRhY3QgVXMuPC9zdHJvbmc+XG4gICAgICAgICAgSWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucyByZWdhcmRpbmcgdGhlIEFncmVlbWVudCwgb3Igd291bGQgbGlrZSBtb3JlIGluZm9ybWF0aW9uIGZyb20ge3JlbmRlckRvbWFpbigpfSwgcGxlYXNlIGNvbnRhY3QgdXMgYXQgdXNpbmcgb3VyXG4gICAgICAgICAgPGEgY2xhc3NOYW1lPVwidW5kZXJsaW5lLWxpbmtcIiBocmVmPVwiL2luZm9ybWF0aW9uI2NvbnRhY3RcIiB0YXJnZXQ9XCJfYmxhbmtcIj5jb250YWN0IGZvcm07PC9hPlxuICAgICAgICAgIG9yIGNhbGwgdXMgYXQ6IDEtODc3LTkxLUVMT0NBTC5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L29sPlxuICAgIDwvUmVhY3QuRnJhZ21lbnQ+XG4gIClcbn1cblxuVGVybXMucHJvcFR5cGVzID0ge1xuICBkb21haW46IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgaWNvbjogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNUcmFkZW1hcmtlZDogUHJvcFR5cGVzLmJvb2wsXG4gIHByaXZhY3lVcmw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn1cblxuVGVybXMuZGVmYXVsdFByb3BzID0ge1xuICBpc1RyYWRlbWFya2VkOiBmYWxzZSxcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGVybXNcbiIsImltcG9ydCBQcml2YWN5IGZyb20gJy4vUHJpdmFjeSdcbmltcG9ydCBQcml2YWN5Q2FsaWZvcm5pYSBmcm9tICcuL1ByaXZhY3lDYWxpZm9ybmlhJ1xuaW1wb3J0IFRlcm1zIGZyb20gJy4vVGVybXMnXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBQcml2YWN5LFxuICBQcml2YWN5Q2FsaWZvcm5pYSxcbiAgVGVybXMsXG59XG4iXX0=\n"],"names":["module","exports","r","e","n","t","o","i","f","u","a","code","p","call","undefined","length","require","getOwnPropertySymbols","Object","hasOwnProperty","prototype","propIsEnumerable","propertyIsEnumerable","shouldUseNative","assign","test1","String","getOwnPropertyNames","test2","fromCharCode","order2","map","join","test3","split","forEach","letter","keys","err","target","source","from","symbols","to","toObject","val","s","arguments","key","cachedSetTimeout","cachedClearTimeout","currentQueue","process","defaultSetTimout","defaultClearTimeout","runTimeout","fun","setTimeout","clearTimeout","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","runClearTimeout","marker","Item","array","noop","nextTick","args","push","apply","title","browser","env","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","printWarning","NODE_ENV","ReactPropTypesSecret","loggedTypeFailures","has","text","message","console","error","x","checkPropTypes","typeSpecs","values","location","componentName","getStack","typeSpecName","Error","ex","stack","resetWarningCache","emptyFunction","emptyFunctionWithReset","shim","props","propName","propFullName","secret","getShim","isRequired","ReactPropTypes","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","PropTypes","ReactIs","emptyFunctionThatReturnsNull","isValidElement","throwOnDirectAccess","ITERATOR_SYMBOL","Symbol","iterator","ANONYMOUS","createPrimitiveTypeChecker","createChainableTypeChecker","typeChecker","PropTypeError","propValue","Array","isArray","propType","getPropType","isValidElementType","expectedClass","expectedClassName","actualClassName","constructor","isNode","every","iteratorFn","getIteratorFn","maybeIterable","step","entries","next","done","value","entry","expectedValues","y","valuesString","JSON","stringify","getPreciseType","arrayOfTypeCheckers","checker","getPostfixForTypeWarning","type","expectedTypes","checkerResult","data","expectedType","expectedTypesMessage","shapeTypes","invalidValidatorError","allKeys","validate","manualPropTypeCallCache","manualPropTypeWarningCount","checkType","cacheKey","chainedCheckType","bind","preciseType","RegExp","Date","isElement","Function","hasSymbol","for","REACT_ELEMENT_TYPE","REACT_PORTAL_TYPE","REACT_FRAGMENT_TYPE","REACT_STRICT_MODE_TYPE","REACT_PROFILER_TYPE","REACT_PROVIDER_TYPE","REACT_CONTEXT_TYPE","REACT_ASYNC_MODE_TYPE","REACT_CONCURRENT_MODE_TYPE","REACT_FORWARD_REF_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_MEMO_TYPE","REACT_LAZY_TYPE","REACT_BLOCK_TYPE","REACT_FUNDAMENTAL_TYPE","REACT_RESPONDER_TYPE","REACT_SCOPE_TYPE","typeOf","$$typeof","$$typeofType","hasWarnedAboutDeprecatedIsAsyncMode","isConcurrentMode","AsyncMode","ConcurrentMode","ContextConsumer","ContextProvider","Element","ForwardRef","Fragment","Lazy","Memo","Portal","Profiler","StrictMode","Suspense","isAsyncMode","isContextConsumer","isContextProvider","isForwardRef","isFragment","isLazy","isMemo","isPortal","isProfiler","isStrictMode","isSuspense","b","c","d","g","h","k","l","m","q","v","w","z","A","specialPropKeyWarningShown","specialPropRefWarningShown","didWarnAboutStringRefs","propTypesMisspellWarningShown","_assign","MAYBE_ITERATOR_SYMBOL","maybeIterator","ReactCurrentDispatcher","current","ReactCurrentOwner","BEFORE_SLASH_RE","getComponentName","tag","displayName","innerType","wrapperName","functionName","render","outerType","resolvedThenable","lazyComponent","_status","_result","ReactDebugCurrentFrame","currentlyValidatingElement","getCurrentStack","getStackAddendum","owner","_owner","describeComponentFrame","ownerName","sourceInfo","path","fileName","replace","test","match","pathBeforeSlash","folderName","lineNumber","_source","impl","ReactSharedInternals","ReactCurrentBatchConfig","suspense","IsSomeRendererActing","warn","format","_len","_key","_len2","_key2","level","indexOf","argsWithFormat","item","unshift","argIndex","ReactComponentTreeHook","didWarnStateUpdateForUnmountedComponent","warnNoop","publicInstance","callerName","_constructor","warningKey","ReactNoopUpdateQueue","isMounted","enqueueForceUpdate","callback","enqueueReplaceState","completeState","enqueueSetState","partialState","emptyObject","Component","context","updater","refs","freeze","isReactComponent","setState","forceUpdate","deprecatedAPIs","replaceState","defineDeprecationWarning","methodName","info","defineProperty","get","fnName","ComponentDummy","PureComponent","pureComponentPrototype","isPureReactComponent","RESERVED_PROPS","ref","__self","__source","hasValidRef","config","getter","getOwnPropertyDescriptor","isReactWarning","hasValidKey","ReactElement","self","_store","configurable","enumerable","writable","createElement","children","warnIfStringRefCannotBeAutoConverted","stateNode","childrenLength","childArray","defaultProps","warnAboutAccessingKey","warnAboutAccessingRef","cloneElement","_self","didWarnAboutMaps","userProvidedKeyEscapeRegex","escapeUserProvidedKey","traverseContextPool","getPooledTraverseContext","mapResult","keyPrefix","mapFunction","mapContext","result","count","traverseContext","pop","releaseTraverseContext","traverseAllChildren","traverseAllChildrenImpl","nameSoFar","invokeCallback","SEPARATOR","getComponentKey","subtreeCount","nextNamePrefix","nextName","child","ii","addendum","childrenString","component","index","escaperLookup","toString","forEachSingleChild","bookKeeping","mapSingleChildIntoContext","childKey","oldElement","newKey","mappedChild","mapIntoWithKeyPrefixInternal","prefix","escapedPrefix","resolveDispatcher","dispatcher","getDeclarationErrorAddendum","ownerHasKeyUseWarning","validateExplicitKey","parentType","validated","currentComponentErrorInfo","getCurrentComponentErrorInfo","parentName","childOwner","validateChildKeys","validatePropTypes","propTypes","getDefaultProps","isReactClassApproved","createElementWithValidation","validType","typeString","getSourceInfoErrorAddendumForProps","elementProps","validateFragmentProps","fragment","didWarnAboutDeprecatedCreateFactory","frozenObject","testMap","Map","testSet","Set","set","add","Children","forEachFunc","forEachContext","toArray","only","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","newElement","createContext","defaultValue","calculateChangedBits","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","hasWarnedAboutUsingNestedContextConsumers","hasWarnedAboutUsingConsumerProvider","defineProperties","_Provider","_currentRenderer","_currentRenderer2","createFactory","validatedFactory","createRef","refObject","seal","forwardRef","lazy","ctor","lazyType","_ctor","newDefaultProps","newPropTypes","memo","compare","useCallback","deps","useContext","Context","unstable_observedBits","realContext","useDebugValue","formatterFn","useEffect","create","useImperativeHandle","useLayoutEffect","useMemo","useReducer","reducer","initialArg","init","useRef","initialValue","useState","initialState","B","C","encodeURIComponent","D","E","F","G","H","I","J","K","L","M","O","P","Q","R","S","V","T","U","W","aa","X","Y","Z","_react","_interopRequireDefault","_propTypes","obj","__esModule","Privacy","domain","isTrademarked","renderDomain","className","href","style","textTransform","id","border","cellSpacing","PrivacyCalifornia","Terms","icon","privacyUrl","mailto","_Privacy","_PrivacyCalifornia","_Terms"],"sourceRoot":""}